ファンクションコーリングとは
Function Calling / 関数呼び出し
LLMに外部関数の呼び出し内容を構造化データとして出力させる、OpenAIが導入したツール連携の仕組み
ひとことで言うと
AIに、呼び出したい関数の内容を決まった形式で出力させる仕組み。
概要
Function Calling(ファンクションコーリング)とは、あらかじめ定義した関数の名前・説明・引数のスキーマをLLMへ提示しておき、ユーザーの入力に応じてLLMがどの関数をどんな引数で呼び出すべきかを構造化されたJSON形式で出力させる仕組み。 OpenAIがChat Completions APIの機能として最初に導入した名称であり、現在ではTool Callingという、より一般的な名称でも呼ばれる。 LLMが自由形式のテキストではなく決まったスキーマに沿った出力を返すため、アプリケーション側でその出力をそのままプログラム的に処理できる点が特徴。 スキーマには多くの場合JSON Schemaが使われ、パラメータの型や必須項目を明確に定義しておくことで、LLMによる誤った形式の引数生成のリスクを減らせる。
背景
LLMにツールを使わせたい場合、出力が自由な自然言語のままではプログラムから安定して解釈するのが難しい。 Function Callingは、呼び出す関数名と引数をあらかじめ定義したJSON Schema等の形式でLLMに出力させることで、この解釈の問題を解消するために導入された。
歴史
2023年6月: OpenAIがChat Completions APIにFunction Calling機能を追加すると発表し、LLMからの構造化されたツール呼び出しを公式にサポート。 以降、他のLLMプロバイダも同様の機能を追加し、名称としてはより包括的なTool Callingが広く使われるようになる。
アーキテクチャ
開発者は、関数名・説明文・引数のJSON Schemaを含む関数定義のリストをAPIリクエストに含める。 LLMは、ユーザーの入力に対しある関数の呼び出しが適切と判断すると、その関数名とスキーマに従って生成した引数を含むJSONを出力する。 アプリケーションはこのJSONをパースして実際の関数を実行し、結果を会話履歴へ追加して次の応答生成に利用する。
ワークフロー
関数定義(名前・説明・JSON Schema)をAPIリクエストへ含める → LLMが呼び出すべき関数名と引数のJSONを生成 → アプリケーションがJSONをパースし関数を実行 → 実行結果を会話履歴へ追加し次の応答を生成。
コード例
OpenAI APIで関数を定義し呼び出し結果を処理する
import json
from openai import OpenAI
client = OpenAI()
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "指定した都市の現在の天気を取得する",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
},
}
]
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "東京の天気を教えてください。"}],
tools=tools,
)
call = response.choices[0].message.tool_calls[0]
args = json.loads(call.function.arguments)
print(call.function.name, args)利点
- LLMの出力を、プログラムが安定して解釈できる構造化データとして得られる
- 既存のAPIや社内システムの関数をそのままLLMから呼び出せるように統合しやすい
- 自然言語の解析(正規表現等)に頼らず、意図した関数呼び出しを高い精度で得られる
欠点
- 引数のスキーマ定義や関数の説明文の質が、呼び出し精度に大きく影響する
- 定義する関数の数が増えるほど、必要な関数の選択を誤りやすくなる
- モデルが定義にない関数名や不正な引数を生成する可能性がゼロではなく、検証処理が必須になる
比較
関連用語
よくある質問
Function Callingは今も使われている用語?
OpenAIのドキュメントやAPIでは現在も使われているが、業界全体としては複数プロバイダ・複数種類の外部連携を包含するTool Callingという呼び方がより一般的になっている。
1回のリクエストで複数の関数を呼び出せる?
モデルやAPIの実装によっては、独立した複数のtool_callsを1つのレスポンスへ含めて返すことができ、並列に呼び出すべき関数をまとめて要求できる場合がある。
参考文献
- DocumentationOpenAI: Function calling