Terraform と Amazon Bedrock を使用して AWS に RAG ユースケースをデプロイする
Martin Maritsch、Nicolas Jacob Baer、Olivier Brique、Julian Ferdinand Grueber、Alice Morano、Nicola D Orazio、Amazon Web Services
概要
AWS には、検索拡張生成 (RAG)
Microsoft Excel ファイルや PDF ドキュメントなどの Amazon Simple Storage Service (Amazon S3) バケットにファイルを手動でアップロードします。(サポートされているファイルタイプの詳細については、Unstructured
のドキュメントを参照してください)。 ファイルの内容は抽出され、サーバーレス Aurora PostgreSQL 互換に基づくナレッジデータベースに埋め込まれます。ここでは、ベクトルストアへのほぼリアルタイムのドキュメントの取り込みがサポートされています。このアプローチにより、RAG モデルは低レイテンシーが重要となるユースケースの関連情報にアクセスし、取得することができます。
テキスト生成モデルでは、以前にアップロードしたファイルから関連コンテンツを取得して拡張することで、インタラクションが強化されます。
このパターンでは、Amazon Titan Text Embeddings v2 を埋め込みモデルとして使用し、Anthropic Claude 3 Sonnet
前提条件と制限事項
前提条件
アクティブな AWS アカウント。
AWS Command Line Interface (AWS CLI) がインストールされ、AWS アカウントで設定されます。インストール手順の詳細については、AWS CLI ドキュメントの「AWS CLI の最新バージョンのインストールまたは更新」を参照してください。AWS 認証情報とアカウントへのアクセスを確認するには、AWS CLI ドキュメントの「設定ファイルと認証情報ファイルの設定」を参照してください。
AWS アカウントの Amazon Bedrock コンソールで必要な大規模言語モデル (LLM) に対して有効になっているモデルアクセス。このパターンには、次の LLM が必要です。
amazon.titan-embed-text-v2:0anthropic.claude-3-sonnet-20240229-v1:0
制限事項
このサンプルアーキテクチャには、ベクトルデータベースを使用したプログラムによる質疑応答のためのインターフェイスは含まれていません。ユースケースで API が必要な場合は、取得タスクと質疑応答タスクを実行する AWS Lambda 関数を使用して Amazon API Gateway を追加することを検討してください。
このサンプルアーキテクチャには、デプロイされたインフラストラクチャのモニタリング機能は含まれていません。ユースケースでモニタリングが必要な場合は、AWS モニタリングサービスの追加を検討してください。
短期間に Amazon S3 バケットに大量のドキュメントをアップロードすると、Lambda 関数でレート制限が発生する可能性があります。解決策として、Lambda 呼び出しのレートを制御できる Amazon Simple Queue Service (Amazon SQS) キューを使用して Lambda 関数を切り離すことができます。
一部の AWS のサービスは、利用できる AWS リージョンが限られる場合があります。利用可能なリージョンについては、「AWS のサービス (リージョン別)
」を参照してください。特定のエンドポイントについては、「サービスエンドポイントとクォータ」を参照して、サービスのリンクを選択してください。
製品バージョン
アーキテクチャ
次の図表は、このパターンのアプリケーションのワークフローとアーキテクチャコンポーネントを示しています。

