ファンクションコーリングとは?AIが外部の道具を呼ぶ仕組み

ファンクションコーリングとは?AIが外部の道具を呼ぶ仕組み

AIエージェントが天気を調べたり、社内のデータベースを引いたりする様子は、もうめずらしくなくなりました。

その裏側で動いているのが、ファンクションコーリング(function calling)と呼ばれる仕組みです。

名前だけを聞くと「AIがプログラムを実行している」ように思えるかもしれません。

けれども実際には、AI自身は何ひとつ実行していない

ここを取り違えたまま実装に入ると、権限設計もエラー処理も見当違いの場所を守ることになります。

AIが返すのは「呼びたい」という申告だけ

ファンクションコーリングでモデルが返すのは、実行結果ではありません。

返ってくるのは「この道具を、この引数で呼びたい」という構造化された申告です。

OpenAI のガイドは、モデルが関数そのものを実行するわけではなく、関数名と JSON 形式の引数を含む応答を返すだけだと明記しています(OpenAI の Function calling ガイド)。

Function calling | OpenAI API

Anthropic 側の説明はもう少し踏み込んでいて、ツール利用をアプリケーションとモデルのあいだの契約と位置づけています。

どんな操作が使えて、入出力がどんな形かはこちらが決め、いつどう呼ぶかだけをモデルが決める、という分担です(Anthropic の How tool use works)。

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を扱うときにも効いてくるのです。

Ollamaの構造化出力でJSONを確実に得る|formatパラメータとPydantic連携

関数の引数ではなく、回答そのものをスキーマどおりの形で返させたいときは、構造化出力という別の仕組みを使います。

構造化出力とは?AIの答えをJSONスキーマで固定する仕組み

つまずきやすい3つのポイント

ひとつ目は、道具を並べすぎることです。

OpenAI のガイドは、ターン開始時点で使える関数は20個未満に抑えることを目安として挙げています。

選択肢が増えるほど、モデルは似た道具の区別に迷う。

ふたつ目は、引数の検証をモデル任せにしてしまうこと。

スキーマは形を守るための仕組みであって、値が業務的に妥当かどうかまでは面倒を見てくれません

削除対象のIDが本当に自分の権限内かは、実行する側で必ず確かめる必要があります。

3つ目は、エラーを握りつぶすこと。

道具が失敗したときは、例外で落とすのではなく「失敗した」という結果を返すほうが、モデルは次の手を考えられます。

失敗もまた、モデルに渡すべき情報のひとつ

なお、こうした道具の定義を標準化して持ち回れるようにしたのが MCP です。

MCP(Model Context Protocol)とは?AIと外部ツールをつなぐ標準を整理する

最後に

ファンクションコーリングは、モデルに「呼びたい」と言わせ、呼ぶのは自分のコードがやるという、それだけの仕組みでした。

一度この分担が腑に落ちると、権限もログもエラー処理も、これまで書いてきたAPI連携と同じ場所に置けばよいと分かってきます。

AIエージェントの安全性は、モデルの賢さではなく道具の設計で決まる

まずは手元の小さな処理をひとつ、道具として切り出してみるところから始めてみてください。

以上です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA