第 4 周 · Day 5:评测基础——人工评分、统计误差、基准与规则指标

Transformers and Large Language Models · Week 4 · Day 5。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

时长 7 小时:§1 评测什么(0.5h)· §2 人工评分与一致性(1h)· §3 一个分数有多可信(1.5h)· §4 基准测试(1.5h)· §5 规则指标(1h)· §A–§C(1.5h)

对应正课 Lecture 8 的前后两部分:评测的动机(人工评分是金标准,但主观、慢、贵;Cohen’s κ、Fleiss’ κ、Krippendorff’s α)、基于规则的指标(METEOR、BLEU、ROUGE 及其局限)、常见基准(知识 MMLU、推理 AIME 与 PIQA、编码 SWE-bench、安全 HarmBench、智能体 τ-bench 与 pass^k)、基准的作用与局限(多维画像、Pareto 前沿、数据污染、Goodhart 定律)。中间的 LLM 当评委放在 Day 6。学习计划点名要会的:“评测方法谱系""为什么 ROUGE 不适合评估开放式生成""怎么设计一个能防止数据污染的内部基准”。

配套代码 w4day5_checks.py(纯 numpy):Cohen’s κ 与 κ 悖论、评分者准确率与 κ、Fleiss’ κ、标准误与能分辨的最小差距、配对比较的统计功效、胜者的诅咒、数据污染与 n-gram 检测、BLEU / ROUGE / METEOR 手算、Pareto 前沿

§B 参考实现(code/ 目录):w4d5_metrics.py(κ、Wilson 区间、bootstrap、McNemar、配对 bootstrap、pass@k / pass^k、支持中文的 BLEU / ROUGE / METEOR、字符 n-gram 污染检测;用它检验 Day 2 的检索比较是否显著、检查黄金集与讲义原文的重叠)。

今天的目标:能说清评测的两层含义和方法谱系;能推出 Cohen’s κ,解释 κ 悖论;能算出一个准确率的误差、判断两个分数的差别能不能当真,知道为什么要配对比较、为什么不能在测试集上调参;能说出四类基准各测什么、pass^k 测什么;能设计一个防污染的内部测试集;能解释 BLEU / ROUGE 为什么在开放式生成上失效。


§0 这两天在做什么

Lecture 7 的结语说”评测很难”。Lecture 8 专门回答它,而这两天的内容会贯穿你之后做的每一个项目:不会评测,就不知道任何改动有没有用。这一周前四天我们已经反复遇到这个问题:Day 1 的 ICT 在一个种子上看起来有用、三个种子一比就没了;Day 2 的混合检索”公认有效”,在讲义上却测不出收益。今天把这些直觉变成方法。

Lecture 8 的结构,以及它在这两天里的分配:

动机:评测什么、人工评分(金标准,但主观、慢、贵)       → 今天 §1–§2
基于规则的指标:BLEU、ROUGE、METEOR                    → 今天 §5
LLM 当评委:做法、好处、偏差与最佳实践                  → Day 6 §1–§2
扩展:事实性的量化、智能体的失败模式                    → Day 6 §3
基准测试:知识、推理、编码、安全、智能体;污染与 Goodhart → 今天 §4

今天还加了一节 Lecture 8 没有展开、但每一个评测都离不开的内容:一个分数有多可信(§3)。

今天要用到的旧结论:Bradley-Terry 与奖励模型的准确率天花板(Week 3 Day 2 §2.2、§2.4);pass@k 的无偏估计(Week 3 Day 5 §5.1);pass^k(Day 4 §3.3);检索指标(Day 2 §3);Goodhart 定律与代理的缺陷(Week 3 Day 6 §5.2);MinHash 与近重复去重(Week 2 Day 4 §1.3)。


§1 评测什么

1.1 两层含义

Lecture 8 开头把”评测”分成两层:

输出质量系统性能
问的是回答好不好系统好不好用
例子是否遵循指令、是否连贯、是否符合事实、是否有用、语气与安全延迟、价格、可靠性(会不会超时、会不会崩)
怎么测人工、规则指标、LLM 评委、基准计时、计费、压测

这两天讲的是输出质量。系统性能同样重要(第 2 周的量化、KV Cache、推测解码都是为了它),而且两者常常要一起权衡(§4.5 的 Pareto 前沿)。

1.2 方法谱系

方法做法需要参考答案吗可信度成本与速度
人工评分人按标准打分或比较不需要最高(但有主观性,§2)慢、贵
规则指标和参考答案比字面重叠需要(仍是人写的)开放式生成上很低(§5)快、便宜
LLM 当评委让 LLM 按标准打分或比较不一定接近人工(要校准,Day 6)较快、较便宜
基准测试固定题库 + 自动判分需要标准答案或测试用例高(在它测的那个维度上),但会被污染和过拟合(§4)快

