【AWS】Bedrock Converse APIをPythonで使う方法

当ページのリンクには広告が含まれています。
この記事で解決できる悩み
いずみ

こんな悩みを解決できる記事を書きました!

僕は現役フリーランスエンジニア(歴年)で、資格は個保有しています。

Amazon BedrockをPythonから呼び出したいけれど、どのAPIを使えばいいか分からない」と悩んでいませんか?

Bedrockには複数の呼び出しAPIがありますが、会話形式のアプリを作るならConverse APIが第一候補になります。

Converse APIはモデルが変わっても同じコードで呼び出せる統一インターフェースです。

いずみ

InvokeModelよりずっと書きやすいです。

ということで、本記事ではBedrock Converse APIをPythonで使う方法を解説します。

いずみ

すぐ読み終わるので、ぜひ最後まで読んでくださいませ。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
執筆者/監修者
  • フリーランスエンジニア(保有資格個、企業と直接契約
  • ブログ・アフィリエイト歴7年(2018年〜)
  • ブランドせどりで月利50万円⇨脱サラ
  • 投資(仮想通貨・FX)歴7年(2018年〜)
  • X(旧Twitter)フォロワー約1,900人
  • 運営者情報はこちら
いずみです
目次

【AWS】Bedrock Converse APIをPythonで使う方法

早速ですが、Bedrock Converse APIをPythonで使う方法を解説します。

Converse APIとは

Converse APIは、Bedrock上のさまざまなモデルへ共通のリクエスト形式でメッセージを送れるAPIです。

従来のInvokeModel APIは、Anthropic ClaudeとAmazon Novaでリクエストボディの構造が異なり、モデルを切り替えるたびにコードの書き直しが必要でした。

Converse APIを使うと、messagessysteminferenceConfigtoolConfigという共通フィールドだけで、どのモデルも呼び出せます。

呼び出し用のメソッドは2つ用意されています。

  • converse:応答をまとめて1回で受け取る
  • converse_stream:応答をトークン単位でストリーミング受信する
いずみ

モデルIDを差し替えるだけでClaudeでもNovaでも動くのが便利ですね。

事前準備

Converse APIを呼び出す前に、3つの準備をします。

STEP
Bedrockでモデルアクセスを有効化する

AWSコンソールのBedrock画面から、使いたいモデルの利用リクエストを送信します。

承認されると、モデルIDを指定して呼び出せるようになります。

STEP
boto3をインストールする
pip install -U boto3

Converse APIはboto3の新しめのバージョンで追加されたため、古い環境ではアップグレードしておきます。

STEP
AWS認証情報とIAM権限を設定する
aws configure

実行するIAMユーザーまたはロールに、bedrock:InvokeModelbedrock:InvokeModelWithResponseStreamの権限を付与します。

converseで基本的な対話を実装する

まずはconverseメソッドで、1往復の対話を実装します。

import boto3

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

model_id = "anthropic.claude-3-5-sonnet-20241022-v2:0"

messages = [
    {
        "role": "user",
        "content": [{"text": "Bedrockの特徴を3つ教えてください"}],
    }
]

response = client.converse(
    modelId=model_id,
    messages=messages,
)

print(response["output"]["message"]["content"][0]["text"])
print(response["usage"])

リクエストはrolecontentを持つメッセージの配列で組み立てます。

content{"text": "..."}のリストになっている点が、InvokeModelとの違いです。

応答本文はresponse["output"]["message"]["content"][0]["text"]で取り出せます。

response["usage"]には入力・出力トークン数が入るので、コスト計算に使えます。

いずみ

レスポンスの形が全モデル共通なので、パース処理を1つ書けば使い回せます。

システムプロンプトと推論パラメータを指定する

システムプロンプトはsystemフィールドで、生成の細かい制御はinferenceConfigで指定します。

response = client.converse(
    modelId=model_id,
    messages=messages,
    system=[{"text": "あなたは日本語で簡潔に答えるアシスタントです"}],
    inferenceConfig={
        "maxTokens": 512,
        "temperature": 0.3,
        "topP": 0.9,
    },
)

maxTokensで最大出力トークン数、temperatureで回答のばらつきを調整します。

モデル固有のパラメータを渡したい場合はadditionalModelRequestFieldsを使います。

converse_streamでストリーミング応答を受け取る

チャットUIのように結果を少しずつ表示したい場合は、converse_streamを使います。

response = client.converse_stream(
    modelId=model_id,
    messages=messages,
)

for event in response["stream"]:
    if "contentBlockDelta" in event:
        text = event["contentBlockDelta"]["delta"]["text"]
        print(text, end="", flush=True)

戻り値のstreamをループで回し、contentBlockDeltaイベントから差分テキストを取り出します。

ほかにもmessageStartcontentBlockStopmessageStopmetadataといったイベントが順に流れてきます。

metadataイベントにトークン使用量が含まれます。

いずみ

体感速度が上がるので、ユーザー向け画面ではストリーミングを推奨します。

toolConfigでツール実行(function calling)を実装する

Converse APIはtoolConfigを渡すだけで、ツール実行(function calling)に対応します。

tool_config = {
    "tools": [
        {
            "toolSpec": {
                "name": "get_weather",
                "description": "指定した都市の天気を返す",
                "inputSchema": {
                    "json": {
                        "type": "object",
                        "properties": {
                            "city": {"type": "string", "description": "都市名"}
                        },
                        "required": ["city"],
                    }
                },
            }
        }
    ]
}

messages = [
    {"role": "user", "content": [{"text": "東京の天気は?"}]}
]

response = client.converse(
    modelId=model_id,
    messages=messages,
    toolConfig=tool_config,
)

stop_reason = response["stopReason"]

モデルがツールを呼びたいと判断すると、stopReasontool_useになります。

アプリ側でツールを実行し、結果をtoolResultとして会話履歴に追加してから、再度converseを呼びます。

if stop_reason == "tool_use":
    content = response["output"]["message"]["content"]
    tool_use = [b for b in content if "toolUse" in b][0]["toolUse"]

    tool_result = {
        "toolUseId": tool_use["toolUseId"],
        "content": [{"json": {"weather": "晴れ", "temp": 28}}],
    }

    messages.append(response["output"]["message"])
    messages.append(
        {"role": "user", "content": [{"toolResult": tool_result}]}
    )

    final = client.converse(
        modelId=model_id,
        messages=messages,
        toolConfig=tool_config,
    )
    print(final["output"]["message"]["content"][0]["text"])

ツールの結果を受け取ったモデルが、最終的な回答文を生成します。

いずみ

ツール定義のスキーマもモデル共通なので、プロバイダーごとの書き方を覚え直す必要がありません。

マルチターン会話を続けるコツ

会話を継続する場合は、モデルの応答メッセージをそのままmessagesへ追加してから、次のユーザー発言を足します。

Converse API自体は会話状態を保持しないため、履歴の管理はアプリ側の責任になります。

履歴が長くなるほど入力トークンが増えるので、古いメッセージを要約する仕組みを用意すると安定します。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式

【厳選】フリーランスエンジニアにおすすめなエージェント3選

フリーランスエンジニアになるにはエージェントから案件をもらう必要があります。

僕が実際に利用しているおすすめエージェントを紹介しますね。

いずみ

エージェントは必ず複数登録してください。

担当者によっては「全然案件紹介してくれない…」みたいなこともあるので…

僕は実際に5つのエージェントを使い回していますよ。

フリーランスを始めるなら「

案件数マージン率単価
約88,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 業界最大級の案件数。
  • 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
  • 案件参画中のフォローの充実。

※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。

は業界最大手のフリーランスエージェントです。

とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!

いずみ

僕もはじめてフリーランスの案件を貰ったのはです。

保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。

手厚い保障を重視したいなら「

案件数マージン率単価
約10,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 手厚い保障で正社員並みの安心感。
  • 還元率60%超え&単価公開でクリアな契約。
  • 給与保障制度(審査あり)。

は手厚い保障が特徴のフリーランスエージェントです。

フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。

いずみ

僕も何度か案件を紹介してもらいました。

自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。

週2〜3日の案件探しなら「

案件数マージン率単価
約5,000件非公開
初心者福利厚生申し込み
経験者向け無料
Good Point
  • IT案件に特化したフリーランスエージェント。
  • 週2〜3日の案件が豊富。
  • リモート案件が多く、直エンドなので単価も高い。

※詳細は「【週2・3案件】ITプロパートナーズとは?メリットや利用手順を解説!」を参照。

はIT案件に特化したフリーランスエージェントです。

週2〜3日から参画できる案件が豊富なので、起業したい人にもおすすめです。

いずみ

週2〜3日の案件はある程度スキルがないと紹介してもらえない印象です。

とはいえ、週5の案件ももちろんありますし、僕が利用した時は迅速・丁寧に対応していただきました!

よくある質問

Converse APIとInvokeModel APIはどちらを使うべきですか?

会話形式のアプリなら、モデル差を吸収できるConverse APIが基本の選択肢です。

画像生成や埋め込みベクトルの取得など、メッセージ形式に当てはまらない用途ではInvokeModel APIを使います。

モデルIDはどこで確認できますか?

AWSコンソールのBedrock画面、またはlist_foundation_modelsの呼び出しで一覧を取得できます。

リージョンをまたいで負荷分散する場合は、推論プロファイルのIDを指定します。

AccessDeniedExceptionが出る場合の対処法は?

モデルアクセスが有効化されているか、IAMポリシーにInvokeModel権限があるかを確認します。

呼び出しているリージョンと、モデルの提供リージョンが一致しているかも確認ポイントです。

まとめ

今回は、Bedrock Converse APIをPythonで使う方法について解説しました。

以下が本記事のまとめになります。

まとめ
  • Converse APIはモデルが変わっても同じコードで呼び出せる統一インターフェース。
  • converseはまとめて受信、converse_streamはストリーミング受信に使う。
  • system・inferenceConfig・toolConfigで挙動を制御できる。
  • toolConfigを渡すだけでツール実行(function calling)に対応できる。
まとめ
いずみ

最後までお読みいただき、ありがとうございました!

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
  • クソおすすめ本
¥4,480 (2024/06/01 23:28時点 | Amazon調べ)
\楽天ポイント4倍セール!/
楽天市場
いずみ

海外のエンジニアがどういった思考で働いているかが理解できます。

海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。

この記事が気に入ったら
フォローしてね!

シェアしてね!
  • URLをコピーしました!
目次