View a markdown version of this page

Amazon Bedrock ナレッジベースを使用して RAG アプリケーションを構築する - FSx for ONTAP

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

Amazon Bedrock ナレッジベースを使用して RAG アプリケーションを構築する

多くの企業は、製品マニュアル、ポリシードキュメント、契約、研究レポート、エンジニアリング仕様、ユーザーが生成したコンテンツなど、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 ボリューム自体の継続的な料金は含まれません。

前提条件

作業を開始する前に、次の項目があることを確認します。

  • Amazon S3 アクセスポイントがアタッチされた FSx for ONTAP ボリューム。 Amazon S3 Amazon Bedrock サービスがアクセスポイントに到達できるようにするには、アクセスポイントにインターネットネットワークオリジンが必要です。アクセスポイントの作成手順については、「」を参照してくださいアクセスポイントの作成

  • 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 基盤モデルへのアクセス」を参照してください。

  • AWS CLI バージョン 2 は、IAM ロール、Amazon S3 Vectors リソース、Amazon Bedrock ナレッジベースを作成できる認証情報でインストールおよび設定されています。

ステップ 1: サンプルドキュメントをアクセスポイントにアップロードする

サンプルコーパスとして使用するいくつかのパブリック 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
  2. 各ファイルをアクセスポイントにアップロードします。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
  3. ファイルがボリュームに送信されたことを確認します。

    $ aws s3 ls s3://access-point-alias/
注記

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

ステップ 2: ベクトルストアを作成する

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

コンソールを使用してベクトルストアを作成するには

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

を使用して Amazon S3 Vectors ベクトルストアを作成するには AWS CLI

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

    $ aws s3vectors create-vector-bucket --vector-bucket-name fsxn-kb-vectors
  2. バケットにベクトルインデックスを作成します。インデックスディメンションは埋め込みモデルの出力ディメンションと一致する必要があります。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: ナレッジベースとデータソースを作成する

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}]'
  2. ナレッジベースロールと現在のユーザーにコレクションを読み書きするアクセス許可を付与するデータアクセスポリシーを作成します。account-idcurrent-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" ] }]'
  3. コレクションを作成し、 になるまで待ちます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}'
  4. 署名付きリクエストを含む Python スクリプトを使用して、コレクションにベクトルインデックスを作成します。インデックスは、Amazon Bedrock ナレッジベースが想定するディメンション 1024 (Titan Text Embeddings v2 の場合) とフィールド名を使用する必要があります。スクリプト全体と以降の設定手順については、「Amazon Bedrock ユーザーガイド」のOpenSearch Service Serverless を使用するための前提条件」を参照してください。 ステップ 4 の結果のコレクション ARN とインデックス名を、タイプ storage-configuration の で使用しますOPENSEARCH_SERVERLESS

ステップ 3: ナレッジベースの IAM ロールを作成する

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

コンソールを使用してロールを作成するには

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

  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"}} }] }
  2. 次のアクセス許可ポリシーを として保存します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/*" ] } ] }
  3. ロールを作成し、アクセス許可ポリシーをアタッチします。

    $ 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: ナレッジベースとデータソースを作成する

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

コンソールを使用してナレッジベースを作成するには

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

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

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

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

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

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

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

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

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

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

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

を使用してナレッジベースを作成するには AWS CLI

  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 を書き留めます。

  2. データソースを作成します。フォーム を使用して、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: ドキュメントを取り込む

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

コンソールを使用して取り込みを実行するには

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

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

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

を使用して取り込みを実行するには AWS CLI

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

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

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

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

    $ 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に移行しますCOMPLETEstatistics フィールドには、スキャンおよびインデックス作成されたドキュメントの数が表示されます。

ステップ 6: ナレッジベースのクエリを実行する

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

コンソールを使用してクエリを実行するには

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

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

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

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

を使用してクエリを実行するには AWS CLI

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

トラブルシューティング

取り込みジョブレポートファイルが無視されました

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

ValidationException: レガシーとしてマークされたモデル

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

AccessDeniedException 取り込み中

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

取り込みジョブは成功したが、クエリは関連するパッセージを返さない

ベクトルインデックスが dimension: 1024 (Titan Text Embeddings v2 の場合) で作成され、インデックスマッピングのフィールド名がナレッジベースで設定されたフィールド名と一致することを確認します。

クリーンアップ

作成したリソースは、継続的な料金の発生を回避するために削除してください。

  • 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

ステップ 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