Lecture 8 的”修订后的工作流”:人工评分是慢的”乌龟”,LLM 评委是快的”兔子”。实践中两者一起用:用少量人工评分校准评委,再用评委做大规模评测。


§2 人工评分与一致性

2.1 为什么是金标准,又为什么不够

LLM 生成的是自由文本,很难自动判断好坏;人的判断最接近我们真正关心的东西。但人的判断有三个问题(Lecture 8):

  • 主观:Lecture 8 的例子:“我该送什么生日礼物?”——“泰迪熊几乎总是一份贴心的礼物,挑一只你觉得合适的就好。“这个回答”有用”吗?一位评分者觉得温暖得体,另一位觉得敷衍、没有回答问题。
  • 慢、贵:一条高质量的人工标注可能要几分钟,专业领域(法律、医学)要专家。

主观性不是评分者的”错误”,而是任务本身的属性。我们需要一个数来衡量这个任务的评分有多一致:一致性低,要么是标准没写清楚,要么是这个维度本来就因人而异。

2.2 Cohen’s κ:扣掉”碰巧一致”

动机:两位评分者 90% 的时候一致,这算高吗?Lecture 8 的问题:“如果评分完全是掷骰子呢?“两个人各自随机打分,也会有一部分碰巧一致。我们要问的是:一致性比”碰巧”好了多少?

推导:设两位评分者给 NN 个样本打 KK 类标签。

  • 观察到的一致率 po=1N∑knkkp_o=\frac1N\sum_k n_{kk}(混淆矩阵对角线之和)。
  • “碰巧一致”的概率 pep_e:假设两人各自按自己使用各类别的比例独立地打分,两人同时打 kk 的概率是 p1(k) p2(k)p_1(k)\,p_2(k),所以 pe=∑kp1(k) p2(k)p_e=\sum_k p_1(k)\,p_2(k)。
  • 一致性比碰巧好了 po−pep_o-p_e;最多能比碰巧好 1−pe1-p_e。两者之比就是 Cohen’s κ(Cohen 1960):

κ=po−pe1−pe.\kappa=\frac{p_o-p_e}{1-p_e}.

κ=1\kappa=1 完全一致;κ=0\kappa=0 和碰巧一样;κ<0\kappa<0 比碰巧还差(系统性地意见相反)。

w4day5_checks.py 第 1 组:60 个回答,两位评分者把”有用程度”分为低、中、高:

         评分者 2:低   中   高
评分者 1:低      20    5    0
          中       3   15    2
          高       1    4   10

po=(20+15+10)/60=0.750p_o=(20+15+10)/60=0.750;pe=25⋅24+20⋅24+15⋅12602=0.350p_e=\frac{25\cdot24+20\cdot24+15\cdot12}{60^2}=0.350;κ=0.750−0.3501−0.350=0.615\kappa=\frac{0.750-0.350}{1-0.350}=0.615。

2.3 κ 的悖论与解读

同样的一致率,κ 可以相差很大。第 1 组的两张表,一致率都是 0.90:

pop_opep_eκ\kappa
类别均衡(50 / 50)0.900.5000.800
类别极不均衡(93% 是”通过”)0.900.8700.232

当几乎所有样本都属于同一类时,两人都说”通过”本身就很容易,碰巧一致率高达 0.87,κ 把这部分扣掉了。这不是 κ 的缺陷:第二张表里,两人各标了 7 个”不通过”,只有 2 个重合,对真正要紧的少数样本几乎从不一致。高一致率掩盖了这一点,κ 揭示了它。报告 κ 时,一起报告 pop_o 和类别分布。

怎么解读 κ 的大小:常用的是 Landis & Koch(1977)的量表:0.21–0.40 一般、0.41–0.60 中等、0.61–0.80 较好、0.81 以上几乎完全一致。这个量表是约定俗成的,不是推出来的;更有用的是和同一任务上的人–人一致性比较(Day 6 §1.5 评委和人的比较就是这样做的)。

2.4 多个评分者

  • Fleiss’ κ(Fleiss 1971):每个样本由 mm 位评分者打分(不要求是同一批人)。PiP_i 是”第 ii 个样本上随机抽两位评分者,两人一致”的概率,对样本平均得 Pˉ\bar P;Pˉe=∑kpk2\bar P_e=\sum_k p_k^2。κ=(Pˉ−Pˉe)/(1−Pˉe)\kappa=(\bar P-\bar P_e)/(1-\bar P_e)。第 1 组:5 位评分者、3 个类别、每人 80% 的时间给出正确标签,Fleiss’ κ = 0.643,和两两 Cohen’s κ 的平均(0.643)一致。
  • Krippendorff’s α:更一般,允许缺失的评分、有序或连续的标签(比如 1–5 分,“4 和 5 的分歧”比”1 和 5 的分歧”小)。

