评估结果的统计显著性:置信区间、配对检验与模型排名(Statistical Significance of Eval Results)
所属:01-fundamentals / 05-agent-evaluation
面试权重:★★★
来源:《深入理解 AI Agent:设计原理与工程实践》第 7 章(李博杰,github.com/bojieli/ai-agent-book);非一手实测
相关知识点:agent-eval.md、benchmarks.md、llm-as-judge.md、02-interview/design/04-llm-evaluation.md
为什么有这个文件:本仓库其余的评测文件反复说「要报置信区间」「几分的差距落在噪声内」「配对比较更敏感」(agent-eval.md§评测自身的成本与噪声、benchmarks.md§统计与报告规范、llm-as-judge.md自测 2、02-interview/design/04-llm-evaluation.md§4.7),但没有一处给出公式、样本量口径和检验方法。本文件就是补上这个方法的:它把「置信区间」从一个说法变成一个能当场算出来的数字,把「配对」从一句形容词变成 McNemar / paired bootstrap 的可复述流程。本文件是方法/知识,不是实战经验(见01-llm-core/multimodal.md顶部那条硬规矩)。
一句话#
评估集是有限的、模型输出又是随机的,所以「A 比 B 高 3 个点」默认是噪声,不是结论:单看一个成功率时,误差按 估算(100 题 70% 的成功率,95% 区间约 ±9 个百分点);比较两个配置时必须用配对分析(McNemar 或 paired bootstrap,以「题」为单位而不是两个独立均值相减),因为同一批题的难度差异在配对时被消掉,灵敏度高得多;只有「分差超过噪声 + 配对成立 + 可复现」三条同时满足,才配得上「切换模型 / 发布改动」这个动作。
为什么重要(面试角度)#
- 它是评测题的「第二问」。面试官听到「我在 100 条评测集上把成功率从 70% 刷到 73%」,下一句几乎必然是「这 3 个点是真的吗?」——答不出公式和配对检验,前面讲的评测体系会被一句话打回原形。
- 它把「严谨」变得可验证。说「要报置信区间」谁都会;能写出 、能算出 70%±9、能说出「要减半误差得把样本翻两番」,才证明你真的会用这套统计。
- 它直接对应线上决策:要不要换模型、要不要上灰度、要不要回滚——这些都是「差异是否超出噪声带宽」的问题。第 7 章里那个模型切换案例(Gemini 在复杂编排场景成功率反降 5%)之所以能转成「简单任务迁移、复杂任务保留」的差异化策略,前提正是先确认了这 5% 超出噪声。
- 它是唯一能同时串联四份文件的知识点:
llm-as-judge.md讲了位置偏置却没讲 Elo 与 76% 这个数、agent-eval.md讲了 pass^k 却没讲它和 pass@k 的公式关系、benchmarks.md讲了「给不确定性」却没讲怎么给、设计题04-llm-evaluation.md讲了「几十条只能分辨十几个点」却没讲这句怎么来的。
核心内容#
1. 标准误与置信区间:先给误差一个数字#
在 个用例上测得成功率 ,标准误(Standard Error)粗略估计为:
核心算例(背下来):100 个用例、成功率 70% 时,
所以「新模型 73% 对旧模型 70%」不足以支持切换 —— 那个 3 个点被埋在 ±9 个点的区间里,两个模型在统计上不可区分。(注意:这是两个独立比例相减的粗口径;若两模型跑的是同一批题,正确的做法是下面的配对分析,它给出的区间会窄得多。)
为什么 在根号里:误差按 缩小,所以
- 要把误差减半,样本量得乘 4(100 题 → 400 题);
- 要把误差降到 1/3,样本量得乘 9。
这解释了两个常见误判:「多加几十条样本就能看出 2 个点的差异」是错的(几十条的区间宽达十几个点);而「评测集已经几百条了,怎么还测不出小差异」也是对的——几百条对 2% 级别的差异本就无能为力。
小样本的口径(面试常用):把 代进去算,几十条样本只能分辨十几个百分点量级的差异。例如 、:,95% 区间约 ±12.7 个点;:区间约 ±16.4 个点。这正是 02-interview/design/04-llm-evaluation.md §4.7 那句「几十条样本只能分辨很大的差异(十几个百分点量级)」的来源。若预期收益只有 2–3 个百分点,而评测集只有几十题,正确的动作是先扩大样本,不是先下结论。
2. 配对分析:比独立比较灵敏得多#
同一批任务比较两个模型,必须做配对分析,而不是两个独立成功率相减。
| 方法 | 用到的信息 | 前提 |
|---|---|---|
| 两个独立成功率相减 | 每题只贡献给各自的总分 | 两批样本相互独立 |
| McNemar 检验 | 只看两个模型结论不一致的那些题 | 两模型跑同一批题 |
| paired bootstrap | 对「同一道题上的成对结果」有放回重采样 | 两模型跑同一批题 + 可复现的随机条件 |
为什么配对更灵敏:同一批题里,有的题很难(两个模型都错)、有的题很简单(两个模型都对)—— 这些难度差异在配对时被消掉了:McNemar 只统计「A 对 B 错」和「A 错 B 对」这两类分歧题,一致的那些题根本不进入检验。独立比较则把难度方差当作噪声一起算进分母,所以要有同样多的样本才能看出同样的差异。同一个 3 个点的差距,配对检验可能显著,独立检验可能落在噪声里,差别就在这里。
McNemar 的口径:把结果排成一张 2×2 表,只关心两个非对角格:
| B 做对 | B 做错 | |
|---|---|---|
| A 做对 | 都对(不提供信息) | :A 对 B 错 |
| A 做错 | :A 错 B 对 | 都错(不提供信息) |
原假设是「两者在分歧题上对称」,即 。检验统计量近似为 (连续性校正), 小时用精确二项检验。只用到 道分歧题——这就是它灵敏的原因,也是它的代价:一致题再多也不增加检验的功效。
paired bootstrap 的可复述步骤(不需要真代码):
- 以「题」为单位(不是以「单次运行」为单位),从 道题里有放回抽 道,得到一个 bootstrap 样本 —— 同一道题可能被抽中多次,也可能一次都没抽中;
- 在这个样本上分别算 、 的成功率,取差值 ;
- 重复 次(通常 1000–10000 次),得到 的一串取值,即差值的经验分布;
- 看这个分布:取它的 2.5% 与 97.5% 分位,就是差值的 95% 置信区间。整个区间落在 0 的同一侧(不含 0)→ 差异显著;跨过 0 → 差异与噪声不可区分;
- 也可以直接用「 的比例」作为 值的近似。
关键:重采样的单位是题,而每一道题都是「A 在这次、B 在这次」的成对记录 —— 这样难度差异才会在每次重采样里同步抵消。这就是「配对」二字在 bootstrap 里的实现。
配对的含义是让两组共享任务与随机条件(同一批题、同一组固定种子),而不是分别抽两批样本再比平均值。第 7 章给的最小伪代码正是这个口径:
for task in paired_tasks:
for seed in fixed_seeds:
a = run(config_a, task, seed)
b = run(config_b, task, seed)
record_paired_delta(verifier(a), verifier(b))
return paired_bootstrap_or_mcnemar(all_deltas)3. 三条必须一起讲的纪律#
每个配置跑 3–5 个随机种子,报均值和波动范围。 Agent 每次运行都可能不同,单次跑分的差常常只是种子噪声——单次运行只能用来筛选方向,不能用来下结论。第 7 章 AndroidWorld 那个调优案例里,三轮实验始终固定模型、任务参数、随机种子、步数上限和模拟器,并且交替安排两组的运行顺序,就是为了让每轮的差异只来自那个被改动的变量。
多重比较:并行验证很多假设时要收紧阈值,或对正向结果做独立复跑。 同时比较十几个配置、试十几个提示词,即使每个都没效果,试够多次也总能碰上一个「看起来显著」的(这就是 值的定义:单次假阳性率 5%,试 20 次至少命中一次的期望不低)。缓解办法是收紧显著性阈值(如按假设数做 Bonferroni 式校正,阈值除以假设数),或者只用第一轮结果生成假设、再用一批新样本独立复跑去验证它。
判据三件套:分差超过噪声 + 配对成立 + 可复现。 第 7 章的原话是:分差要超过噪声、在配对分析中成立,并且能够复现,才值得据此切换模型或发布改动。 缺任何一条都不能成为决策依据——这是本文件最该背下来的一句话。
4. Pass@k vs Pass^k:能力上限 vs 业务可靠性#
单次成功率为 、 次运行相互独立时,两类指标的关系很直观:
核心算例(背下来):、 时,
同一个 ,一个看起来几乎完美,一个看起来几乎不可用。 前者适合衡量探索时的能力天花板(给足机会总能做成至少一次,科研发现、漏洞挖掘这类任务里,人类可以从 条候选轨迹里挑最好那条);后者才接近支付、退款、权限变更、生产部署等场景的可靠性要求。 越大,两者分岔越明显:
| 60.0% | 93.6% | 99.0% | |
| 60.0% | 21.6% | 7.8% |
- Best@k:输出是连续得分而非通过/失败时,取最好一次,记为 Best@k(
agent-eval.md与04-llm-evaluation.md都只在 pass@k/pass^k 上打转,Best@k 是连续指标场景下的对应物)。 - 必须写清 的口径:是「同一任务独立采样 次」,还是「生产流水线上连续 个任务」?两者含义完全不同——前者是「给模型 次机会」,后者是「用户连续遭遇 个请求时全都得对」。报告里不写清口径, 和 都是不可解读的。
- 有副作用的操作不能「重试直到成功」。 对会产生真实副作用的动作(转账、退款、删库),必须在沙盒或可回滚环境里采样,并且把每一次失败都计入可靠性指标。否则 会系统性高估线上表现——因为线上那次失败是真扣款、真退款,不是你 discard 掉的一条采样。
交叉引用:
agent-eval.md已经给出了 pass@k(能力上限)与 pass^k(可靠性)的定性区分,方向是对的;但它的口径偏松——正文写的是 pass^k「也叫 success^all 之类的口径」,「之类的」正是问题所在:success^all 到底是哪种 all、k 的口径是什么,必须钉死,否则同一份报告里两个人都说 pass^k,算的却不是同一个东西。02-interview/design/04-llm-evaluation.md§4.7 要求「多次采样,报 pass@k 和 pass^k 并给置信区间」,本文件把这两个量的公式和 口径补上了。
5. 配对比较与模型排名:Elo / Bradley-Terry#
当评估从「绝对打分」转向「A 和 B 哪个更好」的配对比较时,需要一套把两两结果聚合成全局排名的方法。
Elo 评分(最初用于国际象棋)通过大量两两对决量化相对能力:分差越大,强者的预期胜率越高。
核心算例(背下来):模型 A 得 1200、模型 B 得 1000,Elo 系统预测 A 的胜率约 76%:
- 爆冷时调整幅度更大:如果 B 赢了,B 加分较多、A 减分较多——结果与预期偏差越大,分数调整越多。这种机制让排名快速收敛到真实水平。
- 统计基础是 Bradley-Terry 模型:把每个模型抽象为一个潜在「实力分数」,两两对决的胜负概率由两者分数差决定,即 。Elo 是 Bradley-Terry 的在线增量工程实现:按时间顺序逐场更新、调整幅度受学习率 因子和处理顺序影响;官方榜单(如 Chatbot Arena)用的是 Bradley-Terry 极大似然拟合——对全部对局一次性求解、与投票先后顺序无关。两者总体排名应当吻合,但具体分值不会精确一致(这一点在对比 Elo 实现与官方榜单时必须主动说明,否则会被当成 bug)。
配对评判由 LLM 而非人类投票完成时,要防位置偏差(Position Bias):评判模型会系统性地偏向出现在某个位置(通常是先出现)的候选,即使两个候选内容完全对调,判决也可能不变。缓解方式:
| 做法 | 强度 | 说明 |
|---|---|---|
| 交换顺序各评一次、取平均 | 标准做法 | A 在前评一次、B 在前再评一次,两次取平均 |
| 只有两次判决一致才计入,不一致记平局或送人工复核 | 更严格 | 把位置敏感的部分直接判为「无法判定」 |
| 随机化展示位置(Chatbot Arena 的做法) | 大样本下有效 | 本质相同——让位置偏差在大样本下相互抵消 |
交叉引用:
llm-as-judge.md已经把位置偏置与「交换顺序各评一次再聚合」讲清楚了,但它没有给出聚合机制——为什么 pairwise 的结果最后需要 Elo / Bradley-Terry 才能得到全序、以及 1200 对 1000 究竟是 76% 这个数,都在本文件补上。两处合起来才是完整的:llm-as-judge.md讲单次判决怎么去偏,本文件讲去偏后的判决怎么聚合成排名。
常见面试问法#
Q:我在 100 条评测集上把成功率从 70% 刷到了 73%,能上线吗?
A:不够,这 3 个点大概率是噪声。 用标准误估算:,95% 置信区间约 70% ± 9 个百分点——73% 完全落在旧模型 70% 的区间内,两者统计上不可区分。「新模型 73% 对旧模型 70%」不足以支持切换。要下结论,正确的做法有两条:① 把样本扩大(误差按 缩,要减半得乘 4);② 若两模型跑的是同一批题,改用配对分析——逐题记录谁胜出,用 McNemar 检验(只看「A 对 B 错」和「A 错 B 对」两类分歧题)或 paired bootstrap(以题为单位有放回重采样,看差值分布是否落在 0 的同一侧)。配对把题目难度差异消掉了,比两个独立成功率相减灵敏得多。
Q:标准误的公式是什么?为什么 在根号里?要减半误差怎么办?
A:。 在根号里意味着误差按 缩小,所以要把误差减半,样本量得乘 4(100 题 → 400 题),要降到 1/3 得乘 9。代入数字:100 题 70% 的成功率,,95% 区间约 ±9 个点; 时区间约 ±12.7 个点, 时约 ±16.4 个点——所以几十条样本只能分辨十几个百分点量级的差异。若预期收益只有 2–3 个点而评测集只有几十题,先扩样本,别下结论。
Q:比较两个模型,为什么不能直接相减成功率?
A:因为同一批题的难度差异会被当成噪声算进去。有的题很难(两个模型都错)、有的题很简单(两个模型都对),这些一致的部分对「谁更强」不提供信息,但在独立比较里却进了分母,抬高了方差。配对分析把难度差异消掉:McNemar 只看两模型结论不一致的题(「A 对 B 错」的 与「A 错 B 对」的 ,原假设 );paired bootstrap 以题为单位重采样,每次算同一道题上成对结果的差值。前提是两组共享同一批任务与随机条件,而不是各抽一批样本比均值。
Q:pass@k 和 pass^k 是什么关系?p=0.6、k=5 时分别是多少?
A:( 次中至少一次成功,衡量能力上限),( 次全部成功,衡量业务可靠性)。、:,。同一个 ,一个看起来几乎完美、一个看起来几乎不可用——所以要写清 的口径:是同一任务独立采样 次,还是流水线上连续 个任务?对有副作用的操作,不能「重试直到成功」,必须在沙盒/可回滚环境采样,并把每次失败都计入可靠性,否则 pass@k 会系统性高估线上表现。
Q:Elo 1200 对 1000,谁赢的概率多大?它的统计基础是什么?
A:Elo 系统预测 1200 分的一方胜率约 76%:。爆冷时调整幅度更大(赢家加分多、输家减分多),使排名快速收敛。统计基础是 Bradley-Terry 模型——每个模型有一个潜在实力分 ,,Elo 是它的在线增量实现。要注意两种算法的区别:Elo 逐场在线更新、受学习率 与处理顺序影响;官方榜单常用 Bradley-Terry 极大似然拟合(一次性求解、与顺序无关)。两者总体排名吻合,但具体分值不会精确一致,对比时要说清。
Q:LLM 做 pairwise 评判时位置偏置怎么处理?
A:交换顺序各评一次、取平均;更严格的做法是只有两次判决一致才计入,不一致则记为平局或送人工复核;Chatbot Arena 的做法本质相同——随机化两个回答的展示位置,让位置偏差在大样本下相互抵消。去偏之后的 pairwise 结果,需要用 Elo / Bradley-Terry 这类聚合方法才能得到全局排名(详见 llm-as-judge.md 的偏置一节,那里讲去偏、这里讲聚合)。
易错点#
| 易错说法 / 做法 | 问题 | 应该说 / 应该做 |
|---|---|---|
| 「A 比 B 高 3 个点,换 B」 | 3 个点往往埋在 ±9 个点的区间里 | 先算区间;分差超不过噪声就扩样本或改配对 |
| 「多加几十条样本就能测出 2 个点的差异」 | 误差按 缩,几十条的区间有十几个点宽 | 要减半误差得把样本乘 4;测小差异要几百条量级的配对样本 |
| 两个模型的独立成功率直接相减 | 题目难度差异被算成噪声,灵敏度过低 | 用 McNemar 或 paired bootstrap,以题为单位配对 |
| 「配对」= 分别跑两批样本再比均值 | 那不是配对,是把独立比较换了个名字 | 配对要求同一批题、同一组固定种子 |
| 只跑一次就下结论 | Agent 单次跑分的差常常只是种子噪声 | 每个配置跑 3–5 个随机种子,报均值和波动 |
| 并行试了二十个提示词,挑出那个「显著」的 | 多重比较——试够多次总能蒙上一个 | 收紧阈值(如除以假设数)或对新样本独立复跑 |
| 报告里写 pass^k 但不写 的口径 | 「同一题采样 5 次全对」≠「线上连续 5 个任务全对」 | 钉死:独立采样 次,还是流水线连续 个任务 |
| 对有副作用的操作「重试直到成功」 | 失败被 discard 掉,pass@k 系统性高估线上表现 | 在沙盒/可回滚环境采样,每次失败都计入可靠性 |
| 看到 73% vs 70% 就写「显著提升」 | 把落在噪声内的差当成信号 | 判据三件套:分差超噪声 + 配对成立 + 可复现 |
| 拿 Elo 的分数和官方榜单逐一比对 | Elo(在线、受 与顺序影响)≠ Bradley-Terry MLE(批量、顺序无关) | 只比排名是否大体一致,不比具体分值 |
| 只评一次顺序就下 pairwise 结论 | 位置偏置会让判决随顺序翻转 | 交换顺序各评一次取平均,不一致记平局/送人工 |
自测#
1. 一个评测集有 100 道题,某模型成功率 70%。给出 95% 置信区间,并说明「另一个模型 73%」意味着什么。
答案
;95% 置信区间 70% ± 9 个百分点。「另一个模型 73%」落在这个区间内,两者统计上不可区分——不足以支持切换。想真正比较,要么扩大样本(误差按 缩,减半需 4 倍样本),要么因为两模型跑同一批题而改用配对分析(McNemar / paired bootstrap),后者的灵敏度远高于两个独立成功率相减。
2. 给出 McNemar 检验和 paired bootstrap 的口径,并解释为什么配对比独立比较灵敏。
答案
McNemar:只统计两模型结论不一致的题——(A 对 B 错)与 (A 错 B 对),原假设 ,用 或精确二项检验;一致题(都对/都错)不进检验。paired bootstrap:以题为单位从 道题里有放回重采样 道,每次算两模型成功率的差值 ,重复上千次得到差值的经验分布,取 2.5%/97.5% 分位为 95% 区间——区间不含 0 即显著。为什么灵敏:同一批题里,难题(都错)与易题(都对)的难度差异在配对时被消掉,只有分歧题贡献信息;独立比较把难度方差当噪声算进分母,需要更多样本才能看出同样的差异。前提:两组共享任务与随机条件,不是各抽一批样本比均值。
3. p=0.6、k=5 时 pass@5 和 pass^5 分别是多少?为什么必须写清 k 的口径?
答案
99.0%; 7.8%。同一个单次成功率 ,一个看起来几乎完美(给足机会总能做成一次,衡量能力上限),一个看起来几乎不可用(五次连续都不出错极难,衡量业务可靠性)。必须写清 的口径:是「同一任务独立采样 次」还是「生产流水线上连续 个任务」——前者是「给模型 次机会」、后者是「用户连续 个请求都得对」,含义完全不同。另:对有副作用的操作不能「重试直到成功」,要在沙盒/可回滚环境采样并把每次失败计入可靠性,否则 pass@k 会系统性高估线上表现。
4. 你并行测了 15 个提示词变体,其中一个把成功率从 68% 提到 75%(n=80)。你会直接采用它吗?
答案
不会,至少现在不会。 两个问题:① 样本量:、 时 ,95% 区间约 ±10 个点,7 个点的提升仍在噪声内;② 多重比较:并行试了 15 个变体,即使都没效果,试够多次也总能碰上一个「看起来显著」的。正确做法:把这个变体单独拎出来,在扩大后的样本上、与基线做配对比较(同一批题、同一组种子),并做独立复跑确认可复现——满足「分差超噪声 + 配对成立 + 可复现」三件套才采用。
5. Elo 1200 对 1000 的预期胜率是多少?它和 Bradley-Terry 是什么关系?位置偏置怎么处理?
答案
预期胜率约 76%:;爆冷时调整幅度更大。统计基础是 Bradley-Terry 模型——;Elo 是它的在线增量工程实现,逐场更新、受学习率 与处理顺序影响,而官方榜单常用 Bradley-Terry 极大似然拟合(批量、顺序无关),两者排名大体吻合但具体分值不会精确一致。位置偏置:LLM 评判会系统性偏向某个位置,缓解是交换顺序各评一次取平均(更严格:只有两次一致才计入,不一致记平局或送人工),Chatbot Arena 则随机化展示位置让偏差在大样本下抵消;去偏后的 pairwise 结果需要用 Elo / Bradley-Terry 聚合才能得到全局排名。