Function Callingとは?仕組みや活用例、MCPとの違い、使い方をわかりやすく解説

- Function Callingは、LLMに外部ツールの呼び出しを判断させる機能
- 学習データにない最新情報や社内システムの情報を、アプリケーション側で取得して回答に反映
- 正確な関数定義、権限管理、トークン管理、実行結果の検証をまとめて設計
「Function Calling」は、OpenAI APIを使ったアプリケーションに外部の関数やツールを接続する機能です。ユーザーの質問に応じて、モデルが呼び出す関数と引数を提案し、アプリケーションが処理を実行します。
天気情報の取得や社内データベースの検索、書類登録などを、自然言語の指示から呼び出せるようにする仕組みです。この記事では、Function Callingの仕組み、MCPとの違い、活用場面、注意点を解説します。後半では、Chat Completions APIを使った最小構成の検証結果も取り上げます。
\生成AIを活用して業務プロセスを自動化/
ChatGPTの「Function Calling」機能について
ChatGPTのAPI(OpenAI API)から使える「Function Calling」は、LLMに検索や電卓等の外部ツールを自動操縦させられる機能です。この機能を使うと、LLMに外部ツールの取扱説明書(関数)を渡してその操作を代行させる「関数呼び出し」が実現します。
Function Callingは、モデルが外部関数を直接実行する機能ではありません。アプリケーションが利用できる関数をスキーマで定義すると、モデルは質問の内容に応じて、関数を呼び出す必要があるか、どの引数を渡すかを判断します。
処理の流れは、次の5段階です。
- アプリケーションが、利用可能な関数と引数の形式をモデルへ渡す
- ユーザーの質問を受けたモデルが、関数呼び出しの要否と引数を返す
- アプリケーションが引数を検証し、指定された関数を実行する
- 実行結果をtoolメッセージとしてモデルへ返す
- モデルが実行結果を踏まえ、ユーザー向けの最終回答を生成する
この構造により、モデルの文章生成と、外部システムへのアクセスを分離できます。実際にデータを取得・更新する処理はアプリケーション側で行います。認証、権限、入力値の検証、実行ログも同じ側で管理しなければなりません。
また、Function Callingは関数の説明が曖昧だと、意図しない関数や引数が選ばれる可能性があります。関数名と説明を具体的に書き、引数の型や必須項目を定義したうえで、モデルが返した値をそのまま実行しない設計が必要です。
OpenAI Python SDK(openai>=1.0)とChat Completions APIを使った検証用の最小実装例を、以下に示します。
クリックで表示
import json
import os
from openai import OpenAI
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "指定された都市の検証用の天気情報を返します。",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "都市名"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度単位"
}
},
"required": ["location", "unit"],
"additionalProperties": False
}
}
}
]
def get_weather(location: str, unit: str) -> str:
return json.dumps(
{
"location": location,
"temperature": 22,
"unit": unit,
"forecast": "晴れ"
},
ensure_ascii=False
)
messages = [
{"role": "user", "content": "東京の天気を教えてください。"}
]
first_response = client.chat.completions.create(
model="gpt-5.6",
messages=messages,
tools=tools,
tool_choice="auto"
)
assistant_message = first_response.choices[0].message
messages.append(assistant_message.model_dump(exclude_none=True))
for tool_call in assistant_message.tool_calls or []:
arguments = json.loads(tool_call.function.arguments)
result = get_weather(**arguments)
messages.append(
{
"role": "tool",
"tool_call_id": tool_call.id,
"content": result
}
)
final_response = client.chat.completions.create(
model="gpt-5.6",
messages=messages
)
print(final_response.choices[0].message.content)上記は、呼び出せる関数をget_weatherのみに限定した検証用コードです。実運用では、tool_call.function.nameが許可リストに含まれているかを確認し、argumentsも検証してから関数を実行してください。
最初のリクエストでは、toolsに利用可能な関数を定義し、tool_choice=”auto”で関数を呼び出すかどうかをモデルに判断させます。tool_callsが返された場合は、アプリケーションが引数を読み取って関数を実行し、その結果をtoolメッセージとして追加する流れです。最後にもう一度client.chat.completions.create()を呼び出すと、実行結果を反映した回答が生成されます。
OpenAIの「Custom Instructions」について詳しく知りたい方は、下記の記事を合わせてご確認ください。

