TL;DR

Agent 可靠性需要重复运行同一任务,并分别报告平均成功率、至少一次成功与全部成功。先重置环境,再按任务估计指标和不确定性,不能对总体平均值直接做幂运算。失败轨迹用于定位不稳定决策;多次输出相同只代表一致,仍须独立检查正确性与副作用。

一次成功为什么不能代表可靠交付

同一任务从相同状态重复执行,才能看出成功是否稳定。演示通过一次,无法估计下次失败的风险。

2026 年 9 月的 Consistency Gap 研究 在指定 AppWorld 设置上使用 168 个任务、每任务五次运行。论文报告 GPT-4.1 的平均表现约为 77%,五次全部成功的任务比例约为 53%,差距为 24.4 个百分点。这是该 Agent、模型、任务与配置下的结果,不能推广为所有 Agent 的生产成功率。

平均成功率统计每次运行,全部成功率检查每个任务是否出现过失败。自动处理订单时,还要单独统计偶发越权,不能让它被平均分掩盖。

Agent Harness决定工具、重试、上下文和终止。先排除环境、任务和验收器变化,再分析决策波动;降低温度不能解决所有不稳定问题。

三类指标回答三个问题

Trial 指从规定起点到终止的一次完整运行,是否成功由验收器判断。三个指标分别衡量单次表现、多次找出成功候选的能力,以及重复执行的稳定性。

指标 实际问题 适用流程 容易产生的误解
平均成功率 / Mean@k k 次运行的成功比例 单次执行的总体表现 隐藏失败集中在哪些任务
pass@k k 次中至少一次成功 有可靠候选选择机制的多次尝试 当作直接交付成功率
pass^k k 次全部成功 重复执行的一致可靠性 把一致性当作全部质量

τ-bench 的 2024 年论文提出 pass^k,验收涉及最终数据库状态和任务要求。近期研究延续了这条思路。

如果每个任务 i 的成功概率是 p_i,并假设该任务各次 Trial 独立且概率固定,则:

text
Mean = average(p_i)
pass@k = average(1 - (1 - p_i)^k)
pass^k = average(p_i^k)

必须先按任务计算。两个任务的成功概率分别为 1 和 0,平均成功率是 0.5,pass^2 平均仍是 0.5;对总体均值取平方却得到 0.25。

从重复结果计算指标

每任务运行 n 次、成功 c 次,随机选取 k 次,可用组合比例估计至少一次或全部成功。要求 1 ≤ k ≤ n。

text
pass@k estimate = 1 - C(n-c, k) / C(n, k)
pass^k estimate = C(c, k) / C(n, k)

可选元素少于 k 时,组合数为零。这是无放回选择的估计;要推断未来重复运行,仍需独立同分布假设。

下面使用合成数据,全部任务各运行五次:

任务 成功次数 c 平均成功率 pass@2 pass^2
A 5 1.00 1.00 1.00
B 4 0.80 1.00 0.60
C 2 0.40 0.70 0.10
D 0 0.00 0.00 0.00
任务等权平均 — 0.55 0.675 0.425

pass@2 高,仍可能有频繁失败。实际流程还需要选对成功候选;选择器会挑错时,必须把它纳入端到端评测。

各任务重复次数不同时,先算逐任务指标再等权平均。直接汇总所有 Trial 会偏向重复次数多的任务。按业务流量加权时,另报权重来源。

Go 实践:稳定计算组合比例

下面的 Go 1.23 示例通过比例乘积避免直接计算巨大组合数,只依赖标准库。输出对应上面的合成表格,函数会拒绝 n、c 或 k 不合法的输入。

go
package main

import "fmt"

type Metrics struct {
	Mean    float64
	PassAny float64
	PassAll float64
}

func subsetRatio(selected, total, k int) float64 {
	if selected < k {
		return 0
	}
	ratio := 1.0
	for j := 0; j < k; j++ {
		ratio *= float64(selected-j) / float64(total-j)
	}
	return ratio
}

func estimate(n, c, k int) (Metrics, error) {
	if n < 1 || c < 0 || c > n || k < 1 || k > n {
		return Metrics{}, fmt.Errorf("require n>=1, 0<=c<=n, 1<=k<=n")
	}
	return Metrics{
		Mean:    float64(c) / float64(n),
		PassAny: 1 - subsetRatio(n-c, n, k),
		PassAll: subsetRatio(c, n, k),
	}, nil
}