2.5 一致性的上限:评分者之间 vs 评分者与真相

第 1 组的另一个实验:两位评分者各自以准确率 aa 给出正确的二分类标签(错的时候随机选),它们之间的 κ 是多少?

每人的准确率两人一致率κ理论值 (2a−1)2(2a-1)^2
0.70.5790.1580.160
0.80.6790.3580.360
0.90.8210.6430.640

每人 80% 准确,彼此的一致率只有 0.68、κ 只有 0.36。评分者之间的一致性比”每人对真相的准确率”低得多,因为两个人的错误不会恰好错在一起。两个评委(人或 LLM)一致率不高,不代表他们都不行。这和 Week 3 Day 2 §2.4 奖励模型的准确率天花板是同一件事:标注本身有噪声时,任何模型预测标注的准确率都有上限。


§3 一个分数有多可信

3.1 抽样误差

测到的准确率是一个估计。nn 道题、真实准确率 pp,它的标准误是 p(1−p)/n\sqrt{p(1-p)/n},95% 置信区间约 ±1.96\pm1.96 倍标准误。第 2 组:

题数p=0.8p=0.8:标准误 / 95% 半宽能分辨的最小差距(p=0.5p=0.5,不配对,功效 80%)
50(我们的黄金集)0.057 / ±0.1110.280
5000.018 / ±0.0350.089
1,319(GSM8K 测试集)0.011 / ±0.0220.055
14,042(MMLU 测试集)0.003 / ±0.0070.017

读法:

  • 50 道题时,一个 0.80 的分数的标准误是 0.057(前几天说的”标准误约 0.06”就是它),95% 区间是 ±0.11:0.76 和 0.84 在统计上分不开。这就是 Day 1 §3.4、Day 2 §6 反复提醒”小差距不要当真”的原因。
  • MMLU 的 1.4 万道题,能分辨的差距约 1.7 个百分点;排行榜上 0.3 分的差距多半是噪声。
  • 能分辨的最小差距(不配对、5% 显著性、80% 的把握)约为 (1.96+0.84)2p(1−p)/n(1.96+0.84)\sqrt{2p(1-p)/n},随 n\sqrt n 缩小:题目加 4 倍,分辨力才提高 1 倍。

小样本时用 Wilson 区间:教科书的 p±1.96p(1−p)/np\pm1.96\sqrt{p(1-p)/n} 在 nn 小、pp 接近 0 或 1 时很不准(50 道全对时区间宽度为 0,显然不对)。Wilson 区间把检验”反过来解”,小样本下更可靠。参考代码的 wilson_interval(50, 50) 给出 [0.929, 1.000]。

另一个误差来源:采样的随机性。温度大于 0 时同一个模型跑两次,分数就不同。要跑几个种子,报告均值和标准差;或者用温度 0(但温度 0 也不保证完全确定,见 Week 2 Day 3 §A.3)。

3.2 配对比较

比较两个系统时,让它们做同一批题。题目有难有易,难题两个系统都容易错。配对比较只看两者结果不同的题:bb = A 对 B 错的题数,cc = A 错 B 对的题数。差值的标准误约为 b+c/n\sqrt{b+c}/n,通常比不配对的 2p(1−p)/n\sqrt{2p(1-p)/n} 小。

McNemar 检验:在”两者一样好”的假设下,这 b+cb+c 道分歧题里 A 赢的次数服从 Binomial(b+c, 0.5)\text{Binomial}(b+c,\,0.5),由此得到精确的 p 值。配对 bootstrap:对逐题的差值有放回地重抽,得到差值的置信区间;它也适用于连续分数(NDCG、评委打分)。

第 3 组:1000 道题,难度 di∼N(0,32)d_i\sim\mathcal N(0,3^2),给定难度后两个模型各自独立答题,A 答对的概率 σ(0.5−di)\sigma(0.5-d_i),B 是 σ(0.8−di)\sigma(0.8-d_i)(真实差距约 3.4 个百分点)。400 次重复实验,在 5% 显著性下检测出差异的比例:

统计功效
配对(同一批题,McNemar)0.59
不配对(B 在另一批题上测)0.34

