Skip to content
OpenAI Function Calling: はじめての実用サンプル集

OpenAI Function Calling: Examples to Get Started

Updated on

最新の OpenAI の function calling(tools・JSON Schema・Structured Outputs)を理解しよう。Python と JavaScript の実用例で、ミーティングのスケジュール、株価取得、旅行予約のやり方を解説します。

常に進化し続ける人工知能(AI)の世界において、OpenAI の function calling(現在は tools として提供)は、実アプリケーションを作るうえで最重要なビルディングブロックの 1 つになっています。gpt-4.1gpt-4.1-mini のような強力な言語モデルを、自分の API・データベース・ビジネスロジックに接続できるようにします。

モデルに「このフォーマットで JSON を書いて」と頼んで、うまく従ってくれることを祈る代わりに、JSON Schema で関数を記述し、モデルからはコード側で安全に実行できる 構造化された 関数呼び出しが返ってきます。

このガイドでは次の内容を学びます。

  • OpenAI の function calling とは何か、現在はどう動くのか
  • JSON Schema で tools / functions を定義する方法
  • 実用例:ミーティングのスケジュール、株価取得、旅行予約
  • Structured Outputs などの新機能を使って function calling をより信頼できるものにする方法
  • ベストプラクティス・よくある落とし穴・FAQ
📚

OpenAI Function Calling(Tools)とは?

Function calling を使うと、モデルは通常のテキストではなく 機械可読な関数呼び出し で応答できます。最新の API では、これは tools として表現されます。

  • Tool は次のように定義します:
    • type: "function"
    • function.name, function.description
    • function.parameters(引数を表す JSON Schema)
  • これらの tools をプロンプトと一緒に送ります。
  • モデルは tool を呼び出すかどうかを判断し、関数名と JSON の引数からなる tool call を返します。
  • あとはアプリケーションが:
    1. tool call をパースし、
    2. バックエンド側の対応する関数を実行し、
    3. 必要ならその結果を再度モデルに送って、ユーザー向けの最終回答を生成させます。

内部的には、function calling は次の API でサポートされています。

  • Responses APIPOST /v1/responses)– 新規アプリケーションには推奨。
  • 従来の Chat Completions APIPOST /v1/chat/completions)– 現在も広く使用されておりサポートされています。

歴史的には、function calling は functionsfunction_call パラメータで提供されてきましたが、現在は toolstool_choice が推奨され、前者は非推奨になりました。新しいコードは必ず新スタイルを使うべきです。


基本例:ミーティングを予約する(Chat Completions API)

まずは Chat Completions API を使ったシンプルな例から始めましょう。モデルにミーティングのスケジュールを依頼し、schedule_meeting 関数の構造化された引数を返させます。

JSON リクエスト(概念的な例)

{
    "model": "gpt-4.1-mini",
    "messages": [
        {
            "role": "user",
            "content": "Schedule a meeting with John Doe next Tuesday at 3 PM."
        }
    ],
    "tools": [
        {
            "type": "function",
            "function": {
                "name": "schedule_meeting",
                "description": "Schedule a meeting in the calendar.",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "attendee": {
                            "type": "string",
                            "description": "Name of the attendee for the meeting."
                        },
                        "date": {
                            "type": "string",
                            "description": "Date of the meeting in ISO 8601 format."
                        },
                        "time": {
                            "type": "string",
                            "description": "Time of the meeting, including time zone."
                        }
                    },
                    "required": ["attendee", "date", "time"],
                    "additionalProperties": false
                },
                "strict": true
            }
        }
    ],
    "tool_choice": "auto"
}

モデルの返信は次のような内容を含みます。

{
    "role": "assistant",
    "tool_calls": [
        {
            "id": "call_123",
            "type": "function",
            "function": {
                "name": "schedule_meeting",
                "arguments": "{\"attendee\":\"John Doe\",\"date\":\"2025-11-18\",\"time\":\"15:00 Europe/Berlin\"}"
            }
        }
    ]
}

バックエンドでは arguments をパースして、実際の schedule_meeting 関数(例えば Google Calendar や Outlook 連携)を呼び出し、その結果をモデルに渡してユーザー向けの確認メッセージを生成させることもできます。


例:株価の取得

