本节摘要:常驻层的另一半是工具 schema——模型每轮都要逐字读的"API 文档",却是最常被漏算的上下文:它由 API 自动注入,不出现在你拼的 prompt 字符串里,于是预算表忘了它、优化也轮不到它。本节先算清成本:单个 schema 约 100500 token,1540 个工具的常驻税可达 2k~10k token(示意),与系统提示同量级。再讲更关键的权衡:工具越多,选择越差——Anthropic 的建议是保持"能完成任务的最小工具集"(官方);机制上,每个工具描述都在稀释其他工具的注意力,语义重叠的工具会互相诱骗。然后给工具描述的三层写法(是什么 / 何时用 / 何时别用)与参数、返回值、错误码的描述要点。最后是节税三招——精简合并、分阶段注入(工具路由)、子 Agent 隔离——附
ce_tools.py成本核算示意,把工具集的常驻税变成账本上一行可审计的数字。
阅读完本节,你应当能够:
一个测试:你的应用里,进入模型窗口的 token 都来自哪里?多数人的答案是"系统提示 + 用户消息 + 历史 + 检索"。漏了一项——工具 schema。只要请求带了 tools 参数,全部工具的名称、描述、参数说明就每轮自动注入,位置在系统提示附近,模型逐字读取。
它满足指令成分的三问(1.2 节):开发者产生、每轮常驻、设计期裁剪——所以它是常驻税,而且是最隐蔽的一笔。量级(示意):
| 工具集规模 | 常驻税估算(示意) | 相当于 |
|---|---|---|
| 5 个精简工具 | 0.5k~1.5k token | 一条长系统提示 |
| 15 个工具(本章客服案例) | 2k~5k token | 一段完整的退款政策 |
| 40 个工具(三年只增不减的平台) | 6k~10k+ token | 40 轮会话的历史 |
# ce_tools.py —— 工具集常驻税核算(写法示意,以官方文档为准) import json def est_tokens(text: str) -> int: # 与 ce_budget.py 同口径 cn = sum(1 for ch in text if "\u4e00" <= ch <= "\u9fff") return cn + (len(text) - cn) // 4 def tool_tax(tools: list[dict], window: int = 128_000) -> dict: """tools 为 function calling 风格的 schema 列表。返回常驻税与占比。""" cost = est_tokens(json.dumps(tools, ensure_ascii=False, indent=2)) return {"tools": len(tools), "tokens": cost, "share_pct": round(100 * cost / window, 1)} # 示例输出(示意):15 个工具 → 3.1k token,占 128k 窗口的 2.4%
成本之外有第二重代价:选择质量随工具数下降。Anthropic 在其上下文工程长文中的建议是保持"能完成任务的最小工具集"——加载更多工具不是增强能力,而是降低可靠性(官方)。机制有二:
search_orders、query_order、find_recent_orders 三个名字摆在一起,模型在错误的那个上纠结;参数相近时还会编造混搭的参数。三个失效信号(见到先查工具集规模,再查 prompt):
⚠️ "把 40 个工具都给它,让它自己选"是把路由问题甩给模型——模型会诚实地替你承受选择负担。工具集的裁剪是开发者的职责,不是模型的。
工具描述是写给模型读的 API 文档,分三层,一层比一层值钱:
| 层次 | 写什么 | 例(get_policy) |
|---|---|---|
| 是什么 | 一句话说清功能与输入输出 | "按关键词查退款政策条款,返回条文原文与编号" |
| 何时用 | 触发条件与在流程中的位置 | "回答任何政策问题前必查;先于 create_refund 调用" |
| 何时别用 | 与相近工具的边界 | "查物流时效用 get_logistics;本工具只管退款政策" |
第三层最值钱也最常缺——它直接对冲第二节的"语义重叠诱骗"。参数与返回值的要点:参数说明里给格式与示例("日期格式 YYYY-MM-DD"胜过"传日期");返回结构说清字段含义(模型要基于它生成答案);错误码必须描述("404 表示订单不存在,应向用户核对单号而不是重试")——错误描述写得好,模型能自纠错;写得差,它只会原地重试。
工具集真的需要 40 个怎么办?三招按侵入性排序:
💡 三招不互斥,常见的成熟组合是"先精简合并打地基,再对高频重活用子 Agent 隔离,中间态场景按阶段切工具集"。选择依据回到 2.1 节的预算表:先算清每个方案省下的常驻税与付出的新增成本(子 Agent 的一轮调用、路由的一次判断),再动手。
ce_tools.py 的输出加进预算分配表,工具集变更如同系统提示变更一样走评审。至此常驻层(指令 + 工具)完全定型——开发者写下的每一个字都过了审计。从下一章起进入动态层:先看记忆——那个系统在运行中自己长出来、必须在运行中自己管住的成分(第 4 章)。