Course Builder个人学习工作台 · 本地模式
LLM Eval 实战:用 Python 评测 Skill 与 System Prompt

L006:别把随机性当提升——重复试验、区间与配对比较

目标:区分 case 差异与重复运行的随机差异,并用配对比较和不确定区间判断版本变化。

0–6 分钟:两个不同的问题来源

假设你用 20 个请求比较 prompt-A 与 prompt-B。每个请求运行 4 次。

这里至少有两层变化:

  • case 间差异(between-case variation):请求本身难度不同。例如,“生成普通课程路线”可能稳定通过,而“继续课程但不得无证据升级状态”更容易失败。
  • case 内随机差异(within-case variation):同一个请求重复运行,模型采样或工具交互可能让结果不同。

因此,20 cases × 4 trials 不是 80 个彼此无关的新 case。四次运行仍聚集在同一个 case 下。Anthropic 的统计研究指出,eval 报告应量化不确定性;当观测按问题聚集时,误差估计也应适当地保留这种聚集结构。S06

task、trial 与分数

本课采用以下记号:

  • case i:第 i 个真实请求;
  • trial r:同一版本在该 case 上的第 r 次运行;
  • score[A,i,r]:版本 A 的一次结果,可为 0/1 或连续分数;
  • mean[A,i]:A 在 case i 上多次 trial 的平均值。

重复 trial 可以降低对某个问题平均表现的 within-question variance,但不能替代更多有代表性的 cases。S06 如果所有 20 个 case 都是“正常请求”,每个运行 100 次也不会自动覆盖“不应触发”或“证据门控”失败。

6–12 分钟:为什么比较要“配对”

错误做法是分别计算 A、B 的总均值,然后只看:

mean(B) - mean(A)

这个数本身没有错,但它隐藏了“同一个 case 上发生了什么”。当两个版本使用同一组 case时,更有信息量的做法是先在每个 case 上比较:

d_i = mean[B,i] - mean[A,i]
平均配对差异 = mean(d_i)

这里的“配对”首先指 A 与 B 共享同一个 case。不要仅因为两边都叫“第 1 次 trial”,就假设两次独立随机采样天然配对。共享 case 的配对差异可以利用问题集的共同结构来比较系统。S06

Worked example:平均提升掩盖了回归

五个 case 各运行四次后,得到:

caseA 通过率B 通过率配对差异 B-A解释
正常建课0.500.75+0.25改善
继续下一课0.750.750.00不变
不应触发0.250.50+0.25改善
证据门控1.000.75-0.25回归
来源记录0.500.500.00不变

平均配对差异为:

(+0.25 + 0 + 0.25 - 0.25 + 0) / 5 = +0.05

B 的平均质量提高 5 个百分点,但它在“证据门控”上回归。若该项是不可妥协约束,+5pp 不能覆盖这次失败。再假设每个 task 的平均成本从 $0.020 增至 $0.026,成本增加 30%。合理结论不是“B 胜出”,而可能是:

revise B:保留触发改善的方向,先修复证据门控回归;扩大 case 数后重新比较。当前样本不能证明改善稳定,而且成本上升。

这就是决策相关性:统计结果必须回答“多大的变化才值得采用,以及什么回归会阻止采用”。

12–18 分钟:不确定区间回答什么

点估计 +5pp 只是当前样本的中心结果。不确定区间表达:如果把这些 cases 看作目标使用情境的一个样本,我们对总体配对差异还有多大不确定性。

本课用一个直观方法:

  1. 先得到每个 case 的 d_i;
  2. 以 case 为单位有放回重采样;
  3. 每次计算重采样后的平均 d_i;
  4. 用这些均值的第 2.5 与 97.5 百分位形成一个 95% bootstrap 区间。

关键不是迷信“95%”这个标签,而是保留 case 聚集结构。若区间跨过 0,说明数据仍兼容“B 更差、近似不变或更好”等多种可能;这不等于证明“两者相同”。如果区间完全为正,也仍需检查 effect size 是否值得、重要回归是否出现、成本和延迟是否可接受。

Anthropic 还指出,power analysis 把“希望检测到的最小 effect size”与所需 cases/trials 数联系起来。S06 实务顺序应是:先写决策上最小有意义差异,再规划样本,而不是看到结果后临时挑阈值。

决策表

