AI・機械学習

LLMのFunction Callingって実際どう動いてる?トークンからツール実行までの仕組みを解説

「LLMってネットに繋がってないのに、なんで天気とか調べられるの?」

そう思ったことありませんか?実は ChatGPT や Claude がリアルタイム情報を取ってこられる裏側には、Function Calling(関数呼び出し) という仕組みがあります。今回はその内部動作を、できるだけかみ砕いて解説していきます! 🔍

Function Calling とは?ざっくりいうと

artificial intelligence robot
artificial intelligence robot / Photo by Kindel Media via Pexels

イメージとしては、「LLMが自分で実行できないことを、外部ツールにお願いするための”指示書”を書く」感じです。

たとえば「東京とベルリンの天気を比べて」と聞いたとき、LLM自体はインターネットにアクセスできません。でも 「このAPIをこの引数で呼んでね」という構造化された指示を出力する ことはできます。実際の API 呼び出しはアプリ側が行い、結果をまた LLM に渡す、という流れです。

トークンレベルで何が起きているか

LLM が Function Calling を行うとき、内部ではざっくりこんな流れが起きています。

  1. ユーザーのメッセージを受け取る
  2. 利用可能なツール(関数)の定義を一緒にプロンプトへ埋め込む
  3. モデルが「ツールを呼ぶべき」と判断したら、JSON 形式のツール呼び出し指示をトークンとして出力する
  4. アプリ側がその JSON を解析して実際の関数を実行する
  5. 実行結果を「ツールの返答」としてモデルに渡す
  6. モデルが最終的な回答を生成する

つまり、LLM が直接 API を叩いているわけではないんですよね。あくまでも「何をどう呼ぶか」を決めているのがモデルの役割です。

実際のコードで見てみよう(OpenAI API の例)

OpenAI の API を使った簡単なサンプルで確認してみましょう。ポイントは tools パラメータにツール定義を渡すところです 👇

import openai
import json

client = openai.OpenAI()

# 🔧 ツール(関数)の定義
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "指定した都市の現在の天気を取得する",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {
                        "type": "string",
                        "description": "都市名(例: Tokyo, Berlin)"
                    }
                },
                "required": ["city"]
            }
        }
    }
]

# 💬 ユーザーからの質問
messages = [
    {"role": "user", "content": "東京とベルリンの天気を教えて"}
]

# 🤖 モデルにツール付きでリクエスト
response = client.chat.completions.create(
    model="gpt-4o",
    messages=messages,
    tools=tools,
    tool_choice="auto"  # モデルが自動でツールを選ぶ
)

# 📦 モデルがツール呼び出しを選んだ場合の確認
tool_calls = response.choices[0].message.tool_calls
if tool_calls:
    for call in tool_calls:
        func_name = call.function.name
        args = json.loads(call.function.arguments)
        print(f"呼び出す関数: {func_name}")
        print(f"引数: {args}")

ポイントをまとめるとこんな感じです。

  • tools に関数のスキーマ(仕様)を渡す ことで、モデルが何を呼べるか把握する
  • ✅ モデルは JSON 形式で「どの関数をどの引数で呼ぶか」を返してくる
  • tool_choice="auto" でモデルが自動判断してくれる
  • ✅ 実際の関数実行はアプリ側の責任(モデルはあくまで指示を出すだけ)

並列呼び出しもできる!


冒頭の「東京とベルリンの天気を比べて」というケースでは、同じターンで2回の関数呼び出しが発生します。最近のモデルは Parallel Function Calling(並列ツール呼び出し)に対応しており、tool_calls の配列に複数のツール呼び出しが含まれることがあります。これがいわゆる ツールオーケストレーション(複数ツールの協調制御)の入口になります 🎻

まとめ

LLM の Function Calling は「モデルが直接 API を叩く」のではなく、「モデルが呼び出し指示をトークンとして出力 → アプリが実行 → 結果をモデルへ返す」 というループで動いています。この仕組みを理解しておくと、AI エージェントや自動化ツールの設計がグッとやりやすくなりますよ。ぜひ手元で動かしながら試してみてください! 🚀

📡 Arduinoをもっと深く学ぼう!

Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。

Arduinoロボット入門のおすすめコース・部品を見る →

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

Arduinoをはじめよう 第4版 (Make: PROJECTS)

もしも

Arduinoをはじめよう 第4版 (Make: PROJECTS)

Arduino公式推薦の定番入門書

Amazonで見る

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です