【Function Callingの実践ガイド】7つの活用手順
この記事でわかること
- Function Callingの定義と基本的な仕組み
- Function Calling実装前の準備方法
- JSONスキーマの書き方と設定
- Function Calling実装と高度な活用方法
ChatGPTと外部システムを連携させる「Function Calling」はご存知でしょうか?
この記事では、AIと既存システムを効率的に統合するFunction Callingの基本概念から実装手順まで、7つのステップで分かりやすく解説します。
JSONスキーマによる関数定義の書き方、実際のコード例、Strictモードやストリーミング機能などの高度な設定も紹介。業務効率化やユーザー体験向上につながる具体的な活用事例も盛り込み、開発者からビジネス担当者まで役立つ完全ガイドです。
AIの力を最大限に引き出すFunction Callingの実装方法をマスターして、業務プロセスを改革していきましょう。
目次
Function Callingとは?ChatGPTと外部システム連携の基本

Function Callingは、ChatGPTなどの生成AIが自然言語の質問に応じて外部の関数やAPIを呼び出せる機能です。
AIの言語理解能力と外部システムの実行能力を組み合わせることで、より実用的なアプリケーション開発が可能になります。
Function Callingの定義と基本的な仕組み
Function Callingとは、ChatGPTが自然言語の質問を理解し、適切な外部関数を呼び出して実行する機能です。
例えば、「今日の東京の天気は?」という質問に対して、気象APIを呼び出して最新情報を取得し、正確な回答を提供できます。
この仕組みは次の要素から構成されています。
・関数定義:JSONスキーマによる関数の名前、説明、パラメータの定義 パラメータ解析:AIが自然言語から必要な情報を抽出
・関数実行:開発者側で実際に外部関数を実行
・結果統合:関数の実行結果をAIの応答に組み込む
ChatGPTが外部関数を呼び出すフローと処理の流れ
ChatGPTが外部関数を呼び出す際の処理フローは次の5ステップです。
- 開発者がAPIリクエストと共に関数定義をモデルに提供
- ユーザーの質問に基づき、モデルが関数呼び出しを決定し、関数名と引数を含むJSON出力を生成
- 開発者側でその関数を実際に実行(APIリクエスト送信、データベースクエリなど)
- 関数の実行結果をモデルに送り返す
- モデルが関数結果を取り入れた最終応答を生成
このフローにより、AIの言語処理能力と外部システムの機能を組み合わせた対話が実現します。
Function Callingが解決するビジネス課題
Function Callingは様々なビジネス課題を解決します。
データアクセスの制約を解消し、社内データベースやCRM、ERPなどと連携することで、常に最新データに基づいた応答が可能になります。
業務プロセスの自動化も大きな利点です。請求書の情報抽出や複雑なデータ処理、予約システムとの連携など、これまで人手で行っていた作業を自動化できます。
カスタマーエクスペリエンスの向上にも貢献します。ECサイトでの商品検索やパーソナライズされたレコメンデーション、複数ステップの予約フローなどを自然かつ効率的に進められます。
さらに、市場データ分析や財務シミュレーション、リスク評価など、複数データソースを組み合わせた高度な分析とその結果を説明するAIの能力を融合させた意思決定支援システムの構築も可能です。
Function Calling実装の準備:環境構築からAPIキー取得まで

