はじめに
この記事ではGitHub CodespacesとAWS SDKを使って、Amazon BedrockのClaude 3.5 Sonnetを試す内容になっています。
主な内容としては実践したときのメモを中心に書きます。(忘れやすいことなど)誤りなどがあれば書き直していく予定です。
今回は「Amazon Bedrock 生成AIアプリ開発入門」を参考にAWSのAIにハンズオンしていきたいと思います。※発売前に献本いただきました。
なお、環境のセットアップについては以下を参考にしてください。
【GitHub】GitHub CodespacesでAWS CLIをセットアップする
実行環境
開発利用する環境はGitHub Codespacesですが、その上で様々なものを扱うのでバージョンを明記しておきます。
- GitHub Codespaces
- Python 3.10.13
- pip 24.0 from /usr/local/python/3.10.13/lib/python3.10/site-packages/pip (python 3.10)
セットアップ
パッケージをインストール
まずは、Pythonのパッケージを整えていきます。以下のpipをCodespacesのターミナルで実行します。
pip install boto3==1.34.87
モデルを有効化する
次にデフォルトではモデルのアクセスが有効になっていないため、モデルアクセスを有効化します。
リージョンがus-east-1
のAWSマネジメントコンソールからAmazon Bedrockを開きます。
カッコイイ画面が開きましたら左側にある三本線、いわゆるハンバーガーメニューを開きましょう。
メニューの中からModel Access
をクリックします。
モデルの一覧が表示されますのでその中からClaude 3 Sonnet
のAvailable to request
にカーソルを合わせてクリックします。Request model access
のリンクが表示されるのでクリックします。
クリックするとSonnetにチェックが入ります。
そのまま下にスクロールしてNext
をクリックします。
Submit
をクリックします。
これで有効化完了です。
実際に動かしてみる
aws sso login
認証方法は設定済みだけどもしばらく時間が経過してしまった場合は以下のコマンドを実行して再度、認証してください。認証済みの場合は実行しなくても良いです。
aws sso login
リージョンを指定して基盤モデルの情報を取得する
では、コードを書いて実際に動かしてみましょう。今回はboto3だけを使って、Amazon Bedrockの情報を取得します。以下のコードを書いて実行します。
# us-east-1の基盤モデルを取得するサンプルコード
import boto3
bedrock_client = boto3.client("bedrock",region_name="us-east-1")
bedrock_found_list = bedrock_client.list_foundation_models()
model_summaries = bedrock_found_list['modelSummaries']
for model_summary in model_summaries:
print(model_summary['modelArn'])
pythonで実行します。
python foundation_model_list.py
実行結果
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-tg1-large
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-image-generator-v1:0
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-image-generator-v1
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-text-premier-v1:0
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-g1-text-02
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-text-lite-v1:0:4k
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-text-lite-v1
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-text-express-v1:0:8k
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-text-express-v1
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-text-v1:2:8k
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-text-v1
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-text-v2:0:8k
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-text-v2:0
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-image-v1:0
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-image-v1
arn:aws:bedrock:us-east-1::foundation-model/stability.stable-diffusion-xl-v1:0
arn:aws:bedrock:us-east-1::foundation-model/stability.stable-diffusion-xl-v1
arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-grande-instruct
arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-jumbo-instruct
arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-mid
arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-mid-v1
arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-ultra
arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-ultra-v1:0:8k
arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-ultra-v1
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-instant-v1:2:100k
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-instant-v1
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-v2:0:18k
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-v2:0:100k
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-v2:1:18k
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-v2:1:200k
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-v2:1
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-v2
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0:28k
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0:200k
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-haiku-20240307-v1:0:48k
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-haiku-20240307-v1:0:200k
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-haiku-20240307-v1:0
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0
arn:aws:bedrock:us-east-1::foundation-model/cohere.command-text-v14:7:4k
arn:aws:bedrock:us-east-1::foundation-model/cohere.command-text-v14
arn:aws:bedrock:us-east-1::foundation-model/cohere.command-r-v1:0
arn:aws:bedrock:us-east-1::foundation-model/cohere.command-r-plus-v1:0
arn:aws:bedrock:us-east-1::foundation-model/cohere.command-light-text-v14:7:4k
arn:aws:bedrock:us-east-1::foundation-model/cohere.command-light-text-v14
arn:aws:bedrock:us-east-1::foundation-model/cohere.embed-english-v3:0:512
arn:aws:bedrock:us-east-1::foundation-model/cohere.embed-english-v3
arn:aws:bedrock:us-east-1::foundation-model/cohere.embed-multilingual-v3:0:512
arn:aws:bedrock:us-east-1::foundation-model/cohere.embed-multilingual-v3
arn:aws:bedrock:us-east-1::foundation-model/meta.llama2-13b-chat-v1:0:4k
arn:aws:bedrock:us-east-1::foundation-model/meta.llama2-13b-chat-v1
arn:aws:bedrock:us-east-1::foundation-model/meta.llama2-70b-chat-v1:0:4k
arn:aws:bedrock:us-east-1::foundation-model/meta.llama2-70b-chat-v1
arn:aws:bedrock:us-east-1::foundation-model/meta.llama2-13b-v1:0:4k
arn:aws:bedrock:us-east-1::foundation-model/meta.llama2-13b-v1
arn:aws:bedrock:us-east-1::foundation-model/meta.llama2-70b-v1:0:4k
arn:aws:bedrock:us-east-1::foundation-model/meta.llama2-70b-v1
arn:aws:bedrock:us-east-1::foundation-model/meta.llama3-8b-instruct-v1:0
arn:aws:bedrock:us-east-1::foundation-model/meta.llama3-70b-instruct-v1:0
arn:aws:bedrock:us-east-1::foundation-model/mistral.mistral-7b-instruct-v0:2
arn:aws:bedrock:us-east-1::foundation-model/mistral.mixtral-8x7b-instruct-v0:1
arn:aws:bedrock:us-east-1::foundation-model/mistral.mistral-large-2402-v1:0
arn:aws:bedrock:us-east-1::foundation-model/mistral.mistral-small-2402-v1:0
Bedrockするためのコードを書く
リストが取得できたので上記の内容を使って、Amazon Bedrockにプロンプトを投げてみましょう。以下のコードを実行します。
import json
import boto3
bedrock_client = boto3.client("bedrock-runtime",region_name="us-east-1")
body = json.dumps(
{
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 1000,
"system": "あなたの仕事はユーザーの質問に答えることです。",
"messages": [
{
"role": "user",
"content": "雲の上には何がありますか?"
}
]
}
)
bedrock_model_id = "anthropic.claude-3-5-sonnet-20240620-v1:0"
header_accept = "application/json"
content_type = "application/json"
res = bedrock_client.invoke_model(
body=body,
modelId=bedrock_model_id,
accept=header_accept,
contentType=content_type
)
if res.get("body"):
res_body = json.loads(res.get("body").read())
if res_body["content"]:
answer = res_body["content"][0].get("text")
print(answer)
else:
print("レスポンスのボディがありません!")
pythonで実行します。
python main.py
実行結果
雲の上には主に以下のようなものがあります:
1. より高い層の大気 - 対流圏上部や成層圏など
2. 青空 - 晴れた日には雲の上も青く見えます
3. 太陽、月、星 - 雲の上からはより明るく見えます
4. 飛行機や人工衛星 - 多くの航空機は雲の上空を飛行します
5. より高い雲層 - 巻雲などの高層雲は低層雲の上にあることがあります
6. オーロラ - 極地方では高高度で見られることがあります
7. 宇宙空間 - 大気圏を超えると宇宙につながります
雲の高さは様々で、地上からわずか数百メートルのものから10km以上の高さにあるものまであります。雲の上の世界は、私たちが地上から見るものとはかなり異なる光景を見せてくれます。
まとめ
今回はGitHub CodespacesとAWS SDKでClaude 3.5 Sonnetを実行してみました。
LangChainと比較すると行数は多くなるもののLangChainに知見がない人でもAWS SDKの知識があれば、生成AIを呼び出せるのでとても良いと思いました。今後の発展に期待です。
トラブルシューティング
以下、トラブシューティングです。詰まった時の参考にしてください。
認証エラー
以下のようなエラーが出てしまう場合はaws sso login
を実行しましょう。
Error raised by bedrock service: The SSO session associated with this profile has expired or is otherwise invalid. To refresh this SSO session run aws sso login with the corresponding profile.