AWSにてAI ChatBotの構築とテスト#Amazon Bedrock#Claude2.1

AWS

2024.5.7

はじめに 

最近のAI Chatbot、特にChatGPTは話題の渦中にあると言っても過言ではありません。20年前は、Web開発ができれば「開発能力者」とされ、4年前にはブロックチェーンなどの機能を使用して開発ができれば達人という声を聞くこともできましたが、最近ではWebを開発する際に「AI Chatbot」を埋め込むと最新のトレンドを反映しているという高評価を受けられます。そのくらい「AI Chatbot」は人気があり活用分野も幅広いツールです。本ブログでは、このような社会的な背景に合わせて様々な高性能ファウンデーションモデル(Foundation Model)を単一のAPIを通して提供される完全管理型サービスのAmazon BedrockというAWSサービスを使用して、簡単に「AI Chatbot」を作成する方法を調査してみます。

適用モデルとプラットフォーム

LLM(Large Language Models)としては、2024年3月に東京リージョン(ap-northeast-1)にて使用可能になったClaude 2.1を利用することにしました。もちろんまだマルチモーダル対応はしておらず、インターネット接続にはAPIが必須になる等まだChatGPTに比べて物足りない点があるAIエンジンですが、2.0に比べて返答の正直さ(honesty)が2x倍増加するなど性能が飛躍的に向上しているので、将来が期待されるLLMであることに間違いありません。さらに、開発時の基本モデルとしてはClaude 2.1を使用するとしても、UIなどのChatbotインターフェースや多言語サポートなども必要ですので、以下の2つのフレームワークを追加で使用してみることにしました。

Streamlit
Streamlitは、高速でUIを備えたWebアプリケーションのプロトタイプを作成できるPython ライブラリとしてChatbotを作成する際に、ユーザーインターフェース(UI)の提供、会話履歴の管理、リアルタイム更新、データ視覚化などの機能を提供することができます。記述する言語が Python のみですが、フロントエンドの経験がなくても、容易にUIデザインが可能なアプリケーションを作成できるプラットフォームです。
LangChain

LangChainは多言語対応、リアルタイムの翻訳、多様な言語モデルが支援可能なブロックチェーンプラットフォームであり、Chatbotを使用する時にどの言語で入力してもすぐに該当言語で返答してくれる機能がまさにこのLangChainプラットフォームだと考えていただければよいと思います。さらに、LangChainはAWSインテグレーションパッケージを提供しているため、AWSサービスをより簡単な実装で利用可能です。

アーキテクチャー

私がよく実装の環境として利用しているCloud9で、下記の様なPythonをベースにAmazon Bedrock APIを通じて、私の質問に対する受け答えができる単純な構造として作成する予定です。

設定

1)LLMへのアクセスを要請

• AWS Console ➔ Amazon Bedrock ➔ 「プロバイダー」に接続にしますと、

「Amazon Bedrock is a fully managed service that makes FMs from leading AI startups and Amazon available via an API, so you can choose from a wide range of FMs to find the model that is best suited for your use case.」という「プロバイダー」の説明とともに下記の図のように現在(24/04) 、Amazon Bedrock にて提供されているファウンデーションモデル(foundation model)を確認することは可能です。ところで、上記ではLLMと呼び、ここではファウンデーションモデルと呼ぶので混乱している方がいるかもしれませんが、AI商品が基礎となる一つのモデルを用いて様々な問題を解決するという意味でファウンデーションモデル(foundation model)とも呼んでおり、これは製品の観点から称するものであるのに対して、LLMはアルゴリズムの観点から称する名称だと考えれていただければ良いのではないかと思います。ちなみに、現在、日本リージョンではAmazon Titan, Anthropic Claude, Cohere 以上 3つのファウンデーションモデルを提供中です。

今回はClaude 2.1を使用することにしたため、「プロバイダー」➔ Anthropic ➔「モデルアクセスをリクエスト」を介してモデルアクセスの申請が必要です。さらに、Anthropicの場合は、下記の図の赤い四角形の中に明記されていますが、ユースケースを作成する必要があります。