Function Callingを実際に使用するには適切な環境構築と準備が必要です。ここでは実装前に押さえておくべき基本事項を解説します。
サポートされているモデルと利用条件
Function Callingは特定のOpenAIモデルでのみ利用できます。主なサポートモデルは以下の通りです。
・gpt-4シリーズ:gpt-4、gpt-4-turbo-preview、gpt-4-0613
・gpt-3.5シリーズ:gpt-3.5-turbo、gpt-3.5-turbo-0613
・新世代モデル:gpt-4.1(最新モデル)
これらのモデルは処理能力や精度が異なるため、用途に応じて適切なモデルを選択してください。複雑なパラメータ抽出や高度な推論が必要な場合はgpt-4シリーズが適しています。
利用にはOpenAIのAPIプランへの加入が必要です。料金はモデルごとに異なり、トークン使用量に基づいて課金されます。Function Callingでは関数定義もトークンとしてカウントされるため、コスト面も考慮すべきです。
開発環境の準備とライブラリのインストール
Function Callingを実装するための環境を準備しましょう。最も一般的なのはPythonでの実装です。Python 3.8以上を推奨します。
必須ライブラリをインストールします。
pip install openai # OpenAIの公式Pythonライブラリ
pip install requests # HTTPリクエスト用ライブラリ
pip install tiktoken # トークン数をカウントするライブラリ
特定の用途に応じて追加ライブラリが必要になることもあります。統合開発環境(IDE)としては、Visual Studio Code、PyCharm、Jupyterなどがおすすめです。特にJupyter NotebookはAPIの動作確認やプロトタイピングに適しています。
仮想環境を使用してプロジェクトごとに独立した環境を構築することも良い習慣です。
OpenAI APIキーの取得と安全な管理方法
Function Callingを使用するには、OpenAIのAPIキーが必要です。OpenAIのアカウントを作成し、ダッシュボードの「API keys」セクションから新しいシークレットキーを生成できます。
APIキーは重要な認証情報であり、漏洩すると不正利用や予期せぬ課金につながる可能性があります。以下のセキュリティプラクティスを推奨します。
・環境変数の利用:コード内に直接キーを記述せず、環境変数として管理
・.envファイルの活用:開発環境では.envファイルを使い、Gitなどでバージョン管理しない
・アクセス制限:必要最小限の権限を持つAPIキーを使用
・定期的なローテーション:APIキーを定期的に更新
・使用量の監視:異常な使用パターンを検知するために定期的に使用状況を確認
本番環境と開発環境では異なるAPIキーを使い分け、リスクを最小化することも重要です。
Function Calling設計の基本:JSONスキーマによる関数定義

