Function Calling / Tool Use(LLM)(ファンクションコーリング ツールユース)
Function Calling(Tool Use)とは、LLMが外部関数やAPIを呼び出すための構造化されたリクエストを生成する機能で、OpenAI Functions・Claude Tool Use・Gemini Function Callingなど各社が実装し、LLMエージェント開発の基盤技術となっている。
Function Calling / Tool Use とは
Function Calling(ファンクションコーリング)は、LLMが事前に定義された関数(ツール)の中から適切なものを選択し、引数を構造化データとして生成する機能である。モデルは関数を実際に実行するのではなく、「どの関数を、どのような引数で呼び出すべきか」を JSON 形式で出力する。アプリケーション側がその出力に基づいて関数を実行し、結果をモデルに返すことで、LLMと外部システムの連携が実現する。AnthropicではこれをTool Use(ツールユース)と呼称している。
主要プロバイダの実装比較
OpenAI Functions / Tools API
OpenAIは2023年6月にFunction Callingを導入し、2024年にTools APIへ進化させた。
- tools パラメータ:
tools配列に関数定義(名前・説明・パラメータスキーマ)を記述 - tool_choice:
"auto"(モデル判断)、"required"(必ず呼び出し)、{type: "function", function: {name: "..."}}(特定関数指定)から選択 - 並列呼び出し(Parallel Function Calling): GPT-4o以降、1回のレスポンスで複数の関数を同時に呼び出し可能。
parallel_tool_calls: true(デフォルト有効) - Strict Mode:
strict: trueで引数がJSON Schemaに100%準拠することを保証
Anthropic Tool Use
Anthropicは2024年4月にTool Use(旧Function Calling)をClaude 3で導入した。
- tools パラメータ:
tools配列にツール定義(name・description・input_schema)を記述。input_schemaはJSON Schema形式 - tool_choice:
{type: "auto"}(モデル判断)、{type: "any"}(いずれかのツールを必ず呼び出し)、{type: "tool", name: "..."}(特定ツール指定) - 並列ツール呼び出し: Claude 3.5以降で対応。1つのレスポンスブロック内に複数の
tool_useコンテンツブロックが含まれる - ストリーミング:
content_block_start/content_block_deltaイベントでツール呼び出しの部分データをリアルタイム受信可能 - Claude 4の強化点: discriminated union型への対応、再帰的スキーマ(深度制限付き)、ツール結果のキャッシュ最適化
Google Gemini Function Calling
GeminiはfunctionDeclarationsでツール定義を行う。
- Tool定義:
tools配列内のfunctionDeclarationsに関数名・説明・パラメータ(OpenAPI 3.0形式)を記述 - toolConfig:
function_calling_configでmodeを指定(AUTO/ANY/NONE)。allowed_function_namesで呼び出し可能な関数を制限可能 - 並列呼び出し: Gemini 2.0以降で対応
- Code Execution: Function Callingに加え、Geminiはサンドボックス内でPythonコードを実行する
code_executionツールも提供
| 機能 | OpenAI | Anthropic | Gemini | Mistral |
|---|---|---|---|---|
| 基本FC | ○ tools API | ○ Tool Use | ○ functionDeclarations | ○ |
| 並列呼び出し | ○ (GPT-4o+) | ○ (Claude 3.5+) | ○ (Gemini 2.0+) | ○ |
| Strict Mode | ○ strict: true | ○ input_schema | ○ responseSchema | × |
| ストリーミング | ○ | ○ content_block | ○ | ○ |
| ツール結果キャッシュ | ○ | ○ (Claude 4) | △ | × |
| 最大ツール数 | 128 | 64 | 128 | 64 |
Function Callingの実装パターン
基本的な実装フロー
- ツール定義をAPIリクエストに含める
- モデルがツール呼び出しを含むレスポンスを返す
- アプリケーションがツールを実行し結果を取得
- ツール実行結果をモデルに返す(tool_result / function role)
- モデルが最終回答を生成
マルチターン・ツールチェーン
1つのタスクを完遂するために複数のツールを順次呼び出すパターン。
- 逐次呼び出し: 検索→データ取得→計算→書式化のように、前のツール結果を次のツール引数に使う
- 条件分岐: ツール結果に基づいてモデルが次のアクションを判断。if/else的な制御フローをLLMが自律的に実行
- ループ: 結果が不十分な場合にパラメータを変更して再呼び出し。最大ループ回数の制限が推奨される
エージェント開発での活用
Function Callingは LLM エージェントの「手」として機能する。
- ReAct パターン: Reasoning(推論)とAction(ツール呼び出し)を交互に繰り返す。各ステップでモデルが「次に何をすべきか」を推論し、適切なツールを選択
- Plan-and-Execute: まず全体計画を立て、計画に沿ってツールを順次実行。OpenAI Assistants API のRun機能がこのパターンをネイティブ実装
- Multi-Agent: 複数のエージェントが異なるツールセットを持ち、協調してタスクを遂行。AutoGen・CrewAI・LangGraphなどのフレームワークが対応
セキュリティと注意点
- プロンプトインジェクション: ツール引数にユーザー入力が混入すると、意図しないツール呼び出しが発生するリスク。入力のサニタイズとツール実行前のバリデーションが必須
- 過剰な権限付与: ツールに削除・更新などの破壊的操作権限を与える場合は、確認ステップを挟む設計が推奨される
- レート制限: 並列呼び出しで外部APIを大量に叩く場合、レート制限やコスト管理の仕組みが必要
- ハルシネーション: モデルが存在しない関数名や不正な引数を生成することがある。
tool_choiceの適切な設定とスキーマバリデーションで軽減
よくある質問(FAQ)
Q1: Function CallingとTool Useの違いは何ですか? A: 技術的には同じ概念で、プロバイダによる呼称の違いである。OpenAIは「Function Calling」から「Tools API」に移行し、Anthropicは一貫して「Tool Use」と呼んでいる。GoogleのGeminiは「Function Calling」を使用。いずれもLLMが構造化されたツール呼び出しリクエストを生成する機能を指す。
Q2: 並列Function Callingのメリットは何ですか? A: 独立した複数のデータ取得を1回のAPIコールで同時に実行できるため、レイテンシとAPIコール数を削減できる。例えば天気情報と株価情報を同時に取得する場合、逐次呼び出しでは2ラウンドトリップかかるが、並列呼び出しでは1ラウンドトリップで完了する。
Q3: Function Callingで定義できるツール数の上限はありますか? A: OpenAIは最大128ツール、Anthropicは最大64ツールが実用上の上限。ただし、ツール数が増えるとモデルの選択精度が低下する傾向がある。実用的には20〜30ツール以内に抑え、必要に応じてツールのルーティング層を設ける設計が推奨される。
まとめ
- Function Calling / Tool Useは、LLMが外部関数を呼び出すための構造化リクエストを生成する機能
- OpenAI Tools API、Anthropic Tool Use、Gemini Function Callingの3社が主流
- 並列呼び出し・Strict Mode・ストリーミング対応が2026年の標準スペック
- LLMエージェント開発(ReAct・Plan-and-Execute・Multi-Agent)の基盤技術
- セキュリティ(プロンプトインジェクション・権限管理)への配慮が重要