结果可能动作
区间很宽,跨 0暂不宣称胜出;增加有代表性的 cases,必要时增加 trials
区间较窄但 effect 很小即使“稳定为正”,也可能 keep A,因为收益不抵成本
平均改善但出现不可妥协回归revise 或 rollback B,单列回归
质量改善足够大、无阻断回归、成本可接受可考虑采用 B,并保留回滚路径

18–24 分钟:小型 Python 练习

下面的代码故意以 case 为 bootstrap 单位。先运行,再改数据。

import numpy as np

# 行 = case,列 = repeated trial;1 表示通过该 case 的质量标准
A = np.array([
    [1, 0, 1, 0],  # 正常建课
    [1, 1, 0, 1],  # 继续下一课
    [0, 0, 1, 0],  # 不应触发
    [1, 1, 1, 1],  # 证据门控
    [1, 0, 1, 0],  # 来源记录
], dtype=float)

B = np.array([
    [1, 1, 1, 0],
    [1, 0, 1, 1],
    [1, 0, 1, 0],
    [1, 1, 1, 0],
    [0, 1, 0, 1],
], dtype=float)

case_names = ["正常建课", "继续下一课", "不应触发", "证据门控", "来源记录"]
cost_A, cost_B = 0.020, 0.026

# 先对每个 case 的重复 trials 求均值,再做同-case配对差
case_diff = B.mean(axis=1) - A.mean(axis=1)
effect = case_diff.mean()

# Cluster bootstrap:整行(整个 case)重采样
rng = np.random.default_rng(42)
boot = np.empty(20_000)
for j in range(len(boot)):
    sampled_cases = rng.integers(0, len(case_diff), size=len(case_diff))
    boot[j] = case_diff[sampled_cases].mean()
lo, hi = np.quantile(boot, [0.025, 0.975])

print(f"平均配对差异: {effect:+.1%}")
print(f"95% case-bootstrap 区间: [{lo:+.1%}, {hi:+.1%}]")
print(f"成本变化: {(cost_B / cost_A - 1):+.1%}")
print("逐 case 差异:")
for name, diff in zip(case_names, case_diff):
    print(f"  {name}: {diff:+.1%}")

完成三个改动:

  1. 把 证据门控 标成不可妥协项,并让程序打印其是否回归;
  2. 增加一个真实的边界 case 及 A/B 各 4 次结果;
  3. 写一个显式决策规则,例如:
adopt = (
    lo > 0.02                 # 改善下界超过最小有意义的 2pp
    and case_diff[3] >= 0     # 证据门控不得回归
    and cost_B / cost_A <= 1.10
)

2pp 和 10% 只是示例,不是通用标准。你必须根据自己的风险与预算说明阈值。

24–27 分钟:快速提取练习

请先作答,再展开答案。

问题 1

为什么“10 个 cases 各运行 5 次”不能简单当成 50 个独立 cases?

完成后查看参考答案

因为同一 case 的五次 trial 共享请求内容和难度,观测聚集在 case 内。重复试验主要帮助描述或降低该 case 的随机变化,不能创造新的情境覆盖;不确定性估计应保留这种聚集。

问题 2

配对差异中的“配对”配的是什么?为什么有用?

完成后查看参考答案

主要是把版本 A 与 B 在同一个 case 上的平均表现相配,先求每个 case 的 B-A,再汇总。这样比较利用了共享问题集,并能直接看到改善与回归落在哪些 case;随机 trial 的相同序号并不自动构成有意义的配对。

问题 3

若 95% 区间完全高于 0,为什么仍不能自动采用 B?

完成后查看参考答案

区间为正只处理“总体平均配对差异是否可能为正”的一部分问题。仍要判断 effect size 是否达到决策上最小有意义差异,是否有不可妥协回归,以及成本、延迟或其他指标是否可接受。

通过标准

  • 正确区分 case 间与 case 内随机差异;
  • A/B 使用相同 case 集,并先计算逐 case 配对差异;
  • 重复 trials 没有被伪装成独立 cases;
  • 不确定区间的重采样单位是 case,代码可运行且结果可复核;
  • 至少一个回归被单列,而不是被平均分隐藏;
  • 报告质量与成本,并解释 effect size 的决策意义;
  • 结论明确为 keep / revise / rollback,且不把“区间跨 0”误写成“已证明相同”;
  • 证据来源、版本、试验条件和独立完成程度清楚。

Sources used

  • S06 Anthropic Research, A statistical approach to model evaluations.