関数呼び出し(Function calling)は、大規模言語モデルの機能で、自由形式のテキストを生成する代わりに構造化された引数を出力することで、外部のコードやツールの実行を要求できる機能です。自然言語プロンプトと決定論的なソフトウェアを橋渡しし、LLMがデータベース、API、その他のサービスに対して確実に行動できるようにします。モデルが関数が必要かどうかを判断し、機械可読なペイロードを提供しますが、実際の関数の実行と結果のモデルへのフィードバックは呼び出し側のアプリケーションが担当します。
関数呼び出しの仕組み
開発者は、一連の関数定義をモデルに登録します。通常は、各関数の名前、目的、パラメータを記述したJSONスキーマとして登録します。ユーザーが「東京の天気は?」のようなプロンプトを送信すると、モデルは直接回答しません。代わりに、構造化されたオブジェクト(たとえば {"name": "get_weather", "arguments": {"city": "Tokyo"}})を返します。ホストアプリケーションはそのオブジェクトを解析し、実際の関数(多くはサードパーティAPIの呼び出し)を実行して、その結果を新しいメッセージとして会話に追加します。LLMはその結果をユーザーのための自然言語の返信に変換します。
ほとんどのプロバイダーは、チャット完了APIを通じて同じフロー機能を提供しています。モデル自身がコードを実行することは決してありません。関数呼び出しは本質的に、言語モデルに「JSONで話させる」ための規律ある方法であり、決定論的なソフトウェアが安全に行動できるようにします。
なぜ重要なのか
LLMは言語と推論は得意ですが、算術、リアルタイムデータ、副作用は苦手です。関数呼び出しは、チャットモデルをエージェント型システムの推論レイヤーへと変えます。モデルが計画し、ツールが実行するのです。このパターンは、カレンダーの予約、CRMのクエリ、SQLの実行、社内マイクロサービスの呼び出し、ロボット動作のトリガーなどを行うAIアシスタントを支えており、開発者は実際にどのコードが実行されるかを厳密に制御できます。また、回答がモデルのパラメトリックメモリではなく実際のツール出力に基づいているため、事実的なクエリにおける幻覚(ハルシネーション)を劇的に削減します。
関数呼び出しパターンの主な種類
- シングルショットツール利用:モデルが1ターンに1つの関数を呼び出します。電卓やウェブ検索などが例です。
- 並列呼び出し:モデルが1回の応答で複数の独立した関数を要求します。複数のソースから一度にデータを取得する場合に便利です。
- マルチステップ/エージェント型ループ:モデルがこれ以上の呼び出しは不要と判断するまで、ツールの結果をアプリケーションがループで処理し、一連のアクションを可能にします。
- 制約付きデコーディング:モデルのトークン単位の出力をJSONスキーマに強制的に準拠させる手法で、厳格なAPIに対する信頼性を向上させます。
関数呼び出しは主要なモデルプロバイダーの標準機能となっており、最新のAIエージェント、コパイロット、検索パイプラインの大半が、この上に構築されています。