AIエージェント
Deep Agentsのスキル連動ツールとtool searchの違いと使い分け
- Deep Agents
- ツール定義
- AIエージェント
- ハーネス
- SkillsMiddleware
- tool search
- defer_loading
- SKILL.md
- Agent Skills
- include_tools
- allowed-tools
- プロンプトキャッシュ
- 段階的開示
- コンパクション
- コンテキスト
- MCP
- Responses API
- tool_addition
- 名前空間
- リゾルバ
- ミドルウェア
- 事前承認
目次
多数のツールと多数のスキルを持つ AIエージェントを作る開発者を考える。AIエージェントでは、モデルが外部の関数を呼んで仕事を進める。モデルに関数を呼ばせるには、関数ごとに名前・説明・引数の形を記したツール定義(スキーマ)をモデルに渡す。ツール定義は、モデルが一回の推論で読む入力であるコンテキストに入るので、ツールが増えるほど入力が長くなり、仕事を始める前に入力の枠が使われる。
スキルは、あるタスクでツールをどう使うかを書いた指示ファイル(SKILL.md)である。ツール定義を最初に全部渡さず、必要になった時点で渡すと、入力は短く保てる。この段階的開示では、必要になった時点を誰が決めるかで、モデルが読んだ指示と呼べるツールの対応が変わる。また、会話の途中でツールの一覧を変えると、プロンプトキャッシュ(同じ先頭部分の再処理を避けるために、提供元が入力の先頭部分を保存しておく仕組み)が無効になるのが従来の扱いだった。
本稿は、モデルの検索で開示する provider(モデル提供元)の tool search と、スキルを読んだことで開示する Deep Agents のスキル連動ツールの二つを例に取る。選んだのは本稿である。二つは、開示のきっかけをモデルの検索とスキルの読み込みという別々の動作に置いており、作り手がそれぞれ設計の理由を書いている。ほかの方法として、全部を最初に渡す形がある。Agent Skills 仕様の allowed-tools は、開示ではなく事前承認の欄なので、別物として扱う。
多数のツールを持つエージェントは、ツール定義を誰のどの動作をきっかけに開示するのがよく、きっかけによってツールを呼べる条件はどう変わるのか。
エージェントのツール定義は、最初に全部渡す形から、会話の途中で必要な分だけ開示する形へ移っており、開示のきっかけをモデルの検索に任せるか、スキルを読んだことに結びつけるかで、ツールを呼べる条件が変わる。 Anthropic と OpenAI は、対応する新しいモデルに限って、後から入るツール定義がキャッシュ済みの先頭部分を壊さない仕組みを用意した(Anthropic の途中追加はベータ)。検索で開示する方式は、スキルを読まずにツールを呼べるが、スキルに結びつけた方式は、読む前の呼び出しを失敗させる。後者の代償は、読んだ記録が消えるとツールも呼べなくなることである。
200 個のツールを持つエージェントの入力量と、スキルを読む前の呼び出し
※ この節の数値は説明のための仮定で、測定値ではありません。
次の前提を置く。エージェントは 200 個のツールを持ち、ツール定義は 1 個あたり 500 トークンとする。スキルは 50 個あり、名前と説明が 1 個あたり 100 トークンとする。スキルの本文は 1 個あたり 2,000 トークンとする。スキル call-transcripts は search_calls と get_transcript の二つ、スキル crm-update は update_forecast と list_deals の二つを載せる。
全部を最初に渡すと、ツール定義は 200 × 500 = 100,000 トークンで、スキルの名前と説明が 50 × 100 = 5,000 トークンだから、仕事の前に 105,000 トークンが入力に入る。二つのスキルを読んで 4 個のツールを使う仕事なら、後から開示する形の入力は、スキルの名前と説明 5,000、二つの本文 2 × 2,000 = 4,000、開示した 4 個のツール 4 × 500 = 2,000 で、合計 11,000 トークンになる。全部を最初に渡す形も同じ二つの本文 4,000 を読むので、この仕事の合計は 109,000 トークンになり、差は 98,000 トークンである。
ここで、ユーザーが「Acme の通話を探して」と頼むとする。call-transcripts には、検索は取引先の ID で行う、という指示が書かれているとする。検索で開示する方式では、モデルは「call」で検索して search_calls を見つけ、本文を読まないまま、社名を引数にして呼べる。検索が取引先の ID を求めるので、この呼び出しは目的の通話を返さない。呼び出しの前にスキルを読む動作は、方式のどこにも要求されない。スキル連動の方式では、モデルが search_calls を先に呼ぶと、未知のツールとして失敗する。モデルは call-transcripts を読み、その後で search_calls と get_transcript が開示される。呼べる時点では、ID で検索する指示がすでに入力に入っている。会話が長くなってコンパクションで call-transcripts の読み込みが落ちると、二つのツールはまた呼べなくなり、使うには本文の 2,000 トークンを読み直す。
ツール定義を最初に全部渡すと、ツールが増えるほどトークンと選択精度の二つの問題が出る
最初に全部渡す形は、ツールが増えると二つの問題を起こす。Anthropic の文書は、GitHub・Slack・Sentry・Grafana・Splunk という複数サーバーの構成が、モデルが仕事をする前にツール定義だけで約 55k トークンを使いうると書く1。同じ文書は、tool search がこれを通常 85% 超減らし、1 回の依頼で読み込むのは 3〜5 個のツールだと書く1。もう一つの問題は選択精度である。文書は、Claude が正しいツールを選ぶ力が、使えるツールが 30〜50 個を超えると下がると書く1。
LangChain のブログは、スキルの側から同じ方向を示す。スキルは、名前と説明だけを起動時に入力へ入れ、本文は必要になった時点で読む2。ブログは、スキルの登録簿が数千の規模に育っている現場を挙げる3。MCP(Model Context Protocol。外部サービスのツールをエージェントにつなぐ共通の規格)のサーバーを複数つなぐ構成も、ツール定義の量を同じように増やす。
この方向は、一社の動きではない。Anthropic は tool search と、後述の途中追加のベータを出し、OpenAI は tool_search と defer_loading を出し、LangChain は 2026年10月2日に、スキルを読むとツールが開示される機能の PR #6552 をマージした4。Deep Agents の機能は、途中追加に対応するモデルではその仕組みでツールを足し、provider の tool search とは任意で併用できる4。三者とも、多数のツールでは後から開示する形を用意したが、最初から渡すツールも併せて使える154。
会話の途中でツール定義を足しても、キャッシュ済みの先頭部分が保たれるようになった
後から開示する形の障害は、キャッシュだった。Anthropic の文書は、ツール定義の名前・説明・引数を変えると、ツール・システムプロンプト・メッセージの三つのキャッシュがすべて無効になると書く6。ツールを途中で足すために一覧を書き換えると、そこまでの入力の処理を払い直すことになる。
現在は二つの経路がある。一つ目は、deferred(後から読み込む)の指定である。Anthropic の tool search では、defer_loading: true を付けたツールの定義はシステムプロンプトの先頭部分から外れ、モデルが検索で見つけた時点で、会話の途中に tool_reference ブロックとして入る。文書は、先頭部分が変わらないのでプロンプトキャッシュが保たれると書く1。OpenAI の文書も、tool search は「モデルのキャッシュを保つ」ように設計されており、見つかった新しいツールはコンテキストの末尾に入ると書く5。
二つ目は、ツールの一覧そのものに触れない追加である。Anthropic は、対応するモデルで、ベータヘッダー inline-tools-2026-09-15 を付けると、tools を変えずに、会話の途中のシステムメッセージに tool_addition ブロックを置いてツールを足せると書く6。先頭部分が一致し続けるので、追加したメッセージだけが新しい入力として処理される6。ただし、非 deferred のツールが一つもない tools では、この方法で最初に足すツールが 1 回キャッシュを外す6。
この経路は、ベータのヘッダーを要する新しい機能である。したがって、後から開示する形が安くなるかは、使うモデルと provider の対応に依存する。ベータの終了時期は文書に書かれていない。本稿は、ベータであることを一時的な制約と見込むが、確約はできない。
開示のきっかけには、モデルの検索と、スキルを読んだことがある
本稿が比べる二つのほかに、アプリのコードが tool_addition でツールを足す形もあり、そこでは開示の時点をアプリが決める6。
provider の tool search では、きっかけはモデルの検索である。tool search は、Anthropic と OpenAI がそれぞれの API に載せた機能である。OpenAI の側は Responses API の gpt-5.4 以降のモデルが対象である5。Anthropic では、モデルが正規表現(regex)か BM25 の検索を、ツールの名前・説明・引数名・引数の説明に対して行い、既定で最大 5 個のツールが返る1。Anthropic では、少なくとも一つのツールを非 deferred に残す必要があり、Opus 4.1 以前のモデルは対象外である1。OpenAI では、tool_search を tools に足し、後から読み込む関数に defer_loading: true を付ける。OpenAI の文書は、検索の対象になるものの名前と説明は依頼の最初からモデルに見えると書く。関数を単体で deferred にした場合、後回しになるのは主に引数の形である5。OpenAI の文書は、モデルが主に名前空間と MCP サーバーの単位で検索するよう訓練されていて節約も大きいとして、それらの単位を勧め、一つの名前空間は 10 個未満の関数に収めるとよいと書く5。
この方式の利点は、使う側がスキルを用意しなくても、大きなカタログに使えることである。Anthropic は、10 個以上のツールがあるとき、ツール定義が 10k トークンを超えるとき、複数の MCP サーバーを束ねて 200 個以上になるときに tool search を使うよう書く1。反対に、同じ文書は、ツールが 10 個未満のとき、毎回の依頼ですべてのツールを使うとき、ツール定義の合計が 100 トークン未満のときは、tool search なしの通常のツール呼び出しが向くと書く7。
Deep Agents のスキル連動ツールでは、きっかけはスキルを読むことである。Deep Agents は、LangChain が公開するエージェントのハーネス(モデルを包んで動かす実行基盤)である8。リポジトリは 2025年7月に作られ、GitHub のスターは 30,028 である(2026-10-09 取得)8。スキルの形式を定めた Agent Skills の仕様は、2025年12月に作られたリポジトリで公開され、スターは 25,970 である(同日取得)2。ブログは動機を次のように書く。「これまで、スキルとツールは別々に開示されていた」。ツールの定義は tool search で入力の外に置けたが、ツールをそれを説明するスキルに結びつける仕組みがなく、モデルはスキルを読まずにツールを見つけて呼べ、逆にスキルを読んでもツールを別に検索する必要があった、という3。
使い方は、スキルの SKILL.md の冒頭(frontmatter)で metadata.include_tools にツール名を空白区切りで並べ、そのツールを SkillsMiddleware(モデル呼び出しの前後に処理を挟むミドルウェア)の tools に渡す4。SkillsMiddleware の文書によれば、モデルは read_file で、そのツールを載せたスキルを読んだ後にだけ、そのツールを見る。それまでの呼び出しは未知のツールとして失敗する8。ブログは、これでツールを呼ぶ前にその使い方を読んだことが保証されると書く3。
二つは排他ではない。PR #6552 は、ツールに defer_loading を付けて agent の tools に渡し、ProviderToolSearchMiddleware を入れれば、検索でも見つかり、スキルを読めば検索なしで開示される構成を示す4。本稿は、使い分けをツールの性質で決めるのがよいと考える。手順を読んで使わないと正しく動かないツールには、スキル連動が向く。モデルが探して見つけるべき大きなカタログには、tool search が向く。小さな構成では、全部を最初に渡す形で足りる7。ただし defer_loading と併用すると、検索で見つけたツールはスキルを読まずに呼べるので、読む前の呼び出しを失敗させる性質は失われる。
ツールを呼べるのは、検索型では見つかった後、スキル連動型では読んだ記録が残る間である
Deep Agents の PR は、スキル連動ツールが呼べるのは、そのスキルの読み込みが会話に残っている間だけだと書く。読む前か、コンパクション(長くなった会話を要約などで縮める処理)で読み込みが落ちた後は、標準の無効ツールのエラーになる9。PR はこれを現在の仕様として書く。本稿の推論では、落ちた後にそのツールを使うにはスキルを読み直す必要があり、本文のトークンを再び払う。この性質は、読むことを開示の条件にする設計から出るので、本稿は一時的な制約とは見ない。検索で見つけたツールがコンパクションの後にどう扱われるかは、Anthropic と OpenAI の文書には書かれていない。
Deep Agents が途中追加を使わないモデルでは、スキル連動ツールが従来どおり tools に追記されると PR とブログは書く93。Anthropic の文書ではツール定義の変更はキャッシュ全体を無効にする6ので、その時点でキャッシュは外れる。PR は、Deep Agents がこの経路を使うモデルとして、Claude API の Opus 4.8 以降、Fable、Mythos、Responses API の gpt-5.6 系と gpt-6 系を挙げる9。Anthropic の文書は途中追加の対応モデルに Sonnet 5.5 と Haiku 5.5 も含めるが6、PR の列挙にこの二つは無い。キャッシュが外れるかは、provider の対応と Deep Agents の対応の両方で決まる。
spec の allowed-tools は、これらとは別の欄である。仕様は、事前承認されたツールを空白区切りで書く欄で、実験的であり、対応は実装によって違いうると書く10。この欄はツールの定義を入力に入れる時点を決めず、実行の許可に関わる。欄自体が実験的なので、扱いは今後変わりうる。Deep Agents のリゾルバ(ツール名と実行時の情報を受けてツールを返す関数)は、MCP サーバーのツール群を一つの名前で開示したり、利用者に応じて開示するツールを絞ったりする仕組みで、実行の承認とは別である4。ブログは、利用者が誰かを調べ、許されたツールだけを返す例を示す3。PR は、管理者にだけ delete_issue を返す例を載せる4。
例外として、スキルを読む往復が要らない場合がある。pinned skills は、利用者が指定したスキルをアプリが最初のモデル呼び出しの前に入力へ入れ、束ねたツールも一緒に入る3。ブログは、固定しなければモデルが正しいスキルを読むとは限らないことも、固定する理由に挙げる3。ただし、固定したスキルも会話から落ちれば、束ねたツールは呼べなくなる8。また、本稿は何も実行しておらず、トークン数の削減率や選択精度は各社の文書の記述である。
出典10件
-
Anthropic「Tool search tool」Claude Platform Docs(2026-10-09 取得). https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool — トークン量、選択精度、検索の仕組み、キャッシュ。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
Agent Skills「Specification」(2026-10-09 取得). https://github.com/agentskills/agentskills/blob/main/docs/specification.mdx — 名前と説明だけを起動時に読み、本文と資料は必要時に読む段階的開示。 ↩ ↩2
-
Sydney Runkle「Revamping Skills in Deep Agents」LangChain, 2026-10-07. https://www.langchain.com/blog/revamping-skills-in-deep-agents — ツールをスキルに結びつける動機、開示の仕組み、リゾルバ、pinned skills の説明。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7
-
langchain-ai/deepagents PR #6552, 2026-10-02 マージ. https://github.com/langchain-ai/deepagents/pull/6552 — include_tools の書き方、defer_loading との併用、リゾルバの例。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7
-
OpenAI「Tool search」OpenAI API Docs(2026-10-09 取得). https://developers.openai.com/api/docs/guides/tools-tool-search — defer_loading、キャッシュを保つ設計、gpt-5.4 以降、名前空間の推奨。 ↩ ↩2 ↩3 ↩4 ↩5
-
Anthropic「Prompt caching」Claude Platform Docs(2026-10-09 取得). https://platform.claude.com/docs/en/build-with-claude/prompt-caching — 定義の変更でキャッシュが無効になること、ベータヘッダーでの途中追加。対応モデル: https://platform.claude.com/docs/en/build-with-claude/mid-conversation-system-messages ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7
-
Anthropic「Tool search tool」Claude Platform Docs(2026-10-09 取得). https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool — 通常のツール呼び出しが向く条件(10 個未満など)。 ↩ ↩2
-
langchain-ai/deepagents「SkillsMiddleware」docstring(2026-10-09 取得). https://github.com/langchain-ai/deepagents/blob/main/libs/deepagents/deepagents/middleware/skills.py — スキルを読んだ後にだけツールが見え、読み込みが会話に残る間だけ呼べる。リポジトリの作成時期とスター数: https://github.com/langchain-ai/deepagents ↩ ↩2 ↩3 ↩4
-
langchain-ai/deepagents PR #6552, 2026-10-02 マージ. https://github.com/langchain-ai/deepagents/pull/6552 — 読み込みが落ちると呼べなくなること、未対応モデルの扱い。 ↩ ↩2 ↩3
-
Agent Skills「Specification」(2026-10-09 取得). https://github.com/agentskills/agentskills/blob/main/docs/specification.mdx — allowed-tools は事前承認の欄で、実験的であり、対応は実装によって違う。 ↩
この記事はAIが執筆しています。内容には誤りが含まれる可能性があります。ご注意ください。