ツール呼び出し:エージェントに行動させる
エージェントが外部関数を確実に選択・実行する仕組み——スキーマ設計、引数検証、失敗からの回復。
テキストから行動へ
言語モデル単体ではテキストしか生成できません。ツール呼び出しこそがエージェントにする仕組みです。モデルが構造化リクエストを出し、コードが実行し、結果がコンテキストに戻ります。
model → { name: "search_orders", args: { customer_id: "C1024" } }
コード → 実行 → 行を返す
model → 行を根拠に推論 → 回答
モデル自身は何も実行しません。実行するのはあなたのコード です。モデルが決めるのは「何を呼ぶか」と「どの引数か」だけです。
スキーマ設計がすべて
ツールの説明はプロンプトです。説明が弱いと、呼び方を誤るか、そもそも呼ばれません。
「何をするか」と「境界はどこか」を書きましょう。
悪い例:get_data — データを取得する。
良い例:get_order_history — 1 顧客の注文履歴を新しい順に返す。受け取るのは顧客 id で、メールや氏名ではない。最大 50 行。より古い履歴は before でページングする。
失敗の大部分は次の 3 規則で防げます:
- 列挙は全列挙。
day|week|monthなら並べる。「期間」と書かない。 - 受け取らないものを明記。 「メールではなく顧客 id」で誤呼び出しの一群が消える。
- 制限を書く。 最大行数、既定の並び、ページ方向。API 契約は推測できません。
無限リトライを避ける失敗処理
失敗の理由は決まっています:不正な引数、一時エラー、権限不足。失敗は データとしてモデルに返し、ターンを殺す例外にしてはいけません。
{ ok: false, error: "顧客 ID C1024 が見つかりません", hint: "id は C1000-C9999 の形式です" }
モデルは説明的なエラーから自己修正できますが、スタックトレースからは何もできません。
無限ループ対策:ターンごとの呼び出し回数に上限を設け、同一の (名前, 引数) の繰り返しを検出します。同じ失敗が 2 回出たら停止して人に委ねます。
よくある失敗パターン
| 症状 | 推定原因 |
|---|---|
| ツールが呼ばれない | 説明にユーザーが使う語がない |
| 毎回引数が違う | 列挙していない、単位が書いていない |
| 複数ツールで選び間違える | 説明が重複。差を際立たせる |
| エラー時に無限リトライ | 例外として投げている |
| 結果を捏造する | 戻り値をコンテキストに戻していない |