Function Callingを効果的に活用するためのカギは、適切な関数設計にあります。
AIが正確に関数を理解し呼び出すために、JSONスキーマを用いた明確な定義が不可欠です。
効果的な関数とパラメータの設計方法
関数とパラメータの設計は成功の重要な要素です。以下の原則に従って設計しましょう。
関数名は目的を明確に表すものにします。「get_weather」や「search_products」のように、何をする関数なのかが一目でわかる名前が理想的です。複雑な関数よりも、シンプルで目的が明確な関数の方が正しく理解されやすくなります。
パラメータ設計では
・必要最小限のパラメータに抑える
・パラメータ名は意味が明確なものを使用する
・データ型を適切に指定する
・オプショナルと必須パラメータを明確に区別する
また、関数の数は20個程度に抑えることで、AIの選択精度を維持できます。「最小驚きの原則」に従い、直感的に理解できる設計を心がけましょう。
JSONスキーマの書き方と必須項目の設定
Function Callingでは、JSONスキーマ形式で関数を定義します。基本構造は以下の通りです。
{
“type”: “function”,
“name”: “get_weather”,
“description”: “指定された場所の現在の天気情報を取得します”,
“parameters”: {
“type”: “object”,
“properties”: {
“location”: {
“type”: “string”,
“description”: “都市名と国名(例:東京, 日本)”
},
“units”: {
“type”: “string”,
“enum”: [“celsius”, “fahrenheit”],
“description”: “温度の単位”
}
},
“required”: [“location”],
“additionalProperties”: false
},
“strict”: true
}
この構造の重要項目は、
・type: 常に “function” を指定
・name: 関数の名前
・description: 関数の説明
・parameters: パラメータ定義
・required: 必須パラメータのリスト
・additionalProperties: 未定義のプロパティを許可するかどうか
・rict: スキーマ厳守モードの有効化
関数の説明文とパラメータ説明の最適化テクニック
関数やパラメータの説明は、モデルが適切な選択と抽出を行うための重要な手がかりです。
関数の説明文では以下を明確にしましょう。
・関数の目的と用途
・いつ使用すべきか、いつ使用すべきでないか
・期待される入出力の例
・他の関数との関連性(ある場合)
「現在の気象情報を取得」よりも「指定された都市の現在の気温、湿度、風速を公式気象サービスから取得します。予報ではなく現在の情報のみを返します」という説明の方が効果的です。
パラメータの説明では
・期待される形式や制約(例:「ISO 8601形式の日付」)
・有効な値の例や範囲
・デフォルト値(ある場合)
・他のパラメータとの関連性
説明はバランスが重要です。短すぎると情報不足に、長すぎるとトークン消費が増えます。必要な情報を網羅した簡潔な説明を心がけましょう。
Function Calling実装手順:コード例でわかる開発ステップ
ここでは、Function Callingの実際の実装方法をPythonのコード例を用いて解説します。
シンプルな例から始めて、エラー処理や複数関数の連携まで段階的に学んでいきましょう。
モデルへの関数定義の渡し方と呼び出し方
まず基本的な実装例を見てみましょう。
from openai import OpenAI
import json
# APIクライアントの初期化
client = OpenAI(api_key=”YOUR_API_KEY”)
# 関数定義
tools = [{
“type”: “function”,
“name”: “get_weather”,
“description”: “指定された場所の現在の天気情報を取得します”,
“parameters”: {
“type”: “object”,
“properties”: {
“location”: {
“type”: “string”,
“description”: “都市名と国名(例:東京, 日本)”
}
},
“required”: [“location”],
“additionalProperties”: False
},
“strict”: True
}]
# モデルへのリクエスト
response = client.responses.create(
model=”gpt-4.1″,
input=[{“role”: “user”, “content”: “東京の今日の天気は?”}],
tools=tools
)
# 応答の確認
print(response.output)
モデルからの応答例:
[{
“type”: “function_call”,
“id”: “fc_12345xyz”,
“call_id”: “call_12345xyz”,
“name”: “get_weather”,
“arguments”: “{\”location\”:\”東京, 日本\”}”
}]
Function Callingの結果を処理するコードの実装
モデルが関数呼び出しを返したら、その関数を実行し結果をモデルに返します。
# 関数の実装
def get_weather(location):
# 実際にはここで気象APIを呼び出す
# 簡略化のためハードコードした結果を返す
weather_info = {
“東京, 日本”: “晴れ、気温25度”,
“大阪, 日本”: “曇り、気温23度”
}
return weather_info.get(location, “情報がありません”)
# 応答から関数呼び出し情報を取得
tool_call = response.output[0]
if tool_call.type == “function_call”:
# 引数を解析
args = json.loads(tool_call.arguments)
# 関数を実行
result = get_weather(args[“location”])
# 結果をモデルに送信
input_messages = [{“role”: “user”, “content”: “東京の今日の天気は?”}]
input_messages.append(tool_call) # 関数呼び出しメッセージを追加
input_messages.append({
“type”: “function_call_output”,
“call_id”: tool_call.call_id,
“output”: str(result)
})
# 最終応答を取得
final_response = client.responses.create(
model=”gpt-4.1″,
input=input_messages,
tools=tools
)
print(final_response.output_text)
エラーハンドリングと例外処理の実装ポイント
実際の開発では様々なエラーや例外に対応する必要があります。
def process_function_call(tool_call):
try:
# 関数名の取得
function_name = tool_call.name
# 引数の解析
try:
args = json.loads(tool_call.arguments)
except json.JSONDecodeError:
return “エラー: 引数のパースに失敗しました”
# 関数のルーティング
if function_name == “get_weather”:
# 必要なパラメータの検証
if “location” not in args:
return “エラー: locationパラメータが必要です”
return get_weather(args[“location”])
else:
return f”エラー: 未知の関数 ‘{function_name}’ が呼び出されました”
except Exception as e:
return f”エラー: 関数実行中に問題が発生しました – {str(e)}”
エラー処理のポイント
・必須パラメータの存在確認
・引数のパース失敗の検出
・パラメータ値の検証
・未知の関数名への対応
・関数実行中の例外のキャッチ
複数関数の連携と実行順序の制御方法
実用的なアプリケーションでは複数の関数を連携させることが多いでしょう。
# 複数の関数定義
tools = [
{
“type”: “function”,
“name”: “search_products”,
“description”: “商品データベースから検索します”,
“parameters”: {
“type”: “object”,
“properties”: {
“query”: {“type”: “string”, “description”: “検索キーワード”},
“category”: {“type”: “string”, “description”: “商品カテゴリ”}
},
“required”: [“query”],
“additionalProperties”: False
}
},
{
“type”: “function”,
“name”: “get_product_details”,
“description”: “特定の商品の詳細情報を取得します”,
“parameters”: {
“type”: “object”,
“properties”: {
“product_id”: {“type”: “string”, “description”: “商品ID”}
},
“required”: [“product_id”],
“additionalProperties”: False
}
}
]
# 関数のルーティングと実行
def execute_function(name, args):
if name == “search_products”:
return search_products(args.get(“query”), args.get(“category”))
elif name == “get_product_details”:
return get_product_details(args.get(“product_id”))
else:
return f”未知の関数: {name}”
# 複数の関数呼び出しを処理
for tool_call in response.output:
if tool_call.type == “function_call”:
name = tool_call.name
args = json.loads(tool_call.arguments)
result = execute_function(name, args)
input_messages.append({
“type”: “function_call_output”,
“call_id”: tool_call.call_id,
“output”: str(result)
})
複数関数連携のポイント
・適切な関数ルーティングの実装
・関数間でのデータの受け渡し
・依存関係のある関数の実行順序の管理
・各関数の実行結果の適切な統合
Function Calling高度活用:Strictモードとストリーミング機能

