

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

# Terraform と Amazon Bedrock を使用して AWS に RAG ユースケースをデプロイする
<a name="deploy-rag-use-case-on-aws"></a>

*Martin Maritsch、Nicolas Jacob Baer、Olivier Brique、Julian Ferdinand Grueber、Alice Morano、Nicola D Orazio、Amazon Web Services*

## 概要
<a name="deploy-rag-use-case-on-aws-summary"></a>

AWS には、[検索拡張生成 (RAG)](https://aws.amazon.com/what-is/retrieval-augmented-generation/) 対応の生成 AI ユースケースを構築するためのさまざまなオプションが用意されています。このパターンは、LangChain と Amazon Aurora PostgreSQL 互換をベクトルストアとする RAG ベースのアプリケーション向けのソリューションを提供します。このソリューションを Terraform で に直接デプロイ AWS アカウント し、次のシンプルな RAG ユースケースを実装できます。

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

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

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

このパターンでは、[Amazon Titan Text Embeddings v2](https://docs.aws.amazon.com/bedrock/latest/userguide/titan-embedding-models.html) を埋め込みモデルとして使用し、[Anthropic Claude 3 Sonnet](https://aws.amazon.com/bedrock/claude/) をテキスト生成モデルとして使用します。どちらも Amazon Bedrock で利用可能です。

## 前提条件と制限事項
<a name="deploy-rag-use-case-on-aws-prereqs"></a>

**前提条件**
+ アクティブ AWS アカウント。
+ AWS Command Line Interface (AWS CLI) がインストールされ、 で設定されています AWS アカウント。インストール手順については、 AWS CLI ドキュメントの[「最新バージョンの のインストールまたは更新 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)」を参照してください。 AWS 認証情報とアカウントへのアクセスを確認するには、 AWS CLI ドキュメントの[「設定と認証情報ファイルの設定](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)」を参照してください。
+  AWS アカウントの Amazon Bedrock コンソールで必要な大規模言語モデル (LLM) に対して有効になっているモデルアクセス。このパターンには、次の LLM が必要です。
  + `amazon.titan-embed-text-v2:0`
  + `anthropic.claude-3-sonnet-20240229-v1:0`

**制限事項**
+ このサンプルアーキテクチャには、ベクトルデータベースを使用したプログラムによる質疑応答のためのインターフェイスは含まれていません。ユースケースで API が必要な場合は、取得タスクと質疑応答タスクを実行する AWS Lambda 関数で [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide) を追加することを検討してください。 
+ このサンプルアーキテクチャには、デプロイされたインフラストラクチャのモニタリング機能は含まれていません。ユースケースでモニタリングが必要な場合は、[AWS モニタリングサービス](https://docs.aws.amazon.com/prescriptive-guidance/latest/implementing-logging-monitoring-cloudwatch/welcome.html)の追加を検討してください。
+ 短期間に Amazon S3 バケットに大量のドキュメントをアップロードすると、Lambda 関数でレート制限が発生する可能性があります。解決策として、Lambda 呼び出しのレートを制御できる Amazon Simple Queue Service (Amazon SQS) キューを使用して Lambda 関数を切り離すことができます。
+ 一部の AWS のサービス は では使用できません AWS リージョン。利用可能なリージョンについては、「[AWS のサービス (リージョン別)](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)」を参照してください。特定のエンドポイントについては、「[Service endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)」で、サービスのリンクを選択してご確認ください。

**製品バージョン**
+ [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) バージョン 2 以降
+ [Docker](https://docs.docker.com/get-started/) バージョン 26.0.0 以降
+ [Poetry](https://pypi.org/project/poetry/) バージョン 1.7.1 以降
+ [Python](https://www.python.org/downloads/) バージョン 3.10 以降
+ [Terraform](https://developer.hashicorp.com/terraform/install) バージョン 1.8.4 以降

## アーキテクチャ
<a name="deploy-rag-use-case-on-aws-architecture"></a>

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

![Amazon Bedrock で Aurora PostgreSQL と LLM を使用して RAG ベースのアプリケーションを作成するワークフロー。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/8f184945-7f17-4760-8806-6d0eaeef372a/images/3771b7a0-05bd-4eb3-ad5b-199e22f86184.png)


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

1. Amazon S3 バケット `bedrock-rag-template-<account_id>` にオブジェクトが作成されると、[Amazon S3 の通知](https://docs.aws.amazon.com/AmazonS3/latest/userguide/EventNotifications.html)により Lambda 関数 `data-ingestion-processor` が呼び出されます。

1. Lambda 関数 `data-ingestion-processor` は、Amazon Elastic Container Registry (Amazon ECR) リポジトリ `bedrock-rag-template` に保存されている Docker イメージに基づいています。

   関数は [LangChain S3FileLoader](https://python.langchain.com/v0.1/docs/integrations/document_loaders/aws_s3_file/) を使用して、ファイルを [LangChain ドキュメント](https://api.python.langchain.com/en/v0.0.339/schema/langchain.schema.document.Document.html)として読み取ります。次に、[LangChain RecursiveCharacterTextSplitter](https://python.langchain.com/v0.1/docs/modules/data_connection/document_transformers/recursive_text_splitter/) は、Amazon Titan Text Embedding V2 埋め込みモデルの最大トークンサイズに依存する `CHUNK_SIZE` と `CHUNK_OVERLAP` を指定して、各ドキュメントをチャンク化します。次に、Lambda 関数は Amazon Bedrock の埋め込みモデルを呼び出して、チャンクを数値ベクトル表現に埋め込みます。最後に、これらのベクトルが Aurora PostgreSQL データベースに保存されます。データベースにアクセスするには、Lambda 関数がまずユーザー名とパスワードを取得します AWS Secrets Manager。

1. Amazon SageMaker AI [ノートブックインスタンス](https://docs.aws.amazon.com/sagemaker/latest/dg/nbi.html) `aws-sample-bedrock-rag-template` では、ユーザーは質問プロンプトを記述できます。このコードは Amazon Bedrock で Claude 3 を呼び出し、ナレッジベース情報をプロンプトのコンテキストに追加します。その結果、Claude 3 はドキュメント内の情報を使用してレスポンスを提供します。

ネットワークとセキュリティに対するこのパターンのアプローチは次のとおりです。
+ Lambda 関数 `data-ingestion-processor` は、仮想プライベートクラウド (VPC) 内のプライベートサブネットにあります。Lambda 関数は、セキュリティグループのため、パブリックインターネットにトラフィックを送信することはできません。そのため、Amazon S3 と Amazon Bedrock へのトラフィックは VPC エンドポイントを介してのみルーティングされます。したがって、トラフィックはパブリックインターネットを経由しないため、レイテンシーが短縮され、ネットワークレベルでセキュリティレイヤーが追加されます。
+ すべてのリソースとデータは、該当する場合、エイリアス で AWS Key Management Service (AWS KMS) キーを使用して暗号化されます`aws-sample/bedrock-rag-template`。

**自動化とスケール**

このパターンでは、Terraform を使用してコードリポジトリから AWS アカウントにインフラストラクチャをデプロイします。

## ツール
<a name="deploy-rag-use-case-on-aws-tools"></a>

**AWS のサービス**
+ 「[Amazon Aurora PostgreSQL 互換エディション](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)」は、PostgreSQL デプロイのセットアップ、運用、スケーリングに役立つ、フルマネージド型の ACID 準拠のリレーショナルデータベースエンジンです。このパターンでは、Aurora PostgreSQL 互換は pgvector プラグインをベクトルデータベースとして使用します。
+ [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html) は、主要な AI スタートアップや Amazon が提供する高パフォーマンスな基盤モデル (FM) を、統合 API を通じて利用できるようにするフルマネージド型サービスです。
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) は、コマンドラインシェルのコマンド AWS のサービス を使用して を操作するのに役立つオープンソースツールです。
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) は、セキュリティ、スケーラビリティ、信頼性を備えたマネージドコンテナイメージレジストリサービスです。このパターンでは、Amazon ECR は `data-ingestion-processor` Lambda 関数用に Docker イメージをホストします。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) は、リソースの使用を認証および認可されたユーザーを制御することで、 AWS リソースへのアクセスを安全に管理できます。
+ [AWS Key Management Service (AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) は、データの保護に効果的な暗号キーを作成および管理する上で役立ちます。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。このパターンでは、Lambda はデータをベクトルストアに取り込みます。
+ [Amazon SageMaker AI](https://docs.aws.amazon.com/sagemaker/?id=docs_gateway) はマネージド型の機械学習 (ML) サービスで、ML モデルの構築とトレーニングを行い、それらを本番稼働環境に対応したホスティング環境にデプロイします。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) を使用すると、コード内のハードコードされた認証情報 (パスワードを含む) を Secrets Manager への API コールで置き換えて、プログラムでシークレットを取得することができます。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) は、あらゆる量のデータを保存、保護、取得できるクラウドベースのオブジェクトストレージサービスです。
+ [Amazon Virtual Private Cloud (Amazon VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) は、定義した仮想ネットワークに AWS リソースを起動するのに役立ちます。この仮想ネットワークは、ユーザー自身のデータセンターで運用されていた従来のネットワークと似ていますが、 AWSのスケーラブルなインフラストラクチャを使用できるという利点があります。VPC には、トラフィックフローを制御するためのサブネットとルーティングテーブルが含まれています。

**その他のツール**
+ [Docker](https://docs.docker.com/manuals/) は、オペレーティングシステムレベルの仮想化を使用してソフトウェアをコンテナで配信するサービスとしての Platform as a Service (PaaS) 製品のセットです。
+ [HashiCorp Terraform](https://www.terraform.io/docs) は、コードを使用してクラウドインフラストラクチャとリソースをプロビジョニングして管理するのに役立つ infrastructure as code (IaC) ツールです。
+ [Poetry](https://pypi.org/project/poetry/) は、Python での依存関係の管理とパッケージングのためのツールです。
+ 「[Python](https://www.python.org/)」は汎用のコンピュータプログラミング言語です。

**コードリポジトリ**

このパターンのコードは、GitHub の [terraform-rag-template-using-amazon-bedrock](https://github.com/aws-samples/terraform-rag-template-using-amazon-bedrock) リポジトリで利用できます。

## ベストプラクティス
<a name="deploy-rag-use-case-on-aws-best-practices"></a>
+ このコードサンプルは任意の にデプロイできますが AWS リージョン、米国東部 (バージニア北部) – `us-east-1`または米国西部 (北カリフォルニア) – を使用することをお勧めします`us-west-1`。この推奨事項は、このパターンの公開時点での Amazon Bedrock での基盤モデルと埋め込みモデルの可用性に基づくものです。での Amazon Bedrock 基盤モデルサポートup-to-dateリストについては AWS リージョン、Amazon Bedrock ドキュメントの「 [によるモデルサポート AWS リージョン](https://docs.aws.amazon.com/bedrock/latest/userguide/models-regions.html)」を参照してください。このコードサンプルを他のリージョンにデプロイする方法については、「[追加情報](#deploy-rag-use-case-on-aws-additional)」を参照してください。
+ このパターンは、概念実証 (PoC) またはパイロットデモのみを提供します。コードを本番環境に移行する場合は、次のベストプラクティスに従ってください。
  + Amazon S3 のサーバーアクセスログを有効にします。
  + Lambda 関数の[モニタリングとアラート](https://docs.aws.amazon.com/lambda/latest/dg/lambda-monitoring.html)を設定します。
  + ユースケースで API が必要な場合は、取得タスクと質疑応答タスクを実行する Lambda 関数を使用して Amazon API Gateway を追加することを検討してください。
+ 最小特権の原則に従い、タスクの実行に必要最小限の権限を付与します。詳細については、IAM ドキュメントの「[最小限の特権を認める。](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#grant-least-priv)」と「[IAM でのセキュリティのベストプラクティス](https://docs.aws.amazon.com/IAM/latest/UserGuide/IAMBestPracticesAndUseCases.html)」を参照してください。

## エピック
<a name="deploy-rag-use-case-on-aws-epics"></a>

### ソリューションを にデプロイする AWS アカウント
<a name="deploy-the-solution-in-an-aws-account"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| リポジトリのクローン作成 | このパターンの GitHub リポジトリをクローン作成するには、以下のコマンドを実行します。<pre>git clone https://github.com/aws-samples/terraform-rag-template-using-amazon-bedrock</pre> | AWS DevOps | 
| 変数を設定します。 | このパターンのパラメータを設定するには、以下を実行します。[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-rag-use-case-on-aws.html) | AWS DevOps | 
| ソリューションのデプロイ | ソリューションを展開するには、次を実行します。[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-rag-use-case-on-aws.html)<br />インフラストラクチャのデプロイでは、VPC 内に SageMaker AI インスタンスをプロビジョニングし、Aurora PostgreSQL データベースにアクセスするアクセス許可を付与します。 | AWS DevOps | 

### ソリューションをテストする
<a name="test-the-solution"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| デモを実行する。 | 以前のインフラストラクチャのデプロイが成功したら、次のステップに従って Jupyter Notebook でデモを実行します。[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-rag-use-case-on-aws.html)<br />Jupyter Notebook では、以下のプロセスがガイドされます。[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-rag-use-case-on-aws.html) | AWS 全般 | 

### インフラストラクチャをクリーンアップする
<a name="clean-up-infrastucture"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| インフラストラクチャをクリーンアップします。 | 不要になったときに、作成したすべてのリソースを削除するには、次のコマンドを実行します。<pre>terraform destroy -var-file=commons.tfvars</pre> | AWS DevOps  | 

## 関連リソース
<a name="deploy-rag-use-case-on-aws-resources"></a>

**AWS リソース**
+ [Python で Lambda 関数を構築する](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html)
+ [基盤モデルの推論パラメータ](https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html)
+ [Amazon Bedrock 基盤モデルへのアクセス](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html)
+ [生成 AI アプリケーションにおけるベクトルデータベースの役割](https://aws.amazon.com/blogs/database/the-role-of-vector-datastores-in-generative-ai-applications/) (AWS データベースブログ)
+ [Amazon Aurora PostgreSQL の操作](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)

**その他のリソース**
+ [pgvector ドキュメント](https://github.com/pgvector/pgvector)

## 追加情報
<a name="deploy-rag-use-case-on-aws-additional"></a>

**ベクトルデータベースの実装**

このパターンでは、Aurora PostgreSQL 互換を使用して RAG のベクトルデータベースを実装します。Aurora PostgreSQL の代わりに、 は Amazon Bedrock ナレッジベースや Amazon OpenSearch Service など、RAG の他の機能やサービス AWS を提供します。特定の要件に最適なソリューションを選択できます。
+ [Amazon OpenSearch Service](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/what-is.html) は、大量のデータを格納およびクエリするために使用できる分散型の検索および分析エンジンを備えています。
+ [Amazon Bedrock ナレッジベース](https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base.html)は、RAG の取り込みおよび取得プロセスを簡素化するための追加の抽象化としてナレッジベースを構築およびデプロイするように設計されています。Amazon Bedrock ナレッジベースは、Aurora PostgreSQL と Amazon OpenSearch Service の両方と一緒に使用できます。

**他の へのデプロイ AWS リージョン**

[アーキテクチャ](#deploy-rag-use-case-on-aws-architecture)で説明されているように、このコードサンプルをデプロイするには、米国東部 (バージニア北部) リージョン – `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 を作成します。

1. アプリケーション VPC への [VPC ピアリング](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)または[トランジットゲートウェイ](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-peering.html)を使用して、ピアリング接続を作成します。

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