Amazon BedrockとStreamlitでチャットボットを作成してみた

## はじめに
Amazon BedrockとStreamlitでチャットボットを作成してみました。
Amazon Bedrockのclaudeを用いて、サンプルアプリを開発してみたい方におすすめです。

## 開発環境
- Windows 11
- Python 3.11.0
- AWS CLI 2.13.29


## 実装
### Amazon Bedrockで使用するモデルの有効化
AWS Amazon Bedrockのページに移動し、「Model Access」を選択、Claudeが「Access granted」になっていない場合は、右上の「edit」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/3971fe54-7043-6287-0e34-eca1208e8623.png)

「Anthropic」にチェックを入れ、「Save changes」を選択します。
![記事投稿用 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/07d177dc-a4f8-ae2c-47dd-aff2fc237653.png)

数分間はステータスが「In Progress」となるので、待機します。
![画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/319ae9c9-6f3c-f7a7-0d33-cee11eb78f7c.png)

数分おきに更新ボタンを押して、ステータスが「Access granted」になれば有効化の完了です。
![画像 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/a4e62dce-6865-5dfc-80ad-5fb757e1141b.png)


### IAMの設定
次に、IAMの設定を行います。
AWS IAMの「ユーザー」タブに移動して、任意のユーザーを選択または作成します。
「セキュリティ認証情報」タブから、「アクセスキーを作成」を選択します。
![記事投稿用 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/44dedff3-f3f1-5936-7e9f-5c8a51914447.png)

ユースケースは「コマンドラインインターフェイス(CLI)を選択し、「次へ」を選択します。
![記事投稿用 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/ff30b6d6-dc87-4290-3cab-635ce9c7246a.png)

説明タグ値の入力は任意となるため、入力せずに「アクセスキーを作成」を選択します。
![記事投稿用 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/3903c5d6-329f-0493-d490-bf29360b93b3.png)

アクセスキーとシークレットキーをメモして「完了」を選択します。
![記事投稿用 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/a01e1de5-1d4e-20c0-59a2-0c264249f148.png)

続いて、Amazon Bedrock用の許可ポリシーを作成します。
本記事を作成した時点では、Bedrock専用の許可ポリシーは存在しなかったため、インラインポリシーを作成します。
IAMの「ユーザー」のページに移動し、「許可を追加」から「インラインポリシーを作成」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/eb826c5c-b2e7-2f01-67d3-0f60d51efdc0.png)

ポリシーエディタは「JSON」を選択し、中身を書き換え（コードの内容は、以下の画像の直下に記載）、「次へ」を選択します。
![記事投稿用 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/3bdc469d-77c3-a395-9556-6b05c8b6610e.png)

JSONの中身はこちらです。
```json
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "Statement1",
			"Effect": "Allow",
			"Action": "bedrock:*",
			"Resource": "*"
		}
	]
}
```

ポリシー名を「BedrockFullAccess」とし、「ポリシーの作成」を選択します。
![記事投稿用 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/8708712f-1719-0069-5f8a-784bf4791386.png)

　　
続いて、AWS CLIをインストールしていない場合は、インストールします。
以下の記事を参考にして、インストールしてください。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

今回のチャットボットを実行するディレクトリに移動し、AWS CLIがインストールされたかを以下のコマンドで確認します。
```
aws --version

aws-cli/2.13.29 Python/3.11.6 Windows/10 exe/AMD64 prompt/off
```
結果が表示されれば、インストールされています。

以下のコマンドで、アクセスキーとシークレットキーを設定します。
最初は空の状態なので、ご自身のアクセスキーやシークレットキーを入力し、エンターキーを押してください。region nameは「us-east-1」、output formatは「json」にしてください。
```
aws configure

AWS Access Key ID [****************YK63]:
AWS Secret Access Key [****************2DbP]:
Default region name [us-east-1]:
Default output format [json]:
```

これでIAMの設定は完了です。


### チャットボットの作成
以下の記事を参考にして、チャットボットを作成します。