不用多标一道题,功效就高出一截。两个系统越相似(同一个模型换提示、同一个检索器换参数),分歧题越少,配对的优势越大。单次实验里 b + c = 103 + 126 = 229 道分歧题,McNemar p = 0.146:即使真实差距存在,一次实验也可能测不出来,这就是”功效 0.59”的含义。

反面:拿别人论文里报告的分数,和自己在另一批题(或另一种提示格式、另一个版本的评测脚本)上测的分数直接比,是最不可靠的比较。

3.3 胜者的诅咒

场景:你试了 KK 个提示词(或检查点、超参组合),在同一个测试集上各测一次,挑分数最高的那个报告。

问题:即使这 KK 个候选其实一样好,挑出来的”最高分”也会系统性地偏高。每个候选的测量值是”真实水平 + 噪声”,你挑中的是噪声恰好最大的那一个。第 4 组:500 道题,所有候选的真实准确率都是 0.70(标准误 0.0205):

候选数 KK报告的最高分在新测试集上重测高估
10.70010.6997+0.0004
50.72430.7005+0.024
500.74590.7004+0.046
2000.75530.7003+0.055

试了 50 种提示、挑最好的一个报告,平均高估约 4.6 个百分点,而它们其实一样好。这就是”不要在测试集上调参”的数学:调参用单独的开发集,测试集只在最后测一次。Day 2 §A.4 提醒过:我们在黄金集上扫了 RRF 的 kk、块大小、融合方式,报告的最优值就带着这种偏差。

放大到整个领域:所有人都在同一个公开基准上迭代、只发表涨分的结果,基准分数就会系统性地偏乐观。这是 §4.5 Goodhart 定律的一个统计机制。

3.4 在讲义上检验前几天的结论

w4d5_metrics.py --retrieval-test 把 Day 2 §6 的检索比较做成逐题的 hit@5,逐个检验:

比较A 对 B 错A 错 B 对McNemar p差值与 95% 区间(配对 bootstrap)
LSA → LSA + 面包屑0140.0001+0.280 [+0.160, +0.400]
BM25 → BM25 + 面包屑0150.0001+0.300 [+0.180, +0.440]
BM25 + 面包屑 → LSA + 面包屑211.000−0.020 [−0.080, +0.040]
LSA + 面包屑 → 混合 RRF101.000−0.020 [−0.060, +0.000]

结论与 Day 2 的判断一致:面包屑的提升是显著的(14 道题从错变对,没有一道从对变错);BM25 与 LSA、LSA 与混合之间,分歧题只有一到三道,根本无从判断。每个系统单独的 Wilson 区间也很宽:LSA + 面包屑的 0.82 是 [0.692, 0.902]。


§4 基准测试

4.1 四类能力

Lecture 8 把常见基准按能力分成四类:

类别测什么代表基准判分方式
知识准确陈述关于世界的事实;广度多于深度;反映预训练的质量MMLU(Hendrycks et al. 2020):57 个科目(初等数学、美国历史、计算机、法律……),每题 4 选 1选项硬匹配
推理多步推理;数学与常识两个子领域AIME:美国数学邀请赛,每年约 30 题,几何、代数、分析,答案是 3 位整数;PIQA(Bisk et al. 2019):约 2 万道日常物理常识题,2 选 1;GSM8K答案硬匹配
编码生成语法正确的代码;编程能力;也是工具使用能力的代理SWE-bench(Jimenez et al. 2023):来自 12 个流行 Python 仓库真实 GitHub issue 的 2,294 道题,每题有一个基准提交和一个已合并、带测试的 PR;HumanEval生成的补丁能通过所有测试
安全避免有害、有毒、不当的行为;部署前暴露漏洞;与定制的偏好对齐HarmBench(Mazeika et al. 2024):510 个有害行为(400 个文本、110 个多模态),分为标准、版权、上下文、多模态四类用分类器判断攻击是否成功,指标是攻击成功率(ASR)

判分方式决定了基准能测什么:选择题和数值答案可以硬匹配(便宜、客观);代码可以跑测试(客观,但测试不全时会被钻空子,Week 3 Day 5 §2.3);安全要一个分类器(它本身就是一个评委,有自己的误差)。开放式的”有用性”没有硬匹配,这正是 Day 6 的 LLM 评委要解决的。

同一个基准,不同的评测方式,分数可以差很多:MMLU 可以让模型直接输出字母、也可以比较四个选项的对数概率(§A.1);few-shot 的示例数、提示的措辞、是否用聊天模板,都会影响结果(Week 2 Day 3 §4.4 的提示敏感性)。比较两个分数之前,先确认它们是用同一种方式测的。

4.2 智能体的基准与 pass^k