この図は、次の内容を示したものです。
Amazon S3 バケット
bedrock-rag-template-<account_id>にオブジェクトが作成されると、Amazon S3 の通知により Lambda 関数data-ingestion-processorが呼び出されます。Lambda 関数
data-ingestion-processorは、Amazon Elastic Container Registry (Amazon ECR) リポジトリbedrock-rag-templateに保存されている Docker イメージに基づいています。関数は LangChain S3FileLoader
を使用して、ファイルを LangChain ドキュメント として読み取ります。次に、LangChain RecursiveCharacterTextSplitter は、Amazon Titan Text Embedding V2 埋め込みモデルの最大トークンサイズに依存する CHUNK_SIZEとCHUNK_OVERLAPを指定して、各ドキュメントをチャンク化します。次に、Lambda 関数は Amazon Bedrock の埋め込みモデルを呼び出して、チャンクを数値ベクトル表現に埋め込みます。最後に、これらのベクトルが Aurora PostgreSQL データベースに保存されます。データベースにアクセスするには、Lambda 関数はまず AWS Secrets Manager からユーザー名とパスワードを取得します。Amazon SageMaker AI ノートブックインスタンス
aws-sample-bedrock-rag-templateでは、ユーザーは質問プロンプトを記述できます。このコードは Amazon Bedrock で Claude 3 を呼び出し、ナレッジベース情報をプロンプトのコンテキストに追加します。その結果、Claude 3 はドキュメント内の情報を使用してレスポンスを提供します。
ネットワークとセキュリティに対するこのパターンのアプローチは次のとおりです。
Lambda 関数
data-ingestion-processorは、仮想プライベートクラウド (VPC) 内のプライベートサブネットにあります。Lambda 関数は、セキュリティグループのため、パブリックインターネットにトラフィックを送信することはできません。そのため、Amazon S3 と Amazon Bedrock へのトラフィックは VPC エンドポイントを介してのみルーティングされます。したがって、トラフィックはパブリックインターネットを経由しないため、レイテンシーが短縮され、ネットワークレベルでセキュリティレイヤーが追加されます。すべてのリソースとデータは、該当する場合、エイリアス
aws-sample/bedrock-rag-templateで AWS Key Management Service (AWS KMS) キーを使用して暗号化されます。
自動化とスケール
このパターンでは、Terraform を使用してコードリポジトリから AWS アカウントにインフラストラクチャをデプロイします。
ツール
AWS のサービス
「Amazon Aurora PostgreSQL 互換エディション」は、PostgreSQL デプロイのセットアップ、運用、スケーリングに役立つ、フルマネージド型の ACID 準拠のリレーショナルデータベースエンジンです。このパターンでは、Aurora PostgreSQL 互換は pgvector プラグインをベクトルデータベースとして使用します。
Amazon Bedrock は、主要な AI スタートアップや Amazon が提供する高パフォーマンスな基盤モデル (FM) を、統合 API を通じて利用できるようにするフルマネージド型サービスです。
AWS Command Line Interface (AWS CLI) は、コマンドラインシェルでコマンドを使用して AWS のサービスとやり取りするためのオープンソースツールです。
Amazon Elastic Container Registry (Amazon ECR) は、セキュリティ、スケーラビリティ、信頼性を備えたマネージドコンテナイメージレジストリサービスです。このパターンでは、Amazon ECR は
data-ingestion-processorLambda 関数用に Docker イメージをホストします。「AWS Identity and Access Management (IAM)」では、リソースの使用を認証、許可されるユーザーを制御することで、AWS リソースへのアクセスを安全に管理できます。
AWS Key Management Service (AWS KMS) を使用して、データの保護に役立つ暗号キーを作成および管理できます。
AWS Lambda は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。このパターンでは、Lambda はデータをベクトルストアに取り込みます。
Amazon SageMaker AI はマネージド型の機械学習 (ML) サービスで、ML モデルの構築とトレーニングを行い、それらを本番稼働環境に対応したホスティング環境にデプロイします。
AWS Secrets Manager を使用すると、コード内のハードコードされた認証情報 (パスワードを含む) を Secrets Manager への API コールで置き換えて、プログラムでシークレットを取得することができます。
Amazon Simple Storage Service (Amazon S3) は、あらゆる量のデータを保存、保護、取得できるクラウドベースのオブジェクトストレージサービスです。
Amazon Virtual Private Cloud (Amazon VPC) を使用すると、定義した仮想ネットワーク内で AWS リソースを起動できます。この仮想ネットワークは、ユーザー自身のデータセンターで運用されていた従来のネットワークと似ていますが、AWS のスケーラブルなインフラストラクチャを使用できるという利点があります。VPC には、トラフィックフローを制御するためのサブネットとルーティングテーブルが含まれています。
その他のツール
Docker
は、オペレーティングシステムレベルの仮想化を使用してソフトウェアをコンテナで配信するサービスとしての Platform as a Service (PaaS) 製品のセットです。 HashiCorp Terraform
は、コードを使用してクラウドインフラストラクチャとリソースをプロビジョニングして管理するのに役立つ infrastructure as code (IaC) ツールです。 Poetry
は、Python での依存関係の管理とパッケージングのためのツールです。 「Python
」は汎用のコンピュータプログラミング言語です。
コードリポジトリ
このパターンのコードは、GitHub の terraform-rag-template-using-amazon-bedrock
ベストプラクティス
このコードサンプルは任意の AWS リージョンにデプロイできますが、米国東部 (バージニア北部) –
us-east-1または米国西部 (北カリフォルニア) –us-west-1を使用することをお勧めします。この推奨事項は、このパターンの公開時点での Amazon Bedrock での基盤モデルと埋め込みモデルの可用性に基づくものです。AWS リージョンでの Amazon Bedrock 基盤モデルサポートの最新リストについては、Amazon Bedrock ドキュメントの「Model support by AWS リージョン」を参照してください。このコードサンプルを他のリージョンにデプロイする方法については、「追加情報」を参照してください。このパターンは、概念実証 (PoC) またはパイロットデモのみを提供します。コードを本番環境に移行する場合は、次のベストプラクティスに従ってください。
Amazon S3 のサーバーアクセスログを有効にします。
Lambda 関数のモニタリングとアラートを設定します。
ユースケースで API が必要な場合は、取得タスクと質疑応答タスクを実行する Lambda 関数を使用して Amazon API Gateway を追加することを検討してください。
最小特権の原則に従い、タスクの実行に必要最小限の権限を付与します。詳細については、IAM ドキュメントの「最小特権の付与」と「セキュリティのベストプラクティス」を参照してください。
エピック
| タスク | 説明 | 必要なスキル |
|---|---|---|
リポジトリをクローン作成します。 | このパターンの GitHub リポジトリをクローン作成するには、以下のコマンドを実行します。
| AWS DevOps |
変数を設定します。 | このパターンのパラメータを設定するには、以下を実行します。
| AWS DevOps |
ソリューションをデプロイします。 | ソリューションを展開するには、次を実行します。
インフラストラクチャのデプロイでは、VPC 内に SageMaker AI インスタンスをプロビジョニングし、Aurora PostgreSQL データベースにアクセスするアクセス許可を付与します。 | AWS DevOps |
| タスク | 説明 | 必要なスキル |
|---|---|---|
デモを実行する。 | 以前のインフラストラクチャのデプロイが成功したら、次のステップに従って Jupyter Notebook でデモを実行します。
Jupyter Notebook では、以下のプロセスがガイドされます。
| AWS 全般 |
| タスク | 説明 | 必要なスキル |
|---|---|---|
インフラストラクチャをクリーンアップします。 | 不要になったときに、作成したすべてのリソースを削除するには、次のコマンドを実行します。
| AWS DevOps |
関連リソース
AWS リソース
その他のリソース
追加情報
ベクトルデータベースの実装
このパターンでは、Aurora PostgreSQL 互換を使用して RAG のベクトルデータベースを実装します。AWS は Aurora PostgreSQL の代わりに、Amazon Bedrock ナレッジベースや Amazon OpenSearch Service など、RAG 用の他の機能やサービスを提供します。特定の要件に最適なソリューションを選択できます。
Amazon OpenSearch Service は、大量のデータを格納およびクエリするために使用できる分散型の検索および分析エンジンを備えています。
Amazon Bedrock ナレッジベースは、RAG の取り込みおよび取得プロセスを簡素化するための追加の抽象化としてナレッジベースを構築およびデプロイするように設計されています。Amazon Bedrock ナレッジベースは、Aurora PostgreSQL と Amazon OpenSearch Service の両方と一緒に使用できます。
他の AWS リージョンへのデプロイ
アーキテクチャで説明されているように、このコードサンプルをデプロイするには、米国東部 (バージニア北部) リージョン – us-east-1 または米国西部 (北カリフォルニア) リージョン – us-west-1 を使用することをお勧めします。ただし、このコードサンプルを us-east-1および us-west-1 以外のリージョンにデプロイするには、2 つの方法があります。commons.tfvars ファイルでデプロイリージョンを設定できます。クロスリージョン基盤モデルにアクセスするには、次のオプションを検討してください。
パブリックインターネットを経由する – トラフィックがパブリックインターネットを経由できる場合は、VPC にインターネットゲートウェイを追加します。次に、Lambda 関数
data-ingestion-processorと SageMaker AI ノートブックインスタンスに割り当てられたセキュリティグループを調整して、パブリックインターネットへのアウトバウンドトラフィックを許可します。パブリックインターネットを経由しない – このサンプルを
us-east-1またはus-west-1以外のリージョンにデプロイするには、次の手順を実行します。
us-east-1またはus-west-1リージョンのいずれかで、bedrock-runtimeの VPC エンドポイントを含む追加の VPC を作成します。アプリケーション VPC への VPC ピアリングまたはトランジットゲートウェイを使用して、ピアリング接続を作成します。
us-east-1またはus-west-1の外部で Lambda 関数でbedrock-runtimeboto3 クライアントを設定する場合は、us-east-1または us-west-1 用のbedrock-runtimeの VPC エンドポイントのプライベート DNS 名をendpoint_urlとして boto3 クライアントに渡します。