ツールの使用 (関数の呼び出し)
Claudeは、外部のクライアントサイドのツールや関数と対話することができ、カスタムツールを装備してより幅広いタスクを実行できます。
新しい包括的なツール使用コースで、Claudeでのツール使用をマスターするために必要なすべてを学びましょう!引き続き、このフォームを使ってアイデアや提案を共有してください。
Messages APIを使ってClaudeにツールを提供する方法の例を以下に示します。
ツール使用の仕組み
以下の手順で外部ツールをClaudeと統合します。
Claudeにツールとユーザープロンプトを提供する
- APIリクエストでツールの名前、説明、入力スキーマを定義します。
- これらのツールを必要とするユーザープロンプトを含めます。例: 「サンフランシスコの天気は?」
Claudeがツールを使用することを決定する
- Claudeは、ユーザーのクエリに役立つツールがあるかどうかを評価します。
- ある場合、Claudeは適切にフォーマットされたツール使用リクエストを構築します。
- APIレスポンスの
stop_reason
がtool_use
になり、Claudeの意図を示します。
ツール入力を抽出し、コードを実行し、結果を返す
- クライアント側でClaudeのリクエストからツール名と入力を抽出します。
- 実際のツールコードをクライアント側で実行します。
tool_result
コンテンツブロックを含む新しいuser
メッセージで会話を続けます。
Claudeはツールの結果を使って応答を作成する
- Claudeはツールの結果を分析して、元のユーザープロンプトへの最終的な応答を作成します。
注: ステップ3と4はオプションです。一部のワークフローでは、Claudeのツール使用リクエスト(ステップ2)だけで十分な場合があり、結果をClaudeに送り返す必要はありません。
すべてのツールはユーザーが提供する
Claudeにはビルトインのサーバーサイドツールはないことに注意してください。すべてのツールは、各APIリクエストでユーザーが明示的に提供する必要があります。これにより、Claudeが使用できるツールを完全に制御し、柔軟に対応できます。
ツール使用の実装方法
モデルの選択
一般的に、複雑なツールやあいまいなクエリにはClaude 3 Opusを使用します。複数のツールをより適切に処理し、必要に応じて明確化を求めます。
単純なツールにはHaikuを使用しますが、パラメータを推測する可能性があることに注意してください。
ツールの指定
ツールはAPIリクエストのtools
トップレベルパラメータで指定します。各ツール定義には以下が含まれます。
パラメータ | 説明 |
---|---|
name | ツールの名前。正規表現^[a-zA-Z0-9_-]{1,64}$ に一致する必要があります。 |
description | ツールの機能、使用タイミング、動作を詳細に説明したプレーンテキスト。 |
input_schema | ツールの期待されるパラメータを定義するJSON Schemaオブジェクト。 |
ツール定義のベストプラクティス
ツールを使用する際にClaudeから最高のパフォーマンスを引き出すには、以下のガイドラインに従ってください。
- 極めて詳細な説明を提供する。 これはツールのパフォーマンスに最も重要な要因です。説明には以下を含むツールのすべての詳細を説明する必要があります。
- ツールの機能
- 使用すべきタイミング(と使用すべきでないタイミング)
- 各パラメータの意味とツールの動作への影響
- ツール名が不明確な場合、ツールが返さない情報など、重要な注意点や制限事項。Claudeにツールについてより多くのコンテキストを提供すればするほど、ツールをいつ、どのように使用するかをより適切に判断できるようになります。ツールの説明は少なくとも3〜4文を目安とし、ツールが複雑な場合はさらに長くします。
- 例よりも説明を優先する。 ツールの使用例をその説明や付随するプロンプトに含めることはできますが、ツールの目的とパラメータを明確かつ包括的に説明することの方が重要です。説明を十分に肉付けした後に、例を追加するようにしてください。
良い説明は、ツールの機能、使用タイミング、返すデータ、ticker
パラメータの意味を明確に説明しています。悪い説明は短すぎて、ツールの動作や使用法についてClaudeに多くの疑問を残しています。
Claudeの出力の制御
ツールの使用を強制する
場合によっては、Claudeがツールを使用せずに回答できると考えている場合でも、ユーザーの質問に答えるために特定のツールを使用するようClaudeに指示したい場合があります。これは、以下のようにtool_choice
フィールドでツールを指定することで実現できます。
tool_choice = {"type": "tool", "name": "get_weather"}
tool_choiceパラメータを使用する際、3つの選択肢があります。
auto
は、Claudeが提供されたツールを呼び出すかどうかを決定できるようにします。これがデフォルト値です。any
は、Claudeが提供されたツールのいずれかを使用する必要があることを伝えますが、特定のツールを強制しません。tool
では、特定のツールを常に使用するようClaudeに強制できます。
この図は、各オプションの動作を示しています。
tool_choice
をany
またはtool
にすると、ツールを使用するようにアシスタントメッセージを事前に入力します。つまり、明示的に指示された場合でも、モデルはtool_use
コンテンツブロックの前に連鎖思考のtext
コンテンツブロックを出力しません。
テストでは、これによってパフォーマンスが低下することはないことが示されています。特定のツールを使用するようモデルに要求しながら、(特にOpusで)連鎖思考を維持したい場合は、tool_choice
に{"type": "auto"}
を使用し(デフォルト)、user
メッセージに明示的な指示を追加します。例: 「ロンドンの天気はどうですか?回答ではget_weatherツールを使用してください。」
JSON出力
ツールは必ずしもクライアントサイド関数である必要はありません。提供されたスキーマに従うJSONの出力をモデルに返させたい場合は、いつでもツールを使用できます。例えば、特定のスキーマを持つrecord_summary
ツールを使用するかもしれません。完全な動作例については、ツール使用の例を参照してください。
連鎖思考
ツールを使用する際、Claudeはしばしば「連鎖思考」、つまり問題を分解し、どのツールを使用するかを決定するために使用するステップバイステップの推論を示します。Claude 3 Opusモデルは、tool_choice
がauto
に設定されている場合(これがデフォルト値です。ツールの使用を強制するを参照)、これを行います。SonnetとHaikuはそれを行うようプロンプトを出すことができます。
例えば、「サンフランシスコの現在の天気はどうですか?また、そこは今何時ですか?」というプロンプトが与えられると、Claudeは次のように応答するかもしれません。
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "<thinking>この質問に答えるために、以下を行います。1. get_weatherツールを使用して、サンフランシスコの現在の天気を取得します。2. get_timeツールを使用して、サンフランシスコ(CA)をカバーするAmerica/Los_Angelesタイムゾーンの現在の時刻を取得します。</thinking>"
},
{
"type": "tool_use",
"id": "toolu_01A09q90qw90lq917835lq9",
"name": "get_weather",
"input": {"location": "San Francisco, CA"}
}
]
}
この連鎖思考は、Claudeの推論プロセスに洞察を与え、予期しない動作のデバッグに役立ちます。
Claude 3 Sonnetモデルでは、デフォルトでは連鎖思考はあまり一般的ではありませんが、ユーザーメッセージやシステムプロンプトに「回答する前に、
<thinking>
タグは、Claudeが連鎖思考を示すために使用する一般的な規則ですが、正確なフォーマット(このXMLタグの名前など)は時間とともに変更される可能性があることに注意してください。コードでは、連鎖思考を他のアシスタントが生成したテキストと同様に扱い、<thinking>
タグの存在や特定のフォーマットに依存しないようにする必要があります。
ツール使用とツール結果のコンテンツブロックの処理
Claudeが提供したツールのいずれかを使用することを決定すると、stop_reason
がtool_use
で、APIレスポンスに以下を含む1つ以上のtool_use
コンテンツブロックを含む応答が返されます。
id
: この特定のツール使用ブロックの一意の識別子。後でツールの結果を照合するために使用されます。name
: 使用されるツールの名前。input
: ツールに渡される入力を含むオブジェクトで、ツールのinput_schema
に準拠しています。
ツール使用の応答を受け取ったら、以下を行う必要があります。
tool_use
ブロックからname
、id
、input
を抽出します。- そのツール名に対応するコードベースの実際のツールを実行し、ツールの
input
を渡します。 - [オプション]
role
がuser
で、tool_result
タイプと以下の情報を含むcontent
ブロックを含む新しいメッセージを送信して会話を続けます。tool_use_id
: これが結果であるツール使用リクエストのid
。content
: 文字列としてのツールの結果(例:"content": "15度"
)またはネストされたコンテンツブロックのリスト(例:"content": [{"type": "text", "text": "15度"}]
)。これらのコンテンツブロックは、text
またはimage
タイプを使用できます。is_error
(オプション): ツールの実行がエラーになった場合はtrue
に設定します。
ツールの結果を受け取った後、Claudeはその情報を使用して、元のユーザープロンプトへの応答の生成を続けます。
他のAPIとの違い
ツールの使用を分離したり、tool
やfunction
のような特別なロールを使用したりする他のAPIとは異なり、AnthropicのAPIでは、ツールをuser
とassistant
のメッセージ構造に直接統合しています。
メッセージには、text
、image
、tool_use
、tool_result
ブロックの配列が含まれます。user
メッセージにはクライアントサイドのコンテンツとtool_result
が含まれ、assistant
メッセージにはAIが生成したコンテンツとtool_use
が含まれます。
エラーのトラブルシューティング
Claudeでツールを使用する際に発生する可能性のあるエラーには、いくつかの種類があります。
ツール使用の例
さまざまなツール使用パターンとテクニックを示すいくつかのコード例を以下に示します。簡潔にするために、ツールはシンプルなツールであり、ツールの説明は最高のパフォーマンスを確保するには理想的よりも短くなっています。
価格
ツール使用リクエストは、(tools
パラメータに含まれるものを含む)モデルに送信される入力トークンの総数と生成される出力トークンの数に基づいて、他のClaude APIリクエストと同じように価格が設定されます。
ツール使用による追加のトークンは以下から発生します。
- APIリクエストの
tools
パラメータ(ツール名、説明、スキーマ) - APIリクエストとレスポンスの
tool_use
コンテンツブロック - APIリクエストの
tool_result
コンテンツブロック
tools
を使用する場合、ツール使用を可能にする特別なシステムプロンプトがモデルに自動的に含まれます。各モデルに必要なツール使用トークンの数を以下に示します(上記の追加トークンは除く)。
モデル | ツールの選択 | ツール使用システムプロンプトのトークン数 |
---|---|---|
Claude 3.5 Sonnet | auto any , tool | 294トークン 261トークン |
Claude 3 Opus | auto any , tool | 530トークン 281トークン |
Claude 3 Sonnet | auto any , tool | 159トークン 235トークン |
Claude 3 Haiku | auto any , tool | 264トークン 340トークン |
これらのトークン数は、通常の入力トークンと出力トークンに追加され、リクエストの合計コストを計算するために使用されます。現在のモデルごとの価格については、モデルの概要表を参照してください。
ツール使用プロンプトを送信すると、他のAPIリクエストと同様に、レスポンスには入力トークンと出力トークンの両方のカウントが報告されたusage
メトリクスの一部として出力されます。
次のステップ
クックブックで、すぐに実装できるツール使用のコード例のリポジトリを探索してください。