LoginSignup
8
2

Amazon BedrockにUse Tools(Function calling)が来た

Last updated at Posted at 2024-05-30

急ぎご連絡まで。

pip install "boto3>=1.34.116"
import json

import boto3

bedrock_client = boto3.client("bedrock-runtime")


model_id = "anthropic.claude-3-haiku-20240307-v1:0"

toolConfig = {
    "tools": [
        {
            "toolSpec": {
                "name": "get_weather",
                "description": "Get the current weather in a given location",
                "inputSchema": {
                    "json": {
                        "type": "object",
                        "properties": {
                            "location": {
                                "type": "string",
                                "description": "The city and state, e.g. San Francisco, CA",
                            }
                        },
                        "required": ["location"],
                    }
                },
            }
        }
    ]
}


messages = [
    {
        "role": "user",
        "content": [{"text": "What is the weather like in San Francisco?"}],
    }
]

response = bedrock_client.converse(
    modelId=model_id, messages=messages, toolConfig=toolConfig
)

print(json.dumps(response, indent=2, ensure_ascii=False))
レスポンス
{
  "ResponseMetadata": {
    "RequestId": "8174d361-3f38-4afc-af3f-c00c3f9464ad",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "date": "Thu, 30 May 2024 23:47:24 GMT",
      "content-type": "application/json",
      "content-length": "346",
      "connection": "keep-alive",
      "x-amzn-requestid": "8174d361-3f38-4afc-af3f-c00c3f9464ad"
    },
    "RetryAttempts": 0
  },
  "output": {
    "message": {
      "role": "assistant",
      "content": [
        {
          "text": "Here is the weather for San Francisco, CA:"
        },
        {
          "toolUse": {
            "toolUseId": "tooluse_VwMxYFWoTKSKIKQ6I_m8iQ",
            "name": "get_weather",
            "input": {
              "location": "San Francisco, CA"
            }
          }
        }
      ]
    }
  },
  "stopReason": "tool_use",
  "usage": {
    "inputTokens": 354,
    "outputTokens": 67,
    "totalTokens": 421
  },
  "metrics": {
    "latencyMs": 952
  }
}
  • bodyをjson.dumpsしなくて良くなった
  • レスポンスを謎の書式でパースしなくて良くなった
  • モデル名をcohere.command-r-v1:0にかえる だけ で、Command RのToolが使える

Anthropicのドキュメントは一読したほうが良さそう

  • chain of thoughtしたほうがいいよ。SonnetとHaikuはプロンプトで指示しようね ここ
  • 複雑なTool使うときはOpusがいいよ ここ

ツールを実行したあとのリクエストはこんな感じになります。
ちゃんとmessageを作らないとエラーになりました。

contents = response["output"]["message"]["content"]
messages.append(response["output"]["message"])

tool_use_id = ""
for content in contents:

    if "toolUse" in content:
        tool_use_id = content["toolUse"]["toolUseId"]
        break

messages.append(
    {
        "role": "user",
        "content": [
            {
                "toolResult": {
                    "toolUseId": tool_use_id,
                    "content": [{"text": "15 degrees"}],
                },
            }
        ],
    }
)

response2 = bedrock_client.converse(
    modelId=model_id, messages=messages, toolConfig=toolConfig
)

print(json.dumps(response2, indent=2, ensure_ascii=False))
レスポンス
{
  "ResponseMetadata": {
    "RequestId": "9747e53a-4cb4-4228-8617-86591cc6b448",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "date": "Fri, 31 May 2024 03:35:19 GMT",
      "content-type": "application/json",
      "content-length": "393",
      "connection": "keep-alive",
      "x-amzn-requestid": "9747e53a-4cb4-4228-8617-86591cc6b448"
    },
    "RetryAttempts": 0
  },
  "output": {
    "message": {
      "role": "assistant",
      "content": [
        {
          "text": "Based on the weather information, the current temperature in San Francisco, CA is 15 degrees. I don't have any additional details about the weather conditions, but the temperature is reported to be 15 degrees."
        }
      ]
    }
  },
  "stopReason": "end_turn",
  "usage": {
    "inputTokens": 441,
    "outputTokens": 47,
    "totalTokens": 488
  },
  "metrics": {
    "latencyMs": 1120
  }
}
8
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
2