我给自己的 Claude Code 装了大约 50 个技能。按直觉,技能越多,智能体应该越强。但一项研究给出的结论正好相反:超过三十个左右,每多加一个能力,往往不是提升,而是拖累。更反直觉的是,问题不在你以为的地方——不是上下文被撑爆,而是路由崩了。
把智能体淹在技能库里,会发生什么
一项名为《More Skills, Worse Agents?》的研究把实验做得很干净:先给智能体一组对任务真正有用的技能,再把它淹没在越来越大的技能库里,然后测通过率。结果是单调下降,而且幅度不小。装备良好的智能体,和被 202 个技能淹没的同一个智能体相比,平均通过率差了 21 个百分点,这是跨两个模型取的平均值。知识没变,必需的工具还在,变的只有噪音。
还有一个更糟的信号:智能体完全不调用任何技能、纯靠手写完成工作的比例,从有用技能集下的 12%,涨到了 202 个技能下的 38.5%。它不是挑错了技能,而是干脆放弃去找了。
多一个技能,是怎么把智能体拖垮的
研究拆出了三条路径,权重完全不同。第一条是上下文开销:每个技能都会把名字和描述塞进启动提示词,200 个技能确实是实打实的体量,提示词变长会拖累推理。但影响小,大约只占降幅的三分之一,而且在统计上和零没有区别。它是那个最显眼的嫌疑人,也是错的嫌疑人。
第二条是遮蔽效应,真正的元凶。当两个技能的描述相似时,错误的那一个可能“盖住”正确的那一个,只因为它的描述恰好和查询匹配得稍微好一点。智能体选得很有信心,但选错了。这个效应占降幅的 68%,也是唯一统计显著的因素。关键在于,它随技能库规模线性增长——你加的相似技能越多,制造出错的机会就越多。
第三条是放弃调用,遮蔽的终局。智能体无法决断,干脆什么都不选,徒手干活。202 个技能时,三分之一的运行都是这样。它最阴险的地方在于不可见:在日志里,“未调用技能”看起来像是没有相关技能,而不像一次路由失败。
路由器只看到了 8% 的信号
为什么路由会错得这么离谱?因为决策建立在错误的信息上。Claude Code 分三层加载技能,这套机制叫渐进式披露。路由器只看得到第一层——名字和描述——来决定加载哪个技能。但 SkillRouter 那篇论文通过交叉编码器的注意力分析测出,91.7% 的路由信号藏在技能正文里,也就是第二层内容。名字和描述,恰恰是决策所依赖的东西,只承载了信号的一小部分。
消融实验给出了证明:去掉正文,路由质量会掉 29 到 44 分,取决于方法。把正文蒸馏成更好的描述能找回一部分信号,但永远找不回全部。你是在让路由器用 8% 的相关信息,从 200 个候选里做选择。遮蔽不是 bug,是这套设计的数学必然。同一篇论文还显示,一条读取完整正文的“检索加重排”流水线,在约 8 万个技能的库上做到了 74% 的 Hit@1,用的模型比朴素方案小 13 倍。信号一直都在,只是你得去看它。
Claude Code 的静默截断
还有第二个陷阱,是 Claude Code 特有的。技能描述要过一个字符预算,标定在上下文窗口的 1% 左右。预算一溢出,Claude Code 就截断。后果相当难缠:截断砍掉的是描述的结尾,而触发关键词往往就住在那里——一个原本能匹配“开一个合并请求”的技能,如果句子在它之前被切断,就什么都匹配不上了。被调用最少的技能最先被截断,你的冷门技能变得不可达,于是变得更冷门。装第 N+1 个技能,可能弄坏第 N 个技能的路由:第 N 个技能什么都没变,但它在共享预算里失去了空间。
换句话说,每加一个技能,对其他技能都不是中性的。你付出的不只是上下文开销,还在重新分配一份有限预算,让描述们争夺同一片空间。一项公开研究还指出,26.4% 的公开技能根本没有可用的路由描述,这从一开始就注定了遮蔽。
规模化运营者在做什么
行业的答案正在收敛:不要再一次性暴露所有东西,而要智能地路由。GitHub 记录过,缩减默认工具集后,SWE-bench 和 SWE-Lancer 在 GPT-5 和 Sonnet 4.5 上都得到了改善。他们的结论一句话就能说完:给智能体更多工具,不会让它更聪明,只会让它更慢。Anthropic 也走同一条路,用 Tool Search Tool:不再把 200 个工具定义全塞进上下文,而是让 Claude 按需取用相关的那一个。这和我写过的 MCP RTK 代理是同一个原则——不要为你用不到的东西付出 token 和混乱的代价。
具体对策
在实践中,我的 Claude Code 配置里,三个动作的投入产出比最高。第一,审计描述:检查有没有关键技能的描述被截断,触发关键词是否放在开头而不是结尾。一条以触发词开头的描述,才能在截断中活下来。第二,合并触发条件接近的技能:我曾按项目给 qa-swarm 建了多个变体,每个仓库一个,描述几乎一模一样。这是教科书式的遮蔽案例——四个技能争夺同一个查询。把它们合并成一个参数化技能,就消除了四次误路由的机会。这也正是我在关于有效技能的文章里说过的:描述必须说明何时触发,而不只是这个技能做什么。第三,测量,而不是猜。
热门跟贴