コンテンツにスキップ

API を使った呼び出し

Python(boto3)を使って、プログラムから Amazon Bedrock を呼び出してみましょう。


前提条件

  • Python 3.9 以上がインストールされていること
  • AWS CLI が設定されていること(aws configure 済み)
  • pip が使用可能であること

ステップ 1: 環境のセットアップ

必要なパッケージのインストール

pip install boto3

AWS 認証情報の確認

aws sts get-caller-identity

正常に実行されれば、AWS 認証情報が設定されています。


ステップ 2: 基本的な API 呼び出し

シンプルな例

以下のコードを bedrock_basic.py として保存します:

bedrock_basic.py
import boto3
import json

# Bedrock Runtime クライアントを作成
client = boto3.client(
    service_name='bedrock-runtime',
    region_name='us-east-1'
)

# リクエストボディを作成
request_body = {
    "anthropic_version": "bedrock-2023-05-31",
    "max_tokens": 1024,
    "messages": [
        {
            "role": "user",
            "content": "AWSのLambdaとは何ですか?50文字以内で説明してください。"
        }
    ]
}

# API を呼び出し
response = client.invoke_model(
    modelId='anthropic.claude-3-haiku-20240307-v1:0',
    body=json.dumps(request_body),
    contentType='application/json',
    accept='application/json'
)

# レスポンスを解析
response_body = json.loads(response['body'].read())
print(response_body['content'][0]['text'])

実行

python bedrock_basic.py
期待される出力例

AWS Lambdaは、サーバー管理不要でコードを実行できるサーバーレスコンピューティングサービスです。


ステップ 3: システムプロンプトの使用

システムプロンプトを追加して、AIの振る舞いをカスタマイズします:

bedrock_system_prompt.py
import boto3
import json

client = boto3.client(
    service_name='bedrock-runtime',
    region_name='us-east-1'
)

# システムプロンプトを追加
request_body = {
    "anthropic_version": "bedrock-2023-05-31",
    "max_tokens": 2048,
    "system": """あなたは優秀なAWSアーキテクトです。
以下のルールに従って回答してください:
- 日本語で回答する
- 具体的なユースケースを含める
- メリットとデメリットを説明する
- 必要に応じてサンプルコードを提供する""",
    "messages": [
        {
            "role": "user",
            "content": "ECSとEKSの違いを教えてください。"
        }
    ]
}

response = client.invoke_model(
    modelId='anthropic.claude-3-5-sonnet-20240620-v1:0',
    body=json.dumps(request_body),
    contentType='application/json',
    accept='application/json'
)

response_body = json.loads(response['body'].read())
print(response_body['content'][0]['text'])

ステップ 4: ストリーミングレスポンス

長い回答をリアルタイムで受け取るには、ストリーミングを使用します:

bedrock_streaming.py
import boto3
import json

client = boto3.client(
    service_name='bedrock-runtime',
    region_name='us-east-1'
)

request_body = {
    "anthropic_version": "bedrock-2023-05-31",
    "max_tokens": 2048,
    "messages": [
        {
            "role": "user",
            "content": "Pythonでウェブスクレイピングを行う方法を、手順を追って説明してください。"
        }
    ]
}

# ストリーミングで呼び出し
response = client.invoke_model_with_response_stream(
    modelId='anthropic.claude-3-5-sonnet-20240620-v1:0',
    body=json.dumps(request_body),
    contentType='application/json',
    accept='application/json'
)

# ストリーミングレスポンスを処理
print("=== ストリーミング開始 ===")
for event in response['body']:
    chunk = json.loads(event['chunk']['bytes'])
    if chunk['type'] == 'content_block_delta':
        print(chunk['delta'].get('text', ''), end='', flush=True)
print("\n=== ストリーミング終了 ===")

ストリーミングのメリット

  • ユーザーが回答を早く確認できる
  • 長い回答でも待ち時間が短く感じられる
  • チャットアプリケーションに最適

