Agent 工具箱越大越难选?Tracer 砍掉八成工具 schema,选得反而更准

0 阅读1分钟

💡 一句话总结:微软这篇论文把 agent 的工具检索从「每步当独立搜索」改成「看已发生的调用猜下一步」——历史成功轨迹建成 trie,每条转移记着「当时在办什么事」,逐状态学习两者权重。结果:128 个工具只亮 55 个,选择准确率不降反升(57.2%→61.9%),每步 token 省 80%;free-running 下以 61% 更少 token 追平全注册表任务成功率。

导语:你的工具表,正在悄悄吃掉你的账单

先问一个可能戳到你的问题:你上次给 agent 加第 50 个工具的时候,有没有看一眼那一步的 prompt 有多大?

做过 MCP(Model Context Protocol,让模型按需调用外部工具的协议)接入的人都懂这个痛:工具注册表从十几个长到上百个,每一步都要把全部工具 schema 塞进上下文——token 成本线性上涨不说,模型在几百个工具描述里「查阅资料」的准确率还会不升反降,长上下文里「迷失中部」的老毛病在工具表上原样重演。

于是大家开始做「按需加载」:Anthropic 上了 Tool Search Tool,各家 RAG-MCP 方案用向量检索按请求挑工具。思路都对,但有个共同的盲区——它们把每一步都当成一次独立的搜索,只用「用户这句话和工具描述像不像」来打分。

这篇微软的论文(一作 Tanish Kher,UC Berkeley,工作完成于微软实习期间)指出了这个盲区:工具调用根本不是独立搜索,而是序列决策。零售客服 agent 处理「把订单 W4821 的发票发我,物品分地址寄」,逻辑顺序天然是:找到用户 → 拉订单 → 拆分发货。已发出的调用早就把下一步的范围圈死了——这个信息,描述检索完全没用上。

想自己动手?

这篇论文到底想解决什么问题?

把场景说得更具体一点。你的 agent 注册表里有 split_order_shipment(拆分发货)和 get_order_details(查订单详情)——后者的描述写得很宽泛,「看起来」也能覆盖前者的一部分场景。全量塞给模型会怎样?论文实测:当金标是那五个精确的订单管理工具之一时,模型有 36.4% 的概率抓起万能伞 get_order_details 凑合——描述本身区分不开,模型只能按「哪个看起来都行」来选。

这就是「独立搜索」范式的天花板:每个工具的表示在检索前就固定死了,它既分不开几个语义相近的候选,也表达不了「同一个工具在不同节点干不同的事」。

论文的研究问题一句话就能说清:给定本轮已发出的调用序列,能不能用历史成功轨迹,选出远小于全表的一小撮候选,既包含模型下一步真正该调的工具,又把 token 账单砍下来? 注意这是双目标——光省 token 容易(少给几个就是了),难的是省的同时准确率不塌,最好还涨。

它的思路是什么?

Tracer 的全名是 Trie Retrieval Across Contextual Edges, Reweighted——名字里三个词正好对应三个组件。整体流程是:离线把历史成功轨迹建成一棵前缀 trie(前缀树,把出现过的调用序列按前缀合并存储);在线时,agent 本轮的前缀落在某个节点上,系统给这个节点的子工具打分排序,只把 top-k 交给模型。最终选哪个工具,始终是模型自己决定——Tracer 只裁剪候选名单。

第一件套是全前缀条件化。trie 的节点是「本轮已做的调用序列」,每个节点的子节点就是历史上紧跟其后出现过的工具。为什么强调「全前缀」而不是最近一两次调用?因为同一工具在不同上下文里的后继完全不同——get_order_details 之后可能是拆分发货,也可能是加赠言,只有看全路径才分得开。

第二件套是转移级边记忆,这是全文最巧的一笔。每条边上除了「历史上走这条路的频率」,还存着当时那些对话的嵌入(把对话向量化后的平均值)。打个比方:工具描述是「岗位说明书」,边记忆是「这条路上前人办公时的谈话记录」。两个工具描述写得再像,历史上跟着这个前缀出现的对话只有一种——靠「当时在办什么事」对号入座,描述分不开的候选自然就分开了。

第三件套是逐状态学习的混合权重。历史信号(这步大家通常走哪)和语义信号(这场对话像历史上哪次)哪个更可信?答案随状态变化。Tracer 用一个极轻量的线性头,每步实时预测混合权重 w 和温度 T:大盘学出来 w≈0.02,即语义主导;但对话早期、或者历史先验已经非常自信时,w 会自动抬高。别小看这个设计——消融实验里,把「逐状态学习」换成「全局调一个常数」,主基准准确率直接从 61.9% 掉到 50.5%,比全注册表还低 6.7 分。序列结构是药材,学习混合才是药引子。

还有两个工程上的贴心设计:前缀在 trie 里没见过、或者候选分数分布太平时,置信门整体回退到全局向量检索,域外行为有明确定义;遇到银行那种「KB_search 一个伞状工具包办一半调用」的注册表,Tracer+G 会把按「前缀熵」挑出的三个万能工具常驻候选集。整篇方法没有一个需要训练模型权重的地方——这决定了它能直接挂在现有 agent 框架前面。

效果到底怎么样?

先看主战场:128 个「刻意易混」工具的混合零售+电信环境(论文自建基准,轨迹取自 τ²-bench 公开榜单并经合成扩充),同一预算 top-k=5、同一个 GPT-5.4:

Tracer 与全注册表、向量检索的选择准确率对比(主基准,GPT-5.4,k=5)

图说:向量检索只拿到 27.7%;全注册表 57.2%;Tracer 只亮 55 个候选反而到 61.9%——「给得更少、选得更准」在同一张图里成立。

三个数字值得单独拎出来:

  • +4.7 分,−80% token:选择准确率 57.2%→61.9%,每步注入 token 从 14.2k 降到 2.8k。注册表越大省得越多,全表成本几乎翻倍而 Tracer 成本反而在降。
  • 21/24 全面胜出:六个环境 × 四个模型(GPT-5.4、GPT-5.4-mini、Grok-4、Mistral-Large-3),Tracer 系在 21 个组合上赢过全注册表,平均领先 6~10 分,三个例外(全在银行基准)最多落后 2.2 分。
  • 陷阱率腰斩:模型乱抓万能伞的概率从 36.4% 压到 16.4%——add_gift_message 的正确率从 32% 拉到 77%。有个案例很有说服力:用户要「预付退货标签」,全注册表前端把模型往「发起退货」这个破坏性工具上带,Tracer 在该前缀下直接把它排到第 9 名、根本不进候选。

free-running(模型按自己的选择连续执行整个任务)的结果更贴近真实:GPT-5.4 以每步少 61% 的 token 追平全注册表任务成功率(23% vs 58.3%/58.2%,几乎打平),只暴露 23% 的工具;更弱的 GPT-5.4-mini 受益最大,在最大的注册表上领先 15.2 分——小候选集本身就是弱模型的防分心护栏。

还有个容易忽略的红利:程序性顺序。银行基准里敏感操作必须先 unlock 再执行,全注册表下模型经常跳过解锁直接写、然后失败;trie 里根本不存在绕过解锁的成功轨迹,「顺序即合规」被索引结构天然强制。对做企业 agent 的人来说,这可能比省 token 更值钱。

为什么你要关心?

如果你在做 agent 平台、MCP 网关或者任何带工具调用的产品,这篇论文给了三条可以直接落进设计的启示:

  • 注册表规模与 prompt 预算解耦了。以前「工具多了上下文装不下」是硬约束,现在可以放心接更多内部服务——代价是维护一份带评分的成功轨迹库,而不是训练任何模型。
  • CIC(每步注入的 prompt token)是 serving 成本的主导项,80% 的削减是真金白银。哪怕你不用 Tracer 本身,「轨迹索引 + 描述检索」混合召回、再加一个置信门兜底,也是可以直接抄的工程模式。
  • 检索前端不只是省钱工具,还是安全边界。把破坏性工具挡在候选外、强制先解锁后写入——这类策略用「历史里没这么走过的路就不给」来实现,比在 prompt 里写一百句「请不要乱调」可靠得多。

顺带一提,论文消融里「把边记忆换成静态描述相似度」直接掉 21 分——这说明 agent 记忆这条线的价值不在「存了历史」,而在「历史绑定了具体的执行状态」。这个视角对做 agent 记忆产品的人同样适用。

理性看待

冷静几秒钟:Tracer 的主基准是作者自建、并用合成 API 和合成轨迹扩充的(有盲测人类评审背书,但只有 3 位评审);「追平全注册表」是每设置挑了最优预算的结果,GPT-5.4 在 12 个预算里的 8 个上其实低于全注册表——一次早期选错就可能让后续步骤跌出 trie、吃向量兜底。冷启动也是真问题:没有历史轨迹的新注册表会全面退回普通向量检索。另外所有测试都是客服流程类场景,编码 agent 那种探索型工具调用还没有数据。结论可以先收着:流程越固定、历史越丰富的场景,这招越灵。