Amazon Kendra HANDS-ON に参加してみた #jawsug #jawsugyokohama
こんにちは!AWS事業本部コンサルティング部のたかくに(@takakuni_)です。
JAWS-UG 横浜 #58 で Amazon Kendra のハンズオンを行ったため、ハンズオンの参加レポートを書きたいと思います。
今回のイベントでは、アマゾン ウェブ サービス ジャパン合同会社 の 関谷さんをお招きして、 Kendra の概要や使い方をご説明いただいた後に、ハンズオンを行う流れでした。
Amazon Kendra について新機能/ソリューションを含めてご説明いただき、とても有意義な会でした。
やってみた
ハンズオンの流れをおさらいしてみようと思います。
以下の URL をベースにハンズオンが行われましたが、手順にないものもあったので、もう一度やってみようと思います。(今回は東京リージョンでデプロイします。)
CloudFormation スタックのデプロイ
URL に記載されている CloudFormation テンプレートをダウンロードしてデプロイします。
リソースの作成(特に インデックスの作成)には、45分程度かかります。次の手順(Cloud9の作成)を先に進めておきましょう。
Cloud9 の作成
Streamlit を起動する Cloud9 環境を立ち上げます。インスタンスタイプは大きめの m5.large を利用します。
Python のインストール
現在の Python のバージョンを確認すると 3.7 であることがわかります。
cm-takakuni.shinnosuke:~/environment $ python -V Python 3.7.16
Python3.7 では LangChain が動かないため、 Python 3.8 をインストールしていきます。 (今回は直にインストールしていますが、必要に応じて仮想環境をご利用ください。)
sudo amazon-linux-extras install -y python3.8 sudo ln -sf /usr/bin/python3.8 /usr/bin/python3 pip install urllib3==1.26.6
Streamlit のインストール
Streamlit を利用して Web アプリケーションを構成しているため、インストールしていきます。
pip install streamlit
セキュリティグループの許可
Streamlit で利用するポートの開放を行います。デフォルトでは、 8501 番ポートが利用されます。
Streamlit のテスト
Streamlit のテストをしてみましょう。streamlit hello
コマンドを実行し、 External URL の URL を踏んでみます。
takakuni:~/environment $ streamlit hello Collecting usage statistics. To deactivate, set browser.gatherUsageStats to False. Welcome to Streamlit. Check out our demo in your browser. Network URL: http://172.31.10.134:8501 External URL: http://192.0.2.96:8501 Ready to create your own Python apps super quickly? Head over to https://docs.streamlit.io May you create awesome apps!
正しく、セキュリティグループの許可および、アプリケーションが実行されていれば、以下のような画面になると思います。問題なければ ctrl + c
で停止します。
OpenAI, Langchain のインストール
OpenAI, Langchain のインストールを行います。
pip install langchain pip install openai
アプリケーションのデプロイ
最後にサンプルアプリケーションのデプロイを行います。
まずは、アプリケーションファイルのクローン、インストールを行います。
cd ~/environment git clone https://github.com/aws-samples/amazon-kendra-langchain-extensions.git cd ~/environment/amazon-kendra-langchain-extensions pip install .
環境変数を設定します。
AWS_REGION, KENDRA_INDEX_ID は、 CloudFormation テンプレートの出力タブに表示されているものを利用して下さい。 OPENAI_API_KEY は、 OpenAI の API キーを指定します。
export AWS_REGION="<YOUR_AWS_REGION>" export KENDRA_INDEX_ID="<YOUR_KENDRA_INDEX_ID>" export OPENAI_API_KEY="<YOUR_OPENAI_API_KEY>"
サンプルアプリケーションを起動します。
cd ~/environment/amazon-kendra-langchain-extensions/samples streamlit run app.py openai
streamlit hello
コマンドでテストした場合と同じく、 External URL をクリックします。
入力キーが表示され「What is Kendra」と質問すると、Amazon Kendra についての回答が返ってきました。ソース付きで返ってくるのが、とてもいいですね。
日本語で回答してほしいな...
日本語で質問すると、回答が英語で返ってきました。
日本語で回答できるよう、アプリケーションを変更してみましょう。
kendra_chat_open_ai.py の prompt_template を以下のように変更してみましょう。
from aws_langchain.kendra_index_retriever import KendraIndexRetriever from langchain.chains import ConversationalRetrievalChain from langchain.prompts import PromptTemplate from langchain import OpenAI import sys import os MAX_HISTORY_LENGTH = 5 def build_chain(): region = os.environ["AWS_REGION"] kendra_index_id = os.environ["KENDRA_INDEX_ID"] llm = OpenAI(batch_size=5, temperature=0, max_tokens=300) retriever = KendraIndexRetriever(kendraindex=kendra_index_id, awsregion=region, return_source_documents=True) prompt_template = """ 以下は、人間と AI のフレンドリーな会話です。 AI は饒舌で、その文脈から具体的な内容をたくさん提供してくれます。 AI は質問に対して答えがわからない場合、正直に「わかりません」と答えます。 {context} 指示:上記の資料に基づき、 {question} に対する詳細な答えを述べよ。文書に存在しない場合は正直に「わかりません」と答えなさい。解答してください: """ PROMPT = PromptTemplate( template=prompt_template, input_variables=["context", "question"] ) return ConversationalRetrievalChain.from_llm(llm=llm, retriever=retriever, qa_prompt=PROMPT, return_source_documents=True) def run_chain(chain, prompt: str, history=[]): return chain({"question": prompt, "chat_history": history}) if __name__ == "__main__": class bcolors: HEADER = '\033[95m' OKBLUE = '\033[94m' OKCYAN = '\033[96m' OKGREEN = '\033[92m' WARNING = '\033[93m' FAIL = '\033[91m' ENDC = '\033[0m' BOLD = '\033[1m' UNDERLINE = '\033[4m' qa = build_chain() chat_history = [] print(bcolors.OKBLUE + "Hello! How can I help you?" + bcolors.ENDC) print(bcolors.OKCYAN + "Ask a question, start a New search: or CTRL-D to exit." + bcolors.ENDC) print(">", end=" ", flush=True) for query in sys.stdin: if (query.strip().lower().startswith("new search:")): query = query.strip().lower().replace("new search:","") chat_history = [] elif (len(chat_history) == MAX_HISTORY_LENGTH): chat_history.pop(0) result = run_chain(qa, query, chat_history) chat_history.append((query, result["answer"])) print(bcolors.OKGREEN + result['answer'] + bcolors.ENDC) if 'source_documents' in result: print(bcolors.OKGREEN + 'Sources:') for d in result['source_documents']: print(d.metadata['source']) print(bcolors.ENDC) print(bcolors.OKCYAN + "Ask a question, start a New search: or CTRL-D to exit." + bcolors.ENDC) print(">", end=" ", flush=True) print(bcolors.OKBLUE + "Bye" + bcolors.ENDC)
アプリケーションを再度、起動すると日本語で回答してくれるようになりました!
まとめ
Kendra をデプロイした CloudFormation スタック, Cloud9 環境, CloudWatch Logs, OpenAI の API キーを削除して後片付け終了です。
以上、「Amazon Kendra HANDS-ON に参加してみた」でした!従量課金で手っ取り早く検証できる部分とてもいいですね。また別のコネクターを利用して検索システムを作ってみたいと思いました。
この記事がどなたかの参考になれば幸いです。AWS事業本部コンサルティング部のたかくに(@takakuni_)でした!