τ-bench(Yao et al. 2024)测”工具 – 智能体 – 用户”三方交互:给定数据库模式、API 和业务规则,智能体要一边和一个模拟用户(由 LLM 扮演)对话,一边调用工具完成任务。两个领域:

  • 航空:500 个用户、300 个航班、2000 条预订;约 10 个工具,50 个任务。
  • 零售:500 个用户、50 种商品、1000 个订单;约 10 个工具,115 个任务。

判分方式是硬匹配:任务结束时数据库的状态是否和标准答案一致。除了成功率,它提出了 pass^k(Day 4 §3.3):”kk 次尝试全部成功的概率”,衡量一致性与可靠性。它报告:最强的函数调用智能体在它的任务上成功率不到 50%,零售场景的 pass^8 不到 25%。

pass@k 和 pass^k 的选择:有验证器、能多试几次挑一个(写代码跑测试)时看 pass@k;要可靠地服务每一个用户(客服、订票)时看 pass^k。参考代码的 pass_at_k、pass_hat_k 都是无偏估计(采 nn 次、成功 cc 次)。

4.3 自建测试集

公开基准测的是通用能力;你的应用要的是你的任务上的表现。学习计划的动手任务是”手工造 50 条黄金问答”,我们的 w4_golden.py 就是一个例子。一个好的内部测试集:

  1. 答案唯一、能在语料里找到:每道题都写明答案在哪一节(refs)和标准答案(a)。答案模糊的题,评委和人都判不准。
  2. 问法和原文用词不同:否则你测的是”关键词匹配”,不是”理解”。--leakage 检查了黄金集和讲义原文的字符重叠(§4.4)。
  3. 覆盖真实的分布:不同的周和主题(我们的 50 题:Week 0 9 道、Week 1 14 道、Week 2 15 道、Week 3 12 道),不同的难度,包括不该回答的问题(资料里没有答案时,系统应该说”没找到”)。
  4. 足够大:用 §3.1 倒推。想分辨 5 个百分点的差距,配对设计下也要几百道题;50 道题只够发现大的差别(比如面包屑)。
  5. 分成开发集和测试集:调参只用开发集(§3.3)。
  6. 版本化、可追溯:题目改了,旧的分数就不能和新的比;记下每个分数是在哪个版本上测的。
  7. 从真实失败里补充:上线之后,把用户遇到的失败案例加进来。测试集是会生长的。

4.4 数据污染

问题(Lecture 8):基准的题目或答案出现在了模型的训练数据里。模型可能是”背下了答案”而不是”会做”。

它能抬高多少(第 5 组):测试集里比例 cc 的题被背下了(总能答对),其余部分的真实准确率 a=0.6a=0.6,测到的准确率是 c+(1−c)ac+(1-c)a。污染 20% 就高估 8 个百分点。

怎么检测:看测试题和训练语料有没有长的相同片段(GPT-3 论文用 13-gram)。第 5 组:原样复制一定被抓住;但如果训练数据里的是改写版(每个 token 以概率 qq 被换掉),一个 13-gram 完整保留的概率是 (1−q)13(1-q)^{13}:

改写比例 qq单个 13-gram 保留一道 60 token 的题被检测出来
01.0001.000
0.10.2540.924
0.20.0550.489
0.30.0100.133

改写 20% 的词,只有约一半能被抓到;改写 30% 以上,n-gram 检测基本失效。而模型见过改写版,一样能”学会”答案。

n-gram 的阈值要和分词方式一起定:--leakage 用字符 n-gram 检查我们的黄金集和讲义原文。6 个字符时 43/50 道题有重叠(只是共享了术语和常用搭配);13 个字符时还有 7 道,但其中大多数是很长的英文术语本身(FlashAttention、PagedAttention 都超过 13 个字符),真正和原文共享一个中文短语的只有两三道(“在什么条件下能提高准确率?”)。命中了要人工看一眼,不要只看比例。

Lecture 8 列出的三条预防措施:

  1. 给基准加一个标识符(比如 BIG-bench 的”金丝雀字符串”,一个唯一的 GUID):让训练数据的清洗流程能识别并剔除含有它的文档。前提是清洗的人愿意这么做。
  2. 给调用工具的智能体加黑名单:智能体能上网时,它可能直接搜到基准的答案。Gemini 3 的评测说明里就写了评测时屏蔽了哪些网站。
  3. 用更新的测试版本:用发布日期晚于模型训练数据截止的题(AIME 2025、新一期的比赛题)。这是最可靠的办法,也是为什么很多基准在不断出新版本。

设计一个防污染的内部基准(学习计划的自测题):题目不公开发布;用自己的私有数据出题;定期补充新题并记录每道题的创建日期;分出一个”从不用于调参”的保留集;对模型可能接触的公开语料做 n-gram 检查(记住它抓不住改写)。

