AIエージェントが天気を調べたり、社内のデータベースを引いたりする様子は、もうめずらしくなくなりました。
その裏側で動いているのが、ファンクションコーリング(function calling)と呼ばれる仕組みです。
名前だけを聞くと「AIがプログラムを実行している」ように思えるかもしれません。
けれども実際には、AI自身は何ひとつ実行していない。
ここを取り違えたまま実装に入ると、権限設計もエラー処理も見当違いの場所を守ることになります。
AIが返すのは「呼びたい」という申告だけ
ファンクションコーリングでモデルが返すのは、実行結果ではありません。
返ってくるのは「この道具を、この引数で呼びたい」という構造化された申告です。
OpenAI のガイドは、モデルが関数そのものを実行するわけではなく、関数名と JSON 形式の引数を含む応答を返すだけだと明記しています(OpenAI の Function calling ガイド)。
Anthropic 側の説明はもう少し踏み込んでいて、ツール利用をアプリケーションとモデルのあいだの契約と位置づけています。
どんな操作が使えて、入出力がどんな形かはこちらが決め、いつどう呼ぶかだけをモデルが決める、という分担です(Anthropic の How tool use works)。
つまりモデルは、キーボードを持たない相談相手のようなもの。
指を動かすのは、あくまで呼び出し側のコードのほうなのです。
往復は4ステップで完結する
流れを分解すると、驚くほど単純な往復になります。
まずアプリケーションが、使える道具の一覧とユーザーの依頼をまとめてモデルへ送る。
次にモデルが「この道具をこの引数で」と申告を返します。
そしてアプリケーションが実際にその処理を走らせ、結果をモデルへ送り返す。
最後にモデルが、その結果を踏まえた文章を生成します。
Anthropic のドキュメントが図示しているのも、stop_reason を見ながら回す while ループの形。
# 概念を示す擬似コード
while resp.stop_reason == "tool_use":
results = run_tools(resp.tool_use_blocks) # 実行するのは自分のコード
resp = client.messages.create(
messages=history + [assistant(resp), user(results)],
tools=TOOLS,
)
# ... 以降は通常の応答として扱う
ループの外形が固定されているので、道具が増えても構造は変わりません。
道具を10個に増やしても、変わるのは run_tools の中身だけ。
道具の説明書はJSONスキーマで書く
モデルに渡す道具の定義は、自然言語の説明と JSON スキーマの組み合わせです。
引数の型・必須項目・取りうる値を、機械が検証できる形で宣言しておく。
OpenAI のガイドは、スキーマからの逸脱を防ぐために strict モードと additionalProperties: false の併用を推奨しています。
ここで効いてくるのが、説明文の書き方です。
引数の型はスキーマが守ってくれますが、「どんなときにこの道具を選ぶか」はスキーマに書けません。
その判断材料になるのは description の一文だけなので、道具の説明は仕様書ではなく、隣の席の人へ渡すメモのつもりで書くほうがうまくいきます。
同じ「出力の形を先に約束させる」という発想は、ローカルLLMを扱うときにも効いてくるのです。
関数の引数ではなく、回答そのものをスキーマどおりの形で返させたいときは、構造化出力という別の仕組みを使います。
つまずきやすい3つのポイント
ひとつ目は、道具を並べすぎることです。
OpenAI のガイドは、ターン開始時点で使える関数は20個未満に抑えることを目安として挙げています。
選択肢が増えるほど、モデルは似た道具の区別に迷う。
ふたつ目は、引数の検証をモデル任せにしてしまうこと。
スキーマは形を守るための仕組みであって、値が業務的に妥当かどうかまでは面倒を見てくれません。
削除対象のIDが本当に自分の権限内かは、実行する側で必ず確かめる必要があります。
3つ目は、エラーを握りつぶすこと。
道具が失敗したときは、例外で落とすのではなく「失敗した」という結果を返すほうが、モデルは次の手を考えられます。
失敗もまた、モデルに渡すべき情報のひとつ。
なお、こうした道具の定義を標準化して持ち回れるようにしたのが MCP です。
最後に
ファンクションコーリングは、モデルに「呼びたい」と言わせ、呼ぶのは自分のコードがやるという、それだけの仕組みでした。
一度この分担が腑に落ちると、権限もログもエラー処理も、これまで書いてきたAPI連携と同じ場所に置けばよいと分かってきます。
AIエージェントの安全性は、モデルの賢さではなく道具の設計で決まる。
まずは手元の小さな処理をひとつ、道具として切り出してみるところから始めてみてください。
以上です。













コメントを残す