Amazon Kendra + Chat GPT 社内情報検索アプリ開発のサンプルを試してみた

# はじめに
AWSから生成系AI + Amazon Kendraを用いて、回答を社内情報のみに限定することが可能なチャットアプリケーションの[サンプル](https://github.com/aws-samples/amazon-kendra-langchain-extensions)が公開されていたので試してみた。
↓↓
[高精度な生成系 AI アプリケーションを Amazon Kendra、LangChain、大規模言語モデルを使って作る](https://aws.amazon.com/jp/blogs/news/quickly-build-high-accuracy-generative-ai-applications-on-enterprise-data-using-amazon-kendra-langchain-and-large-language-models/)


本記事ではサンプルを試してみるのみ。
次回以降のどっかで自分用に改造してみようと思うよー。

# 作るもの
こういうのができます！！
アプリはStreamlitで作られていて、テキストを入力するとKendraが呼び出されて情報を検索、検索された情報を生成系AIで文章を作成している感じですね。
![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/4b6d1612-3944-6cbc-eba1-0e21fd321c60.png)

# サンプルアプリケーションを構築していく。
元ネタ：[高精度な生成系 AI アプリケーションを Amazon Kendra、LangChain、大規模言語モデルを使って作る](https://aws.amazon.com/jp/blogs/news/quickly-build-high-accuracy-generative-ai-applications-on-enterprise-data-using-amazon-kendra-langchain-and-large-language-models/)

↑↑の手順通り進めていけば構築できます。（はずです）

## Amazon Kendraインデックス作成
[サンプル](https://github.com/aws-samples/amazon-kendra-langchain-extensions)に含まれるCloudFormationのテンプレートを利用してAmazon Kendraを作成します。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/e0466290-f049-ae13-4b9f-2afae2c09ff5.png)
サンプルファイル内に"kendra-docs-index.yaml"があります。
・AWSオンラインドキュメントを取り込んだKendraインデックス
・データ同期用のLambda
・上記関連のIAMロール
が作成されます。
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
```

## アプリ構築
### Cloud 9構築 
アプリケーションはCloud 9で実行させます。（個人PCでも問題ありません）
とりあえずVPC作成します。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/2c6b4a05-961d-54e1-905e-05546e00aa92.png)

Cloud 9を構築します。
インスタンスタイプはt2.microで問題なくいけました。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/bac803a9-cf6e-effd-3a5b-c9962d17c32f.png)

### 諸々のインストール
Cloud 9に以下をインストールします。
・Python(3.9以上)
・Boto3
・Streamlit
・OpenAI
・LangChain
```
#Cloud 9って初期ではPython 3.7とかなのでアップデートします。
$ pyenv install 3.9

$ pyenv global 3.9

$ python --version
  Python 3.9

#Boto3をインストールします。
$ pip3 install boto3

#Streamlitをインストールします。
#PythonのWeb開発用のフレームワークですね。
$ pip3 install streamlit

#OpenAIをインストールします。
$ pip3 install openai

#LangChainをインストールします。
$ pip3 install langchain
```


このタイミングでWebサイトが閲覧できるか試しておきましょう。。
```
$ streamlit hello --server.port 8080
```
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/e7c0a195-73b9-797e-0fae-74f30b5040c7.png)

### サンプルをクローンする
[サンプル](https://github.com/aws-samples/amazon-kendra-langchain-extensions)の中にサンプルアプリケーション"kendra_retriever_samples"があります。
```
$ git clone https://github.com/aws-samples/amazon-kendra-langchain-extensions.git
$ cd amazon-kendra-langchain-extensions
```

### 環境変数を設定
サンプルアプリケーションを実行する前に使用するKendraインデックスのIDとOpenAIのAPIが必要になります。
（今回はOpenAIを利用しますが、Flan-T5-XL等を利用する場合はそれらの環境変数にAPIを代入します）
AWS_REGION：構築したリージョン
KENDRA_INDEX_ID：KendraインデックスのID
OPENAI_API_KEY：OpenAIのAPI（各自で取得する必要あり）
```
export AWS_REGION="<YOUR-AWS-REGION>"
export KENDRA_INDEX_ID="<YOUR-KENDRA-INDEX-ID>"
export FLAN_XL_ENDPOINT="<YOUR-SAGEMAKER-ENDPOINT-FOR-FLAN-T-XL>"
export FLAN_XXL_ENDPOINT="<YOUR-SAGEMAKER-ENDPOINT-FOR-FLAN-T-XXL>"
export OPENAI_API_KEY="<YOUR-OPEN-AI-API-KEY>"
export ANTHROPIC_API_KEY="<YOUR-ANTHROPIC-API-KEY>"
```

# サンプルアプリケーションの実行
```
$ cd kendra_retriever_samples
$ streamlit run app.py openai --server.port 8080
```
適当に検索してみました。
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/89d11ad1-cf27-438e-5ec4-e86830eec510.png)

Kendraインデックスの検索で引っかからない内容に対しては「知りません」と回答するようにプロンプトが書かれていました。笑笑
この辺りちょっと変更を加えて、Kendraに読み込ますデータを変えるだけで自由に生成系AIを用いたアプリケーションが開発できそうです。
この辺りは次回試してみようかと、、

# おわり
終わりです～。
アプリをコンテナ化してECSに乗せるだけで実際に使えそうなレベルのアプリだったんじゃないですか？
（まだそこまでしっかり見きれていないのでわかりませんが、、）
生成系AIや機械学習はいつかどこかでしっかりと触れてみたいところ。