【2025年最新】ChatGPT APIの「ツール呼び出し(Tool Calling)」とは?基本から実装までを徹底解説

Python/SQL

はじめに

ChatGPTは強力な対話AIですが、その真価は外部の世界と連携することで発揮されます。OpenAI APIの**「ツール呼び出し(Tool Calling)」**機能(旧称:関数呼び出し)は、まさにその連携を実現するための鍵です。

この記事では、ChatGPTが単なる対話相手から、あなたのアプリケーションやサービスを能動的に操作する「エージェント」へと進化する「ツール呼び出し」の仕組みと実装方法を、初心者向けに分かりやすく解説します。


ツール呼び出し(Tool Calling)とは?

ツール呼び出しは、ユーザーとの対話の中で、ChatGPTがあらかじめ定義された外部のツール(関数やAPIなど)を呼び出すべきだと判断し、その実行に必要な情報をJSON形式で返す機能です。

これにより、開発者はユーザーの自然言語による曖昧な指示を、プログラムが実行可能な具体的な処理に結びつけることができます。

主なメリット:

  • 対話を通じたアクション実行: 「明日の東京の天気を教えて」という指示から、get_weather(city="tokyo")のような関数呼び出しをAIが生成します。
  • 外部データとの連携: 社内データベース、天気予報API、株価情報APIなど、リアルタイムで変動する外部データとChatGPTを接続できます。
  • 構造化データの抽出: 「次の会議を来週月曜の午後3時に設定して、参加者は田中さんと鈴木さん」といった自然文から、{ "title": "会議", "date": "2025-09-08T15:00:00", "participants": ["田中", "鈴木"] } のような構造化データを正確に抽出できます。

ツール呼び出しの仕組み

ツール呼び出しは、以下のステップで進行します。重要なのは、ChatGPTがツールを”直接実行する”わけではないという点です。あくまで「どのツールを、どの引数で呼び出すべきか」を提案し、実際の実行は開発者側のコードで行います。

  1. ツールの定義: 開発者は、使用させたいツール(関数)の名前、説明、引数の型などをJSON Schemaという形式で定義します。この「説明」が、AIがいつツールを使うべきかを判断する上で非常に重要になります。
  2. ユーザーからの入力: ユーザーが自然言語でリクエストを送信します。
  3. モデルによる判断: モデルは対話内容と定義されたツールリストを照らし合わせ、ツールを呼び出すべきかを判断します。呼び出すべきだと判断した場合、モデルは通常の返答の代わりに、呼び出すべきツール名と引数(tool_calls)を返します。
  4. ツールの実行: 開発者のアプリケーションは、モデルから返されたtool_callsを受け取り、実際に定義しておいた関数(例: get_current_weather())を実行します。
  5. 結果の返却: ツールの実行結果を、再びモデルに送信します。
  6. 最終応答の生成: モデルはツールの実行結果を解釈し、ユーザーに対して自然言語での最終的な回答を生成します。

実装ガイド(Python版)

ここでは、指定された都市の天気を返す簡単なツールを例に実装方法を解説します。

ステップ1:環境の準備

最新のOpenAI Pythonライブラリをインストールします。旧バージョン(0.x系)とはコードの書き方が大きく異なるためご注意ください。 ※開発環境はGoogle Colabを想定しています。

Python

!pip install openai -U

ステップ2:ツールの定義とAPI呼び出し

ユーザーのクエリに応じて天気を返すプロセスを実装します。

Python

import openai
import json

# APIキーを設定
# 本来は環境変数から読み込むのが安全です
client = openai.OpenAI(api_key='YOUR_API_KEY')

# 1. 実行するPython関数(ツール)を定義
def get_current_weather(location, unit="celsius"):
    """指定された都市の現在の天気を取得します。"""
    # この関数内で実際の天気APIを呼び出す
    # ここではダミーデータを返します
    weather_info = {
        "location": location,
        "temperature": "22",
        "unit": unit,
        "forecast": "晴れ",
    }
    return json.dumps(weather_info)

