以下は、様々なツール使用パターンとテクニックを示すいくつかのコード例です。簡潔にするために、ツールはシンプルなものを使用し、ツールの説明は最高のパフォーマンスを確保するために理想的なものよりも短くしています。詳細については、ツールの指定を参照してください。
単一のツール
この例では、get_weather
ツールを使用した基本的な単一ツールの状況を示しています。
curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "content-type: application/json" \
--data \
'{
"model": "claude-3-opus-20240229",
"max_tokens": 1024,
"tools": [{
"name": "get_weather",
"description": "指定された場所の現在の天気を取得する",
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "都市と州、例: San Francisco, CA"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度の単位、\"celsius\" または \"fahrenheit\""
}
},
"required": ["location"]
}
}],
"messages": [{"role": "user", "content": "サンフランシスコの天気はどうですか?"}]
}'
Claudeは次のような応答を返します:
{
"id": "msg_01Aq9w938a90dw8q",
"model": "claude-3-opus-20240229",
"stop_reason": "tool_use",
"role": "assistant",
"content": [
{
"type": "text",
"text": "<thinking>get_weather関数を呼び出す必要があり、ユーザーはSFを求めています。これはおそらくサンフランシスコ、カリフォルニア州のことでしょう。</thinking>"
},
{
"type": "tool_use",
"id": "toolu_01A09q90qw90lq917835lq9",
"name": "get_weather",
"input": {"location": "San Francisco, CA", "unit": "celsius"}
}
]
}
次に、提供された入力でget_weather
関数を実行し、新しいuser
メッセージで結果を返す必要があります:
curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "content-type: application/json" \
--data \
'{
"model": "claude-3-opus-20240229",
"max_tokens": 1024,
"tools": [
{
"name": "get_weather",
"description": "指定された場所の現在の天気を取得する",
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "都市と州、例: San Francisco, CA"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度の単位、\"celsius\" または \"fahrenheit\""
}
},
"required": ["location"]
}
}
],
"messages": [
{
"role": "user",
"content": "サンフランシスコの天気はどうですか?"
},
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "<thinking>get_weatherを使う必要があり、ユーザーはSFを求めています。これはおそらくサンフランシスコ、カリフォルニア州のことでしょう。</thinking>"
},
{
"type": "tool_use",
"id": "toolu_01A09q90qw90lq917835lq9",
"name": "get_weather",
"input": {
"location": "San Francisco, CA",
"unit": "celsius"
}
}
]
},
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01A09q90qw90lq917835lq9",
"content": "15度"
}
]
}
]
}'
これにより、天気データを組み込んだClaudeの最終的な応答が出力されます:
{
"id": "msg_01Aq9w938a90dw8q",
"model": "claude-3-opus-20240229",
"stop_reason": "stop_sequence",
"role": "assistant",
"content": [
{
"type": "text",
"text": "サンフランシスコの現在の天気は摂氏15度(華氏59度)です。湾岸の街では涼しい日になっています!"
}
]
}
情報の不足
ユーザーのプロンプトにツールの必須パラメータをすべて満たすのに十分な情報が含まれていない場合、Claude 3 Opusはパラメータが不足していることを認識し、それを尋ねる可能性が高くなります。Claude 3 Sonnetは、特にツール要求を出力する前に考えるように促された場合、尋ねることがあります。しかし、妥当な値を推測しようとすることもあります。
例えば、上記のget_weather
ツールを使用して、場所を指定せずに「天気はどうですか?」とClaudeに尋ねると、特にClaude 3 Sonnetは、ツールの入力を推測することがあります:
{
"type": "tool_use",
"id": "toolu_01A09q90qw90lq917835lq9",
"name": "get_weather",
"input": {"location": "New York, NY", "unit": "fahrenheit"}
}
このような動作は、特にあいまいなプロンプトやClaude 3 Opusほど知的ではないモデルでは保証されません。Claude 3 Opusが必須のパラメータを埋めるのに十分なコンテキストを持っていない場合、ツールを呼び出す代わりに明確化の質問をする可能性が高くなります。
複数のツール
1つのリクエストで、Claudeに複数のツールから選択させることができます。ここでは、get_weather
とget_time
の両方のツールを使用し、ユーザーがその両方を尋ねるクエリを示します。
curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "content-type: application/json" \
--data \
'{
"model": "claude-3-opus-20240229",
"max_tokens": 1024,
"tools": [{
"name": "get_weather",
"description": "指定された場所の現在の天気を取得する",
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "都市と州、例: San Francisco, CA"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度の単位、'celsius' または 'fahrenheit'"
}
},
"required": ["location"]
}
},
{
"name": "get_time",
"description": "指定されたタイムゾーンの現在時刻を取得する",
"input_schema": {
"type": "object",
"properties": {
"timezone": {
"type": "string",
"description": "IANAタイムゾーン名、例: America/Los_Angeles"
}
},
"required": ["timezone"]
}
}],
"messages": [{
"role": "user",
"content": "ニューヨークの現在の天気はどうですか? また、そこの時間は何時ですか?"
}]
}'
この場合、Claudeはユーザーの質問に完全に答えるために、get_weather
とget_time
の2つの別々のツールを一度に1つずつ使用しようとする可能性が高いです。ただし、特にツールが互いに依存していない場合は、2つのtool_use
ブロックを一度に出力することもあります。各ツールを実行し、その結果を単一のuser
メッセージ内の別々のtool_result
ブロックで返す必要があります。
連続したツール
一部のタスクでは、あるツールの出力を別のツールの入力として使用するなど、複数のツールを順番に呼び出す必要がある場合があります。その場合、Claudeは一度に1つのツールを呼び出します。一度にすべてのツールを呼び出すように指示された場合、Claudeは、上流のツールの結果に依存する下流のツールのパラメータを推測する可能性があります。
ここでは、get_location
ツールを使用してユーザーの位置情報を取得し、その位置情報をget_weather
ツールに渡す例を示します:
curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "content-type: application/json" \
--data \
'{
"model": "claude-3-opus-20240229",
"max_tokens": 1024,
"tools": [
{
"name": "get_location",
"description": "ユーザーのIPアドレスに基づいて現在のユーザーの位置情報を取得する。このツールにはパラメータや引数はありません。",
"input_schema": {
"type": "object",
"properties": {}
}
},
{
"name": "get_weather",
"description": "指定された場所の現在の天気を取得する",
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "都市と州、例: San Francisco, CA"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度の単位、'celsius' または 'fahrenheit'"
}
},
"required": ["location"]
}
}
],
"messages": [{
"role": "user",
"content": "私のいる場所の天気はどうですか?"
}]
}'
この場合、Claudeは最初にget_location
ツールを呼び出してユーザーの位置情報を取得します。その位置情報をtool_result
で返すと、Claudeはその位置情報を使ってget_weather
を呼び出し、最終的な答えを得ます。
完全な会話は次のようになります:
Role | Content |
---|
User | 私のいる場所の天気はどうですか? |
Assistant | <thinking>これに答えるには、まずget_locationツールを使ってユーザーの位置情報を特定する必要があります。次に、その位置情報をget_weatherツールに渡して、そこの現在の天気を調べることができます。</thinking>[get_locationのツール使用] |
User | [get_locationの結果としてSan Francisco, CAが含まれるツール結果] |
Assistant | [次の入力でget_weatherのツール使用]{ “location”: “San Francisco, CA”, “unit”: “fahrenheit” } |
User | [get_weatherの結果として”59°F (15°C)、ほぼ曇り”が含まれるツール結果] |
Assistant | サンフランシスコ、カリフォルニア州の現在の天気は59°F (15°C)でほぼ曇りです。かなり涼しく曇った日になっています。外出する際は薄手のジャケットを持っていくとよいでしょう。 |
この例は、Claudeが異なるソースからデータを収集する必要がある質問に答えるために、複数のツールの呼び出しをどのように連鎖させることができるかを示しています。主な手順は次のとおりです:
- Claudeは最初に、天気の質問に答えるにはユーザーの位置情報が必要だと気づき、
get_location
ツールを呼び出します。
- ユーザー(つまりクライアントコード)は実際の
get_location
関数を実行し、その結果をtool_result
ブロックで”San Francisco, CA”と返します。
- 位置情報がわかったところで、Claudeは
get_weather
ツールを呼び出し、location
パラメータとして”San Francisco, CA”を渡します(また、unit
は必須パラメータではないので、unit
パラメータを推測します)。
- ユーザーは再び、提供された引数で実際の
get_weather
関数を実行し、別のtool_result
ブロックで天気データを返します。
- 最後に、Claudeは天気データを自然言語の応答に組み込んで、元の質問に答えます。
思考連鎖ツールの使用
デフォルトでは、Claude 3 Opusは、ツールが必要かどうか、どのツールを使用するか、適切なパラメータは何かを最もよく判断するために、ツール使用クエリに答える前に考えるように促されます。Claude 3 SonnetとClaude 3 Haikuは、できるだけツールを使用するように促され、不要なツールを呼び出したり、欠落しているパラメータを推測したりする可能性が高くなります。SonnetやHaikuに、ツールを呼び出す前にユーザークエリをより適切に評価するように促すには、次のプロンプトを使用できます:
思考連鎖プロンプト
関連するツールを使用してユーザーの要求に答えてください(利用可能な場合)。ツールを呼び出す前に、\<thinking>\</thinking>タグ内で分析を行ってください。まず、提供されたツールのうち、ユーザーの要求に答えるのに関連するツールはどれかを考えてください。次に、関連するツールの必須パラメータを1つずつ確認し、ユーザーが直接提供したか、値を推測するのに十分な情報を与えているかを判断します。パラメータを推測できるかどうかを決める際は、特定の値をサポートするかどうかを慎重に検討してください。必須パラメータの値がすべて存在するか、合理的に推測できる場合は、thinkingタグを閉じてツールの呼び出しに進みます。ただし、必須パラメータの値の1つが欠落している場合は、関数を呼び出さず(欠落しているパラメータに値を入れても呼び出さない)、代わりにユーザーに欠落しているパラメータの提供を求めてください。提供されていないオプションのパラメータについては、追加情報を求めないでください。
JSONモード
ツールを使用して、実行する予定のツールや関数がない場合でも、スキーマに従ったJSON出力をClaudeに生成させることができます。
この方法でツールを使用する場合:
- 通常は単一のツールを提供します
- モデルに明示的にそのツールを使用するように指示するために、
tool_choice
を設定します(ツールの使用を強制するを参照)
- モデルが
input
をツールに渡すことを忘れないでください。したがって、ツールの名前と説明はモデルの視点からのものでなければなりません。
以下では、record_summary
ツールを使用して、特定の形式に従って画像を説明しています。
#!/bin/bash
IMAGE_URL="https://upload.wikimedia.org/wikipedia/commons/a/a7/Camponotus_flavomarginatus_ant.jpg"
IMAGE_MEDIA_TYPE="image/jpeg"
IMAGE_BASE64=$(curl "$IMAGE_URL" | base64)
curl https://api.anthropic.com/v1/messages \
--header "content-type: application/json" \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--data \
'{
"model": "claude-3-sonnet-20240229",
"max_tokens": 1024,
"tools": [{
"name": "record_summary",
"description": "整形式JSONを使用して画像の要約を記録する。",
"input_schema": {
"type": "object",
"properties": {
"key_colors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"r": { "type": "number", "description": "赤の値 [0.0, 1.0]" },
"g": { "type": "number", "description": "緑の値 [0.0, 1.0]" },
"b": { "type": "number", "description": "青の値 [0.0, 1.0]" },
"name": { "type": "string", "description": "スネークケースの人間が読める色の名前、例: \"olive_green\" や \"turquoise\"" }
},
"required": [ "r", "g", "b", "name" ]
},
"description": "画像の主要な色。4色未満に制限してください。"
},
"description": {
"type": "string",
"description": "画像の説明。1〜2文程度。"
},
"estimated_year": {
"type": "integer",
"description": "写真の場合、撮影された年の推定値。画像がフィクションではないと思われる場合にのみ設定してください。おおよその推定で構いません!"
}
},
"required": [ "key_colors", "description" ]
}
}],
"tool_choice": {"type": "tool", "name": "record_summary"},
"messages": [
{"role": "user", "content": [
{"type": "image", "source": {
"type": "base64",
"media_type": "'$IMAGE_MEDIA_TYPE'",
"data": "'$IMAGE_BASE64'"
}},
{"type": "text", "text": "この画像を説明してください。"}
]}
]
}'