ツール呼び出し
Function Calling
概要(サマリー)
ツール呼び出しとは、LLMが外部の処理を直接実行するのではなく、処理の名前と引数を返し、アプリケーション側がそれを実行する仕組みである。OpenAIでは function calling または tool calling、Claudeでは tool use、Geminiでは function calling と呼ばれる。名前は違っても、モデルが「この処理をこの値で使いたい」と返す点は共通である。
モデルは「注文番号 A100 の状況を調べたい」と判断し、get_order_status と引数だけをJSONで返す。データベースを開くのは、こちらのプログラムである。結果を再びモデルへ渡すと、人に見せる文章へまとめる。
AIエージェントがファイルを読んだりコマンドを提案したりできるのも、この往復が繰り返されていることが多い。
詳細解説
モデルは関数を実行しない
普通のチャットは、学習した範囲と、渡した文章から文章を返す。今日の注文状況や、こちらのパソコンの中のファイルは、渡さなければ見えない。
ツール呼び出しは、モデルに「使える道具の一覧」を先に渡す。モデルは、その中から道具が要ると判断したとき、道具の名前と引数を返す。実行、権限の確認、失敗時の扱いはアプリケーションの仕事である。
OpenAIのガイドでは、流れを次の5段で説明している。
- 使えるツールを添えてモデルへ依頼する
- モデルからツール呼び出しを受け取る
- 引数を使って、アプリ側のコードを実行する
- 実行結果を添えて、もう一度モデルへ送る
- 文章の回答、または追加のツール呼び出しを受け取る
1回で終わらないことがある。調べる、計算する、その結果で次の道具を選ぶ、というループになる。
道具の定義
道具は、名前、説明、引数の形で伝える。説明が曖昧だと、似た道具の選び間違いが起きる。
tools = [
{
"type": "function",
"name": "get_order_status",
"description": "注文番号から配送状況を返す。注文番号は英数字だけを受け取る。",
"parameters": {
"type": "object",
"properties": {
"order_number": {
"type": "string",
"description": "注文番号。例: A100"
}
},
"required": ["order_number"],
"additionalProperties": False
}
}
]
この定義を渡したあと、利用者の「A100は今どこですか」というプロンプトに対して、モデルは文章の代わりに get_order_status と {"order_number": "A100"} を返すことがある。こちらが注文システムを引き、返ってきた状況をモデルへ戻す。
引数はモデルが作った文字列である。実在する注文番号とは限らない。実行前に、形式、桁、権限を検査する。
結果を戻してから文章になる
ツールの結果は、利用者へそのまま見せるログではない。モデルへの次の入力である。
tool_result = {"order_number": "A100", "status": "配送中", "eta": "11月2日"}
このJSONを戻すと、モデルは「A100は配送中で、到着予定は11月2日です」のような文章を作れる。結果にない日付を、モデルが補って書くこともある。画面へ出す前に、結果と文章が食い違っていないかを見る余地を残す。
返してはいけない情報も、結果に混ぜない。モデルへ戻した内容は、その後の返答に使われる。顧客の住所や内部の管理メモを、必要がないのに戻さない。
MCPとの違い
MCPは、AIアプリと外部の道具をつなぐ接続の取り決めである。ツール呼び出しは、モデルが「この関数を、この引数で使いたい」と返すやり取りである。
OpenAIの組み込みツールには、MCPサーバーの機能を使うものもある。接続の規格と、モデルが返す呼び出しは、重なることもあるが同じ名前の機能ではない。
危険な処理は人が確認する
読み取りは比較的安全でも、削除、送金、メール送信、本番への反映は、モデルの判断だけで実行しない。呼び出しが返ってきた時点で止め、引数を人に見せてから実行する。
モデルは、一覧にない道具を要求したり、説明にない副作用を期待したりすることがある。実行できる関数は、こちらが登録したものだけに限定する。
AIコーディングとの関係
コーディング支援がファイルを開き、テストを走らせ、修正案を出すとき、裏側ではツール呼び出しに近いループが動いている。モデルがターミナルを「実行した」ように見えても、実行しているのはツール側である。
AIに道具を設計させるときは、読み取りと書き込みを分けるよう指定する。read_file と delete_file を同じ「ファイル操作」にまとめない。説明文には、いつ使うかと、いつ使わないかを書く。
返ってきた引数は、適用前に差分として見る。パスが作業フォルダの外を指していないか、コマンドが広すぎないかを、モデルの説明ではなく引数そのもので確認する。
よくある勘違い
AIがデータベースを直接更新する?
基本の仕組みでは、しない。モデルは名前と引数を返す。更新するのは、その引数を受け取ったアプリケーションである。
関数を渡せば、正しい引数になる?
形はそろいやすいが、値の正しさまでは保証されない。存在しないIDや、説明と違う単位が入ることがある。実行前の検査が要る。
MCPと同じもの?
接続の取り決めと、モデルが返す呼び出し要求は別である。MCPで道具を配り、モデルはツール呼び出しでその道具を要求する、という組み合わせになる。
エージェントとは違う?
エージェントは、目的に向かってツール呼び出しを繰り返す進め方である。ツール呼び出しは、その1往復の仕組みである。
まとめ
- ツール呼び出しは、モデルが関数名と引数を返し、アプリが実行する仕組みである
- モデル自身は、外部のデータベースやファイルを勝手には開けない
- 道具は名前、説明、引数の形で定義し、説明の具体さが選択を左右する
- 実行結果を戻してから、人に見せる文章が作られる
- 削除や送信など元に戻しにくい処理は、実行前に人の確認を挟む
情報ソース
より詳しくAIに聞いてみよう
- ツール呼び出しの5段の流れを、注文状況の問い合わせで説明してください。
- モデルが関数を実行しないとはどういうことか、具体例で教えてください。
- ツール呼び出しとMCPの違いを、初心者向けに整理してください。
- 引数を実行前に検査するとき、最低限見る項目を挙げてください。
- AIコーディングのエージェントに、削除だけは人の確認後に実行させる指示文を書いてください。