

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon Bedrock ナレッジベースを使用して RAG アプリケーションを構築する
<a name="tutorial-build-rag-with-bedrock"></a>

多くの企業は、製品マニュアル、ポリシードキュメント、契約、研究レポート、エンジニアリング仕様、ユーザーが生成したコンテンツなど、NFS および SMB ファイル共有にドキュメントの大規模なリポジトリを蓄積します。

Amazon S3 アクセスポイントを FSx for ONTAP ボリュームにアタッチすると、Amazon Bedrock ナレッジベースはボリュームから直接コンテンツを取り込みます。基盤モデルのレスポンスは、チームが NFS または SMB で保存するドキュメントに基づいています。共有でライターが更新するコンテンツは、次回の同期時にナレッジベースで利用できるようになります。

このチュートリアルでは、Amazon S3 アクセスポイントを介して FSx for ONTAP ボリュームに少量のサンプル PDFs をアップロードし、アクセスポイントをポイントする Amazon Bedrock ナレッジベースを作成し、ドキュメントを取り込んで、 `RetrieveAndGenerate` API を介して質問を実行します。

**注記**  
このチュートリアルの所要時間は約 **35～45 分**です。 AWS のサービス 使用する には、作成したリソースの料金が発生します。**クリーンアップ**セクションを含むすべてのステップをすぐに完了すると、米国東部 (バージニア北部) の予想コストは **1 USD** 未満になります。 AWS リージョンこの見積もりには、FSx for ONTAP ボリューム自体の継続的な料金は含まれません。

## 前提条件
<a name="tutorial-bedrock-kb-prerequisites"></a>

作業を開始する前に、次の項目があることを確認します。
+ Amazon S3 アクセスポイントがアタッチされた FSx for ONTAP ボリューム。 Amazon S3 Amazon Bedrock サービスがアクセスポイントに到達できるようにするには、アクセスポイントに**インターネット**ネットワークオリジンが必要です。アクセスポイントの作成手順については、「」を参照してください[アクセスポイントの作成](fsxn-creating-access-points.md)。
+ Amazon Bedrock ナレッジベースでサポートされている埋め込みモデルと、ナレッジベース AWS リージョン を作成する で少なくとも 1 つのテキスト生成モデル ( など`amazon.nova-lite-v1:0`) に対して有効なモデルアクセス。このチュートリアルでは`amazon.titan-embed-text-v2:0`、 (1024 ディメンション) を埋め込みモデルとして使用します。Cohere Embed モデルもサポートされています。別の埋め込みモデルを選択した場合は、ステップ 2 のベクトルインデックスディメンションをモデルの出力ディメンションに合わせて調整します。モデルアクセスは、Amazon Bedrock コンソールの**モデルアクセス**で有効になります。詳細については、[「Amazon Bedrock ユーザーガイド」の「Amazon Bedrock 基盤モデルへのアクセス](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html)」を参照してください。 **
+ AWS CLI バージョン 2 は、IAM ロール、Amazon S3 Vectors リソース、Amazon Bedrock ナレッジベースを作成できる認証情報でインストールおよび設定されています。

## ステップ 1: サンプルドキュメントをアクセスポイントにアップロードする
<a name="tutorial-bedrock-kb-upload"></a>

サンプルコーパスとして使用するいくつかのパブリック PDFs をダウンロードし、Amazon S3 アクセスポイントエイリアスを使用してアクセスポイントにアップロードします。

1. ローカルディレクトリを作成し、サンプル PDFs。

   ```
   $ mkdir -p ~/kb-pdfs && cd ~/kb-pdfs
   curl -sSL -o aws-overview.pdf https://d1.awsstatic.com/whitepapers/aws-overview.pdf
   curl -sSL -o wellarchitected-framework.pdf https://docs.aws.amazon.com/pdfs/wellarchitected/latest/framework/wellarchitected-framework.pdf
   curl -sSL -o s3-userguide.pdf https://docs.aws.amazon.com/pdfs/AmazonS3/latest/userguide/s3-userguide.pdf
   ```

