Function Calling(ファンクションコーリング)
LLMが自然言語の指示から適切な外部関数・APIを選択し、引数を構造化して呼び出す機能で、LLMと外部システムの連携を可能にする中核技術。
Function Callingとは
Function Calling(関数呼び出し)は、LLMがユーザーの自然言語入力を解析し、事前定義された関数群から適切な関数を選択して、正しい引数をJSON形式で構造化して返す機能である。2023年6月にOpenAIがGPT-3.5/GPT-4向けに導入して以降、Claude、Gemini、Mistralなど主要なLLMが対応し、LLMアプリケーション開発の基盤技術となった。
Function Callingの仕組み
LLMそのものは外部APIを直接呼び出すわけではない。実際の処理フローは以下の通りである。
- 関数定義の提供: 開発者がJSON Schemaで関数名・説明・パラメータを定義してLLMに渡す
- ユーザー入力の解析: LLMが自然言語の意図を解釈し、適切な関数と引数を判断
- 関数呼び出しの返却: LLMは関数名と引数のJSONを生成して返す(実行はしない)
- アプリケーション側で実行: 開発者のコードが実際にAPIを呼び出す
- 結果のフィードバック: 関数の実行結果をLLMに戻し、最終応答を生成
この設計により、LLMはインターネットアクセスやDB接続の能力がなくても、アプリケーション経由で任意の外部システムと連携できる。
主要プロバイダの対応状況
| プロバイダ | 対応モデル | 並列呼び出し | ストリーミング | ツール利用名称 |
|---|---|---|---|---|
| Anthropic | Claude 4 Opus/Sonnet/Haiku | 対応 | 対応 | Tool Use |
| OpenAI | GPT-4o/4o-mini/o3 | 対応 | 対応 | Function Calling |
| Gemini 2.5 Pro/Flash | 対応 | 対応 | Function Calling | |
| Mistral | Mistral Large/Medium | 対応 | 対応 | Tool Use |
AnthropicはFunction Callingを「Tool Use」と呼称しているが、技術的には同一の概念である。Claude 4ではtool_choiceパラメータで「auto」「any」「tool名指定」の3モードを選択でき、特定の関数を強制的に呼び出す制御も可能。
Tool Use(Anthropic)の特徴
Anthropicの実装は以下の点で特徴的である。
- キャッシュ対応: ツール定義をsystem promptに含めてプロンプトキャッシュの恩恵を受けられる(90%コスト削減)
- 構造化出力: スキーマを定義すれば、Function Calling経由で確実にJSON出力を得られる(通常の生成よりも形式の信頼性が高い)
- 拡張思考との統合: Claude 4のExtended Thinking機能と組み合わせることで、複雑な判断を要するツール選択の精度が向上
- コンピューター使用: Function Callingの拡張として、画面のスクリーンショットを入力し、マウス操作・キーボード入力の関数を呼び出すComputer Use機能も提供
実用的な活用パターン
データベース検索
ユーザーが「東京で5万円以下のホテルを探して」と入力すると、LLMがsearch_hotels(city="東京", max_price=50000)の関数呼び出しを生成する。自然言語のあいまいな表現を構造化されたクエリに変換する能力がFunction Callingの核心価値である。
マルチツール連携
複雑な質問に対して複数の関数を順次呼び出すケース。「来週の東京出張の予算を見積もって」に対し、①カレンダーAPIで出張日程確認→②交通APIで交通費検索→③宿泊APIでホテル検索→④計算機で合計算出、のように4つの関数を連鎖的に呼び出す。
構造化データ抽出
非構造化テキスト(メール、レポート、契約書)から構造化データを抽出する用途にも使われる。extract_invoice_data()のような関数を定義し、請求書PDFのテキストから金額・日付・取引先を確実にJSON形式で取得する。
セキュリティ上の注意
Function Callingを本番環境で使用する際は以下のセキュリティリスクに注意が必要である。
- プロンプトインジェクション: ユーザー入力に悪意ある指示を紛れ込ませ、意図しない関数を呼び出させる攻撃。関数実行前に入力のサニタイズと権限チェックを行う
- 過剰な権限付与: 削除や更新の関数をLLMに渡す場合、実行前に確認プロンプトを挟むか、ステージング環境でのみ許可する
- 引数の検証: LLMが生成した引数を無条件に信頼せず、サーバーサイドでバリデーションを行う。SQLインジェクション等の従来の脆弱性が関数引数経由で発生する可能性がある
FAQ
Q1: Function CallingとRAGはどう違いますか?
RAGは「情報を検索してLLMのコンテキストに注入する」技術。Function Callingは「LLMが外部の関数/APIを呼び出す」技術。RAGの検索部分をFunction Callingで実装する(search関数を呼び出してベクトルDBを検索する)ケースも多く、両者は相補的な関係にある。
Q2: 全てのLLMがFunction Callingに対応していますか?
2026年時点で主要な商用LLM(Claude 4、GPT-4o、Gemini 2.5)は全て対応。オープンソースではMistral、Llama 3.2、Qwen 2.5以降が対応しているが、精度は商用モデルに劣る場合がある。Hermes 2 Proなど関数呼び出しに特化してファインチューニングされたモデルも存在する。
Q3: Function Callingの精度を上げるには?
関数の説明文(description)が最も重要。何をする関数なのか、どのような場合に使うべきかを明確に記述する。パラメータのdescriptionも同様に詳細に書く。また、関数の数が20を超えると選択精度が低下する傾向があるため、ユースケースに応じて提供する関数を絞り込むことが推奨される。