4.5 基准的作用与局限

基准是一个投影:每个基准只是模型能力在一个轴上的投影。不同的模型擅长不同的事,Lecture 8 半开玩笑地说每个人都有自己的”经验事实”(某家的某个系列擅长写代码、另一个系列便宜)。看一个模型,要看它在多个基准上的画像,而不是一个总分。

Pareto 前沿:质量从来不是唯一的维度。Lecture 8 列出的权衡:质量 vs 成本 / 延迟、质量 vs 安全、质量 vs 上下文长度。一个模型被支配,是指有另一个模型在所有维度上都不差、至少一个维度上更好。第 7 组(示意用的数字):

模型    成本    质量    在前沿上?
甲      0.2     62       是
乙      0.5     70       是
丙      1.0     68       否(比乙贵,分还低)
丁      2.0     79       是
戊      3.0     78       否
己      8.0     84       是
庚     12.0     83       否
前沿:甲 → 乙 → 丁 → 己

被支配的模型没有理由被选;前沿上怎么选,取决于你愿意为多一分质量付多少钱。Lecture 9 提到,行业的关注点正在从”最好的性能”转向”最好的质量–成本权衡”。

Goodhart 定律:“当一个度量变成目标,它就不再是一个好的度量。“(Strathern 1997 对 Goodhart 的表述)第 3 周我们在奖励模型上见过它(Week 3 Day 2 §3.2、Week 3 Day 6 §2.4),在基准上它以几种形式出现:在测试集上反复调参(§3.3)、数据污染(§4.4)、针对基准的格式和题型做专门训练。Lecture 8 的三条教训:不要过度看重基准;需要更”有机”的视角来补全画像,比如 Chatbot Arena 这类由真实用户投票的动态排行榜(Day 6 §2.5);以及,亲自试几个模型。

静态基准 vs 动态排行榜(期末卷问过):静态基准是固定的题目和答案,便宜、可复现,但容易被污染、被过拟合;动态排行榜(Chatbot Arena)靠真实用户的实时投票,更能反映一般用户的偏好,也不容易被背题,但噪声大、受用户群体和提问分布的影响,而且”用户喜欢”不等于”正确”(Day 6 §2 的冗长偏差在人身上也有)。


§5 规则指标

想法(Lecture 8):参考答案写一次,之后每次都拿模型的输出和参考比。比法是数重叠。

5.1 BLEU

BLEU(BiLingual Evaluation Understudy,Papineni et al. 2002)为机器翻译设计,是一个精确率:候选里的 nn 元组有多少出现在参考里。三个设计,每一个都在堵一个漏洞:

  1. 截断计数:候选里一个 nn 元组出现的次数,最多只算它在参考里出现的最多次数。否则 “the the the the the the the” 对参考 “the cat is on the mat” 的 1 元精确率是 7/7 = 1;截断后,“the” 在参考里最多出现 2 次,只算 2 次,精确率 2/7 = 0.286(第 6 组)。
  2. 1 到 4 元的几何平均:1 元组管”用词对不对”,更长的管”语序和流畅度”。几何平均意味着任何一阶为零,整体就是零。
  3. 简短惩罚 BP=exp⁡(1−r/c)\text{BP}=\exp(1-r/c)(候选长度 cc 小于参考长度 rr 时):精确率不惩罚”少说”,只输出 “the cat” 两个词的 1、2 元精确率都是 1,但 BP = e1−6/2=0.135e^{1-6/2}=0.135。

BLEU=BP⋅exp⁡(14∑n=14log⁡pn).\text{BLEU}=\text{BP}\cdot\exp\Big(\frac14\sum_{n=1}^4\log p_n\Big).

BLEU 本来是语料级的:把所有句子的截断匹配数、总数、长度加起来再算一次(参考代码的 corpus_bleu)。句子级 BLEU 很不稳定,短句子里 4 元组全不匹配就是 0,要加平滑。

5.2 ROUGE

ROUGE(Recall-Oriented Understudy for Gisting Evaluation,Lin 2004)为摘要设计,是一个召回率:参考里的内容,候选覆盖了多少。它是一族指标:

  • ROUGE-N:参考里的 nn 元组,有多少出现在候选里。
  • ROUGE-L:基于最长公共子序列(LCS,不要求连续,但要求顺序一致)的 F 值:P=LCS/∣c∣P=\text{LCS}/|c|,R=LCS/∣r∣R=\text{LCS}/|r|。它不需要预先指定 nn,自然地奖励”大体顺序一致”。

5.3 METEOR