1. 各ファイルをアクセスポイントにアップロードします。{{access-point-alias}} をアクセスポイントエイリアス (例: ) に置き換えます`my-kb-ap-a1b2c3d4e5f6g7h8i9j0kl1mnop2uuse1a-ext-s3alias`。エイリアスは、ボリュームの**アタッチされた Amazon S3 アクセスポイント、または を実行して、Amazon ** FSx コンソールで確認できます`aws fsx describe-s3-access-point-attachments`。

   ```
   $ for f in *.pdf; do
       aws s3 cp "$f" "s3://{{access-point-alias}}/$f"
   done
   ```

1. ファイルがボリュームに送信されたことを確認します。

   ```
   $ aws s3 ls s3://{{access-point-alias}}/
   ```

**注記**  
Amazon Bedrock ナレッジベースでは、ドキュメントごとに最大 50 MB のファイルサイズが適用されます。50 MB を超えるファイルは、取り込み中にスキップされます。

## ステップ 2: ベクトルストアを作成する
<a name="tutorial-bedrock-kb-vector-store"></a>

ナレッジベースは、ドキュメント埋め込みをベクトルストアに保存します。Amazon Bedrock ナレッジベースは複数のベクトルストアをサポートしています。このチュートリアルでは、RAG ワークロードにコスト最適化され、最小限のセットアップが必要なため、Amazon S3 Vectors をデフォルトとして使用します。Amazon OpenSearch Serverless もサポートされています。これらの手順については、このステップの最後にある折りたたみ可能なセクションを参照してください。

### コンソールを使用してベクトルストアを作成するには
<a name="tutorial-bedrock-kb-vector-store-console"></a>

