ツール使用 (Tool Use)
ツール使用とは、LLMが応答の途中で外部の関数、API、データベース、サービスを呼び出せるようにする機能であり、最新データの取得、計算の実行、現実世界での操作の実行を可能にします。学習データに縛られる代わりに、ツールを使えるモデルはタスクの要求に応じて自分自身の外側へ手を伸ばすことができます。
ツール使用とは、LLMが応答の途中で外部の関数、API、データベース、サービスを呼び出せるようにする機能であり、最新データの取得、計算の実行、現実世界での操作の実行を可能にします。学習データに縛られる代わりに、ツールを使えるモデルはタスクの要求に応じて自分自身の外側へ手を伸ばすことができます。
なぜ重要か
素のLLMには3つの厳しい制約があります。固定されたナレッジカットオフ、プライベートデータへのアクセス不可、そして操作を実行できないことです。ツール使用はこの3つすべてを取り除きます。ツールがあれば、同じモデルが「現在のMRRは?」に答えたり、メールを送ったり、フライトを予約したり、データベースに問い合わせたり、コードを実行したりできます。ツール使用は、最新のあらゆるAIエージェント、あらゆる「コパイロット」、そしてチャットボット層を超えるほぼすべての本番LLMアプリケーションの基盤です。
仕組み
1. ツール定義: 呼び出し側は、それぞれ名前、説明、パラメータスキーマを持つ利用可能なツールの一覧をモデルに提供します。
2. モデルが呼び出しを決定: ユーザーのリクエストにツールが必要な場合、モデルは通常のテキストではなく、構造化されたツール呼び出し(スキーマに一致するJSON)を出力します。
3. ランタイムがツールを実行: あなたのコードがツール呼び出しを受け取り、実際の関数を実行し、結果を返します。
4. 結果がモデルに戻る: モデルはその結果をコンテキストの一部として受け取り、応答を続けます。ユーザーに答えるか、別のツールを呼び出します。
5. 完了までループ: 複数ツールを使うタスクでは、モデルが最終的なテキスト応答を生成するまでツール呼び出しが連鎖します。
ツール使用と関数呼び出しの違い
この2つの用語はほぼ同じ意味で使われますが、わずかなニュアンスの違いがあります。
- 関数呼び出し: 元々の枠組みで、モデルは単一の名前付き関数に対するJSON引数を出力します。
- ツール使用: より広い枠組みで、ツールは関数、API、コンピュータ操作、MCPサーバーであり得て、モデルはそれらを順に複数オーケストレーションします。
Anthropicは「ツール使用」を、OpenAIは歴史的に「関数呼び出し」を使い、現在は「ツール」と表現しています。どちらも同じ根底の機能を指しています。
ツールの種類
取得: ドキュメントの取得、ウェブ検索、データベースへの問い合わせ、レコードの検索。
計算: Pythonの実行、計算、単位変換、ファイルの解析。
操作: メールの送信、カレンダーイベントの作成、Slackへの投稿、CRMの更新。
コード実行: モデルがコードを書いて実行できるサンドボックス化されたインタープリタ。
コンピュータ使用: クリック、入力、画面の読み取り。最も汎用的なツールです。
モデル間連携: 別の特化したモデル(例: 画像生成)に委譲します。
良いツールスキーマの設計
明確で短い説明: 説明はモデルがいつ呼び出すかを判断する材料です。曖昧さをなくしましょう。
狭いパラメータ型: 自由なテキストよりも列挙型や制約付き文字列を優先します。これは引数の幻覚を減らします。
可能な限り冪等に: モデルが再試行する可能性がある場合、2回目の呼び出しでメールが二重送信されてはいけません。
構造化された結果を返す: モデルには自由なテキストではなくJSONを返しましょう。モデルは構造についての方がうまく推論します。
エラー応答はモデルに何をすべきか伝える: 「エラー: 都市が見つかりません、別のスペルを試してください」は「500」よりも役立ちます。
よくある間違い
ツールが多すぎる: 約20〜30個を超えると、モデルは間違ったツールを選び始めます。関連するツールをグループ化するか、より小さな選択肢へルーティングしましょう。
曖昧な説明: 「ユーティリティ」では、モデルにいつ呼び出すべきか伝わりません。具体的にしましょう。
エラー処理がない: ツールの失敗はループを壊します。常にモデルが反応できる構造化されたエラーを返しましょう。
レイテンシの無視: ツール呼び出しごとに往復が増えます。独立した呼び出しは並列化し、可能な場合はバッチ処理しましょう。
ガードレールの省略: 操作を実行するツール(メール送信、送金)には、人間の介在(human-in-the-loop)や厳格なスコープ設定が必要です。
Sources: