この記事の音声は準備中です。
音声の一覧・再生リストへツール使用(Tool Use / Function Calling)
この記事の目的
ツール使用の仕組みを正しく説明できるようになります。特に「モデルはツールを実行しない」という事実の設計上の意味を理解し、ツールの粒度と結果の返し方を自分で設計できる状態がゴールです。
対象読者
- ツール使用型の Agent を初めて実装するアプリケーションエンジニア
- ツールの設計(何をツールにするか、結果をどう返すか)に責任を持つエンジニア
前提知識
- AI Agent とは何か — Agent の構成要素
- Agent ループ — ツール使用が組み込まれるループの全体像
本文
概要: モデルはツールを「実行しない」
ツール使用(tool use)とは、LLM に利用可能な機能の一覧(名前・説明・入力スキーマ)を渡し、モデルが「この機能をこの引数で呼びたい」という構造化された要求を出力し、実行はアプリケーション側が行って結果をモデルに返す仕組みです。関数呼び出し(function calling)とも呼ばれ、同じ機構を指します。
「モデルは実行要求を出すだけで、実行しない」— この一点が安全設計の土台です。以下のアプリ実行型では、実行の手前に自社のコードが挟まるため、検証・権限チェック・人間の承認を置けます。プロバイダー実行型にも同じ制御点があるとは限りません。
図を元の大きさで表示
図の中をスクロールして読めます。キーボードでは図の領域へ Tab で移動し、矢印キーを使います。読み終わったら、この見出しをもう一度選ぶと閉じます。
実行主体と制御点を区別する
| 方式 | 実行主体 | 制御点 |
|---|---|---|
| アプリ実行型(function calling・自社 MCP クライアント) | 自社アプリが要求を検証して実行 | 引数・実効権限・承認を自社コードで強制 |
| プロバイダー実行型(組み込みツール・API 経由のリモート MCP) | プロバイダー基盤がツールや接続先を呼ぶ | 許可ツール・承認設定・資格情報スコープ・送信先を製品機能で制限 |
OpenAI のリモート MCP は allowed_tools と require_approval による制御を提供し、承認要求への応答をアプリが返せます(2026-10-03 確認)。設定の有無を確認せず独自の承認ゲートを置けると仮定しません。必要な承認を実行直前に強制できない副作用はアプリ実行型へ置きます。資格情報の最小化と外部送信の制限はどちらの方式にも必要です。
詳細: ツール定義の 3 要素
| 要素 | 役割 | 設計のポイント |
|---|---|---|
| 名前 | モデルが要求で指定する識別子 | 動詞 + 対象で具体的に(search_expenses) |
| 説明文 | モデルが「いつ使うか」を判断する唯一の材料 | プロンプトの一部として書く。用途・制約・使わない場面まで |
| 入力スキーマ | 引数の構造(JSON Schema) | 各引数に説明と形式例を付ける |
説明文の質がツール選択の精度を直接決めます。定義例:
{
"name": "search_expenses",
"description": "社員の経費精算履歴を検索します。精算の状況・金額・日付の照会に使います。経費の新規申請や修正はできません(照会専用)。",
"input_schema": {
"type": "object",
"properties": {
"employee_id": { "type": "string", "description": "社員 ID(例: E12345)" },
"month": { "type": "string", "description": "対象月。YYYY-MM 形式(例: 2026-06)" }
},
"required": ["employee_id", "month"]
}
}詳細: 結果の返し方も設計対象
ツールが返す内容は、そのままモデルの「観測」になります。
- 成功時: モデルの判断に必要なフィールドに絞って返します。生 API レスポンスの全文ダンプはコンテキストを圧迫し、重要な値を埋もれさせます
- 失敗時: 「何が悪かったか」「どうすればよいか」を含めます(例: 「month は YYYY-MM 形式で指定してください」)。エラーは例外で握りつぶさず観測として返します(Agent ループ 参照)
- 大きい結果: 件数制限・要約・ページングを用意します。「検索ヒット 1 万件を全部返す」はツール側の設計ミスです
詳細: 自前実装と標準プロトコル(MCP)
ツールを 1 つずつ自前で定義する方法に加えて、2026 年時点では MCP(Model Context Protocol) のような標準プロトコルで既存のツールサーバーに接続する形態が広く使われています。概念上はどちらも「ツール」であり、自社 MCP クライアントでは本記事のアプリ実行型の仕組みが当てはまります。API 経由の MCP 接続はプロバイダー実行型となるため、承認・許可ツールと実行主体を別に確認します。
接続の実務は ツール接続標準(MCP とエコシステム)、外部ツールサーバーをどこまで信頼するかという安全性の論点は ツール権限設計とサンドボックス で扱います。
設計判断: 何をツールにするか(粒度)
- 細かすぎる場合: 低レベル API を 1:1 で 30 個並べると、モデルは毎回呼び出し順序を推論することになり、選択ミスとトークン消費が増えます
- 粗すぎる場合:
do_anything(action: string)のような万能ツールは、スキーマによる制約が効かず検証もできません - 指針: 「モデルに判断させたい境界」でツールを切ります。決定論的にできる処理(整形・集計・入力検証)はツール内部のコードで済ませ、モデルには判断だけをさせます
- ツール数: 多いほど選択ミスと定義のトークン消費が増えます。タスクに必要なセットへ絞り込むこと自体が設計です
実務での注意点
アンチパターン
- 説明文が名前の言い換えだけ(
search_expenses: 経費を検索する)→ いつ使うべきか・使うべきでないかが伝わらず、誤用と不使用の両方が起きる → 用途・制約・形式例まで書く - 「念のため」全ツールを常時渡す → 選択ミスの確率とトークンコストだけが増える → タスク種別ごとにツールセットを絞る
- ツール呼び出し要求を無検証で実行する → モデルの出力は誤りうる入力であり、プロンプトインジェクションモデルへの入力に紛れ込ませた指示で、開発者の意図した挙動を上書きする攻撃。ユーザー入力による直接型と、Agent が読む外部コンテンツ経由の間接型がある。(プロンプトインジェクション)の出口にもなる → 引数の妥当性と権限をアプリ側で必ず検証する
チェックリスト
- 各ツールの実行主体と、実行直前に権限・承認を強制する制御点を確認した
- 各ツールの説明文に「いつ使うか」「何ができないか」が書いてある
- 引数スキーマの各項目に説明と形式例がある
- 失敗時に、モデルが次の手を判断できるエラーメッセージを返す
- 大きい結果に件数制限・要約の仕組みがある
- 副作用のあるツール(送信・削除・購入)を照会系と区別し、権限・承認を設計した
- ツール呼び出し要求の引数をアプリ側で検証している
関連トピック
- Agent ループ — ツール使用が組み込まれるループ全体
- AI Agent とは何か — ツールが Agent の構成要素である位置づけ
- RAG と Agent の関係・使い分け — 「検索をツールにする」代表的な応用
- ツール定義の設計 — 定義設計の実践プラクティス集
- ツール接続標準(MCP とエコシステム) — MCP による接続の実務
- LLM の能力と限界の由来 — ツールが LLM の構造的弱点を補うという理論的根拠
- examples/python/tool-use/ — 本記事の仕組みを実装した動くサンプル
参考資料
-
MCP servers(OpenAI) — リモート MCP の許可ツール・承認設定(アクセス日: 2026-10-03)
-
Building Effective Agents(Anthropic) — ツールを含む Agent 構成の設計原則(アクセス日: 2026-07-05)
-
Model Context Protocol 公式サイト — MCP の仕様とドキュメント(アクセス日: 2026-07-05)
TODO・未確認事項
本文の未確認事項を参照してください。