Function Calling(関数呼び出し)(ファンクションコーリング)
LLMが外部APIや関数を構造化された形式で呼び出す機能。モデルが自然言語の入力から適切な関数名と引数を推論し、JSON形式で出力することで外部システムとの連携を実現する。
Function Callingとは
Function Calling(関数呼び出し)は、LLMが自然言語の指示を解釈し、事前に定義された関数(ツール)の中から適切なものを選択して構造化された引数とともに呼び出す機能である。2023年6月にOpenAIがGPT-3.5/GPT-4のAPIで初めて正式サポートし、以降Anthropic Claude、Google Gemini、Mistral等の主要LLMが相次いで対応した。
動作の仕組み
Function Callingの処理フローは以下の3段階で構成される:
- 関数定義の提供: API呼び出し時に、利用可能な関数のスキーマ(名前・説明・パラメータ型)をJSON Schemaで渡す
- モデルの判断: モデルがユーザーの入力を解析し、関数を呼ぶべきか、どの関数をどの引数で呼ぶかを推論
- 構造化出力: モデルが関数名と引数をJSON形式で返す(実際の関数実行はクライアント側が行う)
| ステップ | 実行主体 | 内容 |
|---|---|---|
| 関数スキーマ送信 | 開発者 | tools パラメータで関数定義を渡す |
| 関数選択・引数推論 | LLM | ユーザー入力から最適な関数と引数を判断 |
| JSON出力 | LLM | tool_calls として構造化データを返す |
| 関数実行 | クライアント | 返されたJSON通りに実際のAPIを呼び出す |
| 結果返却 | 開発者 | 実行結果をtool roleメッセージとしてモデルに送信 |
| 最終応答生成 | LLM | 関数の実行結果を踏まえて自然言語で回答 |
主要LLMの対応状況
| LLMプロバイダ | 関数名 | 最大関数数 | Parallel対応 | Strict mode |
|---|---|---|---|---|
| OpenAI GPT-4o | tools | 128 | ○ | ○(Structured Outputs) |
| Anthropic Claude 4 | tools | 制限なし | ○ | ○(tool_choice) |
| Google Gemini 2.5 | function_declarations | 128 | ○ | ○ |
| Mistral Large | tools | 制限なし | ○ | × |
| Meta Llama 3.1+ | tools(via vLLM等) | 実装依存 | △ | × |
Function Callingの活用パターン
データ取得型
天気情報API、株価API、データベースクエリ等、外部データを取得してユーザーに提供する。最も基本的なパターン。
アクション実行型
メール送信、カレンダー予約、ECサイトでの注文処理等、ユーザーの代わりにアクションを実行する。確認ステップの組み込みが重要。
マルチステップ型
複数の関数を順次呼び出して複合的なタスクを完遂する。例:「東京の天気を調べて、雨なら室内レストランを予約」→ get_weather → search_restaurants → make_reservation の3段階。
RAG連携型
ベクトルDBの検索関数をFunction Callingで呼び出し、検索結果をコンテキストとしてモデルに渡す。RAGパイプラインの柔軟な構築に使われる。
実装上の注意点
- 関数スキーマの品質: description フィールドが最重要。モデルはこの説明文を手がかりに関数を選択するため、曖昧な説明は誤選択の原因になる
- 引数のバリデーション: モデルが返す引数は必ずしもスキーマ通りとは限らない。クライアント側でのバリデーションは必須
- エラーハンドリング: 関数実行が失敗した場合、エラー情報をtool roleメッセージとしてモデルに返し、リトライや代替案の提案を促す
- コスト: 関数定義はプロンプトの一部としてトークン消費する。128個の関数を全て渡すと数千トークンのオーバーヘッドが発生
FAQ
Q: Function CallingとPromptでのJSON出力指示の違いは?
A: Function Callingはモデルが学習時に関数呼び出しパターンを訓練しており、スキーマ準拠率が格段に高い。プロンプトでの指示は不安定でJSON構文エラーやスキーマ逸脱が頻発する。本番システムでは必ずFunction Callingを使うべきである。
Q: どのくらいの関数数が実用的か?
A: 実用的には10-30関数が最適レンジ。関数数が増えるほどモデルの選択精度が下がり、トークンコストも増大する。100以上の関数がある場合は、事前にカテゴリ分類してサブセットのみを渡すルーティング層を設けるのが一般的。
Q: オープンソースLLMでもFunction Callingは使えるか?
A: Llama 3.1以降、Qwen2.5、Mistral等の主要オープンソースモデルはFunction Calling対応の訓練を受けている。vLLMやTGI等の推論エンジンがtoolsパラメータをサポートしており、OpenAI互換APIとして利用可能。