https://qiita.com/moritalous/items/c9e8fce7514345af5cd2

#### 必要なライブラリやフレームワークのインストールとインポート
まずは必要なライブラリやフレームワークをインストールしてインポートします。
最初に、ターミナルでLangChainとstreamlitをインストールしましょう。
```
pip install langchain streamlit
```

次に、Pythonファイルでインポートしていきます。
```test.py
from langchain.chains import LLMChain
from langchain.llms import Bedrock
from langchain.memory import ConversationBufferMemory
from langchain.memory.chat_message_histories import StreamlitChatMessageHistory
from langchain.prompts import PromptTemplate

import streamlit as st
```
1. `from langchain.chains import LLMChain`：LangChainの基本的なチェーンの一つで、プロンプトテンプレートと言語モデルを組み合わせて使用します。
1. `from langchain.llms import Bedrock`：LangChainライブラリからBedrockクラスをインポートしています。
1. `from langchain.memory import ConversationBufferMemory`：会話の履歴を保存するためのメモリクラスです。
1. `from langchain.memory.chat_message_histories import StreamlitChatMessageHistory`：Streamlitセッション状態にメッセージを保存します。
1. `from langchain.prompts import PromptTemplate`：言語モデルへのプロンプトを生成します。
1. `import streamlit as st`：StreamlitというPythonのフレームワークをインポートしています。Streamlitは、PythonのコードだけでWebアプリケーションを作成できます。

#### 会話の履歴を呼び出す
会話が続くように、前回までの会話の履歴を保存するインスタンスを作成します。履歴がない場合は、「こんにちは！」と表示させます。
```test.py
msgs = StreamlitChatMessageHistory(key="chat_messages")

memory = ConversationBufferMemory(memory_key="history", chat_memory=msgs)
if len(msgs.messages) == 0:
    msgs.add_ai_message("こんにちは！")
```

#### templateとprompt、llm_chainの作成
templateとprompt、llm_chainを作成します。チャット履歴と人間の入力を元にして、anthropic.claude-v2モデルが回答します。
```test.py
template = """You are an AI chatbot having a conversation with a human.
You answer always in japanese.

Current conversation:
<conversation_history>
{history}
</conversation_history>

Here is the human's next reply:
<human_reply>
{human_input}
</human_reply>
"""
prompt = PromptTemplate(input_variables=["history", "human_input"], template=template)

llm_chain = LLMChain(llm=Bedrock(model_id='anthropic.claude-v2'), prompt=prompt, memory=memory)
```

#### チャットUIの作成
会話履歴、人間が入力したメッセージ、AIの回答を表示するUIをstreamlitで実装します。
```test.py
for msg in msgs.messages:
    st.chat_message(msg.type).write(msg.content)

if prompt := st.chat_input():
    st.chat_message("human").write(prompt)

    response = llm_chain.run(prompt)
    st.chat_message("ai").write(response)
```

　　

`streamlit run test.py`を実行するとclaude2とチャットすることができます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124507/a565b6ed-1d51-83ad-a15a-40e9f160aa04.png)
ChatGPTとは違った雰囲気があります！

## おわりに
Amazon BedrockとStreamlitでチャットボットを作成してみました。
OpenAI以外にも、様々な企業が生成AIを開発しているので、ぜひ試してみてください！

最後までお読みいただき、ありがとうございました！

記事に関する質問等ございましたら、コメントまたは以下のDMにてよろしくお願いします！

https://twitter.com/t___tatsuki

## 参考文献

https://qiita.com/moritalous/items/c9e8fce7514345af5cd2

https://tech-blog.cloud-config.jp/2023-10-02-hello-bedrock

https://dev.classmethod.jp/articles/if-you-want-to-try-out-amazon-bedrock-from-the-management-console-you-can-set-up-access-to-base-models/

https://github.com/aws-samples/amazon-bedrock-workshop/blob/main/04_Chatbot/00_Chatbot_Claude.ipynb

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html