RAG と ReAct プロンプトを使用して高度な生成 AI チャットベースのアシスタントを開発する - AWS 規範ガイダンス

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

RAG と ReAct プロンプトを使用して高度な生成 AI チャットベースのアシスタントを開発する

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

概要

一般的な企業では、データの 70% がサイロ化されたシステムにトラップされています。生成 AI を活用したチャットベースのアシスタントを使用して、自然言語のやり取りを通じて、これらのデータサイロ間のインサイトと関係性を引き出すことができます。生成 AI を最大限に活用するには、出力の信頼性の高さと正確さ、出力に利用可能な企業データが含まれていることが必要となります。チャットベースのアシスタントの成否は、以下によって決まります。

  • 生成 AI モデル (Anthropic Claude 2 など)

  • データソースのベクトル化

  • モデルをプロンプトするための ReAct フレームワークなどの高度な推論手法

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

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

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

前提条件と制限

前提条件

制限事項

  • LangChain は、すべての LLM のストリーミングをサポートしているわけではありません。Anthropic Claude モデルはサポートされていますが、AI21 Labs のモデルはサポートされていません。

  • このソリューションは単一 AWS アカウントにデプロイされます。

  • このソリューションは、Amazon Bedrock と Amazon Kendra が利用可能な AWS リージョンでのみデプロイできます。詳細は、Amazon BedrockAmazon Kendra のドキュメントを参照してください。

製品バージョン

  • Python バージョン 3.11 以降

  • Streamlit バージョン 1.30.0 以降

  • Streamlit-chat バージョン 0.1.1 以降

  • LangChain バージョン 0.1.12 以降

  • AWS CDK バージョン 2.132.1 以降

アーキテクチャ

ターゲットテクノロジースタック

  • 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 に接続して、チャットベースのアシスタントユーザーからのクエリ (質問) に応答します。

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

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

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

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

アーキテクチャ図。
  • ステップ 1 – 入力 query (質問) が 3 つのインテントのいずれかに分類されます。

    • 一般的な SageMaker ガイダンスに関する質問

    • 一般的な SageMaker 料金 (トレーニング/推論) に関する質問

    • SageMaker と料金に関する複雑な質問

  • ステップ 2 – 入力 query が 3 つのサービスのいずれかを開始します。

    • RAG Retrieval service: Amazon Kendra ベクトルデータベースから関連するコンテキストを取得し、Amazon Bedrock を介して LLM を呼び出して、取得したコンテキストをレスポンスとして要約します。

    • Database Query service: LLM、データベースメタデータ、および関連するテーブルのサンプル行を使用して、入力 query を SQL クエリに変換します。Database Query サービスは、Amazon Athena を介して SageMaker 料金データベースに対して SQL クエリを実行し、クエリ結果をレスポンスとして要約します。

    • In-context ReACT Agent service: レスポンスを提供する前に、入力 query を複数のステップに分割します。エージェントは、推論プロセス中に関連情報を取得するためのツールとして RAG Retrieval serviceDatabase Query service を使用します。推論プロセスとアクションプロセスが完了すると、エージェントはレスポンスとして最終的な回答を生成します。

  • ステップ 3 – オーケストレーション Lambda 関数からのレスポンスが、出力として Streamlit アプリケーションに送信されます。

ツール

AWS サービス

  • Amazon Athena」は、標準 SQL を使用して Amazon Simple Storage Service (Amazon S3) 内のデータを直接分析できるようにするインタラクティブなクエリサービスです。

  • Amazon Bedrock は、主要な AI スタートアップ企業や Amazon が提供する高パフォーマンスな基盤モデル (FM) を、統合 API を通じて利用できるようにするフルマネージド型サービスです。

  • AWS Cloud Development Kit (AWS CDK) は、AWS クラウドインフラストラクチャをコードで定義してプロビジョニングするのに役立つソフトウェア開発フレームワークです。

  • AWS コマンドラインインターフェイス (AWS CLI)」は、オープンソースのツールであり、コマンドラインシェルのコマンドを使用して AWS サービスとやり取りすることができます。

  • Amazon Elastic Container Service (Amazon ECS)」 は、クラスターでのコンテナの実行、停止、管理を支援する、高速でスケーラブルなコンテナ管理サービスです。

  • AWS Glue は、フルマネージド型の抽出、変換、ロード (ETL) サービスです。これにより、データストアとデータストリーム間でのデータの確実な分類、整理、強化、移動をサポートできます。このパターンでは、AWS Glue クローラーと AWS Glue データカタログテーブルを使用します。

  • Amazon Kendra は、自然言語処理と高度な機械学習アルゴリズムを使用して、データから検索に関する質問に対する特定の回答を返すインテリジェント検索サービスです。

  • AWS Lambda は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。

  • Amazon Simple Storage Service (Amazon S3) は、任意の量のデータを保存、保護、取得する上で役立つクラウドベースのオブジェクトストレージサービスです。

  • Elastic Load Balancing (ELB)」は、受信するアプリケーションまたはネットワークのトラフィックを複数のターゲットに分散します。例えば、1 つ以上のアベイラビリティゾーンにある Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、コンテナ、および IP アドレス間でトラフィックを分散できます。

コードリポジトリ

このパターンのコードは GitHub の 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) コンストラクトAWS によって管理される AWS Identity and Access Management (IAM) ポリシーを使用します。

ベストプラクティス

エピック

タスク説明必要なスキル

スタックをデプロイするアカウントと AWS リージョンの変数をエクスポートします。