def run_conversation(user_query):
    # 2. モデルに渡すツール定義リストを作成
    tools = [
        {
            "type": "function",
            "function": {
                "name": "get_current_weather",
                "description": "指定された都市の現在の天気情報を取得する",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "location": {
                            "type": "string",
                            "description": "都市名 (例: 東京, サンフランシスコ)",
                        },
                        "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
                    },
                    "required": ["location"],
                },
            },
        }
    ]

    # ユーザーのクエリを含むメッセージリスト
    messages = [{"role": "user", "content": user_query}]

    # 3. モデルにメッセージとツール定義を渡す
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=messages,
        tools=tools,
        tool_choice="auto",  # モデルにツールを使うかどうかの判断を委ねる
    )

    response_message = response.choices[0].message
    tool_calls = response_message.tool_calls

    # 4. モデルがツール呼び出しを要求したかチェック
    if tool_calls:
        # 利用可能な関数をマッピング
        available_functions = {
            "get_current_weather": get_current_weather,
        }
        
        # メッセージ履歴にアシスタントの応答(ツール呼び出し要求)を追加
        messages.append(response_message)

        # 複数のツール呼び出し要求に対応
        for tool_call in tool_calls:
            function_name = tool_call.function.name
            function_to_call = available_functions[function_name]
            function_args = json.loads(tool_call.function.arguments)
            
            # 5. 実際にツール(関数)を実行
            function_response = function_to_call(
                location=function_args.get("location"),
                unit=function_args.get("unit"),
            )
            
            # 6. ツール実行結果をメッセージ履歴に追加
            messages.append(
                {
                    "tool_call_id": tool_call.id,
                    "role": "tool",
                    "name": function_name,
                    "content": function_response,
                }
            )
        
        # 7. ツール実行結果を含めて再度モデルを呼び出し、最終応答を得る
        second_response = client.chat.completions.create(
            model="gpt-4o",
            messages=messages,
        )
        return second_response.choices[0].message.content
    
    # ツール呼び出しが不要だった場合は、最初の応答をそのまま返す
    return response_message.content

# 実行
final_answer = run_conversation("東京の天気を教えて")
print(final_answer)

出力例

現在の東京の天気は晴れで、気温は22℃です。

実践的な活用例

  • カレンダー連携: 「来週月曜の午後3時に田中さんと会議を設定して」 → Calendar(title="会議", datetime="...", participants=["田中"]) を呼び出し、Google Calendarに予定を追加。
  • ECサイトの在庫確認: 「商品ID: 12345 の在庫はありますか?」 → get_stock(product_id="12345") を呼び出し、データベースから在庫情報を取得して返答。
  • 複数APIの統合: 「サンフランシスコの今の天気と、日本円でのドル相場を教えて」 → get_weather(location="San Francisco")get_exchange_rate(from="USD", to="JPY") の2つのツールを連続で呼び出し、結果をまとめて報告。

重要な注意点

  • セキュリティ: ユーザーからの入力をそのままツールの引数として実行するのは危険です。特にデータベース操作や外部コマンド実行など、破壊的な操作を許可するツールを定義する場合は、厳格な入力値の検証と権限管理が必須です。
  • エラーハンドリング: API呼び出しが失敗した場合や、ツール実行中にエラーが発生した場合を考慮した、堅牢なエラーハンドリングを実装してください。
  • コスト管理: ツール呼び出しは、最低でも2回のAPIコールが発生します。複雑な対話ではコール数が増えるため、APIの使用量とコストを常に意識することが重要です。

まとめ

OpenAI APIのツール呼び出しは、ChatGPTを単なる対話エンジンから、外部システムと連携して能動的にタスクを実行する「AIエージェント」へと昇華させるための強力な機能です。

この機能を使いこなすことで、より動的で実用的なAIアプリケーションを構築できます。ぜひこのガイドを参考に、革新的な開発に挑戦してみてください。