ChatGPTのFunction CallingとMCPの違い

Function Callingと同じく、「LLMに外部ツールの取扱説明書を渡して操作を代行させる」技術として「MCP(Model Context Protocol)」というものがあります。
| 比較項目 | Function Calling | MCP |
|---|---|---|
| 主な役割 | アプリケーションが定義した関数をモデルに選ばせ、実行結果をモデルへ返す | AIアプリケーションと外部ツール・データを共通のプロトコルで接続する |
| 定義の単位 | 各アプリケーションのtoolsに関数スキーマを定義する | MCPサーバーがツール、リソース、プロンプトなどを公開する |
| 実装範囲 | モデルへのツール提示、引数検証、関数実行、結果の返却を実装する | MCPホスト・クライアントとMCPサーバー間の接続や権限を設計する |
| 向いている場面 | 少数の自社関数を組み込む、小さなアプリケーションを作る | 複数のAIクライアントから同じ外部機能を利用する |
Function CallingとMCPは、どちらもAIアプリケーションと外部ツールをつなぐ場面で使われますが、役割が異なります。Function Callingは、1つのアプリケーション内でモデルに渡す関数の定義と呼び出しの往復を設計する仕組みです。
一方、MCP(Model Context Protocol)は、AIアプリケーションと外部のデータソース・ツール・ワークフローを接続するオープンなプロトコルです。ホストアプリケーションがMCPサーバーへ接続し、サーバーが公開するツールやリソースを利用します。
MCPは公式レジストリで公開サーバーを検索できるなど、複数のAIクライアントから外部機能を利用するための選択肢として整備が進んでいます。Function Callingは関数の呼び出し部分をアプリケーションに組み込むAPI機能、MCPは外部機能を再利用しやすくする接続方式と考えると整理しやすいでしょう。
【ハンズオン】ChatGPTのFunction Calling機能を試す
ここでは、ローカル関数を使ってFunction Callingの往復を確認します。天気情報を返す関数を用意し、モデルがその関数を選択してから最終回答を生成する流れを検証します。外部の天気APIは使わず、検証用の固定データを返す構成です。実際のAPI連携に必要な認証設定を増やさず、基本動作を確認できます。
外部のAPIを呼び出して質問に答えるチャットボット