METEOR(Banerjee & Lavie 2005)想修 BLEU 的几个问题:只看精确率、只认字面。它先在候选和参考之间做单词对齐(精确匹配,然后是词干相同,然后是同义词),再算一个偏重召回的调和平均 Fmean=10PRR+9PF_{mean}=\frac{10PR}{R+9P},最后乘一个碎片惩罚 1−0.5 (块数/匹配数)31-0.5\,(\text{块数}/\text{匹配数})^3:匹配的词如果散成很多不连续的块,说明语序乱了。参考代码的 meteor_exact 只做精确匹配。

5.4 为什么在开放式生成上失效

Lecture 8 列出三个局限。第 6 组用它的泰迪熊例句演示了前两个。参考:“A plush teddy bear can comfort a child during bedtime.”

候选BLEU(平滑)ROUGE-1ROUGE-LMETEOR
同义改写 1:“Soft stuffed bears often help kids feel safe as they fall asleep.”0.0000.0000.0000.000
同义改写 2:“Many youngsters rest more easily at night when they cuddle a gentle toy companion.”0.0760.1000.0830.048
意思相反:“A plush teddy bear cannot comfort a child during bedtime.”0.7000.9000.9000.895
  1. 不考虑风格和措辞的变化:两个意思完全正确的改写几乎得零分;把 can 改成 cannot、意思完全相反的句子接近满分。重叠指标度量的是”用词像不像参考答案”,而开放式生成的好答案可以有无数种说法。
  2. 和人的判断相关性不高:这是上面这个现象在大量样本上的统计表现。
  3. 仍然需要人写参考答案:没有省掉人工,只是把人工挪到了前面。

中文有一个额外的坑:w4d5_metrics.py --demo 用 LoRA 的一句话做参考。如果用英文的分词规则(很多评测包的默认值,§A.2),中文字符会被全部丢掉,只剩 “lora”、“b”、“ba”、“0” 几个词元,“几乎照抄”和”意思相反”都得满分。换成汉字按字切,照抄得 0.83、改写得 0.11、意思相反得 0.80:还是看字面,不看意思。

中间路线:基于嵌入的指标。BERTScore(Zhang et al. 2019)把候选和参考的每个 token 用 BERT 编码,按余弦相似度做软对齐。它对同义改写宽容得多,但同样对”意思相反”不敏感(can 和 cannot 的上下文嵌入很接近),而且仍然需要参考答案。规则指标适合的场景:输出空间窄、参考答案基本唯一的任务(翻译的粗略比较、固定格式的抽取)。开放式的回答要用 LLM 评委(Day 6)或人工。


§A 评测工具:API 用法与边界

A.1 lm-evaluation-harness

EleutherAI 的 lm-evaluation-harness 是最常用的开源基准评测框架(Hugging Face 的 Open LLM Leaderboard 用过它)。

lm_eval --model hf --model_args pretrained=Qwen/Qwen2.5-0.5B-Instruct --tasks mmlu,gsm8k --batch_size 8
  • 选择题的两种判分:acc 比较每个选项续写的总对数概率;acc_norm 按选项的长度(字节数)归一化。选项长短差别大时,acc 偏向短选项(长选项的对数概率是更多个负数之和),两者可以差好几个点。报告时写清楚用的是哪个。
  • few-shot 数、提示模板、是否用聊天模板(--apply_chat_template)都会改变分数。对指令模型不用聊天模板,常常低估它的能力。
  • 生成类任务(GSM8K)要从生成的文本里抽答案,抽取规则(正则)决定了分数;模型的答案格式和规则不匹配,就会被判错(Week 3 Day 5 §A.2 的答案验证)。
  • 固定 --seed,记录框架的版本:不同版本的任务定义可能不同。

A.2 BLEU / ROUGE 的实现差异

  • sacrebleu 是 BLEU 的标准实现,默认分词器 13a 为英文设计,中文要设 tokenize="zh"(按字切)。它会输出一个”签名”字符串,记录分词、平滑等设置,报告时附上它,别人才能复现。
  • rouge_score(Google 的实现)的默认分词器会把不是 [a-z0-9] 的字符都当成分隔符,中文字符被全部丢掉,中文文本的 ROUGE 全是 0 或只剩英文单词的分数(--demo 模拟了这一点)。中文要先自己分词(或按字切)再用空格连起来,或者换一个支持中文的实现。
  • nltk 的 sentence_bleu 默认不平滑:短句子任何一阶没有匹配时得 0(会给一个警告)。要用 SmoothingFunction。
  • 不同实现的 BLEU 不可直接比较:分词、平滑、大小写、是语料级还是句子平均,都会让同一个输出得到不同的分数。

