人和模型的差别只有一条,但它决定了全部设计:人的上下文是廉价的,模型的上下文是稀缺的。所以给人用的 API 追求功能覆盖度,给模型用的工具追求"每个返回 token 携带多少决策价值"。Anthropic 的说法是,在 ACI(Agent-Computer Interface)上投入的精力应当与在 HCI 上投入的一样多。
这条抽象原则落到工程上,就是两笔必须分开记的账。
第一笔:定义体积(definition cost)。 工具的名字、描述、参数 schema,在模型看第一眼之前就已经躺在上下文里了。这是纯成本 token——它不携带任何任务信息,只描述"你能做什么"。全量前置加载大量 MCP server 的工具定义可达约 150,000 token;Claude Code 的默认策略是延迟加载,启动时只列工具名,约 120 token,用到时才通过 tool search 拉具体 schema。环境变量 ENABLE_TOOL_SEARCH=auto 的语义是:只有当完整 schema 能塞进上下文窗口 10% 以内时才预加载,否则走检索。
这给了一个可以立刻执行的诊断阈值:先算你的工具定义占了窗口的百分之几。如果已经是两位数,后面观察到的一切退化——选错工具、反复调用、干脆不用工具——都先归因到这里,不要急着调 prompt。
第二笔:往返体积(round-trip cost)。 工具返回的每一个 token、以及模型为了串联两个工具而必须把前一个结果原样贴回去的每一个 token。这笔账和定义体积完全独立:一场 2 小时销售会议的转录如果必须在两次工具调用之间穿过模型上下文,会额外消耗约 50,000 token;让代码在沙箱里直接把结果从 A 传给 B,这笔钱就省掉了。
两笔账独立到什么程度?看两个可验证的推论:
- 一个鉴权完善、传输合规、协议版本最新的远程 MCP server,只要客户端仍然全量前置加载 schema,照样撞 150k。传输层做对,不构成上下文层的任何保证。
- 反过来,即使开了即时检索(启动只列工具名 120 token),如果工具是镜像 API 的一堆碎片(
list_users + list_events + create_event),省下的只是定义 token;调用轮次里往返的中间结果照样过窗口。上面那 50,000 token 的转录,正是"即时检索开了但工具没合并"的典型账单形态。
第三个可用的对照来自subagent-context-isolation:Claude Code 文档里的会话示例中,子代理为了回答一个研究问题读了 6,100 token 的文件,回到主窗口的结果只有 420 token,约 14.5:1。这说明往返体积不是不可压的——它可以被移出主窗口,代价是一次完整的委派往返。子代理通常返回 1,000–2,000 token 的凝练摘要,这个区间可以直接当作"一次外包该收回多少"的预算基线。
所以工具接口的成本优化必须同时在定义体积和往返体积两个维度做。 相应地,验收指标也不能只有一个:Anthropic 建议收集的是单次工具调用与整任务的总耗时、工具调用总次数、总 token 消耗、工具报错数。只看成功率会完整地掩盖"答对了但烧了 3 倍 token"这类退化——而这恰恰是把 API 直接包成工具最典型的结局。