Function Calling
Function calling は、LLM が開発者定義の関数またはツールのスキーマを読み取り、固定された JSON 形式の構造化データとして、その呼び出しに必要な引数を生成できる機能です。モデル自体が関数を実行することはなく、生成された引数を受け取り、実際のコードを実行するのはアプリケーションの役割です。
関数呼び出しとは、LLMが自然言語のリクエストを読み取り、構造化された引数を生成し、それが事前定義された関数のJSON Schemaに準拠する仕組みです。
要点は引数生成にあります。モデルは関数を実行するのではなく、どの関数をどの値で呼び出すかをJSONで出力するだけであり、実際の実行と結果の返却はアプリケーションが担います。
OpenAI、Anthropic、Google Geminiはいずれも同じパターンに従っており、Anthropicの公式ドキュメントでも、「tool use」と「function calling」は同じものを指す互換的な用語であると明記されています。
関数呼び出しは、より広いtool useフローの中の一段階であり、LLMが呼び出し引数を生成する部分に特化しています。
strict mode(スキーマ強制)を有効にすると、生成される引数が指定したJSON Schemaと完全に一致することが保証されます。
Function Callingとは
関数呼び出しとは、LLMがユーザーの自然言語リクエストを、開発者が提供する関数定義(名前、説明、パラメータスキーマ)とあわせて読み取り、その関数を呼び出すために必要な引数を構造化データとして、固定のJSON形式で出力する機能です。たとえば、ユーザーが「パリの天気を教えて」と入力した場合、モデルは自由文で返す代わりに、次の関数を呼び出すべきことを示すJSONを出力します。get_weather引数は{"location": "Paris, France"}です。
ここで最も重要なのは、モデル自身は関数を実行しないという点です。OpenAIとGoogleの公式ドキュメントの両方が明確に示しているとおり、モデルは関数を実行せず、引数を生成するだけです。生成された引数を受け取り、実際のコード(API呼び出し、データベース検索など)を実行し、その結果をモデルに返すのは、すべてアプリケーションの責任です。つまり、関数呼び出しとは、LLMが自然言語を構造化された呼び出し仕様へ変換するステップに焦点を当てた概念です。
Tool Useとの関係Tool Use
実務上、「function calling」と「tool use」はほぼ同じ意味で使われます。Anthropicの公式ドキュメントでも、「Tool useはfunction callingとしても知られており、両者は互換的である」と明記されています。ただし、強調点にはわずかな違いがあります。tool useは、ツールの定義、引数生成、実行、結果の返却、最終回答の生成までを含む、全体のループをカバーするより広い概念です。Function callingは、そのループ内で LLM が呼び出しに必要な引数を生成する仕組みにより近いものです。
仕組み
標準的な流れは、3つのプロバイダーのドキュメント全体でほぼ同じように説明されており、次のとおりです。
ツール(関数)の定義を渡す: ユーザーメッセージとともに、呼び出し可能な関数の一覧をモデルに送信します。各関数には、名前、説明、パラメータスキーマ(JSON Schema)が含まれます。
モデルが判断して引数を生成する: モデルはリクエストを各関数の説明と照らし合わせ、ツールが役立つと判断すると、自由記述の回答ではなく、どの関数をどの引数で呼び出すかを指定した構造化 JSON を出力します。
アプリケーションが実行する: アプリケーションはその JSON を解析し、実際の関数または API を実行します。(このステップはモデルではなく、開発者コードによって行われます。)
結果を返す: 実行結果をモデルに返します。Anthropic ではこれを
tool_resultブロックで行い、OpenAI と Gemini では function output メッセージを返します。また Gemini では、結果を返す際に各呼び出しに割り当てられたidに一致させることが推奨されています。最終応答を生成する: モデルは関数の結果を取り込み、ユーザー向けの最終回答を生成します。必要に応じて、さらに追加の関数呼び出しを続けることもあります。
Anthropic では、モデルがツールを呼び出すと判断した場合、レスポンスのstop_reasonは"tool_use"となり、1つ以上のtool_useブロックが返されます。また、呼び出し動作はtool_choiceで制御することもできます。デフォルトの{"type": "auto"}では、モデルが各ターンごとにツールを呼び出すか直接応答するかを自律的に判断しますが、anyまたは特定のtoolを指定すると、呼び出しが強制されます。
スキーマとコード例
関数定義の中心にあるのは、モデルが読み取るJSON Schemaです。OpenAI の関数定義はtype、name、description、およびparametersフィールドで構成されており、strict: trueを有効にすると、生成される引数がスキーマと完全に一致することが保証されます(これにはadditionalProperties: false).
{
"type": "function",
"name": "get_weather",
"description": "指定した場所の現在の天気を取得します。",
"parameters": {
"type": "object",
"properties": {
"location": { "type": "string", "description": "都市名と国名。例: Paris, France" },
"unit": { "type": "string", "enum": ["celsius", "fahrenheit"] }
},
"required": ["location"],
"additionalProperties": false
},
"strict": true
}ユーザーが「パリの天気」を尋ねた場合、モデルは関数を実行するのではなく、上記スキーマに適合する引数のみを生成します。OpenAIでは、以下の構造化された引数が返されます。
{ "location": "Paris, France" }AnthropicのClaudeは同じ意図をtool_useブロックとして表現します。以下は公式ドキュメントの例で、モデルが生成した引数はinputフィールドに含まれています。
{
"type": "tool_use",
"id": "toolu_01A09q90qw90lq917835lq9",
"name": "get_weather",
"input": { "location": "New York, NY", "unit": "fahrenheit" }
}Google Geminiも同様で、関数宣言はOpenAPI互換のJSON Schemaのサブセットとして定義され、モデルは関数名、引数、および一意のidを含む構造化されたJSONで応答します。3つのプロバイダーすべてに共通する基盤の仕組みは同じで、LLMがスキーマに準拠した引数JSONを生成するということです。
プロバイダーによる説明
OpenAIの公式function callingガイドでは、function callingを5ステップのフローとして説明し、モデルは関数を実行せず、スキーマに一致するJSON形式の引数を生成するだけだと明記しています。また、Structured Outputをstrict: trueで使用すると、生成される引数が提供したJSON Schemaと完全に一致することが保証されると述べています。
Anthropicの公式ドキュメント(Tool usewith Claude)では、tool useはfunction callingとしても知られており、この2つの用語は互換的に使えると説明されています。また、クライアントツールについてはモデルがstop_reason: "tool_use"と atool_useブロック。その後、開発者コードが実行され、tool_resultが返されます。
Google の公式ドキュメント(Function calling with the Gemini API)では、モデルは関数を直接実行せず、レスポンスの処理はアプリケーションの責任であると説明されており、関数宣言には OpenAPI スキーマのサブセットが使用されると記載されています。最新の Gemini モデルでは、各関数呼び出しに一意のidが割り当てられます。