跳到主要内容

大多数 Agent 路由器跳过的意图分类层

· 阅读需 12 分钟
Tian Pan
Software Engineer

当你给 Agent 一份 50 个工具的列表,让 LLM 自行决定调用哪个时,准确率大约在 94% 左右。还算合理,可以上线。但当这份列表增长到 200 个工具——这比任何人预期的都要快——准确率就会跌至 64%。到 417 个工具时,命中率只剩 20%。到 741 个工具时,更是跌落至 13.6%,与随机猜测在统计上没有区别。

解决方案是一种大多数团队跳过的模式:在工具分发之前运行意图分类层。不是取代 LLM,而是在它之前。分类器缩小工具命名空间,让 LLM 只看到与用户实际意图相关的工具。LLM 的推理能力保持完整,只是在一个经过筛选的相关子集上工作,而不是在一个不断膨胀的大海捞针中。

本文解释为什么团队会跳过这一步、跳过后代价几何,以及如何正确构建这个层——包括让其随时间持续优化的反馈循环。

为何没人在"流血"之前添加这一层

工具分发阻力最小的路径是函数调用:给 LLM 所有工具 Schema,让它自己挑。OpenAI、Anthropic 和 Google 都原生支持这一方式,无需任何架构设计。在五到十个工具的原型阶段,效果很好,于是就上线了。

问题在于工具集会不断增长。一个最初只处理账单的 Agent,随后获得了日历排期功能,再是人力资源查询,再是技术支持工作流。当你有 50 个工具时,已经感受到摩擦;到 100 个时,问题已经很严重;到 200 个时,你已经处于危机模式。但此时架构决策早已固化。

反对先分类还有一个哲学层面的论点:LLM 函数调用很灵活。它能处理模糊查询、多步骤意图以及新颖组合,无需预定义分类体系。意图分类器要求你预先枚举类别,这感觉像是一种约束。这一论点在小规模下是成立的,但在大规模下站不住脚。

性能退化的结构性原因是研究人员所称的"上下文腐烂"(context rot)。Transformer 注意力机制与上下文长度呈二次方关系扩展。在 100K token 时,模型需要管理一百亿个两两关系。当 400 个工具 Schema 占据上下文中 80K token 时,列表中间的工具实际上变得不可见。对 18 个前沿模型的研究发现,每一个模型都会随输入长度增长而性能退化——位于上下文中点(50% 位置)的工具被准确选中的概率显著低于位于两端的工具,即便正确工具确实存在于上下文中。

"迷失在中间"效应不是模型的 bug,而是物理约束。你无法通过更精妙的提示词或升级模型版本来解决它。解决方法是:从一开始就不加载无关工具。

跳过分类的 Token 经济学代价

10 个工具、每个 500 token,每次请求加载 5,000 token 的开销,尚在可接受范围。

到 741 个工具时,在包含用户实际消息之前,每次请求的开销已达 127,315 token。有了将工具精确筛选到相关子集的分类层,这个数字降至 1,084 token——减少了 117 倍。按典型前沿模型定价,每月 100 万次请求,差价约为每年 379 万美元的 API 成本。

成本倍增器不只是 token 数量。Agent 会话会跨轮次累积上下文。你在第 1 轮包含的每一个 token,都会在随后的每一轮中被重新包含——在一个 30 轮对话中,等效于将其成本乘以 30。第 1 轮在无关工具 Schema 上浪费 1,000 token,整个会话就会多耗费 30,000 token。

错误的命名空间路由还会进一步放大这个问题。当一个账单查询被路由到充满日历和人力资源工具的上下文时,LLM 要么选错工具,要么返回"我无法帮助处理此事"——尽管它完全有能力——因为相关工具根本不可见。随后的重试循环又消耗额外的 token 和延迟。在 Agent 工作流中,单次错误路由可能级联扩展为五六次 API 往返才能恢复。

团队通常以惨痛方式发现这一点:一个用几个工具运转良好、花费 50 美元的概念验证,一旦用户量上来、工具集扩大,就变成每月 250 万美元的生产账单。经济学不是线性变化的,而是在越过某些工具数量阈值时出现悬崖式跳变。

三种分类方案及其适用场景

正确的分类方案取决于工具数量、流量规模以及意图分类体系的定义程度。

基于嵌入的路由是最快的选项。查询嵌入通过余弦相似度与每个意图类别的预编码示例话语进行比对。延迟在 16–100ms 之间。在有据可查的生产部署中,这种方案将端到端路由延迟从 5,000ms 降至 100ms,经迭代示例精化后达到 92–96% 的精确率。与基于 LLM 的分类每 10,000 次查询约 0.65 美元相比,其成本不到一分钱——大约便宜 65 倍。局限性在于:嵌入路由器对分布外查询和需要组合推理的意图处理能力较弱。当意图集固定且定义明确时,效果最佳。

微调小模型(SetFit、DistilBERT、ModernBERT)增加了训练开销,但在细微意图识别上精度更高。SetFit 的推理速度比前沿 LLM 快 56 倍,F1 分数与最佳 LLM 相差 8–10%,而成本只是其极小一部分。SetFit 模型可以在普通硬件上用 8 个标注样本在 30 秒内完成训练。IBM Research 为 vLLM 开发的语义路由器使用 ModernBERT 作为意图分类器,在 MMLU-Pro 上实现了 10.24 个百分点的准确率提升,同时延迟降低 47.1%。Google 研究团队的成果表明,两阶段方案——小模型汇总每次交互,再由微调小模型提取意图——可以匹配 Gemini Pro 的准确率,同时实现设备端的隐私保护分类。

基于 LLM 的分类是准确率最高但成本也最高的选项。使用主模型(或更便宜的小模型)作为专用分类器,会在工具分发前增加一次完整的模型调用。对于真正模糊、需要推理的意图,这是正确选择,但在规模化后,与基于嵌入的方案相比,延迟和成本都会翻倍。实际使用场景是作为分类级联底部的兜底层。

级联模式汇集了三者的优点:

  1. 关键词过滤(亚毫秒级)——处理高频、无歧义意图
  2. 嵌入路由器(16–100ms)——覆盖大多数查询
  3. 微调分类器(50–200ms)——处理路由器范围内的模糊情况
  4. LLM 兜底(1–5 秒)——处理级联无法自信分类的新颖或组合意图

升级级联层级的阈值是分类器置信度:预测置信度高于 0.8 则自动路由;0.5 到 0.8 之间则路由但标记待审;低于 0.5 则升级至下一层或人工介入。使用这种模式的混合实现,在分布内数据上可达到接近原生 LLM 准确率的 2% 以内,延迟减少约 50%。

实用经验法则:工具少于 15 个,LLM 函数调用完全够用;15–50 个工具,加一个嵌入路由器;超过 50 个工具,需要微调分类器;超过 100 个工具,分类层不可省略。

分类器究竟在把控什么

一个常见误解是分类器取代了 LLM 的推理能力。事实并非如此。分类器回答的是一个更窄的问题:哪个工具命名空间与此查询相关?LLM 随后仍然负责所有组合推理、参数提取和多步骤执行——只是在一个经过筛选的相关工具子集上进行。

加载中…
References:Let's stay in touch and Follow me for more thoughts and updates