Amazon Kendra と OpenAI により最新の AWS ユーザーガイドに基づいて回答するチャットアプリケーションのサンプルを試してみた

2023.05.10

Amazon Kendra と OpenAI などを利用して、AWS の最新のユーザーガイドに基づいた回答をしてもらえるチャットのサンプルアプリケーションが AWS Samples に公開されたため試してみました。

実際に構築して試してみたチャット画面です。Amazon Kendra が対応しているドキュメントタイプを質問し、ソースとなるユーザーガイドの URL と共に回答してくれました。回答に含まれている Microsoft Excel は 2023 年 1 月に対応したドキュメントタイプです。


サンプルアプリケーションは次のリポジトリにあります。

OpenAI 以外にも次の AI に対応しています。

  • Hugging Face
  • AI21 Labs
  • Cohere
  • Anthropic
  • OpneAI

サンプルの使い方を紹介している AWS ブログもあります。このブログを参考にサンプルアプリケーションの構築を試してみました。


2023.5.16 追記
AWS ブログの日本語翻訳版も公開されました


始めに構築するサンプルアプリケーションの構成を説明した後に、構築を試してみます。

構成図

本ブログで構築するサンプルアプリケーションの構成図を AWS ブログから抜粋して掲載します。

ユーザーがチャットで問い合わせると、アプリケーションが AWS ユーザーガイドの情報を取り込んだ Amazon Kendra にアクセスし、その回答を OpneAI に渡すことで、ユーザーへの回答を生成します。

サンプルアプリケーションの構築

冒頭で紹介した AWS ブログに記載されている手順 に沿って構築してみたいと思います。

今回利用したソフトウェアのバージョンは次の通りです。

  • Python 3.9.16
  • boto3 1.26.130
  • Streamlit 1.22.0
  • openai 0.27.6
  • langchain 0.0.163

アプリケーションを実行する環境は AWS Cloud9 を利用しました。主な設定は次の通りです。

  • インスタンスサイズ t2.micro
  • Platform Amazon Linux 2


Amazon Kendra の構築

サンプル用に CloudFormation テンプレートが用意されているため、今回は用意されているテンプレートを利用します。


AWS CloudShell に上記テンプレートをアップロードした後に次のコマンドで作成します。

aws cloudformation create-stack \
  --region ap-northeast-1 \
  --stack-name demo-kendora \
  --template-body file://kendra-docs-index.yaml \
  --capabilities CAPABILITY_NAMED_IAM


環境構築には 45 分ほどかかります。

完了後は Kendra のインデックスとデータソース、データソースとの同期を実行する Lambda、および、関連する IAM ロールが作成されます。

Kendra のデータソースのタイプはWebCrawler connectorであり、AWS ユーザーガイドの次の 3 つのサイトマップがクローリング先として設定されています。

https://docs.aws.amazon.com/sagemaker/latest/dg/sitemap.xml
https://docs.aws.amazon.com/lex/latest/dg/sitemap.xml
https://docs.aws.amazon.com/kendra/latest/dg/sitemap.xml

同期処理に関して、いくつかのソースがFailedになっていましたが、Addedのソースも多いためこのまま進めたいと思います。

データソースとの同期スケジュールはRun on demandで設定されており、定期的な同期は実施されません。この設定の場合は手動で同期が必要なため、AWS Lambda を利用して構築時に同期が実行されています。おそらく、Web クローリングをむやみに実行しないように考慮しているのだと思います。


なお、AWS ブログ上では、Amazon Kendora のクォータ増加のリクエストすることでエクスペリエンスが向上するとの記載がありますが、今回は実施しません。


Web アプリケーションの構築

AWS Cloud9 上でサンプルの Web アプリケーションを構築していきます。

Python

AWS ブログに Python 3.9 以降と指定があるため、Python のバージョンを変更します。現状のバージョンは次の通りです。

$ python --version
Python 3.7.16

Cloud9 上の Python のバージョン変更は次のブログを参考にして実施しました。

pyenv をインストールします。

$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv

$ ~/.pyenv/bin/pyenv --version
pyenv 2.3.17-9-g528d10e9

$ cat << 'EOT' >> ~/.bashrc
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
EOT

$ source ~/.bashrc

$ pyenv versions
* system (set by /home/ec2-user/.pyenv/version)

Python 3.9.16(最新バージョン)をインストールしてバージョンを切り替えます。

$ sudo yum -y update
$ sudo yum -y install bzip2-devel
$ sudo yum -y install xz-devel

$ pyenv install 3.9.16

$ pyenv versions
* system (set by /home/ec2-user/.pyenv/version)
  3.9.16

$ pyenv global 3.9.16

$ pyenv versions
  system
* 3.9.16 (set by /home/ec2-user/.pyenv/version)

$ python --version
Python 3.9.16


boto3

AWS SDK for Python (Boto3) をインストールします。

次のページに従ってインストールします。

必要に応じて、pip をアップグレードします。

$ /home/ec2-user/.pyenv/versions/3.9.16/bin/python3.9 -m pip install --upgrade pip

boto3 をインストールします。

$ pip3 install boto3
$ pip3 list | grep boto3
boto3           1.26.130


Streamlit

Python で Web アプリケーションを作成するための Streamlit をインストールします。

次のページに従ってインストールします。