Function Callingでは、次のような処理を組み込めます。
- 天気、在庫、営業日など、外部APIや社内システムから最新情報を取得する
- 自然言語の依頼を、予約登録や申請作成などの構造化された処理へ変換する
- 文書や問い合わせ内容から、後続システムへ渡す項目を抽出する
今回の検証では、アプリケーション側にget_weather関数を実装し、モデルには関数名と引数の形式だけを伝えます。関数の実行はアプリケーション側で行い、モデルが返した引数を検証してから、その結果を再びモデルへ渡す構成です。
【コード】
以下は検証用の最小コード例です。
クリックで表示
import json
from openai import OpenAI
client = OpenAI()
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "指定された都市の検証用の天気情報を返します。",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "都市名",
},
"unit": {
"type": ["string", "null"],
"enum": ["celsius", "fahrenheit", None],
"description": "温度単位",
},
},
"required": ["location", "unit"],
"additionalProperties": False,
},
"strict": True,
},
}
]
def get_weather(location: str, unit: str | None) -> str:
# 実運用では、この部分で外部APIや社内システムを呼び出します。
return json.dumps(
{
"location": location,
"temperature": 22,
"unit": unit or "celsius",
"forecast": "晴れ",
},
ensure_ascii=False,
)
def validate_weather_args(arguments: dict[str, object]) -> tuple[str, str | None]:
location = arguments.get("location")
unit = arguments.get("unit")
if not isinstance(location, str) or not location.strip():
raise ValueError("location must be a non-empty string")
if unit not in {"celsius", "fahrenheit", None}:
raise ValueError("unit must be celsius, fahrenheit, or null")
return location.strip(), unit
messages = [
{"role": "user", "content": "東京の天気を教えてください。"}
]
print("=== Function Calling検証 ===")
print(f"質問: {messages[0]['content']}")
first_response = client.chat.completions.create(
model="gpt-5.6",
messages=messages,
tools=tools,
tool_choice="auto",
)
assistant_message = first_response.choices[0].message
tool_calls = assistant_message.tool_calls or []
if not tool_calls:
print(assistant_message.content or "")
raise SystemExit
# モデルの出力と関数実行結果を、次のリクエストへ引き継ぎます。
messages.append(assistant_message.model_dump(exclude_none=True))
for tool_call in tool_calls:
if tool_call.function.name != "get_weather":
continue
print(f"\n関数呼び出し: {tool_call.function.name}")
print(f"引数: {tool_call.function.arguments}")
arguments = json.loads(tool_call.function.arguments)
location, unit = validate_weather_args(arguments)
result = get_weather(location, unit)
print(f"関数の実行結果: {result}")
messages.append(
{
"role": "tool",
"tool_call_id": tool_call.id,
"content": result,
}
)
final_response = client.chat.completions.create(
model="gpt-5.6",
messages=messages,
tools=tools,
tool_choice="auto",
)
print("\n最終回答:")
print(final_response.choices[0].message.content or "")このコードを実行するには、OpenAI Python SDK(openai>=1.0)をインストールし、OPENAI_API_KEYを環境変数へ設定します。gpt-5.6が利用できない環境では、アカウントで利用可能なFunction Calling対応モデルへ置き換えてください。APIキーはコードやスクリーンショットへ記載しないでください。
最初のレスポンスに最終回答が含まれるとは限りません。tool_callsが返った場合は、アプリケーションが関数名と引数を読み取り、実際の関数を実行します。その結果をtoolメッセージとして返したあと、モデルが自然言語の回答を生成するという順序です。
関数呼び出しと最終回答を確認する