ユースケース を作成し、モデルアクセスのリクエストが完了すると、一定の時間の経過後、下記の図のようにアクセス権限が付与され、Amazon Bedrock によってAnthropic Claude モデルが使用可能な状態になります。

2) 実装環境

「AIbot」という 作業用のcloud9環境を作成しました。

続けて、Pythonを開発言語として使う予定なので、下記のように関連パッケージを設置しました。

pip install boto3  #Python用 AWS-SDK
pip install boto3 streamlit langchain langchain-aws

3) 実装

3) -1. Backendの構築

backendai.py

import os
from langchain_aws import BedrockLLM
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain

def feel_chatbot() :
bedrock_llm = BedrockLLM (
credentials_profile_name = 'default',
model_id = 'anthropic.claude-v2:1',
model_kwargs = {
"prompt": \\n\\nHuman: Hello world\\n\\nAssistant:\",
"temperature": 0.5,
"top_p": 1,
"top_k": 250,
"max_tokens_to_sample": 1000
})
return bedrock_llm
def buff_memory():
buff_memory = feel_chatbot()
memory = ConversationBufferMemory(llm = buff_memory, max_token_limit=2000)
return memory

def cnvs_chain(input_text, memory):
chain_data = feel_chatbot()
cnvs_chain = ConversationChain(llm = chain_data, memory = memory, verbose=True)

chat_replay = cnvs_chain.predict(input = input_text)
return chat_replay

上記のコードはChatbotのバックエンド側を実装したものです。全体的な動きはChatbotを通じて対話を始めるとfeel_chatbotという関数がinput_textという媒介変数を受け入れ、これを通じてファウンデーションモデルを活用してChatbotから応答を生成します。ちなみに、このChatbotはファウンデーションモデルのテスト用なので特に、会話のヒストリーを保存したりする機能は追加せずにリアルタイムで会話する機能のみを実装しました。

実装には対話形プラットフォームが必要なため、上記で説明したlangchainを使用するためのAWS用のlangchainインテグレーションモジュールをインポートする形からスタートします。そして、対話のヒストリーは保存しなくても、私がした質問はメモリーに入れてClaudeに伝える必要があり、Claudeの返答も私に伝送する必要があるため、Langchain.memoryモジュールとClaude2.1を使用するために設定したkwargs(keyword arguments)をLLMに伝達する役割を担うLangchain.chainsモジュールを追加でインポートしました。そして、Bedrockのオブジェクトを生成するとき、credentials_profile_name、model_id、model_kwargsなどのパラメーターを設定します。このとき、Credentials_profile_nameはAWS資格証明プロファイルの名前を指定するものですが、すでにCLI環境でcredentialsファイルの設定が完了している場合は、上記のように「default」で十分だと思います。model_idは使用するモデルのID(確認場所は下記の図を参照)を埋め込みます。続いてmodel_kwargs(※参照)については個人的に、Chatbotのアイデンティティーを定義する重要な部分だと考えるので各パラメーターについて簡単に説明します。

  • promptは会話の順序を定義(私が質問、Chatbotが返答…)する。
  • Temperatureはランダム性を制御するパラメーターとしてバリューを高くすると多様性が増加する。
  • Top-pはnucleusトークン選択の累積確率をカットオフする値として、 値が低いほど多様性が減少し、より上部に可能性の高いnucleusのサンプリングをすることを意味する。
  • Top-kは導出されているサンプリングトークンにて上位 k 個までだけサンプリングするというオプションである。低レベルのレスポンスを削除する時に使用される。

Amazon Bedrockのプロバイダーページに行くと、下記イメージのようにデフォルトのバリューが設定されていて記載してあるので、標準性能を希望する場合は、そのままコピーペーストして使用すれば良いと思います。さらにmodel_id、prompt、max_tokens_to_sampleは必須パラメーターで、残りはオプション設定です。

 

