人工智能实践(语言智能)
第1讲:经典 NLP 任务

1.6 评估方法

BLEU、ROUGE、METEOR、chrF、BERTScore、COMET、Perplexity——为什么字面指标衡量不到意义,以及通往人工评估与 LLM-as-Judge 的必然路径

评估比你想象的更难

很多研究生的直觉是:"评估不就是算个准确率吗?" 对分类任务确实如此——上一节给的 Accuracy / F1 公式就够了。但对生成任务,评估的难度本身就是一个未解的研究问题:

给一段原文,翻译成英文。"The cat sat on the mat." 和 "A cat was on the mat." 哪个更好?两句几乎同义,但字面重合度不到一半。

经典自动评估指标的核心限制——它们本质上衡量的是字面重合度(n-gram overlap),而不是语义一致性。理解这些指标的"衡量什么"和"衡量不到什么",是一切 LLM 评估工作的第一堂课。


生成指标:从字面到语义的三代演化

第一代:基于 n-gram 的字面指标

BLEU(Bilingual Evaluation Understudy)

机器翻译的奠基指标(Papineni et al., 2002)。核心:候选译文与参考译文的 n-gram 精确率

BLEU=BPexp(n=1Nwnlogpn)\text{BLEU} = BP \cdot \exp\left(\sum_{n=1}^{N} w_n \log p_n\right)

其中:

  • pnp_n:n-gram 精确率(候选中的 n-gram 有多少在参考中出现过)
  • wn=1/Nw_n = 1/N:通常 N=4,均匀加权
  • BPBP(Brevity Penalty):长度惩罚,防止模型通过输出短句作弊

致命缺陷

  • 只看精确率不看召回率(靠 BP 部分弥补)
  • 同义词无能为力:"happy" vs "joyful" 算完全不匹配
  • 单句级别和人工评估相关性低,适合语料级评估

ROUGE(Recall-Oriented Understudy for Gisting Evaluation)

摘要的标准指标。BLEU 看精确率,ROUGE 反过来看召回率。

  • ROUGE-1:unigram 召回率
  • ROUGE-2:bigram 召回率
  • ROUGE-L:最长公共子序列(LCS)长度的 F1
ROUGE-L=(1+β2)PlcsRlcsRlcs+β2Plcs\text{ROUGE-L} = \frac{(1 + \beta^2) \cdot P_{\text{lcs}} \cdot R_{\text{lcs}}}{R_{\text{lcs}} + \beta^2 P_{\text{lcs}}}

ROUGE 同样只看字面。对抽取式摘要比较合理,对生成式摘要经常低估好的改写。

METEOR

引入同义词匹配(基于 WordNet)和词干还原(stemming),在 unigram 匹配基础上考虑同义。

chrF(character-F-score)

字符 n-gram而非词 n-gram 上算 F-score。对形态丰富语言(德语、俄语、中文)更鲁棒,现代 MT 评估常和 BLEU 一起报。

第二代:基于 embedding 的语义指标

BERTScore

用 BERT 对候选和参考的每个 token 算上下文化向量,然后做token 级的余弦相似度匹配

BERTScore-R=1yyjymaxy^iy^cos(hj,h^i)\text{BERTScore-R} = \frac{1}{|y|} \sum_{y_j \in y} \max_{\hat{y}_i \in \hat{y}} \cos(\mathbf{h}_j, \hat{\mathbf{h}}_i)

能捕捉同义词、改写、不同语序。是 2020 年以来 NLG 论文的标配副指标。

第三代:学习的评估器

COMET、BLEURT

把评估本身建模为回归任务:在大量人工标注的"候选、参考、人工评分"数据上训练一个神经网络,输入候选+参考(+ 源文本),输出一个分数。

  • COMET 在 WMT 机器翻译评估任务上与人工评分的相关性显著超过 BLEU、ROUGE、BERTScore
  • 代价:需要大规模人工标注数据才能训练

LLM-as-Judge

直接让 GPT-4 / Claude 当评委打分。第 8 讲专门讲。


经典指标对比表

指标关注点粒度是否捕捉语义典型任务
BLEUn-gram 精确率机器翻译
ROUGE-1/2/Ln-gram 召回率 / LCS摘要
METEOR含同义词的 F1翻译、摘要
chrF字符 n-gram F1字符多语言 MT
BERTScore上下文 embedding 匹配token生成任务通用副指标
COMET监督学习的打分器最强WMT 翻译评估标准

语言模型评估:Perplexity