コンソールを使用して でナレッジベースを作成する場合は[ステップ 4: ナレッジベースとデータソースを作成する](#tutorial-bedrock-kb-create-kb)、**ベクトルデータベース**ステップで**新しいベクトルストアのクイック作成**を選択し、**Amazon S3 Vectors** (推奨) または **Amazon OpenSearch Serverless** を選択します。Amazon Bedrock は、ベクトルストアと必要なすべての設定を自動的に作成します。[ステップ 3: ナレッジベースの IAM ロールを作成する](#tutorial-bedrock-kb-iam-role) に進んでください。

### を使用して Amazon S3 Vectors ベクトルストアを作成するには AWS CLI
<a name="tutorial-bedrock-kb-vector-store-cli"></a>

1. Amazon S3 ベクトルバケットを作成します。ベクトルバケット名は、標準の Amazon S3 バケットと同じグローバル一意性ルールに従います。このチュートリアルでは、 を使用します`fsxn-kb-vectors`。 を一意の名前に置き換えます。

   ```
   $ aws s3vectors create-vector-bucket --vector-bucket-name fsxn-kb-vectors
   ```

1. バケットにベクトルインデックスを作成します。インデックスディメンションは埋め込みモデルの出力ディメンションと一致する必要があります。Titan Text Embeddings v2 は 1024 ディメンションを出力します。`nonFilterableMetadataKeys` この設定では、Bedrock メタデータフィールドをフィルタリング不可としてマークし、ベクトルごとのフィルタリング可能なメタデータ制限の 2 KB から除外します。

   ```
   $ aws s3vectors create-index --vector-bucket-name fsxn-kb-vectors \
       --index-name bedrock-kb-index \
       --dimension 1024 --distance-metric cosine --data-type float32 \
       --metadata-configuration '{"nonFilterableMetadataKeys":["AMAZON_BEDROCK_METADATA","AMAZON_BEDROCK_TEXT"]}'
   ```

   レスポンス`indexArn`の に注意してください。 で使用します[ステップ 4: ナレッジベースとデータソースを作成する](#tutorial-bedrock-kb-create-kb)。

### 代替: を使用して OpenSearch Service Serverless ベクトルストアを作成する AWS CLI
<a name="tutorial-bedrock-kb-vector-store-oss"></a>

OpenSearch Service Serverless (1 queries-per-second数が高い、高度な検索機能、または既存の運用に精通している場合) を使用する場合は、上記の Amazon S3 Vectors 手順ではなく、次の手順を使用します。

1. コレクションの暗号化ポリシーとネットワークセキュリティポリシーを作成します。

   ```
   $ aws opensearchserverless create-security-policy --name kb-enc --type encryption \
       --policy '{"Rules":[{"ResourceType":"collection","Resource":["collection/fsxn-kb"]}],"AWSOwnedKey":true}'
   aws opensearchserverless create-security-policy --name kb-net --type network \
       --policy '[{"Rules":[{"ResourceType":"collection","Resource":["collection/fsxn-kb"]},{"ResourceType":"dashboard","Resource":["collection/fsxn-kb"]}],"AllowFromPublic":true}]'
   ```

1. ナレッジベースロールと現在のユーザーにコレクションを読み書きするアクセス許可を付与するデータアクセスポリシーを作成します。{{account-id}} と {{current-user}} を自分の値に置き換えます。

   ```
   $ aws opensearchserverless create-access-policy --name kb-data --type data --policy '[{
       "Rules":[
           {"ResourceType":"index","Resource":["index/fsxn-kb/*"],"Permission":["aoss:*"]},
           {"ResourceType":"collection","Resource":["collection/fsxn-kb"],"Permission":["aoss:*"]}
       ],
       "Principal":[
           "arn:aws:iam::{{account-id}}:role/fsxn-kb-role",
           "arn:aws:iam::{{account-id}}:user/{{current-user}}"
       ]
   }]'
   ```

1. コレクションを作成し、 になるまで待ちます`ACTIVE`。

   ```
   $ aws opensearchserverless create-collection --name fsxn-kb --type VECTORSEARCH
   aws opensearchserverless batch-get-collection --names fsxn-kb \
       --query 'collectionDetails[0].{status:status,endpoint:collectionEndpoint}'
   ```

1. 署名付きリクエストを含む Python スクリプトを使用して、コレクションにベクトルインデックスを作成します。インデックスは、Amazon Bedrock ナレッジベースが想定するディメンション 1024 (Titan Text Embeddings v2 の場合) とフィールド名を使用する必要があります。スクリプト全体と以降の設定手順については、[「Amazon Bedrock ユーザーガイド」のOpenSearch Service Serverless を使用するための前提条件](https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base-setup-oss.html)」を参照してください。 **ステップ 4 の結果のコレクション ARN とインデックス名を、タイプ `storage-configuration` の で使用します`OPENSEARCH_SERVERLESS`。

## ステップ 3: ナレッジベースの IAM ロールを作成する
<a name="tutorial-bedrock-kb-iam-role"></a>

ナレッジベースには、埋め込みモデルを呼び出し、Amazon S3 アクセスポイントを介してオブジェクトを読み取り、ベクトルストアにアクセスするために引き受けることができる IAM ロールが必要です。以下に示すポリシーは、Amazon S3 Vectors ベクトルストアへのアクセスを許可します。代わりに OpenSearch Service Serverless を使用する場合は、 `S3Vectors`ステートメントをコレクション ARN `aoss:APIAccessAll`で に付与するステートメントに置き換えます。

### コンソールを使用してロールを作成するには
<a name="tutorial-bedrock-kb-iam-role-console"></a>

で Amazon Bedrock コンソールを使用してナレッジベースを作成するときは[ステップ 4: ナレッジベースとデータソースを作成する](#tutorial-bedrock-kb-create-kb)、**新しいサービスロールを作成して使用します**。Amazon Bedrock は、ナレッジベース、埋め込みモデル、ベクトルストア、データソースを対象とした、必要な信頼とアクセス許可を持つロールを作成します。[ステップ 4: ナレッジベースとデータソースを作成する](#tutorial-bedrock-kb-create-kb) に進んでください。

### を使用してロールを作成するには AWS CLI
<a name="tutorial-bedrock-kb-iam-role-cli"></a>

1. 次の信頼ポリシーを として保存します`kb-trust-policy.json`。これにより、Amazon Bedrock がロールを引き受けることができます。{{account-id}} を AWS アカウント ID に置き換えます。

   ```
   {
       "Version": "2012-10-17", 		 	 	 
       "Statement": [{
           "Effect": "Allow",
           "Principal": {"Service": "bedrock.amazonaws.com"},
           "Action": "sts:AssumeRole",
           "Condition": {"StringEquals": {"aws:SourceAccount": "{{account-id}}"}}
       }]
   }
   ```

1. 次のアクセス許可ポリシーを として保存します`kb-permissions.json`。埋め込みモデル、Amazon S3 アクセスポイント、ベクトルストアへのアクセスを許可します。プレースホルダーを値に置き換えます。

   ```
   {
       "Version": "2012-10-17", 		 	 	 
       "Statement": [
           {
               "Sid": "FoundationModel",
               "Effect": "Allow",
               "Action": ["bedrock:InvokeModel"],
               "Resource": ["arn:aws:bedrock:{{region}}::foundation-model/amazon.titan-embed-text-v2:0"]
           },
           {
               "Sid": "S3AccessPoint",
               "Effect": "Allow",
               "Action": ["s3:GetObject", "s3:ListBucket"],
               "Resource": [
                   "arn:aws:s3:{{region}}:{{account-id}}:accesspoint/{{access-point-name}}",
                   "arn:aws:s3:{{region}}:{{account-id}}:accesspoint/{{access-point-name}}/object/*"
               ]
           },
           {
               "Sid": "S3Vectors",
               "Effect": "Allow",
               "Action": [
                   "s3vectors:GetIndex",
                   "s3vectors:PutVectors",
                   "s3vectors:GetVectors",
                   "s3vectors:ListVectors",
                   "s3vectors:DeleteVectors",
                   "s3vectors:QueryVectors"
               ],
               "Resource": [
                   "arn:aws:s3vectors:{{region}}:{{account-id}}:bucket/fsxn-kb-vectors",
                   "arn:aws:s3vectors:{{region}}:{{account-id}}:bucket/fsxn-kb-vectors/index/*"
               ]
           }
       ]
   }
   ```

1. ロールを作成し、アクセス許可ポリシーをアタッチします。

   ```
   $ aws iam create-role --role-name fsxn-kb-role \
       --assume-role-policy-document file://kb-trust-policy.json
   aws iam put-role-policy --role-name fsxn-kb-role --policy-name kb-access \
       --policy-document file://kb-permissions.json
   ```

## ステップ 4: ナレッジベースとデータソースを作成する
<a name="tutorial-bedrock-kb-create-kb"></a>

データソースは Amazon S3 アクセスポイントエイリアスを指します。Amazon Bedrock ナレッジベースは、バケット名の代わりにアクセスポイントエイリアスを受け入れます。

### コンソールを使用してナレッジベースを作成するには
<a name="tutorial-bedrock-kb-create-kb-console"></a>

1. Amazon Bedrock コンソール ([https://console.aws.amazon.com/bedrock/](https://console.aws.amazon.com/bedrock/)) を開きます。

1. 左側のナビゲーションペインで、**ナレッジベース**を選択し、**ナレッジベースの作成**を選択します。

1. **ナレッジベースの詳細**に、名前 ( など`fsxn-kb`) と説明を入力します。

1. **IAM アクセス許可**で、**新しいサービスロールを作成して使用します**。

1. **データソース**で、**Amazon S3** を選択し、次**へ**を選択します。

1. データソース名 ( など`fsxn-s3ap-source`) を入力します。

1. **S3 URI **の場合は、「」と入力`s3://`し、その後にアクセスポイントエイリアス、例えば「」を入力します`s3://my-kb-ap-a1b2c3d4e5f6g7h8i9j0kl1mnop2uuse1a-ext-s3alias`。コンソールは、このフィールドでバケット名とアクセスポイントエイリアスを区別しません。アクセスポイントエイリアスはそのまま受け入れられます。

1. [**次へ**] を選択します。

1. **埋め込みモデル**で、**Titan Text Embeddings v2 **を選択します。

1. **「ベクトルデータベース**」で、**「新しいベクトルストアのクイック作成**」を選択し、**Amazon S3 Vectors**」を選択します。[**次へ**] を選択します。

1. 設定を確認し、**ナレッジベースの作成**を選択します。ナレッジベースの作成には数分かかる場合があります。

### を使用してナレッジベースを作成するには AWS CLI
<a name="tutorial-bedrock-kb-create-kb-cli"></a>

1. ナレッジベースを作成します。プレースホルダーを値に置き換えます。`indexArn` は、ステップ 2 で作成した Amazon S3 ベクトルインデックスの ARN です。

   ```
   $ aws bedrock-agent create-knowledge-base --name fsxn-kb \
       --role-arn arn:aws:iam::{{account-id}}:role/fsxn-kb-role \
       --knowledge-base-configuration '{
           "type":"VECTOR",
           "vectorKnowledgeBaseConfiguration":{
               "embeddingModelArn":"arn:aws:bedrock:{{region}}::foundation-model/amazon.titan-embed-text-v2:0"
           }
       }' \
       --storage-configuration '{
           "type":"S3_VECTORS",
           "s3VectorsConfiguration":{
               "indexArn":"{{index-arn}}"
           }
       }'
   ```

   レスポンス内の `knowledgeBaseId` を書き留めます。

1. データソースを作成します。フォーム を使用して、Amazon S3 アクセスポイントエイリアスを `bucketArn`フィールドのバケット名として渡します`arn:aws:s3:::{{access-point-alias}}`。

   ```
   $ aws bedrock-agent create-data-source \
       --knowledge-base-id {{knowledge-base-id}} \
       --name fsxn-s3ap-source \
       --data-source-configuration '{
           "type":"S3",
           "s3Configuration":{"bucketArn":"arn:aws:s3:::{{access-point-alias}}"}
       }'
   ```

   レスポンス内の `dataSourceId` を書き留めます。

## ステップ 5: ドキュメントを取り込む
<a name="tutorial-bedrock-kb-ingest"></a>

取り込みジョブを実行して、アクセスポイントを介してドキュメントをクロールし、埋め込みを生成して、ベクトルストアでインデックスを作成します。

### コンソールを使用して取り込みを実行するには
<a name="tutorial-bedrock-kb-ingest-console"></a>

1. Amazon Bedrock コンソールで、ナレッジベースを開きます。

1. **データソース**セクションで、データソースを選択し、**同期**を選択します。

1. **同期ステータス**が**準備完了**を表示するまで待ちます。

### を使用して取り込みを実行するには AWS CLI
<a name="tutorial-bedrock-kb-ingest-cli"></a>

1. 取り込みジョブを開始します。

   ```
   $ aws bedrock-agent start-ingestion-job \
       --knowledge-base-id {{knowledge-base-id}} \
       --data-source-id {{data-source-id}}
   ```

   レスポンス内の `ingestionJobId` を書き留めます。

1. ジョブが完了するまでポーリングします。

   ```
   $ aws bedrock-agent get-ingestion-job \
       --knowledge-base-id {{knowledge-base-id}} \
       --data-source-id {{data-source-id}} \
       --ingestion-job-id {{ingestion-job-id}}
   ```

   `status` フィールドは から `IN_PROGRESS`に移行します`COMPLETE`。`statistics` フィールドには、スキャンおよびインデックス作成されたドキュメントの数が表示されます。

## ステップ 6: ナレッジベースのクエリを実行する
<a name="tutorial-bedrock-kb-query"></a>

取り込まれたドキュメントに基づいてナレッジベースに質問します。レスポンスには、Amazon S3 アクセスポイントエイリアスを介してソースドキュメントを参照する引用が含まれています。

### コンソールを使用してクエリを実行するには
<a name="tutorial-bedrock-kb-query-console"></a>

1. Amazon Bedrock コンソールで、ナレッジベースを開きます。

1. **ナレッジベースのテスト**を選択します。

1. **「レスポンスの生成**」で、テキスト生成モデル (**Nova Lite** など) を選択します。

1. などの質問を入力し`What are the pillars of the AWS Well-Architected Framework?`、**実行**を選択します。回答には、Amazon S3 アクセスポイントのソースドキュメントにリンクする引用参照が表示されます。

### を使用してクエリを実行するには AWS CLI
<a name="tutorial-bedrock-kb-query-cli"></a>

`retrieve-and-generate` コマンドを使用します。プレースホルダーを値に置き換えます。は、アクセスできるテキスト生成モデルの推論プロファイルを参照`modelArn`する必要があります。

```
$ aws bedrock-agent-runtime retrieve-and-generate \
    --input '{"text":"What are the pillars of the AWS Well-Architected Framework?"}' \
    --retrieve-and-generate-configuration '{
        "type":"KNOWLEDGE_BASE",
        "knowledgeBaseConfiguration":{
            "knowledgeBaseId":"{{knowledge-base-id}}",
            "modelArn":"arn:aws:bedrock:{{region}}:{{account-id}}:inference-profile/us.amazon.nova-lite-v1:0"
        }
    }'
```

レスポンスには、 で生成された回答`output.text`と、`citations`配列内の引用のリストが含まれます。各引用には、アクセスポイントエイリアスを介してソースドキュメントを指す `s3Location.uri`フィールドが 形式で含まれます`s3://{{access-point-alias}}/{{file.pdf}}`。

## トラブルシューティング
<a name="tutorial-bedrock-kb-troubleshooting"></a>

取り込みジョブレポートファイルが無視されました  
Amazon Bedrock ナレッジベースでは、ドキュメントごとに最大 50 MB のファイルサイズが適用されます。50 MB を超えるファイルは にリストされ`failureReasons`、スキップされます。アップロードする前に大きなドキュメントを分割または圧縮します。

`ValidationException`: レガシーとしてマークされたモデル  
指定したテキスト生成モデルは、アカウントで廃止されました。`us.amazon.nova-lite-v1:0` や現在サポートされている別のモデルなど、アクティブな推論プロファイルを選択します。を実行して、使用可能なプロファイル`aws bedrock list-inference-profiles`を一覧表示します。

`AccessDeniedException` 取り込み中  
ナレッジベースの IAM ロールにアクセスポイント ARN (基になるボリュームではなく) `s3:GetObject``s3:ListBucket`と があり、アクセスポイントにインターネットネットワークオリジンがあり、Amazon Bedrock サービスがそれに到達できることを確認します。ステップ 2 で OpenSearch Service Serverless の代替手段を選択した場合は、データアクセスポリシーでロールがプリンシパルとしてリストされていることを確認します。

取り込みジョブは成功したが、クエリは関連するパッセージを返さない  
ベクトルインデックスが `dimension: 1024` (Titan Text Embeddings v2 の場合) で作成され、インデックスマッピングのフィールド名がナレッジベースで設定されたフィールド名と一致することを確認します。

## クリーンアップ
<a name="tutorial-bedrock-kb-clean-up"></a>

作成したリソースは、継続的な料金の発生を回避するために削除してください。
+ Amazon Bedrock ナレッジベースとデータソース
+ Amazon S3 ベクトルインデックスとベクトルバケット (またはステップ 2 で代替手段を使用した場合は OpenSearch Service Serverless コレクション)
+ IAM ロールとインラインポリシー
+ アクセスポイントにアップロードされたオブジェクト (不要になった場合)

```
$ aws bedrock-agent delete-data-source --knowledge-base-id {{knowledge-base-id}} --data-source-id {{data-source-id}}
aws bedrock-agent delete-knowledge-base --knowledge-base-id {{knowledge-base-id}}
aws s3vectors delete-index --vector-bucket-name fsxn-kb-vectors --index-name bedrock-kb-index
aws s3vectors delete-vector-bucket --vector-bucket-name fsxn-kb-vectors
aws iam delete-role-policy --role-name fsxn-kb-role --policy-name kb-access
aws iam delete-role --role-name fsxn-kb-role
```

### 代替: OpenSearch Service Serverless リソースをクリーンアップする
<a name="tutorial-bedrock-kb-clean-up-oss"></a>

ステップ 2 で OpenSearch Service Serverless の代替手段を選択した場合は、上記の`s3vectors`コマンドを以下に置き換えます。アイドル状態の OpenSearch Service Serverless コレクションには OCU 時間料金が発生するため、チュートリアルが終了したらすぐに削除してください。

```
$ # Get the collection ID (required by delete-collection; the name is not accepted)
COLLECTION_ID=$(aws opensearchserverless batch-get-collection --names fsxn-kb \
    --query 'collectionDetails[0].id' --output text)

# Delete the collection, then the policies
aws opensearchserverless delete-collection --id "$COLLECTION_ID"
aws opensearchserverless delete-access-policy --name kb-data --type data
aws opensearchserverless delete-security-policy --name kb-net --type network
aws opensearchserverless delete-security-policy --name kb-enc --type encryption
```