Function Calling (Tool Use)
関数呼び出し(ツール利用)では、言語モデルがJSON引数とともに外部関数の実行を要求し、アプリケーションがその関数を実行して結果を返します。
関数呼び出しは、ツール呼び出しまたはツール使用とも呼ばれ、大規模言語モデル(LLM)が通常のテキストではなく、外部関数の実行要求で回答する機能です。アプリケーションは、利用可能な各ツールを、名前、目的、引数を定義するJSON Schemaで記述します。リクエストにリアルタイムデータやアクションが必要な場合、モデルはツール名とJSON引数を返し、アプリケーションが関数を実行した後、モデルはその結果に基づいて回答を作成します。モデル自身が何かを実行することはありません。MetaのToolformerは2023年2月、モデルが自らのテキストにAPI呼び出しを挿入する方法を自己学習できることを示しました。OpenAIは2023年6月13日にAPIへ関数呼び出しを追加し、関数が必要なタイミングを検出し、シグネチャに適合する引数を整形するようファインチューニングしたモデルを提供しました。現在では主要なモデルプロバイダーがすべて対応しており、オープンモデルは指示チューニングやチャットテンプレートを通じてこの機能を学習します。
関数呼び出しの仕組み#
ツール呼び出しは、モデルとアプリケーションの間を往復し、モデルが必要な情報を得るまで繰り返します。
以下のコードは、OpenAIの関数呼び出しガイドの形式で、モデルの返信を記述することで、APIキーなしで実行できるようにし、1回の往復の両側を再現します。
import json
from jsonschema import validate
# リクエストとともに送信されるツール定義: 引数の名前、目的、JSON Schema
tool = {
"type": "function",
"name": "get_order_status",
"description": "Look up the shipping status of an order by its number.",
"parameters": {
"type": "object",
"properties": {"order_id": {"type": "string", "pattern": "^[0-9]+$"}},
"required": ["order_id"],
},
}
# モデルの出力は関数呼び出しで、その引数はJSON文字列として届きます
call = {"type": "function_call", "call_id": "call_1", "name": "get_order_status", "arguments": '{"order_id": "4417"}'}
args = json.loads(call["arguments"])
validate(args, tool["parameters"]) # 引数がスキーマに適合しない場合、何も実行される前に例外が発生します
# アプリケーションは独自の関数を実行し、同じcall_idの下で結果を返します
orders = {"4417": "Shipped, arriving Thursday"}
print({"type": "function_call_output", "call_id": call["call_id"], "output": orders[args["order_id"]]}){'type': 'function_call_output', 'call_id': 'call_1', 'output': 'Shipped, arriving Thursday'}を出力します。これは、モデルを再度呼び出す前にアプリケーションが会話に追加する項目です。ツールに"strict": trueを設定すると、APIが制約付きデコーディングを適用するため、モデルが生成する引数は常にスキーマに一致します。
ツールの選択と連鎖#
モデルは、2件の注文を同時に確認する場合など、1回のターンで複数の独立した呼び出しを行えます。また、アプリケーションは特定のツールを強制したり、いずれかのツールの使用を必須にしたり、そのターンでツールを禁止したりできます。ターンをまたいで呼び出しを連鎖させ、各結果に基づいて次の呼び出しを決定するループが、エージェントハーネス内で動作するAIエージェントをモデルから作り出します。Berkeley Function Calling Leaderboardは、適切な関数の選択、引数の設定、並列呼び出しや複数ターンにわたる呼び出し、適合するツールがない場合の辞退といったスキルを評価します。ツールの結果は入力としてモデルに戻されるため、ツールが取得したウェブページやドキュメントにprompt injectionが含まれる可能性があります。そのためアプリケーションは、ツールに必要最小限の権限を与え、購入、削除、メッセージの送信を行う前に人による確認を求めます。
ビジョンモデルは、出力がすでに構造化されているため、自然なツールになります。Ultralytics YOLOでは、Results.summary()がYOLO26モデルが検出した各オブジェクトを、クラス名、クラスインデックス、信頼度、ボックス座標からなる辞書として返します。このリストはjson.dumpsによって直接ツールの結果に変換されるため、チャットモデルやビジョン言語モデル(VLM)はpredictモードを呼び出して、写真内のオブジェクトを数えたり位置を特定したりできます。
関数呼び出しと関連用語#
- コンピューター操作エージェント: スクリーンショット、クリック、キー入力を通じてソフトウェアを操作するため、APIのないアプリケーションにも対応できます。APIがある場合、関数呼び出しは構造化された1回のリクエストで同じ結果を得ます。
- 構造化出力: 請求書から項目を抽出する場合など、モデルの最終応答をスキーマに従わせます。関数呼び出しでは、同じスキーマを使ってアクションを要求し、その結果を受け取ります。
- 検索拡張生成(RAG): 検索したドキュメントをプロンプトに追加します。検索ツールでRAGを実装でき、エージェント型RAGでは、検索するタイミングと検索対象をモデルが決定します。
- Model Context Protocol(MCP): 2024年11月にAnthropicが発表したオープンプロトコルで、アプリケーションが外部プログラムによって提供されるツールを検出できるようにします。モデルは引き続き関数呼び出しを通じてMCPツールを呼び出します。