次はより「API らしい」例です。自然言語から get_stock_price 関数を呼び出します。

get_stock_price tool つきのリクエスト

{
    "model": "gpt-4.1-mini",
    "messages": [
        {
            "role": "user",
            "content": "What's the current price of Apple stock?"
        }
    ],
    "tools": [
        {
            "type": "function",
            "function": {
                "name": "get_stock_price",
                "description": "Get the current stock price for a ticker symbol.",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "ticker_symbol": {
                            "type": "string",
                            "description": "Ticker symbol of the stock, e.g. AAPL."
                        },
                        "currency": {
                            "type": "string",
                            "enum": ["USD", "EUR", "GBP"],
                            "description": "Currency for the price."
                        }
                    },
                    "required": ["ticker_symbol"],
                    "additionalProperties": false
                },
                "strict": true
            }
        }
    ],
    "tool_choice": "auto"
}

ユーザーが “What’s the current price of Apple stock?” と聞くと、モデルは次のような tool call を生成します。

{
    "type": "function",
    "function": {
        "name": "get_stock_price",
        "arguments": "{\"ticker_symbol\":\"AAPL\",\"currency\":\"USD\"}"
    }
}

あとは次のように進めます。

  1. 実際の株価 API を呼び出す。
  2. その結果をフォローアップのリクエストとしてモデルに渡す。
  3. モデルに人間向けの説明文を作らせる。

例:Function Calling を使った旅行予約

Function calling が真価を発揮するのは、ユーザーのプロンプトは雑で人間的でも、バックエンドでは きれいな構造化パラメータ が必要なときです。

次のような発話を考えてみましょう。

“I need to book a trip from Bonn to Amsterdam for my wife, mother, my two sons, my daughter, and me. The airline must fly direct.”

ここから抽出したいのは:

  • departure
  • destination
  • number_people
  • travel_mode(例:plane / train など)

book_travel の tool 定義

{
    "model": "gpt-4.1-mini",
    "messages": [
        {
            "role": "user",
            "content": "I need to book a trip from Bonn to Amsterdam for my wife, mother, my two sons and daughter, and me. The airline must fly direct."
        }
    ],
    "tools": [
        {
            "type": "function",
            "function": {
                "name": "book_travel",
                "description": "Search or book transportation for a group of travelers.",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "departure": {
                            "type": "string",
                            "description": "City or airport you are traveling from."
                        },
                        "destination": {
                            "type": "string",
                            "description": "City or airport you are traveling to."
                        },
                        "number_people": {
                            "type": "integer",
                            "description": "How many people are traveling."
                        },
                        "travel_mode": {
                            "type": "string",
                            "enum": ["plane", "train", "bus", "car"],
                            "description": "Preferred mode of travel."
                        },
                        "non_stop_only": {
                            "type": "boolean",
                            "description": "Whether only non-stop options are allowed."
                        }
                    },
                    "required": ["departure", "destination", "number_people"],
                    "additionalProperties": false
                },
                "strict": true
            }
        }
    ],
    "tool_choice": "auto"
}

モデルは次のような出力を行うかもしれません。

{
    "name": "book_travel",
    "arguments": "{\"departure\":\"Bonn\",\"destination\":\"Amsterdam\",\"number_people\":6,\"travel_mode\":\"plane\",\"non_stop_only\":true}"
}

このままフライト検索サービスへ渡して利用できます。


最新の OpenAI SDK を使う(Python & JavaScript)

通常は生の JSON を手書きするのではなく、公式の SDK を利用し、型付きのレスポンスとして扱います。

Python の例(Chat Completions + tools)

from openai import OpenAI
 
client = OpenAI()
 
tools = [
    {
        "type": "function",
        "function": {
            "name": "schedule_meeting",
            "description": "Schedule a meeting in the calendar.",
            "parameters": {
                "type": "object",
                "properties": {
                    "attendee": {"type": "string"},
                    "date": {"type": "string"},
                    "time": {"type": "string"},
                },
                "required": ["attendee", "date", "time"],
                "additionalProperties": False,
            },
            "strict": True,
        },
    }
]
 
completion = client.chat.completions.create(
    model="gpt-4.1-mini",
    messages=[
        {
            "role": "user",
            "content": "Schedule a meeting with John Doe next Tuesday at 3 PM.",
        }
    ],
    tools=tools,
    tool_choice="auto",
)
 