今回の検証では、モデルがget_weatherと引数を返し、アプリケーションがローカル関数を実行したあと、その結果を使った最終回答を生成できました。関数の実行主体はアプリケーション側であり、モデルが直接外部システムを操作したわけではありません。
ChatGPTのFunction Callingの活用例
Function Callingは、既存のシステムやデータと接続できるため、モデルの回答だけでは完結しない業務に活用できます。代表的な活用例は次のとおりです。
- 社内システムの検索:自然言語の質問を受け、顧客情報、在庫、勤怠、申請状況などを検索して回答する
- 定型業務の自動化:問い合わせ内容を分類し、チケット作成、担当者の割り当て、通知送信などの処理へつなぐ
- 書類・画像の情報整理:請求書や申込書から必要な項目を抽出し、データベースや業務システムへ渡す
「安定した繰り返し処理」を強みとする外部ツールに、LLM最大の魅力「文脈・状況を踏まえた柔軟な判断力」が合わさることで、従来以上の高度な自動化が実現しそうです。
ChatGPT以外(Gemini・Claude)でもFunction Callingは使える
Function Callingに相当する機能は、OpenAI以外の生成AIにも用意されています。Gemini APIは同じくFunction calling、Claude APIだとtool useという名称で、モデルがツール名と引数を返し、アプリケーションが処理結果を返す流れを実装できます。
共通する考え方は、モデルに実行権限を渡すのではなく、モデルの判断をアプリケーション側で検証してから処理することです。
Function Callingを利用する際の注意点
Function Callingの導入では、実行前の検証と権限設計が重要です。関数を呼び出せる状態にするだけでは不十分です。入力値、費用、副作用、エラー時の挙動をあらかじめ決めておきます。
トークン使用量と費用が増える可能性がある
Function Callingでは、ツール定義もリクエストに含めて送信します。関数名や説明、引数のJSON Schemaが長いほど入力内容が増え、通常の質問だけを送る場合より費用が高くなる可能性があります。
利用可能な関数を最初からすべて渡すのではなく、その画面や業務で必要なツールだけに絞りましょう。説明文を簡潔にし、同じ情報を複数の関数定義へ重複させないことも有効です。費用を管理する場合は、入力・出力トークン、ツール呼び出し回数、失敗回数を記録します。
1度のリクエストで複数の関数が呼ばれることもある
モデルは、質問に応じて関数を呼ばない場合、1つ呼ぶ場合、複数呼ぶ場合があります。そのため、複数の呼び出しを前提に処理し、アプリケーション側で最初の関数呼び出しだけを処理して終了しないようにします。
複数の呼び出しに対応する場合は、各tool_callの関数名と引数を検証してから実行し、それぞれのtool_call_idに対応する結果を返します。登録や削除など副作用のある関数を並列実行すると、順序や重複処理の問題が起きるおそれがあるため、実行前の確認や処理の直列化も検討してください。
関数定義と引数を正確に設計する
関数の説明、引数名、データ型、必須項目を具体的に定義します。特に、日付・金額・ID・権限に関わる値は、モデルの出力をそのまま信用しないでください。形式と許可範囲は、アプリケーション側で検証します。
厳格なスキーマでは、必須項目、additionalProperties: false、nullの扱いが重要です。関数の実行前には、認証済みユーザーの権限を確認します。タイムアウト、再試行、エラー時の表示、監査ログも準備しておくと運用しやすくなります。
ChatGPTのAPIついて詳しく知りたい方は、下記の記事を合わせてご確認ください。

よくある質問
Function Callingを使いこなそう
Function Callingは、LLMの文章生成を外部APIや社内システムの処理へつなぐ機能です。モデルの判断とアプリケーションの実行を分けるという役割分担を理解すると、実装の全体像を把握しやすくなります。
業務へ導入する際は、引数とアクセス権を検証し、必要な処理には承認フローを用意します。トークン使用量、エラー処理、実行ログまで含めて設計してください。最初は小さな読み取り処理から検証し、結果を確認してから登録や更新を伴う業務へ広げるとよいでしょう。
最後に
Function Callingを活用すれば、自社システムとChatGPTを連携し、業務自動化や顧客対応を高度化できます。
「生成AIで新しいプロダクトを作りたい」「もっと本格的に生成AIを業務に組み込みたい」とお考えの方は、ぜひ株式会社WEELにご相談ください。
開発実績として、
・新規事業室での「リサーチ」「分析」「事業計画検討」を70%自動化するAIエージェント
・社内お問い合わせの1次回答を自動化するRAG型のチャットボット
・過去事例や最新情報を加味して、10秒で記事のたたき台を作成できるAIプロダクト
・お客様からのメール対応の工数を80%削減したAIメール
・サーバーやAI PCを活用したオンプレでの生成AI活用
・生徒の感情や学習状況を踏まえ、勉強をアシストするAIアシスタント
などの開発実績がございます。
生成AIを活用したプロダクト開発の支援内容は、以下のページでも詳しくご覧いただけます。
➡︎株式会社WEELのサービスを詳しく見る。
アイデア段階でも構いません。まずは無料相談でお気軽にご相談ください。
➡︎生成AIを活用したプロダクト開発・業務効率化について相談する

「生成AIを社内で活用したい」「生成AIの事業をやっていきたい」という方に向けて、通勤時間に読めるメルマガを配信しています。
最新のAI情報を日本最速で受け取りたい方は、以下からご登録ください。
また、弊社紹介資料もご用意しておりますので、併せてご確認ください。