对语言模型本身(不是下游任务)的内在评估用 Perplexity(困惑度,PPL)

PPL(D)=exp(1Ni=1NlogPθ(xix<i))\text{PPL}(D) = \exp\left(-\frac{1}{N} \sum_{i=1}^N \log P_\theta(x_i | x_{<i})\right)

直观:PPL=k\text{PPL} = k 意味着模型在每一步平均要在 kk 个 token 中"犹豫"。越小越好。

Perplexity 的能与不能

  • :衡量"语言模型在该语料上有多流畅",比较同架构不同参数的模型
  • 不能:比较不同 tokenizer 的模型(tokenizer 不同 PPL 不可比)、衡量下游任务能力
  • 陷阱:低 PPL 不等于回答正确,甚至不等于有用——早期 GPT-3 在 Common Crawl 上 PPL 很低,但在指令跟随、事实问答上仍然很差

为什么字面指标"不衡量意义"

考虑一个场景:一个优秀的翻译模型输出:"这只猫坐在垫子上";参考译文是:"那只猫坐在毯子上"。

  • 从语义上看:几乎正确,只是指代和名词的细微差异
  • 从 BLEU 看:unigram 匹配 3/6,bigram 匹配 1/5,分数会相当难看
  • 从 BERTScore 看:会给一个相对高的分数,因为 embedding 捕捉到了近义

三个指标会给三个差距不小的分数,但谁最接近人类判断?

答案是:没有一个能完全替代人类。BLEU / ROUGE 会惩罚正确的改写;BERTScore / COMET 会掩盖事实性错误(模型输出语义相近但事实错误,embedding 仍然高)。任何一个严肃的评估报告都应该同时报告多个指标 + 关键样本的人工评估


人工评估与 LLM-as-Judge 的铺垫

人工评估的黄金标准

真实场景的人工评估通常用成对比较(pairwise comparison)

  • 给标注员展示两个模型的输出 A 和 B(不告诉哪个是哪个)
  • 标注员选择哪个更好,或标注为"同样好"
  • 多个标注员交叉核对,用 Cohen's Kappa 或 Fleiss' Kappa 衡量一致性

成对比较比"给每个输出打 1-5 分"更稳定——人类对"谁更好"比对"绝对分数"的判断准得多。

LLM-as-Judge:把 GPT-4 当标注员

2023 年以来的新范式:直接让 GPT-4 / Claude 来扮演标注员,做成对比较或打分。

优势:

  • 成本远低于人工(约 1/100 的价格)
  • 可扩展性远高(一夜评估 10 万条)
  • 在很多维度上与人工评分相关性 > 0.8

挑战:

  • 位置偏差:LLM 倾向于偏好先给的那个
  • 长度偏差:LLM 倾向于偏好更长的回复
  • 风格偏差:LLM 倾向于偏好与自己风格一致的回复

LLM-as-Judge 是第 8 讲的核心主题。这里你需要理解的是:BLEU / ROUGE 再精巧,也无法替代"两个更懂语言的智能体在对比"这件事。从 2002 年 BLEU 诞生到 2023 年 LLM-as-Judge 崛起,NLP 评估走过了整整 20 年。


评估设计的实用建议

多指标 + 不同家族

永远不要只报一个指标。典型组合:BLEU + chrF + COMET(翻译),ROUGE + BERTScore(摘要)。多指标能揭露单指标的偏好。

报告置信区间

自动指标看似精确,但小数据上抖动很大。bootstrap 1000 次计算 95% 置信区间——差距 0.3 BLEU 在 200 样本测试集上往往统计上不显著。

保留人工评估小样本

哪怕只有 50 条由人工标注的成对比较,也能帮你识别自动指标的系统性偏差。

定性分析

看 20-30 个 bad case,归类模型失误的类型(重复、幻觉、指代错误、长尾词漏翻)。这比任何一个数字都更能指导改进方向。


本节小结

指标家族代表核心思想局限
第一代 n-gramBLEU、ROUGE、chrF字面重合度不懂同义、改写
第二代 embeddingBERTScore上下文向量匹配可能掩盖事实错误
第三代 learnedCOMET、BLEURT从人工标注学评估需大规模标注数据
语言模型内在Perplexity平均预测难度不等于下游任务能力
成对比较人工 A/B、LLM-as-Judge人类判断或 LLM 判断人力成本、LLM 偏差

核心原则:字面指标"精确但失真",语义指标"更准但昂贵",人工/LLM-as-Judge"最准但成本高"——根据任务和预算组合使用,永远不要信一个数字。