tool_calls = completion.choices[0].message.tool_calls
if tool_calls:
    call = tool_calls[0]
    args = client.responses._client._utils.json.loads(call.function.arguments)
    # 実装例:
    # result = schedule_meeting(**args)

JavaScript の例(Node.js)

import OpenAI from "openai";
 
const client = new OpenAI();
 
const tools = [
    {
        type: "function",
        function: {
            name: "get_stock_price",
            description: "Get the current price for a given ticker symbol.",
            parameters: {
                type: "object",
                properties: {
                    ticker_symbol: {
                        type: "string",
                        description: "Stock ticker symbol, e.g. AAPL",
                    },
                },
                required: ["ticker_symbol"],
                additionalProperties: false,
            },
            strict: true,
        },
    },
];
 
const response = await client.chat.completions.create({
    model: "gpt-4.1-mini",
    messages: [
        { role: "user", content: "What's the current price of Apple stock?" },
    ],
    tools,
    tool_choice: "auto",
});
 
const toolCalls = response.choices[0].message.tool_calls;

Structured Outputs:より信頼性の高い Function Calling

JSON Mode を使うとモデルは有効な JSON を返してくれますが、それが 自分のスキーマに完全に一致する とは限りません。Structured Outputs はこれを一歩進め、モデルが tool を呼び出す際に JSON Schema を厳密に適用します。

  • tool の function 定義で "strict": true を設定します。
  • これにより、モデルが返す引数はスキーマ(型・必須項目・余計なプロパティなし)に準拠することが保証され、パースやバリデーションの失敗が大幅に減ります。

特に次のようなケースで有用です。

  • 複雑でネストしたデータを非構造テキストから抽出したいとき
  • 各ステップが正確な構造化データに依存するマルチステップのワークフロー
  • SQL・分析パイプライン・データ可視化ツールなど、下流システムのパラメータを生成するとき

Structured Outputs を使っても、値は依然として「信頼できない入力」として扱うべきです(例えば範囲チェック、ID の存在確認、ビジネスルールに基づく検証など)。


デザインパターンとベストプラクティス

1. Tool は小さくシンプルに保つ

巨大な do_everything 関数を 1 つ作るのではなく、小さく合成可能な tools に分割しましょう。

  • get_user_profile
  • get_user_orders
  • create_support_ticket
  • schedule_meeting

こうすることでスキーマを保守しやすくなり、モデルも適切な tool を選びやすくなります。

2. わかりやすい名前と説明を付ける

  • 関数名は動詞ベースにする:create_invoice, fetch_weather, book_travel など。
  • 説明は「何をするか」だけでなく、「いつ この関数を使うべきか」も明示しましょう。

悪い例:

“Get data from the system.”

良い例:

“Use this function whenever the user asks about their recent orders or order history.”

3. Schema は厳密に

  • required フィールドと additionalProperties: false を積極的に使う。
  • 限られた選択肢には enum を使う("enum": ["plane", "train"] など)。
  • 必要に応じて簡単な制約(文字列フォーマット、整数の最小値など)も追加する。

4. すべて検証し、ログを残す

  • 関数を実行する前に、常にサーバー側で tool の引数を検証する。
  • tool call と自然言語プロンプトをログに残してデバッグに役立てる。
  • 検証に失敗した場合は、短い修正用の system メッセージを挟んで再試行することも検討する。

5. 必要に応じて Tool をチェーンする

より複雑なワークフロー(例:ユーザー取得 → 注文取得 → 要約)では次のような方法が取れます。

  1. モデルに 1 回のレスポンスで複数の tool を呼ばせる(並列 tool call)。
  2. あるいはバックエンド側でステップバイステップにオーケストレーションし、前の tool の結果を次のモデル呼び出しに渡していく。

具体的なマルチステップ例:混在フォーマットの計算

Function calling が「単なるおまけ」ではないことを示すクラシックな例を見てみましょう。

“What’s the result of 22 plus 5 in decimal added to the hexadecimal number A?”

これを解くために 2 つの tool を定義します。

  • add_decimal(a: number, b: number)
  • add_hex(a: string, b: string)