$ pip3 install streamlit
$ streamlit --version
Streamlit, version 1.22.0

ローカル環境で Web サイトが閲覧できるか確認します。

$ streamlit hello --server.port 8080

上記コマンド実行後に、AWS Cloud9 のPreviewPreview Running Applicaitonを選択すると閲覧できます。


インストール時にも出力されますが、Streamlit は使用統計を収集します。オプトアウトしたい場合は、設定ファイルに次の内容を追記します。

[browser]
gatherUsageStats = false

設定ファイルがない場合は次のコマンドで作成できます。

$ mkdir ~/.streamlit
$ vi ~/.streamlit/config.toml

使用統計の収集のオプトアウト設定については次のページに記載があります。

Configuration - Streamlit Docs


OpenAI, LangChain

LangChain は次のページに従ってインストールします。

OpneAI をインストールします。API キーの環境変数は後で設定します。

$ pip3 install openai
$ openai --version
openai 0.27.6

LangChain をインストールします。

$ pip3 install langchain
$ pip3 list | grep langchain
langchain               0.0.163


サンプルアプリケーション

次のリポジトリのREADME.mdに従って構築します。

GitHub からクローンして構築していきます。

$ pwd
/home/ec2-user

$ git clone https://github.com/aws-samples/amazon-kendra-langchain-extensions.git
$ cd amazon-kendra-langchain-extensions

$ pip3 install .
$ pip3 install ".[samples]"

環境変数を設定します。

$ export AWS_REGION="ap-northeast-1"
$ export KENDRA_INDEX_ID="dd6d896b-704e-46f9-9ab6-5adffexample"
$ export OPENAI_API_KEY="..."

REGIONは Amazon Kendra を構築しているリージョンを指定します。今回の場合は Amazon Kendra を構築する CloudFormation スタックを作成したリージョンです。

KENDRA_INDEX_IDは Amazon Kendra のインデックスの ID を指定します。マネジメントコンソールから確認するか次のコマンドで確認します。

$ aws kendra list-indices
{
    "IndexConfigurationSummaryItems": [
        {
            "Status": "ACTIVE",
            "Name": "demo-kendora-Index",
            "Edition": "DEVELOPER_EDITION",
            "UpdatedAt": 1683642249.785,
            "Id": "dd6d896b-704e-46f9-9ab6-5adffexample",
            "CreatedAt": 1683642249.785
        }
    ]
}

OPENAI_API_KEYは OpenAI の API キーを指定します。本ブログ上ではマスキングしています。


サンプルアプリケーションを実行します。

$ cd samples
$ streamlit run app.py openai --server.port 8080

AWS Cloud9 のPreviewPreview Running Applicaitonを選択すると閲覧できます。

後は質問するだけです。


動作確認

Amazon Kendra のデータソースとして次の AWS サービスのユーザーガイドを取り込んでいるため、関連する質問をしてみます。

  • Amazon Lex
  • Amazon SageMaker
  • Amazon Kendra

Amazon Kendra が対応している全てのドキュメントタイプを聞いてみました。

ソースとして提示されている 2 つ目のリンクに得たい情報がありました。

Unstructured text

Amazon Kendra supports the following types of unstructured text:

  • HTML files
  • Microsoft PowerPoint (PPT) presentations
  • MS WORD documents
  • Plain text documents
  • PDFs
  • Comma Separated Values (CSV) files
  • Microsoft Excel (MS EXCEL) files
  • XML files
  • JSON files
  • Markdown Documentation (MD) files
  • Rich Text Format (RTF) files
  • Extensible Stylesheet Language Transformation (XSLT) files

引用元:Types of documents - Amazon Kendra

チャットの回答とリンク先を見比べてみると JSON が抜けていたものの 2023 年 1 月に対応した Microsoft Excel などが含まれています。


追加で JSON に対応しているかを聞いてみました。

No との回答ですが、JSON はプレーンテキストとして扱われるとのことでした。ソースのユーザーガイドにもその旨の記載がありました。なるほど、と思いました。

If you want to use a JSON file for your set of frequently asked questions and answers, JSON files are treated as plain text and is a type of unstructured text.

よくある質問と回答に JSON ファイルを使用する場合、JSON ファイルはプレーンテキストとして扱われ、非構造化テキストの一種です。

引用元:Types of documents - Amazon Kendra


以上で、サンプルアプリケーションのお試しは終わりです。


(補足)Amazon Kendra の料金

Amazon Kendra の料金は次のページで確認できます。

Developer Edition でインデックスを構築する場合に1.125 USD/時間かかり、1 日(24 時間)に換算すると27 USD/日です。また、コネクタの同期やスキャンしたドキュメントにも追加料金があります。

そのため、事前に料金を確認してから試すことをおすすめします。

さいごに

AWS が公開している、Amazon Kendra と OpenAI、Langchain などを利用して、AWS の最新のユーザーガイドに基づいた回答をしてもらえるチャットのサンプルアプリケーションを試してみました。

今回の構築では、Amazon Kendra に AWS ユーザーガイドを取り込みましたが、S3 に社内ドキュメントやマニュアルなどを格納して Kendra に取り込むこともできるので独自のドキュメントに基づいたチャットもできそうです。

以上、このブログがどなたかのご参考になれば幸いです。