Function Callingをより効果的に活用するための高度な機能について解説します。
Strictモード、並列関数呼び出し、ストリーミング、Tool Choiceなど、実用的なアプリケーション開発に役立つ機能を紹介します。
Strictモードの設定とメリット
Strictモードは、Function Callingの精度と信頼性を高めるための機能です。このモードを有効にすると、モデルは定義されたJSONスキーマに厳密に従います。
Strictモードを有効にするには、関数定義に”strict”: trueを追加します。
tools = [{
# 関数定義
“strict”: true
}]
Strictモードの要件
・additionalPropertiesをfalseに設定
・全てのフィールドをrequired配列に含める
・オプショナルなフィールドは、型にnullを含める形で定義
“units”: {
“type”: [“string”, “null”],
“enum”: [“celsius”, “fahrenheit”],
“description”: “温度の単位(省略可能)”
}
Strictモードのメリットは、モデルが確実にスキーマ通りのパラメータを返すため、型エラーやパラメータ不足による実行時エラーを減らせることです。
デメリットは、初回リクエスト時の処理時間増加と一部JSONスキーマ機能の非サポートです。
並列関数呼び出しの実装と活用シーン
モデルは一度に複数の関数を呼び出すことができます。デフォルトでは有効ですが、parallel_tool_calls=Falseで制限できます。
response = client.responses.create(
model=”gpt-4.1″,
input=input_messages,
tools=tools,
parallel_tool_calls=False # 並列呼び出しを無効化
)
並列関数呼び出しの活用シーン
・複数のデータソースから情報を集約する場合
・相互に独立した複数のアクションを実行する場合
・APIラウンドトリップを減らして応答時間を短縮したい場合
注意点として、並列関数呼び出し時にはStrictモードが一時的に無効になることがあります。
重要な型チェックが必要な場合は、並列呼び出しを無効にすることを検討してください。
ストリーミングを活用したリアルタイム処理
Function CallingはストリーミングAPIと組み合わせることで、関数呼び出しの進行状況をリアルタイムで表示できます。
これにより、ユーザー体験を向上させられます。
stream = client.responses.create(
model=”gpt-4.1″,
input=[{“role”: “user”, “content”: “東京の観光スポットを教えて”}],
tools=tools,
stream=True # ストリーミングを有効化
)
for event in stream:
print(event)
主なイベントタイプ
・response.output_item.added: 新しい関数呼び出し追加
・response.function_call_arguments.delta: 引数追加
・response.function_call_arguments.done: 引数完成
・response.output_item.done: 関数呼び出し完了
ストリーミングデータ処理例
final_tool_calls = {}
for event in stream:
if event.type == ‘response.output_item.added’:
final_tool_calls[event.output_index] = event.item
elif event.type == ‘response.function_call_arguments.delta’:
index = event.output_index
if final_tool_calls[index]:
final_tool_calls[index].arguments += event.delta
Tool Choiceによる関数呼び出し制御
tool_choiceパラメータを使うと、モデルの関数呼び出し動作をより細かく制御できます。
主なオプション:
Auto(デフォルト): モデルが自律的に判断
tool_choice=”auto”
Required: 必ず1つ以上の関数を呼び出す
tool_choice=”required”
Forced Function: 特定の関数を強制的に呼び出す
tool_choice={“type”: “function”, “name”: “get_weather”}
活用シーン
・特定のワークフローを強制したい場合
・ユーザー入力に関わらず特定の情報を常に収集したい場合
・モデルの判断を補助して精度を高めたい場合
・特定のビジネスロジックに従った関数呼び出しを実現したい場合
tool_choice=”none”を設定すると、関数呼び出しを完全に無効化できます。これは動的に制御したい場合に便利です。
まとめ:Function Callingでシステム連携を実現し業務を効率化しよう