3) -2. Frontendの構築

FrontendはUIのデザイン的な部分であるため、全コードは記載しません。streamlitフラットフォームを使用するとセッションを利用できるので、以下のようにstm.session_state.memoryとstm.session_state.chat_historyを使ってセッションにChatbotとの会話を記録するようにしました。ちなみに、私はChatbotのタイトルを「Feelbot」にし、チャット画面があまりにも閑散としているため、著作権がフリーになったミッキーマウスのイメージを入れました。

import streamlit as stm
import backendai as be
from PIL import Image
stm.title("Hi~Feelbot")
stm.session_state.memory = be.buff_memory()
stm.session_state.chat_histmory = [ ]

for message in stm.session_state.chat_histmory:
with stm.chat_message(message['role']):
stm.markdown(message["text"])
..............................................

 

4) Chatbot起動とテスト

6248:~/environment $ streamlit run frontai.py

Collecting usage statistics. To deactivate, set browser.gatherUsageStats to false.

You can now view your Streamlit app in your browser.

Network URL: http://xxx.31.14.254:8501
External URL: http://xx.77.89.179:8501

起動してテストを行ってみました。単純会話のAI生成を確認するのではなく、上記のClaude2.1のアイデンティティであるパラメータに触れて、AIの反応の変化について確認してみました。もちろん、テストのレベルは、論文に記載するレベルの正確なデータ分布を把握するために数百、数千回を実施したわけではなく、数回程度実施したことに過ぎないので、後に皆さんが同様のテストを実施し、異なる結果や意見になることも十分に可能性として考えられます。

まず、Claude2.1のマニュアルを確認してみるとtemperatureだけを変更することを推奨しているので、まずtemperatureのバリューを修正してテストしてみました。質問に客観的に接近することも、主観的に接近することも可能な「人間」というテーマを投げてみました。Temperatureを0.0に近く設定した場合は、人間を生物的な存在としてアクセスするのかそれとも社会的、理性的な存在としてアクセスするのかの判断ができない様に見えました。しかし、Temperatureを1.0に近く設定した場合は、一般的な理性的な存在としての人間を説明しました。下記以外にも何度か別の質問を投げてみた結果、数学のように回答が明確な質問は、Temperature:0.0に近づく程綺麗な回答になり、学のような叙述形返答はTemperature:1.0に近づく程綺麗な回答になりました。

→Temperature : 0.0

→Temperature : 1.0

続けて Top-pはバリューが低いほど多様性が減り、可能性が高いトークンにフォーカスを合わせて回答を表示している様です。 (Temperatureと同時にバリューを変更して利用は不可能)下記のイメージをみるとTop-pが0の場合には生物としての人間(生物学の観点)、Top-pが1の場合は理性がある人間(人間学の観点)の様な感じを受けました。Top-kは数値の変化によって単語の選択や活用的な部分が変わるだけで、意味的には大きな変化は発生しない気がしました。 個人的には、Top-pはトークンのCDF(cumulative distribution function)を設定する用で、Top-kはトークンの群れ(単語の活用?)があるインデックスを表示するのではないかと考えました。

→Top-p:0.0 、Top-k:250

→Top-p:0.0 、Top-k:50

→Top-p:1.0 、Top-k:250

→Top-p:1.0 、Top-k:50

Conclusion

本ブログではAmazon BedrockのClaude2.1ファウンデーションモデルを使って簡単なChatbotを作成してみました。以前とは違い、単純に数学的アルゴリズムを利用してテキストを分析するレベルではなく、教師なし学習(Unsupervised Learning)を通じて作られた口述型の文章はまるで人間と会話をしている様な感じがしました。また、このような感じを作り出すエンジンを完全管理型サービス形態で配布できるAmazon Bedrockの機能もやはり素晴らしかったです。 機会があれば、教師なし学習の進化によるAIの考えの改善方向と可能性について、もう少し確認し改めてブログに記載してみることにします。

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら