レガシーツールの使用
このツールの使用形式は古くなっています
**できるだけ早く、改良されたツールの使用構造に切り替えることを強くお勧めします。**これは、より信頼性が高く、特に複雑なツールの使用タスクにおいて、より高品質のパフォーマンスを実現できます。
このツールの使用形式は、Claude 3に最適化されておらず、更新されたツールの使用形式よりもパフォーマンスが低下する可能性があります。
レガシーツールの使用方法
レガシーツールの使用では、プロンプト自体の中で関数が定義されます。ツールや関数の説明をClaudeに提供すると、Claudeはそれらのツールをいつどのように使用するかを賢明に判断し、質問に答えたりタスクを完了したりするのに役立てることができます。
例えば、プロンプトの中で、指定された場所の現在の天気を取得するget_weather(location)
という関数をClaudeに提供したとします。ユーザーが「ロンドンの現在の天気はどうですか?」と尋ねると、Claudeは提供されたget_weather
関数を使って答えを調べることができると認識します。
舞台裏では、これは多段階のプロセスです。
- 関数の定義とユーザーの質問の両方が、1つのプロンプトでClaudeに渡されます。
- Claudeがツールを使用するかどうかを適切に判断するためには、ツールとその説明だけでなく、そのツールを使用すべき状況の付随する例も必要です。これは、ユースケースとツールの複雑さに応じて異なります。
- Claudeはユーザーの質問を評価し、どの関数をどの引数で呼び出すかを決定します。
- Claudeは適切な形式の関数呼び出しを構築します。
- 関数呼び出しは、明確な
stop_sequence
を使用してクライアントコードによって傍受され、実際の関数はクライアント側で実行されます。 - 関数の結果がClaudeに返されます。
- Claudeは関数の結果を使用して、ユーザーへの最終的な応答を作成します。
この手法により、Claudeは会話型のインターフェースを維持しながら、外部の知識や機能を活用することができます。
関数の定義
関数は、関数の説明をXMLタグで囲んでClaudeに提供することで定義されます。説明には以下の内容を含める必要があります。
- 関数名
- 関数の機能をプレーンテキストで説明したもの
- 予想されるパラメータ、その型、および説明
- 戻り値とその型
- 発生する可能性のある例外
関数定義の例を以下に示します。
<tool_description>
<tool_name>get_weather</tool_name>
<description>
指定された場所の現在の天気を取得します。
2つのフィールドを持つ辞書を返します。
- temperature: float型、現在の気温(華氏)
- conditions: string型、現在の天気状況の簡単な説明
指定された場所が見つからない場合は、ValueErrorを発生させます。
</description>
<parameters>
<parameter>
<name>location</name>
<type>string</type>
<description>都市と州、例: San Francisco, CA</description>
</parameter>
</parameters>
</tool_description>
良い関数の説明を書くためのヒント:
- 明確かつ簡潔に、しかしClaudeがその関数をいつ使用すべきかを理解するのに十分な詳細を提供する
- パラメータと戻り値の型を指定する
- 発生する可能性のある関連する例外について言及する
- コードの構文ではなく、プレーンテキストの説明を使用する
レガシーツールの使用形式
Claudeが関数を呼び出すためには、非常に特定の形式のXMLブロックを出力する必要があります。その形式は次のようになります。
<function_calls>
<invoke>
<tool_name>function_name</tool_name>
<parameters>
<param1>value1</param1>
<param2>value2</param2>
</parameters>
</invoke>
</function_calls>
Claudeが複数の関数を同時に呼び出す場合、<function_calls>
ブロックには複数の<invoke>
ブロックを含めることができます。各<invoke>
には、呼び出される関数の名前と渡されるパラメータが含まれています。
Claudeが関数を呼び出した後、テキストの生成を停止するようにするには、APIコールに
</function_calls>
をstop_sequence
として渡す必要があります。
<function_calls>
ブロックの後、適切なストップシーケンスが設定されていれば、Claudeは生成を停止し、次のような<function_results>
ブロックで関数の結果が渡されるのを待ちます。
<function_results>
<result>
<tool_name>function_name</tool_name>
<stdout>
function result goes here
</stdout>
</result>
</function_results>
関数の結果は<stdout>
タグ内に配置する必要があります。関数が例外を発生させた場合は、次のように返す必要があります。
<function_results>
<error>
error message goes here
</error>
</function_results>
関数の結果全体は、以前の会話を継続するメッセージとしてClaudeに渡す必要があります。関数の結果を受け取った後、Claudeは結果を応答に組み込むために生成を続けます。
レガシーツールの使用プロンプトの例
以下は、Claudeに2つの関数を提供し、それらを使用する必要がある質問をするプロンプトの完全な例です。
Content | |
---|---|
System | この環境では、ユーザーの質問に答えるために使用できる一連のツールにアクセスできます。 次のようにしてそれらを呼び出すことができます。 <function_calls> <invoke> <tool_name>$TOOL_NAME</tool_name> <parameters> <$PARAMETER_NAME>$PARAMETER_VALUE</$PARAMETER_NAME> … </parameters> </invoke> </function_calls> 使用可能なツールは次のとおりです。 <tools> <tool_description> <tool_name>get_current_stock_price </tool_name><description>企業の現在の株価を取得します。float型を返します。現在の株価。 入力シンボルが無効/不明の場合、ValueErrorを発生させます。</description> <parameters> <parameter> <name>symbol</name> <type>string</type> <description>価格を取得する企業の株式シンボル。</description> </parameter> </parameters> </tool_description> <tool_description> <tool_name>get_ticker_symbol</tool_name> <description>名前で検索された企業の株式ティッカーシンボルを取得します。str型を返します。企業株式のティッカーシンボル。一致するティッカーシンボルが見つからない場合、TickerNotFoundを発生させます。 </description> <parameters> <parameter> <name>company_name</name> <type>string</type> <description>企業名。</description> </parameter> </parameters> </tool_description></tools> |
User | General Motorsの現在の株価はいくらですか? |
Claudeの応答は次のようになります。
Content | |
---|---|
Assistant | <scratchpad> この質問に答えるには、以下のことを行う必要があります。 1. get_ticker_symbol()関数を使用して、General Motorsのティッカーシンボルを取得する。 2. 返されたティッカーシンボルを使用して、get_current_stock_price()関数で現在の株価を取得する。</scratchpad> <function_calls> <invoke> <tool_name>get_ticker_symbol</tool_name> <parameters> <company_name>General Motors</company_name> </parameters> </invoke> </function_calls> |
Claudeは最初にget_ticker_symbol
を呼び出して、General Motorsのティッカーシンボルを取得します。</function calls>
のストップシーケンスによって、Claudeが関数を呼び出そうとしていることがわかります。関連するXMLタグの間からデータを抽出し、Claudeに代わって関数を実行します。そして、結果を<function_results>
タグに入れてClaudeに渡します。
Content | |
---|---|
User | <function_results> <result> <tool_name>get_ticker_symbol</tool_name> <stdout> GM </stdout> </result> </function_results> |
ティッカーシンボルがわかったので、Claudeは次にget_current_stock_price
を呼び出して現在の価格を取得する必要があると判断します。
Content | |
---|---|
Assistant | <function_calls> <invoke> <tool_name>get_current_stock_price</tool_name> <parameters> <symbol>GM</symbol> </parameters> </invoke> </function_calls> |
これらの結果も同様に渡します。
Content | |
---|---|
User | <function_results> <result> <tool_name>get_current_stock_price</tool_name> <stdout> 38.50 </stdout> </result> </function_results> |
この一連の会話により、Claudeに必要なすべての詳細が提供されるので、Claudeは最終的な出力としてユーザーに答えを提供することができます。
Content |
---|
<answer> General Motorsの現在の株価は$38.50です。 </answer> |
レガシーツールの使用に関するFAQ
1回のやり取りで、Claudeにいくつのツールを渡すことができますか?
Claudeが使用するツールや関数は任意の数だけ定義できますが、このレガシーツールの使用構造では、ユースケースや関数の複雑さにもよりますが、現在のところ3〜5個を超えないことをお勧めします。
Claudeには、既知の組み込みツールがありますか?
いいえ。Claudeに使用させたいツールは、ツールの使用プロンプト内で自分で定義する必要があります。Claudeには、最適に機能する関数と定義のリストが事前に決められているわけではありません。
新しいツールの使用形式は、いつVertex AIやAmazon Bedrockに登場しますか?
近日中に登場予定です!