大多数 Agent 路由器跳过的意图分类层
当你给 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,而是物理约束。你无法通过更精妙的提示词或升级模型版本来解决它。解决方法是:从一开始就不加载无关工具。
