你的智能体在排练中表现正常,但在现场演示时却走了另一条路,导致同样的任务失败。
这在舞台上令人尴尬。在生产环境中,这是一个可靠性问题:一次成功的工作流可能在用户再次提出相同请求时失败。对于关键任务,如核对金融交易或检查合同中的义务,这可能导致项目停滞。
大多数基准测试将这种变异性隐藏在平均值之后。在 AppWorld 上,使用 GPT-4.1 的 ReAct 智能体在五轮重复运行中成功率为 77.4%。但它仅在 53.0% 的任务中实现了五次全部成功——存在 24.4 个百分点的一致性差距。
大多数基准测试报告的是第一个数字。我们构建了一种方法来测量第二个数字——并加以改进。
在之前的文章中,我们介绍了 ALTK-Evolve ——一个将智能体自身的过去轨迹转化为可重用指南的系统,这些指南经过自动提炼并在推理时注入。它显著提高了任务成功率,但这些结果同样只关注了平均情况的问题。本文引入了“一致性指南”(consistency guidelines),这是 altk-evolve 中基于我们称为“一致性分析器”的诊断工具构建的一种新指南类型,直接针对这一差距。
TL;DR
准确性掩盖了可靠性问题。在 AppWorld test_normal 上使用 GPT-4.1 的 ReAct 智能体平均成功率为 77.4%,但在五次重复运行中全部成功的任务比例仅为 53.0%——存在 24.4 个百分点的一致性差距。在困难任务上,这一差距甚至达到 30 个百分点。
我们为此构建了一个诊断工具。一致性分析器通过对智能体自身记录的轨迹进行重采样,来寻找容易翻转的决策点——即模型仅差一个 token 采样就会做出不同选择的步骤。它只需要一条轨迹,无需真实标签——它通过单次调用请求 k 个补全结果(默认 k=5)对轨迹中的每个决策点进行重采样,而不是重新运行整个任务。
将这种诊断转化为指南可将差距减半——从 24.4pp 降至 12.0pp(相同任务 Pass⁵ +16.0pp,相似任务 +13.0pp),且平均准确率没有任何损失。
完整的方法论和评估详见 arXiv 上的技术报告。
几乎无人报告的指标
标准的智能体评估报告 Mean@k:将基准测试运行 k 次,计算平均通过率。通常 k=3,有时仅为 1。这是每个排行榜上的数字,也是实践中“77% 准确”的含义。
Mean@k 回答的是“这个智能体平均表现如何?”它并没有回答真实用户关心的问题:如果我再次提出完全相同的问题,它是否依然表现良好?为此你需要 Pass^k:即智能体在所有 k 次运行中都成功的任务比例。
⚠️ Pass^k 不等于 Pass@k。熟悉的 Pass@k 是乐观的——它询问的是 k 次尝试中至少有一次成功,这在可以验证并重试的情况下是正确的提问方式。Pass^k 是其悲观的镜像:每次尝试都必须成功。字母相同,问题相反。Pass^k ≤ Mean@k ≤ Pass@k,始终成立。
由 GPT-4.1 支持的 ReAct 智能体在 Mean@5 上达到 77.4%——确实很强。但 Pass^5 仅为 53.0%。基准测试中近四分之一的任务是智能体有时能解决、有时不能解决的,且运行之间任务没有任何变化。我们将这一差距(Mean@k 减去 Pass^k)称为一致性差距。
这不是一个通过更大模型就能解决的能力问题。它是一个正交的维度:智能体可以同时具备能力且不一致。
为什么智能体会翻转:尖锐决策与平坦决策
每当 LLM 智能体做出某个决定——调用哪个 API、传递什么参数、是否重试——该决定都来自下一个 token 的概率分布。关键在于该分布的形状。尖锐的分布将大部分概率质量集中在单个 token 上:第二名远远落后,因此每次运行都会得出相同的选择。平坦的分布在几个势均力敌的 token 上分散了可比的质量,哪个胜出几乎等同于抛硬币。
形状的分布决定了需要多少噪声才能改变结果。尖锐的分布具有韧性——GPU浮点数非结合性、请求批处理以及其他平台侧效应会轻微扰动数值,但远不足以让明确的赢家易位。平坦的分布则极易受到这种扰动的冲击:在微小扰动下,势均力敌的情况可能会重新排序。而且由于一条轨迹由数十个决策步骤链接而成,每一步微小的翻转概率会累积成整个运行过程出现差异的高概率。这就是24分差距的来源。
这也是为什么该问题在你的解码设置中依然存在的原因。贪婪解码和固定种子都控制着如何将分布转化为词元——它们对分布本身一无所知。在托管端点上,概率在每次运行之间会有轻微变化,因此即使温度为零,对同一模型使用相同的提示,今天可能以这种方式解决势均力敌的局面,明天却以另一种方式解决。
我们的设置:ReAct智能体在温度0.0下运行,因此上述的方差并非来自普通的采样。
诊断,然后修复
这将问题转化为一个搜索过程:在给定轨迹中,哪些步骤是平坦的分布——一旦知道,你该怎么做?
一致性指南出自一个两阶段管道,它接入ALTK-Evolve现有的机制——由一个新的信号源驱动写入内容。
检测——一致性分析器。
给定一条记录的轨迹,分析器通过受控重采样回放每个决策步骤,测量模型输出在该点实际变化的程度。具体来说,这是每个决策步骤额外的一次模型调用,离线执行一次——设置采样参数以同时抽取k个补全(默认k=5)——针对已记录的环境上下文进行回放,而不是新的工具调用、新的环境交互,也不是任务的第二次端到端 rollout。这为每个决策步骤产生一个一致性分数,并写入记分卡,以精确指出哪些决策在下一次运行时面临翻转风险。检测是完全黑盒的——无需logits、无需模型内部信息、无需超出你已有的轨迹追踪之外的任何仪器。
生成——针对性指南。每一个被标记的步骤都成为标准ALTK-Evolve格式的一致性指南候选者,从而嵌入现有的存储和检索管道。这里有一个由GPT-4.1从AppWorld任务“根据我的SimpleNote笔记,我的待办事项清单中完成了多少活动?”的轨迹生成的真实示例:
[指南 1] 在计算笔记内容中的复选框样式标记时,使用基于行锚定的正则表达式匹配,而不是简单的子字符串计数——笔记标题常在图例行中重复该标记符号。
[指南 2] 始终通过检查多个匹配项并在继续之前确认正确的笔记,来验证笔记查询的搜索结果。
这里没有任何特定于任务的琐事。字符串计数错误和未经验证的搜索结果是决策点,它们在许多AppWorld任务中以高不确定性出现。这就是重点:分析器针对的是不稳定性,而非失败——因此它捕捉到智能体这次碰巧做对、但下次很容易出错的步骤。
观看2分钟演示——由于智能体对计数策略的不确定性,该任务的五个并行运行以3-2分裂,然后在将这些指南加入上下文后再次运行:所有五个结果达成一致。
结果:缩小差距而不损失准确性
我们在AppWorld test_normal(168个任务)上进行了评估,使用GPT-4.1上的ReAct智能体,为每个任务从单个基线轨迹生成一致性指南,并在5次全新运行中测试它们。
Mean@5 (%),聚合——与上述Pass^5相同的尺度。
一致性差距缩小了约一半。Aggregate Pass^5 从 53.0% 提升至 69.0%,Mean@5 从 77.4% 提升至 81.0%,使得“看起来有能力”与“可信赖”之间的差距从 24.4 个百分点缩小至 12.0 个百分点。此前不一致的任务中,近三分之一变成了代理在每次运行中都能通过的任务。
中等和困难层级的提升最为显著。Medium 层级提升 22.9 个百分点(相对提升 44%),Hard 层级提升 14.3 个百分点(相对提升 45%)——在相对意义上两者持平,Medium 层级在绝对数值上略高。Easy 层级仅提升 12.2 个百分点,因为其原本的提升空间最小。这正是一致性指南发挥其设计初衷的作用:找到并稳定那些代理自身的不确定性泄露到结果中的具体决策点。
Mean@5 从未下降。保持平均准确率是一项硬性要求,而非锦上添花:如果一个系统通过牺牲 Mean@5 来提升 Pass^5,那只是在转移不可靠性,而非解决它。在各个难度层级上,平均准确率均保持不变或有所提升。
这些指南具有泛化能力——它们并非仅针对单一轨迹进行修补。
在 AppWorld 场景中应用于另一个相关但不同的任务时(即从其中挖掘出这些指南的场景的另一种变体),一致性指南仍将 Pass^5 提升了 13.0 个百分点,仅比同一任务的提升数值低 3 个百分点。从一次运行中得出的指南不仅仅是在修补该次运行;它捕捉到的是具有可迁移性的内容。
更具说服力的证据来自较弱的模型 gpt-oss-120b。在同一任务中,Pass^5 从较低的基础水平(10.1% → 16.1%)提升了 6.0 个百分点——有趣的是,跨任务的泛化数值(+8.7 个百分点)实际上超过了同一任务的提升幅度,这表明这些指南捕捉到的是真正可复用的失败模式,而非记忆了单一轨迹的具体细节。
如果你正在部署代理
请在 Mean@k 旁边报告 Pass^k。平均值无法区分可靠的代理和侥幸成功的代理;即使 k=3 也能揭示出你未曾察觉的差距。
预期随着难度增加,差距会扩大。你最难的层级是单一平均数值最具误导性的地方。
不要首先寻求更大的模型。一致性独立于能力之外。更强的模型会提升 Mean@k;它并不一定会缩小一致性差距。
诊断不需要评分器,也不需要实时回放。每个决策步骤额外调用一次 LLM(默认采样 k=5 个完成结果)就足够了——无需真实标签,也无需针对环境重新运行任务。这使得它在生产流量中变得可用,而在生产环境中,你往往甚至无法完整重放一次任务。
试一试
尝试 ALTK-Evolve——该开源仓库现已包含在这些实验中使用的 Consistency Analyzer 和一致性指南生成工具——或阅读 arXiv 上的技术报告以获取完整的方法论。
如果你对自己无法在自己的任务中复现的准确率数字感到熟悉,我们很想听听你的反馈——你自己代理中频繁出现波动行为的具体例子,正是塑造我们下一步开发方向的那种反馈。请提交 issue 或参与讨论。
附录:理解指标
Mean@k。运行任务 k 次,报告平均通过率——大多数基准测试所称的“准确率”。
Pass^k。代理在 k 次独立运行中全部成功的任务比例。始终 ≤ Mean@k。如果用户两次运行相同的查询,所体验到的结果。
Pass@k。k 次运行中至少有一次成功——这是乐观的对应指标,常见于代码生成论文中。
一致性差距。Mean@k − Pass^k,以百分点为单位。
相关工件/参考文献