環境変数を使用して AWS CDK の AWS 認証情報を提供には、次のコマンドを実行します。

export CDK_DEFAULT_ACCOUNT=<12 Digit AWS Account Number> export CDK_DEFAULT_REGION=<region>
DevOps エンジニア、AWS DevOps

AWS CLI プロファイルをセットアップします。

アカウントの AWS CLI プロファイルを設定するには、AWS ドキュメントの指示に従います。

DevOps エンジニア、AWS DevOps
タスク説明必要なスキル

ローカルマシンにリポジトリを複製します。

リポジトリのクローンを作成するには、ターミナルで次のコマンドを実行します。

git clone https://github.com/awslabs/genai-bedrock-chatbot.git
DevOps エンジニア、AWS DevOps

Python 仮想環境を設定し、必要な依存関係をインストールします。

Python 仮想環境をセットアップするには、次のコマンドを実行します。

cd genai-bedrock-chatbot python3 -m venv .venv source .venv/bin/activate

必要な依存関係をセットアップするには、次のコマンドを実行します。

pip3 install -r requirements.txt
DevOps エンジニア、AWS DevOps

AWS CDK 環境をセットアップし、AWS CDK コードを合成します。

  1. AWS アカウントで AWS CDK 環境を設定するには、次のコマンドを実行します。

    cdk bootstrap aws://ACCOUNT-NUMBER/REGION
  2. コードを AWS CloudFormation スタック設定に変換するには、cdk synth コマンドを実行します。

DevOps エンジニア、AWS DevOps
タスク説明必要なスキル

Claude モデルアクセスをプロビジョニングする。

AWS アカウントの Anthropic Claude モデルアクセスを有効にするには、Amazon Bedrock ドキュメントの手順に従います。

AWS DevOps

アカウントにリソースをデプロイします。

AWS CDK を使用して AWS アカウントでリソースをデプロイするには、以下を実行します。

  1. クローンしたリポジトリのルートにある cdk.json ファイルに、logging パラメータを入力します。値の例は、INFODEBUGWARN、および ERROR です。

    これらの値は、Lambda 関数と Streamlit アプリケーションのログレベルのメッセージを定義するものです。

  2. クローンされたリポジトリのルートにある app.py ファイルには、デプロイに使用される AWS CloudFormation スタック名が記述されています。デフォルトのスタック名は chatbot-stack です。

  3. リソースをデプロイするには、cdk deploy コマンドを実行します。

    cdk deploy コマンドは L3 コンストラクトを使用して、ドキュメントと CSV データセットファイルを S3 バケットにコピーするための複数の Lambda 関数を作成します。

  4. コマンドが完了したら、AWS マネジメントコンソールにサインインし、CloudFormation コンソールを開き、スタックが正常にデプロイされたことを確認します

デプロイが正常に完了したら、CloudFormation の出力セクションにある URL を使用して、チャットベースのアシスタントアプリケーションにアクセスすることができます。

AWS DevOps、DevOps エンジニア

AWS Glue クローラーを実行し、データカタログテーブルを作成します。

AWS Glue クローラーは、データスキーマを動的に保つために使用されます。このソリューションでは、オンデマンドでクローラーを実行することにより、AWS Glue データカタログテーブルのパーティションを作成および更新します。CSV データセットファイルが S3 バケットにコピーされたら、AWS Glue クローラーを実行し、テスト用の Data Catalog テーブルスキーマを作成します。

  1. AWS Glue コンソールに移動します。

  2. ナビゲーションペインの [Data Catalog (データカタログ)] で、[Crawlers (クローラー)] を選択します。

  3. サフィックス sagemaker-pricing-crawler が付いたクローラーを選択します。

  4. クローラーを実行します。

  5. クローラーが正常に実行されると、AWS Glue データカタログテーブルが作成されます。

注記

AWS CDK コードは、AWS Glue クローラーをオンデマンドで実行するように設定しますが、定期的に実行するようにスケジュールすることもできます。

DevOps エンジニア、AWS DevOps

ドキュメントのインデックス作成を開始する。

ファイルが S3 バケットにコピーされたら、Amazon Kendra を使用してクロールとインデックス付けを行います。

  1. Amazon Kendra コンソールに移動します。

  2. サフィックス chatbot-index が付いたインデックスを選択します。

  3. ナビゲーションペインで、[データソース] を選択し、サフィックス chatbot-index が付いたデータソースコネクタを選択します。

  4. [今すぐ同期する] を選択して、インデックス作成プロセスを開始します。

注記

AWS CDK コードは、Amazon Kendra インデックス同期をオンデマンドで実行するように設定しますが、スケジュールパラメータを使用して定期的に実行することもできます。

AWS DevOps、DevOps エンジニア
タスク説明必要なスキル

AWS リソースを削除します。

ソリューションをテストしたら、リソースをクリーンアップします。

  1. ソリューションによってデプロイされた AWS リソースを削除するには、cdk destroy コマンドを実行します。

  2. 2 つの S3 バケットからすべてのオブジェクトを削除してから、バケットを削除します。

    詳細については、バケットを削除するを参照してください。

DevOps エンジニア、AWS DevOps

トラブルシューティング

問題ソリューション

AWS CDK はエラーを返します。

AWS CDK の問題に関するヘルプは、一般的な AWS CDK 問題をトラブルシューティングするを参照してください。

関連リソース

追加情報

AWS CDK コマンド

AWS CDK を使用する際は、以下の便利なコマンドに注意してください。

  • アプリ内のすべてのスタックを一覧表示

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

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

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

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

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

    cdk destroy