AWS BedrockからGPTではない生成系AI、Claude2を使ってみた
AWS Bedrockを使ってClaude2を触ってみたので、AWS Bedrockの使い方からご説明します。
目次
はじめに
今回はAnthropic社の基盤モデルClaude2をAWSのBedrockを使って使用してみたので、その使用手順を解説します。
AWS bedrockを使うための準備
以下のような3段階に分けて行います。
1. AWSアカウントの作成
2. IAMユーザの作成と設定
3. Bedrock上の設定
AWSアカウントの作成
この工程はAWSアカウントを新しく作る必要がある場合のみ行います。
このAWSのサインアップページにアクセスすると以下のようなページが出てくるので、アカウントを作りましょう。このメールアドレスに対応したユーザがルートユーザとなります。
IAMユーザーの作成
AWSアカウント作成時に作られるルートユーザは全ての権限を持っていて、そのまま利用することは危険です。そこで、プロジェクト単位で扱える範囲を限定したIAMユーザーというものを作成します。今回は開発周りについてはある程度自由に行える権限を持つが、アカウント周りのサービスへの権限については制限されているという、ある程度権限の強いIAMユーザーを使っていきます。
この権限をユーザーに付与する1つの方法がポリシーと呼ばれるもので、今回のような用途ではPowerUserAccessというポリシーを使用します。どの程度の権限を与えるかについては、ご自分の使用状況等を踏まえて決めてください。
手順
ダッシュボードのトップページから以下のようにIAMユーザの編集ページに移動し、「ユーザの作成」ボタンを押します。
以下のページに移ったら、使用したいユーザー名を入力します。マネジメントコンソールへのユーザアクセスというのは、今ルートユーザとして行なっているようなコンソールの操作をこのIAMユーザに対しても許可する場合にオンにします。今回はBedrockにアクセスするだけなので、オフを選択して次に進みます。
その次に許可を設定というページが出てきます。ここで、そのIAMユーザにどのような権限(ポリシー)を与えるかを決定します。グループと呼ばれる共通の権限を与える集団を作って、そこに追加してもいいですがここでは個別に加えていきます。今回の権限では、PowerUserAccessというポリシーを使うので、これを選択したのち確認画面で保存します。
その後、IAMユーザの編集ページに戻ると以下のようなユーザの一覧の中に作ったユーザがあるはずです。そのユーザ名の部分をクリックすると、そのIAMアカウントのページに飛べるのでアクセスキーを作成し、ユースケースとしてローカルコードを選択します。アクセスキーとシークレットアクセスキーと呼ばれるものが出力されるので保存しておきましょう。APIの使用時に使います。
Bedrockの設定
ダッシュボードのトップページから同じようにBedrockを検索し、以下のページでBase modelsを選択します。初回はモデルが開放されていないので、利用用途等を記入することで使えるようになります。私の場合では、記入して1時間もしないうちに気づいたら使えるようになっていました。
注意点としてはregionによって使えるモデルが制限されてしまうことです。us-east-1を使うといいでしょう。
モジュール系のimport
今回はLangChainを使って実装します。まずはモジュールのインポートとセッションの確立です。アクセスキー等は自分のを使用しましょう。
from boto3.session import Session
from langchain.chat_models import BedrockChat
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain.prompts.chat import (
ChatPromptTemplate,
HumanMessagePromptTemplate,
MessagesPlaceholder,
)
session = Session(
aws_access_key_id='your access key',
aws_secret_access_key='your seacret access key',
)
bedrock_runtime = session.client("bedrock-runtime", region_name="your region")
チャットボットを作成
全体の概要は以下のようです。最後の行に自分の聞きたい内容を入れます。それぞれ具体的に説明していきます。
llm = BedrockChat(
client=bedrock_runtime,
model_id="anthropic.claude-v2",
model_kwargs={"temperature":0.0, "max_tokens_to_sample": 8192},
)
memory = ConversationBufferMemory(return_messages=True)
prompt = ChatPromptTemplate.from_messages([
MessagesPlaceholder(variable_name="history"),
HumanMessagePromptTemplate.from_template("""{input}""")
])
llm_chain = ConversationChain(llm=llm, prompt=prompt, memory=memory)
result = llm_chain.run("Your message to chatbot.")
言語モデルの取得
BedrockChatで言語モデルをとってきます。ここでとって来るモデルはmodel_idで指定できます。
model_kwargsでは以下の2点を指定しています。
- temperature: 0から1の値で0に近づくほど決定論的になります。タスクが決まっている場合は0にしましょう。
- max_tokens_to_sample: 出力の最大トークン数です。これにより出力が必要以上に長くなることを防ぐことができます。
よく使うのはここら辺ですが、他にもタイムアウトの時間等指定できる要素があります。
モデルの記憶
memoryはこのチャットボットが持つ記憶を表します。ConversationBufferMemoryを今回は指定しています。これはボットにすべての会話をそのまま記憶させる方法ですが、当然やりとりが長くなると必要とするトークン数が爆発的に増えることになります。
他にも様々な記憶機能があり、一例として以下のようなものがあります。
- ConversationBufferWindowMemory: 最近n個の会話のみを記憶。
- ConversationSummaryMemory: 今までの会話の要約を記憶。
プロンプトの作成
ChatPromptTemplate.from_messagesはメッセージのリストからプロンプトの変換します。また、MessagePlaceholderとHumanMessagePromptTemplateは、使いたい内容に話者や属性の情報を付与してメッセージを作る機能だと思うと理解しやすいです。
後者のHumanMessagePromptTemplateについては与える文章に変数を入れることができ、今回の例ではinputという変数を入れています。inputは入力した内容が入るあらかじめ定義された変数です。これにより、ユーザが入力した文章をプロンプトに取り込みます。
簡単な出力例
簡単に以下のような入力を入れてみました。
result = llm_chain.run("おすすめのランチメニューは?")
それに対する出力は以下のようになりました。
ランチメニューのおすすめは次のとおりです。
– 和食のランチセット
– カレーとサラダのセット
– ハンバーグとサラダのセット
– パスタとサラダのセット
– 天ぷら盛り合わせセット
和食のランチセットは、お米、味噌汁、お新香、漬物など日本食の定番が揃っていて満足できます。カレーはコクと深みがあり、サラダと一緒にボリューム感もあります。ハンバーグはジューシーな肉の旨味が楽しめてオススメです。パスタは軽めであっさりしていて、サラダと合わせるとバランスが良いですね。天ぷら盛り合わせは揚げたてが味わえてクセになる一品です。
ご予算や食べたい料理の種類に合わせて、上記の中からお選びいただければと思います。
続けて以下のように入力すると
result = llm_chain.run("お肉料理のおすすめはある?")
以下のような出力が得られます。
お肉料理がおすすめということですね。ランチ時のお肉メニューとしては以下がおすすめです。
– ハンバーグプレート
– 唐揚げとハンバーグのセット
– 生姜焼きとローストビーフの盛り合わせ
– 煮込みハンバーグ丼
– ステーキランチ
ハンバーグはジューシーな肉の旨味が味わえます。唐揚げや生姜焼きと一緒に盛り合わせるとボリューム感もあり好評です。煮込みハンバーグは味が染み込んでいて食べ応え抜群。ステーキは高級感があり、ランチにはちょうどいい一品かと思います。
ご予算やボリューム感などに合わせて、この中からお選びいただければ幸いです。ランチタイムをお肉料理で満喫してください。
このように、ランチメニューであるという記憶を引き継いでいることが確認できました。
最後に
今回はAWSのBedrockとLangChainを使ってClaude2を簡単に触ってみました。AWSのBedrockを使うと他にも様々な基盤モデルが触れるので試してみると面白いです。