ステップ 5: 会話の継続(マルチターン)

複数のメッセージをやり取りする会話を実装します:

bedrock_conversation.py
import boto3
import json

client = boto3.client(
    service_name='bedrock-runtime',
    region_name='us-east-1'
)

def chat(messages, system_prompt=None):
    """Bedrockとチャットする関数"""
    request_body = {
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": 2048,
        "messages": messages
    }

    if system_prompt:
        request_body["system"] = system_prompt

    response = client.invoke_model(
        modelId='anthropic.claude-3-haiku-20240307-v1:0',
        body=json.dumps(request_body),
        contentType='application/json',
        accept='application/json'
    )

    response_body = json.loads(response['body'].read())
    return response_body['content'][0]['text']

# 会話履歴を保持
conversation_history = []

# 会話を開始
print("=== 会話開始('quit'で終了)===\n")

while True:
    user_input = input("You: ")

    if user_input.lower() == 'quit':
        print("会話を終了します。")
        break

    # ユーザーメッセージを追加
    conversation_history.append({
        "role": "user",
        "content": user_input
    })

    # AIの応答を取得
    assistant_response = chat(
        conversation_history,
        system_prompt="あなたは親切なAWSサポートエンジニアです。"
    )

    # AIの応答を履歴に追加
    conversation_history.append({
        "role": "assistant",
        "content": assistant_response
    })

    print(f"\nAssistant: {assistant_response}\n")

ステップ 6: エラーハンドリング

本番環境では、適切なエラーハンドリングが重要です:

bedrock_error_handling.py
import boto3
import json
from botocore.exceptions import ClientError

client = boto3.client(
    service_name='bedrock-runtime',
    region_name='us-east-1'
)

def invoke_bedrock(prompt, model_id='anthropic.claude-3-haiku-20240307-v1:0'):
    """エラーハンドリング付きでBedrockを呼び出す"""

    request_body = {
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": 1024,
        "messages": [{"role": "user", "content": prompt}]
    }

    try:
        response = client.invoke_model(
            modelId=model_id,
            body=json.dumps(request_body),
            contentType='application/json',
            accept='application/json'
        )
        response_body = json.loads(response['body'].read())
        return response_body['content'][0]['text']

    except ClientError as e:
        error_code = e.response['Error']['Code']
        error_message = e.response['Error']['Message']

        if error_code == 'AccessDeniedException':
            print(f"アクセス拒否: モデルへのアクセス権限がありません")
        elif error_code == 'ThrottlingException':
            print(f"スロットリング: リクエスト制限に達しました。少し待ってから再試行してください")
        elif error_code == 'ModelNotReadyException':
            print(f"モデル準備中: モデルがまだ利用可能ではありません")
        elif error_code == 'ValidationException':
            print(f"バリデーションエラー: リクエストの形式が正しくありません")
        else:
            print(f"エラー ({error_code}): {error_message}")

        return None

    except Exception as e:
        print(f"予期しないエラー: {e}")
        return None

# 使用例
result = invoke_bedrock("AWSとは?")
if result:
    print(result)

モデル ID 一覧

モデル モデル ID
Claude 3.5 Sonnet anthropic.claude-3-5-sonnet-20240620-v1:0
Claude 3 Haiku anthropic.claude-3-haiku-20240307-v1:0
Claude 3 Sonnet anthropic.claude-3-sonnet-20240229-v1:0
Titan Text Express amazon.titan-text-express-v1

ハンズオン課題

課題: FAQ ボットを作成

以下の要件を満たすシンプルな FAQ ボットを作成してみましょう:

  1. システムプロンプトで「あなたはAWSの FAQ ボットです」と設定
  2. ユーザーの質問に対して回答を生成
  3. 会話履歴を保持してコンテキストを維持
  4. エラーハンドリングを実装

次のステップ

API の基本的な使い方を学んだら、次はプロンプトエンジニアリングのテクニックを学びましょう。

プロンプトエンジニアリングへ進む