ワークフローは次のとおりです。

  1. モデルが add_decimal{ "a": 22, "b": 5 } で呼び出す → コード側は 27 を返す。
  2. その結果と元の質問をモデルに再度渡す。
  3. モデルは add_hex{ "a": "27", "b": "A" } で呼び出す。
  4. コード側が 31 を返し、モデルが最終結果をユーザーに説明する。

このパターンは どんなドメインにも一般化 できます:金融、分析、データ可視化、DevOps、BI ダッシュボードなど。Function calling と自前の tools を組み合わせれば、柔軟でドメイン知識を持った AI アシスタントを構築できます。


ChatGPT のパワーでどんなチャートでも簡単に作りたいですか? VizGPT (opens in a new tab) を試してみてください — データとチャートのイメージを自然言語で説明するだけで、ノーコード で美しいチャートを生成できます。

How to Create Charts with VizGPT (opens in a new tab)

VizGPT: Create Charts with the Power of ChatGPT (opens in a new tab)


関連する OpenAI のアップデート(ハイレベル)

OpenAI は function calling と tools の体験を継続的に改善しています。

  • より大きなコンテキストウィンドウ:長い会話・ドキュメント・スキーマを扱いやすくなりました。
  • Structured Outputs:tools や response formats に対して JSON Schema に準拠した出力を保証します。
  • よりリッチな Responses API と tools エコシステム(web search・file search・code execution など)により、同じ function calling の概念を使って本格的なエージェントワークフローを構築しやすくなっています。

料金や最新のモデル一覧については、常に公式の OpenAI ドキュメントと pricing ページを確認してください。


まとめ

Function calling は、LLM を 実用的で信頼できるスタックの一部 に変える強力な方法です。

  • JSON Schema で「自分の関数が何をできるか」を記述する。
  • モデルは「いつ・どのように」それらを呼ぶかを判断する。
  • バックエンドがその呼び出しを実行し、モデルと協調してリッチなユーザー体験を構築する。

ミーティングの予約、株価の問い合わせ、旅行の予約、あるいは PyGWalker や VizGPT のようなツールで BI ダッシュボードを動かす場合でも、function calling は自然言語と実際のアクションをつなぐ「のり(glue)」の役割を果たします。

まずは 1 つの関数からシンプルに始め、すべてを検証しながら、アプリケーションの成熟とともにマルチステップのエージェントワークフローへと発展させていきましょう。


よくある質問(FAQ)

  1. OpenAI の function calling 機能とは何ですか?

    Function calling では、JSON Schema で関数(tools)を記述しておくことで、モデルが自由テキストではなく構造化された関数呼び出しを返せるようになります。モデル自体が処理を実行するのではなく、アプリケーション側が tool call をパースして実際の関数を実行します。

  2. どのモデルが function calling をサポートしていますか?

    最新の GPT-4・GPT-4.1・GPT-4o・GPT-4o-mini・そして新しい GPT-5 / o-series モデルは、Chat Completions API と Responses API を通じて tools / function calling をサポートしています。最新の対応モデル一覧は OpenAI ドキュメントを確認してください。

  3. 古い functions / function_call パラメータを使うべきですか?

    いいえ。これらは第一世代の function calling パラメータで、現在はレガシー扱いです。新しいコードでは、より柔軟で最新モデル・API に対応した toolstool_choice を使用してください。

  4. JSON Mode や Structured Outputs とはどう違いますか?

    • JSON Moderesponse_format: { "type": "json_object" })は「有効な JSON」を返すことを保証しますが、特定のスキーマまでは強制しません。
    • Structured Outputs を使った function calling(tool 定義で strict: true)は、モデルが返す引数が指定した JSON Schema に準拠することを保証します。
    • より細かく制御したい場合は、function calling と JSON Mode を組み合わせることも可能です。
  5. 代表的なユースケースには何がありますか?

    • 外部 API(天気、CRM、チケット管理、社内ツールなど)を呼び出すチャットボット
    • 自然言語 → API コール・SQL クエリ・検索フィルタ
    • 非構造テキストを構造化レコードに変換するデータ抽出パイプライン
    • 自動化・分析・BI 向けのマルチステップ「エージェント」ワークフロー
📚