Terraform と Amazon Bedrock を使用して AWS に RAG ユースケースをデプロイする - AWS 規範的ガイダンス

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) 対応の生成 AI ユースケースを構築するためのさまざまなオプションが用意されています。このパターンは、LangChain と Amazon Aurora PostgreSQL 互換をベクトルストアとする RAG ベースのアプリケーション向けのソリューションを提供します。このソリューションを Terraform で AWS アカウントに直接デプロイし、次のシンプルな RAG ユースケースを実装できます。

  1. Microsoft Excel ファイルや PDF ドキュメントなどの Amazon Simple Storage Service (Amazon S3) バケットにファイルを手動でアップロードします。(サポートされているファイルタイプの詳細については、Unstructured のドキュメントを参照してください)。

  2. ファイルの内容は抽出され、サーバーレス Aurora PostgreSQL 互換に基づくナレッジデータベースに埋め込まれます。ここでは、ベクトルストアへのほぼリアルタイムのドキュメントの取り込みがサポートされています。このアプローチにより、RAG モデルは低レイテンシーが重要となるユースケースの関連情報にアクセスし、取得することができます。

  3. テキスト生成モデルでは、以前にアップロードしたファイルから関連コンテンツを取得して拡張することで、インタラクションが強化されます。

このパターンでは、Amazon Titan Text Embeddings v2 を埋め込みモデルとして使用し、Anthropic Claude 3 Sonnet をテキスト生成モデルとして使用します。どちらも Amazon Bedrock で利用可能です。

前提条件と制限事項

前提条件 

  • アクティブな 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:0

    • anthropic.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 のサービス (リージョン別)」を参照してください。特定のエンドポイントについては、「サービスエンドポイントとクォータ」を参照して、サービスのリンクを選択してください。

製品バージョン

  • AWS CLI バージョン 2 以降

  • Docker バージョン 26.0.0 以降

  • Poetry バージョン 1.7.1 以降

  • Python バージョン 3.10 以降

  • Terraform バージョン 1.8.4 以降

アーキテクチャ

次の図表は、このパターンのアプリケーションのワークフローとアーキテクチャコンポーネントを示しています。

Amazon Bedrock で Aurora PostgreSQL と LLM を使用して RAG ベースのアプリケーションを作成するワークフロー。

この図は、次の内容を示したものです。

  1. Amazon S3 バケット bedrock-rag-template-<account_id> にオブジェクトが作成されると、Amazon S3 の通知により Lambda 関数 data-ingestion-processor が呼び出されます。

  2. 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_SIZECHUNK_OVERLAP を指定して、各ドキュメントをチャンク化します。次に、Lambda 関数は Amazon Bedrock の埋め込みモデルを呼び出して、チャンクを数値ベクトル表現に埋め込みます。最後に、これらのベクトルが Aurora PostgreSQL データベースに保存されます。データベースにアクセスするには、Lambda 関数はまず AWS Secrets Manager からユーザー名とパスワードを取得します。

  3. 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-processor Lambda 関数用に 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 リポジトリをクローン作成するには、以下のコマンドを実行します。

git clone https://github.com/aws-samples/terraform-rag-template-using-amazon-bedrock
AWS DevOps

変数を設定します。

このパターンのパラメータを設定するには、以下を実行します。

  1. コンピュータの GitHub リポジトリで、次のコマンドを使用して terraform フォルダを開きます。

    cd terraform
  2. commons.tfvars ファイルを開き、必要に応じてパラメータをカスタマイズします。

AWS DevOps

ソリューションをデプロイします。

ソリューションを展開するには、次を実行します。

  1. terraform フォルダで、次のコマンドを使用して Terraform を実行し、カスタマイズした変数を渡します。

    terraform init terraform apply -var-file=commons.tfvars
  2. アーキテクチャ図に示されているリソースが正常にデプロイされたことを確認します。

インフラストラクチャのデプロイでは、VPC 内に SageMaker AI インスタンスをプロビジョニングし、Aurora PostgreSQL データベースにアクセスするアクセス許可を付与します。

AWS DevOps
タスク説明必要なスキル

デモを実行する。

以前のインフラストラクチャのデプロイが成功したら、次のステップに従って Jupyter Notebook でデモを実行します。

  1. インフラストラクチャがデプロイされている AWS アカウントの AWS マネジメントコンソール にサインインします。

  2. SageMaker AI ノートブックインスタンス aws-sample-bedrock-rag-template を開きます。

  3. ドラッグアンドドロップを使用して、rag_demo.ipynb Jupyter Notebook を SageMaker AI Notebook インスタンスに移動します。

  4. SageMaker AI ノートブックインスタンスで rag_demo.ipynb を開き、conda_python3 カーネルを選択します。

  5. デモを実行するには、ノートブックのセルを実行します。

Jupyter Notebook では、以下のプロセスがガイドされます。

  • 要件のインストール

  • 定義の埋め込み

  • データベース接続

  • データインジェスト

  • 検索拡張テキスト生成

  • 関連するドキュメントクエリ

AWS 全般
タスク説明必要なスキル

インフラストラクチャをクリーンアップします。

不要になったときに、作成したすべてのリソースを削除するには、次のコマンドを実行します。

terraform destroy -var-file=commons.tfvars
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 以外のリージョンにデプロイするには、次の手順を実行します。

  1. us-east-1 または us-west-1 リージョンのいずれかで、bedrock-runtime の VPC エンドポイントを含む追加の VPC を作成します。

  2. アプリケーション VPC への VPC ピアリングまたはトランジットゲートウェイを使用して、ピアリング接続を作成します。

  3. us-east-1 または us-west-1 の外部で Lambda 関数で bedrock-runtime boto3 クライアントを設定する場合は、us-east-1 または us-west-1 用の bedrock-runtime の VPC エンドポイントのプライベート DNS 名を endpoint_url として boto3 クライアントに渡します。