

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

# RAG と ReAct プロンプトを使用して高度な生成 AI チャットベースのアシスタントを開発する
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting"></a>

*Amazon Web Services、Praveen Kumar Jeyarajan、Shuai Cao、Noah Hamilton、Kioua Jackson、Jundong Qiao、Kara Yang*

## 概要
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-summary"></a>

一般的な企業では、データの 70% がサイロ化されたシステムにトラップされています。生成 AI を活用したチャットベースのアシスタントを使用して、自然言語のやり取りを通じて、これらのデータサイロ間のインサイトと関係性を引き出すことができます。生成 AI を最大限に活用するには、出力の信頼性の高さと正確さ、出力に利用可能な企業データが含まれていることが必要となります。チャットベースのアシスタントの成否は、以下によって決まります。
+ 生成 AI モデル (Anthropic Claude 2 など)
+ データソースのベクトル化
+ モデルをプロンプトするための [ReAct フレームワーク](https://www.promptingguide.ai/techniques/react)などの高度な推論手法

このパターンでは、Amazon Simple Storage Service (Amazon S3) バケット、AWS Glue、Amazon Relational Database Service (Amazon RDS) などのデータソースからのデータ取得アプローチを提供します。データからの値の取得は、[検索拡張生成 (RAG)](https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base.html) を思考連鎖メソッドでインターリーブすることによって行われます。結果は、企業の保存されたデータ全体を利用する複雑なチャットベースのアシスタントの会話をサポートします。

このパターンでは、Amazon SageMaker のマニュアルと料金データテーブルを例として使用して、生成 AI チャットベースのアシスタントの機能について説明します。料金とサービスの機能に関する質問に回答することにより、顧客が SageMaker サービスを評価できるようにするチャットベースのアシスタントを構築します。このソリューションでは、フロントエンドアプリケーションを構築するための Streamlit ライブラリと、大規模言語モデル (LLM) を搭載したアプリケーションバックエンドを開発するための LangChain フレームワークを使用します。

チャットベースのアシスタントへの質問には、3 つの可能なワークフローのいずれかにルーティングするための初期インテント分類で対応します。最も洗練されたワークフローは、一般的なアドバイザリガイダンスと複雑な料金分析を組み合わせたものです。このパターンは、企業、会社、業界のユースケースに合わせて調整できます。

## 前提条件と制限
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-prereqs"></a>

**前提条件**
+ [AWS コマンドラインインターフェイス (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) がインストールされ、設定されていること
+ [AWS Cloud Development Kit (AWS CDK) ツールキット 2.114.1 以降](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html)がインストールされ、設定されていること
+ Python および AWS CDK の基本的な知識
+ インストール済み[Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
+ [Docker](https://docs.docker.com/get-docker/) がインストールされていること
+ [Python 3.11 以降](https://www.python.org/downloads/)がインストールされ、設定されていること (詳細は、「[ツール](#develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-tools)」セクションを参照してください)
+ [AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html) を使用して[有効な AWS アカウント](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-creating.html)がブートストラップされていること
+ Amazon Titan および Anthropic Claude [モデルアクセス](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html#add-model-access)が Amazon Bedrock サービスで有効になっていること
+ ターミナル環境における [AWS セキュリティ認証情報](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html) (`AWS_ACCESS_KEY_ID` を含む) の適切な設定

**制限事項**
+ LangChain は、すべての LLM のストリーミングをサポートしているわけではありません。Anthropic Claude モデルはサポートされていますが、AI21 Labs のモデルはサポートされていません。
+ このソリューションは単一 AWS アカウントにデプロイされます。
+ このソリューションは、Amazon Bedrock と Amazon Kendra が利用可能な AWS リージョンでのみデプロイできます。詳細は、[Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html#bedrock-regions) と [Amazon Kendra](https://docs.aws.amazon.com/general/latest/gr/kendra.html) のドキュメントを参照してください。

**製品バージョン**
+ Python バージョン 3.11 以降
+ Streamlit バージョン 1.30.0 以降
+ Streamlit-chat バージョン 0.1.1 以降
+ LangChain バージョン 0.1.12 以降
+ AWS CDK バージョン 2.132.1 以降

## アーキテクチャ
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-architecture"></a>

**ターゲットテクノロジースタック**
+ Amazon Athena
+ Amazon Bedrock
+ Amazon Elastic Container Service (Amazon ECS)
+ AWS Glue
+ AWS Lambda
+ Amazon S3
+ Amazon Kendra
+ エラスティックロードバランシング

**ターゲットアーキテクチャ**

AWS CDK コードは、AWS アカウントでチャットベースのアシスタントアプリケーションを設定するのに必要なすべてのリソースをデプロイします。次の図に示すチャットベースのアシスタントアプリケーションは、ユーザーからの SageMaker 関連のクエリに応答するように設計されています。ユーザーは Application Load Balancer を介して、Streamlit アプリケーションをホストする Amazon ECS クラスターを含む VPC に接続します。オーケストレーション Lambda 関数はアプリケーションに接続します。S3 バケットデータソースは、Amazon Kendra と AWS Glue を介して Lambda 関数にデータを提供します。Lambda 関数は Amazon Bedrock に接続して、チャットベースのアシスタントユーザーからのクエリ (質問) に応答します。

![\[アーキテクチャ図。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/b4df6405-76ab-4493-a722-15ceca067254/images/4e5856cf-9489-41f8-a411-e3b8d8a50748.png)


1. オーケストレーション Lambda 関数が、LLM プロンプトリクエストを Amazon Bedrock モデル (Claude 2) に送信します。

1. Amazon Bedrock が、LLM レスポンスをオーケストレーション Lambda 関数に返送します。

**オーケストレーション Lambda 関数内のロジックフロー**

ユーザーが Streamlit アプリケーションを通じて質問すると、アプリケーションによってオーケストレーション Lambda 関数が直接呼び出されます。次の図に、Lambda 関数が呼び出されたときのロジックフローを示します。

![\[アーキテクチャ図。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/b4df6405-76ab-4493-a722-15ceca067254/images/70ae4736-06a6-4d3a-903a-edc5c10d78a0.png)

+ ステップ 1 – 入力 `query` (質問) が 3 つのインテントのいずれかに分類されます。
  + 一般的な SageMaker ガイダンスに関する質問
  + 一般的な SageMaker 料金 (トレーニング/推論) に関する質問
  + SageMaker と料金に関する複雑な質問
+ ステップ 2 – 入力 `query` が 3 つのサービスのいずれかを開始します。
  + `RAG Retrieval service`: [Amazon Kendra ](https://aws.amazon.com/kendra/)ベクトルデータベースから関連するコンテキストを取得し、[Amazon Bedrock](https://aws.amazon.com/bedrock/) を介して LLM を呼び出して、取得したコンテキストをレスポンスとして要約します。
  + `Database Query service`: LLM、データベースメタデータ、および関連するテーブルのサンプル行を使用して、入力 `query` を SQL クエリに変換します。Database Query サービスは、[Amazon Athena](https://aws.amazon.com/athena/) を介して SageMaker 料金データベースに対して SQL クエリを実行し、クエリ結果をレスポンスとして要約します。
  + `In-context ReACT Agent service`: レスポンスを提供する前に、入力 `query` を複数のステップに分割します。エージェントは、推論プロセス中に関連情報を取得するためのツールとして `RAG Retrieval service` と `Database Query service` を使用します。推論プロセスとアクションプロセスが完了すると、エージェントはレスポンスとして最終的な回答を生成します。
+ ステップ 3 – オーケストレーション Lambda 関数からのレスポンスが、出力として Streamlit アプリケーションに送信されます。

## ツール
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-tools"></a>

**AWS サービス**
+ 「[Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/what-is.html)」は、標準 SQL を使用して Amazon Simple Storage Service (Amazon S3) 内のデータを直接分析できるようにするインタラクティブなクエリサービスです。
+ [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/what-is-bedrock.html) は、主要な AI スタートアップ企業や Amazon が提供する高パフォーマンスな基盤モデル (FM) を、統合 API を通じて利用できるようにするフルマネージド型サービスです。
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) は、AWS クラウドインフラストラクチャをコードで定義してプロビジョニングするのに役立つソフトウェア開発フレームワークです。
+ 「[AWS コマンドラインインターフェイス (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)」は、オープンソースのツールであり、コマンドラインシェルのコマンドを使用して AWS サービスとやり取りすることができます。
+ 「[Amazon Elastic Container Service (Amazon ECS)](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html)」 は、クラスターでのコンテナの実行、停止、管理を支援する、高速でスケーラブルなコンテナ管理サービスです。
+ [AWS Glue](https://docs.aws.amazon.com/glue/) は、フルマネージド型の抽出、変換、ロード (ETL) サービスです。これにより、データストアとデータストリーム間でのデータの確実な分類、整理、強化、移動をサポートできます。このパターンでは、AWS Glue クローラーと AWS Glue データカタログテーブルを使用します。
+ [Amazon Kendra](https://docs.aws.amazon.com/kendra/latest/dg/what-is-kendra.html) は、自然言語処理と高度な機械学習アルゴリズムを使用して、データから検索に関する質問に対する特定の回答を返すインテリジェント検索サービスです。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) は、任意の量のデータを保存、保護、取得する上で役立つクラウドベースのオブジェクトストレージサービスです。
+ 「[Elastic Load Balancing (ELB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html)」は、受信するアプリケーションまたはネットワークのトラフィックを複数のターゲットに分散します。例えば、1 つ以上のアベイラビリティゾーンにある Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、コンテナ、および IP アドレス間でトラフィックを分散できます。

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

このパターンのコードは GitHub の [genai-bedrock-chatbot](https://github.com/awslabs/genai-bedrock-chatbot) リポジトリで入手できます。

コードリポジトリには以下のファイルとフォルダが含まれています。
+ `assets` フォルダ - アーキテクチャ図とパブリックデータセットの静的アセット
+ `code/lambda-container` フォルダ - Lambda 関数で実行される Python コード
+ `code/streamlit-app` フォルダ - Amazon ECS のコンテナイメージとして実行される Python コード
+ `tests` フォルダ - AWS CDK コンストラクトをユニットテストするために実行される Python ファイル
+ `code/code_stack.py` - AWS リソースの作成に使用される AWS CDK コンストラクト Python ファイル
+ `app.py` - ターゲット AWS アカウントで AWS リソースをデプロイするために使用される AWS CDK スタック Python ファイル
+ `requirements.txt` - AWS CDK のためにインストールする必要があるすべての Python 依存関係のリスト
+ `requirements-dev.txt` - AWS CDK でユニットテストスイートを実行するためにインストールする必要があるすべての Python 依存関係のリスト
+ `cdk.json` — リソースの起動に必要な値を提供する入力ファイル


| 
| 
| 注記: AWS CDK コードは、ソリューションをデプロイするために、[L3 (レイヤー 3) コンストラクト](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html)と [AWS によって管理される AWS Identity and Access Management (IAM) ポリシー](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)を使用します。 | 
| --- |

## ベストプラクティス
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-best-practices"></a>
+ ここに示すコード例は、PoC (概念実証) またはパイロットデモ専用です。コードを本番環境に移行する場合は、次のベストプラクティスに従ってください。
  + [Amazon S3 アクセスログ記録が有効になっていること](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-server-access-logging.html)。
  + [VPC フローログが有効になっていること](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html)。
  + [Amazon Kendra Enterprise Edition インデックス](https://docs.aws.amazon.com/whitepapers/latest/how-aws-pricing-works/amazon-kendra.html)が有効になっていること。
+ Lambda 関数のモニタリングとアラートを設定します。詳細については、[Lambda 関数をモニタリングおよびトラブルシューティングする](https://docs.aws.amazon.com/lambda/latest/dg/lambda-monitoring.html)を参照してください。Lambda 関数を使用する際の一般的なベストプラクティスについては、[AWS ドキュメント](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html)を参照してください。

## エピック
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-epics"></a>

### ローカルマシンで AWS 認証情報をセットアップする
<a name="set-up-aws-credentials-on-your-local-machine"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| スタックをデプロイするアカウントと AWS リージョンの変数をエクスポートします。 | 環境変数を使用して AWS CDK の AWS 認証情報を提供には、次のコマンドを実行します。<pre>export CDK_DEFAULT_ACCOUNT=<12 Digit AWS Account Number><br />export CDK_DEFAULT_REGION=<region></pre> | DevOps エンジニア、AWS DevOps | 
| AWS CLI プロファイルをセットアップします。 | アカウントの AWS CLI プロファイルを設定するには、[AWS ドキュメント](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/keys-profiles-credentials.html)の指示に従います。 | DevOps エンジニア、AWS DevOps | 

### 環境をセットアップします。
<a name="set-up-your-environment"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| ローカルマシンにリポジトリを複製します。 | リポジトリのクローンを作成するには、ターミナルで次のコマンドを実行します。<pre>git clone https://github.com/awslabs/genai-bedrock-chatbot.git</pre> | DevOps エンジニア、AWS DevOps | 
| Python 仮想環境を設定し、必要な依存関係をインストールします。 | Python 仮想環境をセットアップするには、次のコマンドを実行します。<pre>cd genai-bedrock-chatbot<br />python3 -m venv .venv<br />source .venv/bin/activate</pre>必要な依存関係をセットアップするには、次のコマンドを実行します。<pre>pip3 install -r requirements.txt</pre> | DevOps エンジニア、AWS DevOps | 
| AWS CDK 環境をセットアップし、AWS CDK コードを合成します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting.html) | DevOps エンジニア、AWS DevOps | 

### チャットベースのアシスタントアプリケーションを設定してデプロイする
<a name="configure-and-deploy-the-chat-based-assistant-application"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Claude モデルアクセスをプロビジョニングする。 | AWS アカウントの Anthropic Claude モデルアクセスを有効にするには、[Amazon Bedrock ドキュメント](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html#add-model-access)の手順に従います。 | AWS DevOps | 
| アカウントにリソースをデプロイします。 | AWS CDK を使用して AWS アカウントでリソースをデプロイするには、以下を実行します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting.html)デプロイが正常に完了したら、CloudFormation の**出力**セクションにある URL を使用して、チャットベースのアシスタントアプリケーションにアクセスすることができます。 | AWS DevOps、DevOps エンジニア | 
| AWS Glue クローラーを実行し、データカタログテーブルを作成します。 | [AWS Glue クローラー](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html)は、データスキーマを動的に保つために使用されます。このソリューションでは、オンデマンドでクローラーを実行することにより、[AWS Glue データカタログテーブル](https://docs.aws.amazon.com/athena/latest/ug/querying-glue-catalog.html)のパーティションを作成および更新します。CSV データセットファイルが S3 バケットにコピーされたら、AWS Glue クローラーを実行し、テスト用の Data Catalog テーブルスキーマを作成します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting.html)AWS CDK コードは、AWS Glue クローラーをオンデマンドで実行するように設定しますが、定期的に実行するように[スケジュール](https://docs.aws.amazon.com/glue/latest/dg/schedule-crawler.html)することもできます。 | DevOps エンジニア、AWS DevOps | 
| ドキュメントのインデックス作成を開始する。 | ファイルが S3 バケットにコピーされたら、Amazon Kendra を使用してクロールとインデックス付けを行います。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting.html)AWS CDK コードは、Amazon Kendra インデックス同期をオンデマンドで実行するように設定しますが、[スケジュールパラメータ](https://docs.aws.amazon.com/kendra/latest/dg/data-source.html#cron)を使用して定期的に実行することもできます。 | AWS DevOps、DevOps エンジニア | 

### ソリューション内のすべての AWS リソースをクリーンアップする
<a name="clean-up-all-aws-resources-in-the-solution"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| AWS リソースを削除します。 | ソリューションをテストしたら、リソースをクリーンアップします。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting.html) | DevOps エンジニア、AWS DevOps | 

## トラブルシューティング
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| AWS CDK はエラーを返します。 | AWS CDK の問題に関するヘルプは、[一般的な AWS CDK 問題をトラブルシューティングする](https://docs.aws.amazon.com/cdk/v2/guide/troubleshooting.html)を参照してください。 | 

## 関連リソース
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-resources"></a>
+ Amazon Bedrock:
  + [モデルアクセス](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html)
  + [基盤モデルの推論パラメータ](https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html)
+ [Python で Lambda 関数を構築する](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html)
+ [Get started with the AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html)
+ [Working with the AWS CDK in Python](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-python.html)
+ [AWS での生成 AI Application Builder](https://docs.aws.amazon.com/solutions/latest/generative-ai-application-builder-on-aws/solution-overview.html)
+ [LangChain ドキュメント](https://python.langchain.com/docs/get_started/introduction)
+ [Streamlit ドキュメント](https://docs.streamlit.io/)

## 追加情報
<a name="develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting-additional"></a>

**AWS CDK コマンド**

AWS CDK を使用する際は、以下の便利なコマンドに注意してください。
+ アプリ内のすべてのスタックを一覧表示

  ```
  cdk ls
  ```
+ 合成された AWS CloudFormation テンプレートを発行

  ```
  cdk synth
  ```
+ スタックをデフォルトの AWS アカウントとリージョンにデプロイ

  ```
  cdk deploy
  ```
+ デプロイされたスタックを現在の状態と比較

  ```
  cdk diff
  ```
+ AWS CDK ドキュメントを開く

  ```
  cdk docs
  ```
+ CloudFormation スタックを削除し、AWS にデプロイされたリソースを削除

  ```
  cdk destroy
  ```