func main() {
	counts := []int{5, 4, 2, 0}
	sum := Metrics{}
	for i, c := range counts {
		m, err := estimate(5, c, 2)
		if err != nil {
			panic(err)
		}
		fmt.Printf("%c mean=%.3f any=%.3f all=%.3f\n",
			'A'+i, m.Mean, m.PassAny, m.PassAll)
		sum.Mean += m.Mean
		sum.PassAny += m.PassAny
		sum.PassAll += m.PassAll
	}
	size := float64(len(counts))
	fmt.Printf("macro mean=%.3f any=%.3f all=%.3f\n",
		sum.Mean/size, sum.PassAny/size, sum.PassAll/size)
	if _, err := estimate(5, 6, 2); err == nil {
		panic("invalid count accepted")
	}
}

运行 go run main.go:

text
A mean=1.000 any=1.000 all=1.000
B mean=0.800 any=1.000 all=0.600
C mean=0.400 any=0.700 all=0.100
D mean=0.000 any=0.000 all=0.000
macro mean=0.550 any=0.675 all=0.425

函数计算指标,不给出置信区间,也不判断 Trial 独立性。很小的概率可能浮点下溢;通常的有限重复规模足够使用,若需要极端尾部概率,应改用对数域并报告精度。

五次全部成功,也不能证明未来必然成功。重复次数由允许的失败风险和估计精度决定。

重复 Trial 必须从相同环境起点开始

每个 Trial 使用隔离的文件、数据库、缓存和操作标识。失败后也要完整清理,否则下次可能复用部分结果。

flowchart LR A[冻结任务和契约] --> B[克隆环境快照] B --> C[分配 Trial 身份] C --> D[执行 Agent] D --> E[独立验收最终状态] E --> F[保存轨迹与成本] F --> G[销毁或重置环境] G --> H[按任务聚合重复指标]

记录模型版本、采样参数、工具版本和可控随机种子。温度为零,仍可能受服务更新和并行工具调度影响。

超时与工具故障应纳入系统成功率,同时另报根因切片。如果想测纯模型决策,可以另建冻结工具响应的实验,但不能把它当作线上系统可靠性。跨会话中断的专项设计见长任务恢复评测。

不确定性建议采用任务级 bootstrap:以任务为单位有放回抽样,每次携带该任务所有 Trial,重算宏平均,再报告预先选定的百分位区间。比较两个系统时,对相同任务一起抽样。这样的区间主要反映任务抽样不确定性;任务内随机性还需要足够重复和适当的分层模型。

从失败轨迹定位不稳定决策

比较Agent 轨迹中的工具、参数、返回结果和终止原因,定位错误在哪一步发生。

对每个任务选取成功与失败 Trial,先对齐语义步骤:解析日期、查询订单、检查权限、输出结果。然后找最早的关键分歧:日期解析不同、缺少权限查询、重试后重复写入,或者在工具报错后提前结束。

最早分歧只能提供线索。不同调用可能等价,相同调用也可能读到不同状态。核对输入与返回结果后,再做干预实验,例如固定日期解析结果,观察失败是否减少。

失败切片 轨迹信号 可验证修复
工具选择不稳定 同条件调用不同接口 明确工具边界并做消融
参数漂移 日期或身份字段不同 结构化校验与错误反馈
提前结束 未完成必要检查就终止 由验收器控制完成标记
重试污染 同业务操作出现多次写入 幂等键与副作用对账

修复后重跑相同任务并独立验收。步骤变短、解释变一致,都不能代替正确性检查。

常见问题

pass@k 很高,可以直接上线吗?

需要实际选择机制和成本预算。如果系统只执行一次,pass@k 无法代表交付能力;如果执行 k 次却不能识别成功候选,也无法实现理想的至少一次成功收益。

应该选多大的 k?

根据重复使用方式选择。日常自动化可报告 k=1、2、5 的曲线,但 n 必须至少达到最大 k。高风险业务还需要单独报告严重错误率,不能用总体 pass^k 掩盖少量越权。

输出完全相同为什么仍可能不可靠?

稳定错误仍然是错误。重复性检查回答行为是否波动,正确性验收回答是否满足任务。二者应并列报告,不能互相替代。

如何比较两个 Harness 的重复可靠性?

使用相同任务、快照与验收器,配对比较逐任务指标,同时报告预算。参见Harness 对照与消融评测,避免把更多尝试误认为架构改进。

参考资料