はじめに
本記事は、Amazon BedrockのClaudeモデルを使用してLambda関数からリクエストを送信し、生成されたレスポンスを取得する方法について備忘録も兼ねてまとめたものです。
環境
Python 3.12
前提
- Bedrockのclaude2.1が使用できる状態であること
Lambda関数の作成
マネジメントコンソールからLambda関数を作成します。
デフォルトの権限ではIAMポリシーが不足しているため権限を追加します。
今回はBedrockのフルアクセス権限付与しておきます。
Lambdaにデフォルトで設定されてるタイムアウトの設定は3秒ですが、これではBedrockへのリクエスト時にタイムアウトしてしまうことがあるので、20秒くらいにしておきます。
ソース
下記のソースではBedrockのClaudeモデルにプロンプトを送信し生成された回答を取得します。
プロンプトはLambda関数のイベントJSONに記載しておきます。
import json
import boto3
def invoke_claude_model(prompt):
bedrock_runtime = boto3.client(service_name='bedrock-runtime')
# モデルのIDと最大トークン数を設定
model_id = 'anthropic.claude-v2:1'
max_tokens = 1000
# リクエストボディを作成
body = json.dumps(
{
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": max_tokens,
"messages": [
{"role": "user", "content": prompt}
]
}
)
# Bedrockモデルを呼んでレスポンスを取得
response = bedrock_runtime.invoke_model(body=body, modelId=model_id)
response_body = json.loads(response.get('body').read())
# レスポンスから生成された回答を抽出
text_content = response_body["content"][0]["text"]
return text_content
def lambda_handler(event, context):
try:
# イベントからプロンプトを取得
prompt = event['prompt']
# Bedrockモデルを呼び出して回答を取得
response = invoke_claude_model(prompt)
return {
'statusCode': 200,
'body': json.dumps(response, ensure_ascii=False)
}
except Exception as e:
# エラーが発生した場合
return {
'statusCode': 500,
'body': json.dumps({'error': str(e)})
}
実行 & 結果確認
LambdaのイベントJSONにはBedrockモデルに渡すプロンプトを記載しておく。
イベントJSON
{
"prompt": "claudeは何が得意ですか?一言で簡単に教えてください。"
}
プロンプトを設定出来たらLambdaでテスト(ctrl+shift+i)実行をさせてみます。
3秒程度でレスポンスが返ってくる事を確認できました。
Response
{
"statusCode": 200,
"body": "\"はい、ClaudeはAIシステムですので、その機能に関して一言で簡単に説明すると「会話」が得意です。\""
}
参考