A.3 统计检验

  • 置信区间:比例用 Wilson(statsmodels 的 proportion_confint(method="wilson"),或参考代码的 wilson_interval);复杂的指标(NDCG、评委打分的平均)用 bootstrap。
  • 两个系统的比较:同一批题上,二值结果用 McNemar(statsmodels.stats.contingency_tables.mcnemar(exact=True)),连续分数用配对 bootstrap 或配对 t 检验。
  • 样本不独立时:同一篇文档出的多道题、同一个用户的多轮对话,要按组做 bootstrap(整组一起抽),否则区间偏窄。
  • 比较很多对时:比了 20 对,按 5% 的显著性,平均会有一对”碰巧显著”。要么做多重比较校正,要么事先定好要比哪几对。

§B 实操

  1. 跑通 w4day5_checks.py,7 组结论都看懂。第 3 组把难度的标准差从 3 改成 1(题目难度更接近),看配对的优势怎么变;第 4 组算一算:你在 Day 2 扫了多少种配置?
  2. 推导(1h,纸笔):(a) Cohen’s κ 的定义,手算第 1 组的两张悖论表;(b) 评分者准确率为 aa 时两人的 κ 为什么是 (2a−1)2(2a-1)^2(二分类、类别均衡);(c) 标准误与”能分辨的最小差距”;(d) BLEU 的三个设计各堵了什么漏洞。
  3. 检验前几天的结论(1h):python code/w4d5_metrics.py --retrieval-test,复现 §3.4 的表。把你在 Day 1、Day 2 做过的其他比较(块大小、ICT 的三个种子、RRF 的 kk)也逐题拿出来检验。哪些”结论”其实不成立?
  4. 看一眼规则指标的坑(30min):--demo 和 --leakage。自己写三个候选(照抄、改写、意思相反),用 bleu、rouge 算一遍。
  5. 设计你的测试集(1h):按 §4.3 的七条,给你自己的 RAG 项目写一份测试集的设计说明:多少题、怎么出、覆盖哪些情况、怎么防泄漏、怎么分开发集和测试集。如果打算扩充 w4_golden.py,至少补 10 道”资料里没有答案”的题。
  6. 读论文:Papineni et al. 2002(BLEU)的第 2 节;τ-bench(Yao et al. 2024)关于 pass^k 的部分;挑读 SWE-bench 的数据构造部分。

参考实现:code/w4d5_metrics.py。


§C 自测

动机与直觉层

  1. “评测”的两层含义是什么?各举三个维度。
  2. 人工评分为什么是金标准?它的三个问题是什么?
  3. 为什么说两位评委一致率不高,不代表他们都不行?
  4. 静态基准和动态排行榜(如 Chatbot Arena)各有什么优缺点?
  5. 什么是 Goodhart 定律?在基准测试上它以哪几种形式出现?

推导与计算层

  1. 推出 Cohen’s κ。举一个一致率 0.9 但 κ 很低的例子,并解释为什么 κ 是对的。
  2. 50 道题、准确率 0.8,标准误和 95% 区间是多少?要分辨 5 个百分点的差距大约要多少道题?
  3. 为什么在同一批题上比较两个系统更有统计功效?写出 McNemar 检验在检验什么。
  4. 试了 50 个提示、挑最好的一个报告,为什么分数会偏高?偏高多少取决于什么?
  5. 写出 BLEU 的公式,说明截断计数和简短惩罚各防的是什么。

工程层

  1. 为什么 ROUGE 不适合评估开放式生成?用中文算 ROUGE 有什么坑?
  2. 怎么设计一个能防止数据污染的内部基准?(至少四条)
  3. 同一个模型在 MMLU 上,你测的分数和官方报告差了 5 个点,可能是哪些原因?
  4. 你的 RAG 系统改了一个参数,黄金集上的准确率从 0.78 升到 0.82(50 道题)。你会怎么判断这个提升是真的?

出关标准

  • 能说清评测的两层含义和方法谱系,以及人工评分的地位与问题
  • 能推出 Cohen’s κ,解释 κ 悖论和评分者之间一致性的上限
  • 能算出一个准确率的标准误和置信区间,说出为什么要配对比较、为什么不能在测试集上调参
  • 能说出四类基准各测什么、怎么判分,以及 pass^k 与 pass@k 的区别
  • 能设计一个防污染的内部测试集,说出 n-gram 检测的局限
  • 能解释 BLEU / ROUGE / METEOR 的设计,以及它们为什么在开放式生成上失效
  • 用 --retrieval-test 检验了前几天至少三个比较的显著性

疑问清单

← 返回课程目录