Function Callingは、ChatGPTの言語理解能力と外部システムの実行能力を連携させ、データ取得、業務自動化、カスタマーサポート効率化などの課題解決を実現します。
実装成功の鍵は適切な関数設計にあり、明確な関数名とパラメータ定義、JSONスキーマの活用によりAIとの連携精度が向上します。StrictモードやストリーミングなどのFunction Callingの高度な機能を活用することで、より洗練されたアプリケーション開発が可能になります。
まずは小規模プロジェクトから始め、徐々に自社システムとの連携へと発展させることをお勧めします。Function Callingの力を活用し、業務プロセスを革新して新たな価値を創出していきましょう。

【生成AI活用でお困りではないですか?】
株式会社アドカルは主に生成AIを活用したマーケティング支援や業務効率化に強みを持った企業です。
貴社のパートナーとして、少数精鋭で担当させていただくので、
「生成AIを業務に活用したい」
「業務効率を改善したい」
「自社の業務に生成AIを取り入れたい」
とお悩みの方は、ぜひ弊社にご相談ください。
貴社のご相談内容に合わせて、最適なご提案をさせていただきます。
サービスの詳細は下記からご確認ください。無料相談も可能です。
この記事でわかることを1問1答で紹介
Q. Function Callingとは何ですか?
A. ChatGPTなどの生成AIが、自然言語をもとに外部の関数やAPIを呼び出して実行できる機能です。
Q. Function Callingはどのような仕組みで動作しますか?
A. モデルが関数定義をもとに適切な関数と引数を出力し、開発者がその関数を実行し、結果をモデルに返して応答に反映します。
Q. どんなビジネス課題を解決できますか?
A. 社内システムとの連携、自動化による業務効率化、レコメンドや予約などのUX向上、高度な意思決定支援などが可能です。
Q. Function Callingを使うために必要な環境は?
A. OpenAI APIキー、Python環境、必要なライブラリ(openai, requestsなど)、およびサポートモデル(GPT-4系やGPT-3.5系)が必要です。
Q. 関数はどう定義すればよいですか?
A. JSONスキーマ形式で関数名・説明・パラメータ・必須項目などを記述し、AIが理解しやすいように設計します。
Q. 実装時の注意点やセキュリティ対策は?
A. APIキーの環境変数管理、.envファイルの除外、アクセス制限、使用量の監視などの対策が必要です。
Q. 実装の基本手順は?
A. 関数定義→モデルに渡す→モデルの関数呼び出しを検出→関数実行→結果をモデルに返す→最終応答生成の流れです。
Q. Function Callingの高度な使い方は?
A. Strictモードでの厳密な入力チェック、複数関数の並列呼び出し、ストリーミングによるリアルタイム処理、Tool Choiceによる呼び出し制御が可能です。