时长 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 的问题:“如果评分完全是掷骰子呢?“两个人各自随机打分,也会有一部分碰巧一致。我们要问的是:一致性比”碰巧”好了多少?
推导:设两位评分者给 个样本打 类标签。
- 观察到的一致率 (混淆矩阵对角线之和)。
- “碰巧一致”的概率 :假设两人各自按自己使用各类别的比例独立地打分,两人同时打 的概率是 ,所以 。
- 一致性比碰巧好了 ;最多能比碰巧好 。两者之比就是 Cohen’s κ(Cohen 1960):
完全一致; 和碰巧一样; 比碰巧还差(系统性地意见相反)。
w4day5_checks.py 第 1 组:60 个回答,两位评分者把”有用程度”分为低、中、高:
评分者 2:低 中 高
评分者 1:低 20 5 0
中 3 15 2
高 1 4 10
;;。
2.3 κ 的悖论与解读
同样的一致率,κ 可以相差很大。第 1 组的两张表,一致率都是 0.90:
| 类别均衡(50 / 50) | 0.90 | 0.500 | 0.800 |
| 类别极不均衡(93% 是”通过”) | 0.90 | 0.870 | 0.232 |
当几乎所有样本都属于同一类时,两人都说”通过”本身就很容易,碰巧一致率高达 0.87,κ 把这部分扣掉了。这不是 κ 的缺陷:第二张表里,两人各标了 7 个”不通过”,只有 2 个重合,对真正要紧的少数样本几乎从不一致。高一致率掩盖了这一点,κ 揭示了它。报告 κ 时,一起报告 和类别分布。
怎么解读 κ 的大小:常用的是 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):每个样本由 位评分者打分(不要求是同一批人)。 是”第 个样本上随机抽两位评分者,两人一致”的概率,对样本平均得 ;。。第 1 组:5 位评分者、3 个类别、每人 80% 的时间给出正确标签,Fleiss’ κ = 0.643,和两两 Cohen’s κ 的平均(0.643)一致。
- Krippendorff’s α:更一般,允许缺失的评分、有序或连续的标签(比如 1–5 分,“4 和 5 的分歧”比”1 和 5 的分歧”小)。
2.5 一致性的上限:评分者之间 vs 评分者与真相
第 1 组的另一个实验:两位评分者各自以准确率 给出正确的二分类标签(错的时候随机选),它们之间的 κ 是多少?
| 每人的准确率 | 两人一致率 | κ | 理论值 |
|---|---|---|---|
| 0.7 | 0.579 | 0.158 | 0.160 |
| 0.8 | 0.679 | 0.358 | 0.360 |
| 0.9 | 0.821 | 0.643 | 0.640 |
每人 80% 准确,彼此的一致率只有 0.68、κ 只有 0.36。评分者之间的一致性比”每人对真相的准确率”低得多,因为两个人的错误不会恰好错在一起。两个评委(人或 LLM)一致率不高,不代表他们都不行。这和 Week 3 Day 2 §2.4 奖励模型的准确率天花板是同一件事:标注本身有噪声时,任何模型预测标注的准确率都有上限。
§3 一个分数有多可信
3.1 抽样误差
测到的准确率是一个估计。 道题、真实准确率 ,它的标准误是 ,95% 置信区间约 倍标准误。第 2 组:
| 题数 | :标准误 / 95% 半宽 | 能分辨的最小差距(,不配对,功效 80%) |
|---|---|---|
| 50(我们的黄金集) | 0.057 / ±0.111 | 0.280 |
| 500 | 0.018 / ±0.035 | 0.089 |
| 1,319(GSM8K 测试集) | 0.011 / ±0.022 | 0.055 |
| 14,042(MMLU 测试集) | 0.003 / ±0.007 | 0.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% 的把握)约为 ,随 缩小:题目加 4 倍,分辨力才提高 1 倍。
小样本时用 Wilson 区间:教科书的 在 小、 接近 0 或 1 时很不准(50 道全对时区间宽度为 0,显然不对)。Wilson 区间把检验”反过来解”,小样本下更可靠。参考代码的 wilson_interval(50, 50) 给出 [0.929, 1.000]。
另一个误差来源:采样的随机性。温度大于 0 时同一个模型跑两次,分数就不同。要跑几个种子,报告均值和标准差;或者用温度 0(但温度 0 也不保证完全确定,见 Week 2 Day 3 §A.3)。
3.2 配对比较
比较两个系统时,让它们做同一批题。题目有难有易,难题两个系统都容易错。配对比较只看两者结果不同的题: = A 对 B 错的题数, = A 错 B 对的题数。差值的标准误约为 ,通常比不配对的 小。
McNemar 检验:在”两者一样好”的假设下,这 道分歧题里 A 赢的次数服从 ,由此得到精确的 p 值。配对 bootstrap:对逐题的差值有放回地重抽,得到差值的置信区间;它也适用于连续分数(NDCG、评委打分)。
第 3 组:1000 道题,难度 ,给定难度后两个模型各自独立答题,A 答对的概率 ,B 是 (真实差距约 3.4 个百分点)。400 次重复实验,在 5% 显著性下检测出差异的比例:
| 统计功效 | |
|---|---|
| 配对(同一批题,McNemar) | 0.59 |
| 不配对(B 在另一批题上测) | 0.34 |
不用多标一道题,功效就高出一截。两个系统越相似(同一个模型换提示、同一个检索器换参数),分歧题越少,配对的优势越大。单次实验里 b + c = 103 + 126 = 229 道分歧题,McNemar p = 0.146:即使真实差距存在,一次实验也可能测不出来,这就是”功效 0.59”的含义。
反面:拿别人论文里报告的分数,和自己在另一批题(或另一种提示格式、另一个版本的评测脚本)上测的分数直接比,是最不可靠的比较。
3.3 胜者的诅咒
场景:你试了 个提示词(或检查点、超参组合),在同一个测试集上各测一次,挑分数最高的那个报告。
问题:即使这 个候选其实一样好,挑出来的”最高分”也会系统性地偏高。每个候选的测量值是”真实水平 + 噪声”,你挑中的是噪声恰好最大的那一个。第 4 组:500 道题,所有候选的真实准确率都是 0.70(标准误 0.0205):
| 候选数 | 报告的最高分 | 在新测试集上重测 | 高估 |
|---|---|---|---|
| 1 | 0.7001 | 0.6997 | +0.0004 |
| 5 | 0.7243 | 0.7005 | +0.024 |
| 50 | 0.7459 | 0.7004 | +0.046 |
| 200 | 0.7553 | 0.7003 | +0.055 |
试了 50 种提示、挑最好的一个报告,平均高估约 4.6 个百分点,而它们其实一样好。这就是”不要在测试集上调参”的数学:调参用单独的开发集,测试集只在最后测一次。Day 2 §A.4 提醒过:我们在黄金集上扫了 RRF 的 、块大小、融合方式,报告的最优值就带着这种偏差。
放大到整个领域:所有人都在同一个公开基准上迭代、只发表涨分的结果,基准分数就会系统性地偏乐观。这是 §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 + 面包屑 | 0 | 14 | 0.0001 | +0.280 [+0.160, +0.400] |
| BM25 → BM25 + 面包屑 | 0 | 15 | 0.0001 | +0.300 [+0.180, +0.440] |
| BM25 + 面包屑 → LSA + 面包屑 | 2 | 1 | 1.000 | −0.020 [−0.080, +0.040] |
| LSA + 面包屑 → 混合 RRF | 1 | 0 | 1.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):” 次尝试全部成功的概率”,衡量一致性与可靠性。它报告:最强的函数调用智能体在它的任务上成功率不到 50%,零售场景的 pass^8 不到 25%。
pass@k 和 pass^k 的选择:有验证器、能多试几次挑一个(写代码跑测试)时看 pass@k;要可靠地服务每一个用户(客服、订票)时看 pass^k。参考代码的 pass_at_k、pass_hat_k 都是无偏估计(采 次、成功 次)。
4.3 自建测试集
公开基准测的是通用能力;你的应用要的是你的任务上的表现。学习计划的动手任务是”手工造 50 条黄金问答”,我们的 w4_golden.py 就是一个例子。一个好的内部测试集:
- 答案唯一、能在语料里找到:每道题都写明答案在哪一节(
refs)和标准答案(a)。答案模糊的题,评委和人都判不准。 - 问法和原文用词不同:否则你测的是”关键词匹配”,不是”理解”。
--leakage检查了黄金集和讲义原文的字符重叠(§4.4)。 - 覆盖真实的分布:不同的周和主题(我们的 50 题:Week 0 9 道、Week 1 14 道、Week 2 15 道、Week 3 12 道),不同的难度,包括不该回答的问题(资料里没有答案时,系统应该说”没找到”)。
- 足够大:用 §3.1 倒推。想分辨 5 个百分点的差距,配对设计下也要几百道题;50 道题只够发现大的差别(比如面包屑)。
- 分成开发集和测试集:调参只用开发集(§3.3)。
- 版本化、可追溯:题目改了,旧的分数就不能和新的比;记下每个分数是在哪个版本上测的。
- 从真实失败里补充:上线之后,把用户遇到的失败案例加进来。测试集是会生长的。
4.4 数据污染
问题(Lecture 8):基准的题目或答案出现在了模型的训练数据里。模型可能是”背下了答案”而不是”会做”。
它能抬高多少(第 5 组):测试集里比例 的题被背下了(总能答对),其余部分的真实准确率 ,测到的准确率是 。污染 20% 就高估 8 个百分点。
怎么检测:看测试题和训练语料有没有长的相同片段(GPT-3 论文用 13-gram)。第 5 组:原样复制一定被抓住;但如果训练数据里的是改写版(每个 token 以概率 被换掉),一个 13-gram 完整保留的概率是 :
| 改写比例 | 单个 13-gram 保留 | 一道 60 token 的题被检测出来 |
|---|---|---|
| 0 | 1.000 | 1.000 |
| 0.1 | 0.254 | 0.924 |
| 0.2 | 0.055 | 0.489 |
| 0.3 | 0.010 | 0.133 |
改写 20% 的词,只有约一半能被抓到;改写 30% 以上,n-gram 检测基本失效。而模型见过改写版,一样能”学会”答案。
n-gram 的阈值要和分词方式一起定:--leakage 用字符 n-gram 检查我们的黄金集和讲义原文。6 个字符时 43/50 道题有重叠(只是共享了术语和常用搭配);13 个字符时还有 7 道,但其中大多数是很长的英文术语本身(FlashAttention、PagedAttention 都超过 13 个字符),真正和原文共享一个中文短语的只有两三道(“在什么条件下能提高准确率?”)。命中了要人工看一眼,不要只看比例。
Lecture 8 列出的三条预防措施:
- 给基准加一个标识符(比如 BIG-bench 的”金丝雀字符串”,一个唯一的 GUID):让训练数据的清洗流程能识别并剔除含有它的文档。前提是清洗的人愿意这么做。
- 给调用工具的智能体加黑名单:智能体能上网时,它可能直接搜到基准的答案。Gemini 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)为机器翻译设计,是一个精确率:候选里的 元组有多少出现在参考里。三个设计,每一个都在堵一个漏洞:
- 截断计数:候选里一个 元组出现的次数,最多只算它在参考里出现的最多次数。否则 “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 组)。
- 1 到 4 元的几何平均:1 元组管”用词对不对”,更长的管”语序和流畅度”。几何平均意味着任何一阶为零,整体就是零。
- 简短惩罚 (候选长度 小于参考长度 时):精确率不惩罚”少说”,只输出 “the cat” 两个词的 1、2 元精确率都是 1,但 BP = 。
BLEU 本来是语料级的:把所有句子的截断匹配数、总数、长度加起来再算一次(参考代码的 corpus_bleu)。句子级 BLEU 很不稳定,短句子里 4 元组全不匹配就是 0,要加平滑。
5.2 ROUGE
ROUGE(Recall-Oriented Understudy for Gisting Evaluation,Lin 2004)为摘要设计,是一个召回率:参考里的内容,候选覆盖了多少。它是一族指标:
- ROUGE-N:参考里的 元组,有多少出现在候选里。
- ROUGE-L:基于最长公共子序列(LCS,不要求连续,但要求顺序一致)的 F 值:,。它不需要预先指定 ,自然地奖励”大体顺序一致”。
5.3 METEOR
METEOR(Banerjee & Lavie 2005)想修 BLEU 的几个问题:只看精确率、只认字面。它先在候选和参考之间做单词对齐(精确匹配,然后是词干相同,然后是同义词),再算一个偏重召回的调和平均 ,最后乘一个碎片惩罚 :匹配的词如果散成很多不连续的块,说明语序乱了。参考代码的 meteor_exact 只做精确匹配。
5.4 为什么在开放式生成上失效
Lecture 8 列出三个局限。第 6 组用它的泰迪熊例句演示了前两个。参考:“A plush teddy bear can comfort a child during bedtime.”
| 候选 | BLEU(平滑) | ROUGE-1 | ROUGE-L | METEOR |
|---|---|---|---|---|
| 同义改写 1:“Soft stuffed bears often help kids feel safe as they fall asleep.” | 0.000 | 0.000 | 0.000 | 0.000 |
| 同义改写 2:“Many youngsters rest more easily at night when they cuddle a gentle toy companion.” | 0.076 | 0.100 | 0.083 | 0.048 |
| 意思相反:“A plush teddy bear cannot comfort a child during bedtime.” | 0.700 | 0.900 | 0.900 | 0.895 |
- 不考虑风格和措辞的变化:两个意思完全正确的改写几乎得零分;把 can 改成 cannot、意思完全相反的句子接近满分。重叠指标度量的是”用词像不像参考答案”,而开放式生成的好答案可以有无数种说法。
- 和人的判断相关性不高:这是上面这个现象在大量样本上的统计表现。
- 仍然需要人写参考答案:没有省掉人工,只是把人工挪到了前面。
中文有一个额外的坑: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 实操
- 跑通
w4day5_checks.py,7 组结论都看懂。第 3 组把难度的标准差从 3 改成 1(题目难度更接近),看配对的优势怎么变;第 4 组算一算:你在 Day 2 扫了多少种配置? - 推导(1h,纸笔):(a) Cohen’s κ 的定义,手算第 1 组的两张悖论表;(b) 评分者准确率为 时两人的 κ 为什么是 (二分类、类别均衡);(c) 标准误与”能分辨的最小差距”;(d) BLEU 的三个设计各堵了什么漏洞。
- 检验前几天的结论(1h):
python code/w4d5_metrics.py --retrieval-test,复现 §3.4 的表。把你在 Day 1、Day 2 做过的其他比较(块大小、ICT 的三个种子、RRF 的 )也逐题拿出来检验。哪些”结论”其实不成立? - 看一眼规则指标的坑(30min):
--demo和--leakage。自己写三个候选(照抄、改写、意思相反),用bleu、rouge算一遍。 - 设计你的测试集(1h):按 §4.3 的七条,给你自己的 RAG 项目写一份测试集的设计说明:多少题、怎么出、覆盖哪些情况、怎么防泄漏、怎么分开发集和测试集。如果打算扩充
w4_golden.py,至少补 10 道”资料里没有答案”的题。 - 读论文:Papineni et al. 2002(BLEU)的第 2 节;τ-bench(Yao et al. 2024)关于 pass^k 的部分;挑读 SWE-bench 的数据构造部分。
参考实现:code/w4d5_metrics.py。
§C 自测
动机与直觉层
- “评测”的两层含义是什么?各举三个维度。
- 人工评分为什么是金标准?它的三个问题是什么?
- 为什么说两位评委一致率不高,不代表他们都不行?
- 静态基准和动态排行榜(如 Chatbot Arena)各有什么优缺点?
- 什么是 Goodhart 定律?在基准测试上它以哪几种形式出现?
推导与计算层
- 推出 Cohen’s κ。举一个一致率 0.9 但 κ 很低的例子,并解释为什么 κ 是对的。
- 50 道题、准确率 0.8,标准误和 95% 区间是多少?要分辨 5 个百分点的差距大约要多少道题?
- 为什么在同一批题上比较两个系统更有统计功效?写出 McNemar 检验在检验什么。
- 试了 50 个提示、挑最好的一个报告,为什么分数会偏高?偏高多少取决于什么?
- 写出 BLEU 的公式,说明截断计数和简短惩罚各防的是什么。
工程层
- 为什么 ROUGE 不适合评估开放式生成?用中文算 ROUGE 有什么坑?
- 怎么设计一个能防止数据污染的内部基准?(至少四条)
- 同一个模型在 MMLU 上,你测的分数和官方报告差了 5 个点,可能是哪些原因?
- 你的 RAG 系统改了一个参数,黄金集上的准确率从 0.78 升到 0.82(50 道题)。你会怎么判断这个提升是真的?
出关标准
- 能说清评测的两层含义和方法谱系,以及人工评分的地位与问题
- 能推出 Cohen’s κ,解释 κ 悖论和评分者之间一致性的上限
- 能算出一个准确率的标准误和置信区间,说出为什么要配对比较、为什么不能在测试集上调参
- 能说出四类基准各测什么、怎么判分,以及 pass^k 与 pass@k 的区别
- 能设计一个防污染的内部测试集,说出 n-gram 检测的局限
- 能解释 BLEU / ROUGE / METEOR 的设计,以及它们为什么在开放式生成上失效
- 用
--retrieval-test检验了前几天至少三个比较的显著性