模型评估指标:困惑度、BLEU、ROUGE 与人类评估怎么用

训练一个模型只是第一步,能不能用它、好不好用,要靠评估指标来说话。本文系统梳理自然语言处理与生成式 AI 中最常用的几类指标:困惑度、BLEU、ROUGE、检索指标,以及人类评估与 LLM-as-Judge,并给出按任务选指标的清单和常见陷阱。

为什么要评估

没有度量,就没有改进。评估至少解决三件事:

第一,量化进展。只有通过可重复的数字,才能判断一次改动是变好还是变坏,避免凭感觉调参。

第二,横向对比。同一个任务上,不同模型、不同提示词、不同配置孰优孰劣,需要一个共同标尺。

第三,对齐目标。指标不只是数字,它定义了「什么是好」。选错指标,团队就会朝着错误的方向优化。

要特别注意:不同任务该用不同指标。机器翻译看译文像不像人话,摘要看有没有覆盖要点,检索看有没有把对的文档排到前面,开放生成看有没有说真话、有没有用。把翻译指标硬套到检索上,结论会完全失真。

语言模型困惑度(Perplexity)

困惑度衡量语言模型对测试文本的「意外程度」。直观理解:模型每预测下一个词时,平均要在多少个等可能候选里纠结。候选越多,说明模型越没把握,困惑度越高。

数学上,困惑度是平均交叉熵的指数:

Perplexity = exp( 平均交叉熵 )
            = 2^( 平均比特数 )

它等价于测试集上概率的几何平均的倒数。越低越好:困惑度越低,模型对语言规律掌握得越扎实。

局限要记牢:

  • 与真实任务弱相关。困惑度低的模型,翻译成品不一定更好,回答不一定更有用。它只反映「像不像训练语料的统计分布」,不反映事实正确性或用户满意度。
  • 依赖分词。不同 tokenizer 算出的困惑度不直接可比,中英文、BPE 与 WordPiece 之间尤其要小心。
  • 可被「刷分」。模型只要更保守、更套话,困惑度就能降下来,但表达反而更空洞。
  • 不区分好坏内容。一句通顺的谣言和一句通顺的常识,在困惑度上可能几乎一样。

所以困惑度适合做预训练或语言建模阶段的「健康体检」,不适合作为最终上线指标。有研究报道,主流大模型在公开语料上的困惑度可低至 待核实 量级,但具体数值强烈依赖评测集与分词方式,引用前务必复核原始实验设置。

机器翻译与摘要:BLEU 与 ROUGE

翻译和摘要都属于「生成一段文本,且存在参考答案」的任务,最经典的两套自动指标是 BLEU 和 ROUGE。

BLEU:精确率导向

BLEU(Bilingual Evaluation Understudy)由 Papineni 等人在 2002 年提出,最初用于机器翻译的自动评测。它的核心思想是比较「候选译文」与「参考译文」之间的 n-gram 重合程度,再用简短惩罚(brevity penalty)防止模型靠写短句刷分。

计算过程分两步:

  1. 修正的 n-gram 精确率。对候选里的每个 n-gram(通常取 1 到 4 元),把它在参考中出现的最多次数「截断」(clip),再除以候选里该 n-gram 的总次数。这样候选重复同一个词也不会虚高。
  2. 简短惩罚。如果候选比参考短,施加惩罚:
BP = exp(1 - r/c),当 c < r 时;否则 BP = 1
其中 c 是候选长度,r 是匹配到的参考有效长度

最终 BLEU 是各阶 n-gram 精确率的几何平均乘上 BP,取值通常在 0 到 1 之间(工程上常乘 100 写成 0 到 100 的百分制),越高越好。

下面是用 sacrebleu 计算语料级 BLEU 的示例:

from sacrebleu.metrics import BLEU

candidate = "the cat sat on the mat"
references = ["the cat is on the mat"]

bleu = BLEU()
score = bleu.corpus_score([candidate], [[references]])
print(score.score)  # 0 到 100 的 BLEU 值,越高越好

BLEU 的局限:它只看 n-gram 表面的重合,对同义改写、语序调整不敏感;偏重精确率,召回靠参考覆盖;单句层面噪声很大,更适合在语料级使用;而且需要多条参考译文才稳。BLEU 达到人类水平通常对应 待核实 区间,但「分数高」不等于「读起来自然」。

ROUGE:召回导向

ROUGE(Recall-Oriented Understudy for Gisting Evaluation)由 Chin-Yew Lin 在 2004 年提出,最初面向自动摘要评测。与 BLEU 相反,它从「参考里有多少被系统输出覆盖」出发,是召回导向的。

常用变体:

  • ROUGE-N:n-gram 召回率,最常用 ROUGE-1(词级)和 ROUGE-2(二元组级)。
  • ROUGE-L:基于最长公共子序列(LCS)的 F 值,能捕捉词序上的整体重叠。
  • ROUGE-W:带权重的最长公共子序列,对连续匹配更友好。
  • ROUGE-S:基于跳跃二元组(skip-bigram)的重叠,允许中间隔词。

ROUGE 取值同样在 0 到 1 之间(常用百分制),越高代表系统输出越完整地覆盖了参考要点,因此特别适合摘要、关键词抽取这类「别漏重点」的任务。

from rouge_score import rouge_scorer

scorer = rouge_scorer.RougeScorer(["rouge1", "rouge2", "rougeL"], use_stemmer=True)
scores = scorer.score("猫坐在垫子上", "猫在垫子上")
print(scores["rougeL"].fmeasure)  # 0 到 1,越高越好

一句话区分:BLEU 关心「你说的有没有说对词」,ROUGE 关心「该说的重点你说了没有」。两者都只比字面重叠,都不懂语义。

嵌入与检索:准确率@K、Recall、MRR、NDCG

当任务从「生成」变成「从一堆里挑出对的几个」,要用检索类指标。这常见于向量数据库、RAG 召回、推荐系统。

  • 准确率@K / 命中率@K(Accuracy@K、Hit@K):前 K 个结果里只要出现至少一个相关项就算命中。最直白,但不关心排第几。
  • 召回率@K(Recall@K):所有相关项里,有多少比例出现在前 K 个。衡量「漏没漏」。
  • 平均倒数排名(MRR,Mean Reciprocal Rank):对每个查询,取第一个相关结果排名的倒数,再对所有查询求平均。关心「第一个对的排得多靠前」。
  • 归一化折损累计增益(NDCG,Normalized Discounted Cumulative Gain):考虑分级相关性(比如相关度 0 到 3)和位置折扣,越靠前、越相关的项权重越大。是检索里最全面的指标之一。

NDCG 的计算示意:

import math

def dcg(relevances):
    return sum((2 ** r - 1) / math.log2(i + 2) for i, r in enumerate(relevances))

def ndcg(relevances):
    ideal = sorted(relevances, reverse=True)
    idcg = dcg(ideal)
    return dcg(relevances) / idcg if idcg > 0 else 0.0

ranking = [3, 2, 0, 1, 3]  # 模型返回的前 5 个文档的相关度(0 到 3 分级)
print(ndcg(ranking))  # 越接近 1 越好

选型上:只要「有没有命中」看 Hit@K;关心「覆盖全不全」看 Recall@K;关心「第一个对的排多前」看 MRR;既要分级相关又要位置加权,看 NDCG。具体 K 取多少(10 还是 100)取决于产品里用户实际会翻几屏。

生成质量:人类评估、LLM-as-Judge 与事实一致性

自动指标再方便,也逃不开一个根本问题:生成内容到底好不好?这里有三层手段。

人类评估

最可靠的标尺。通常让标注者就若干维度打分,例如流畅度(读不读得通)、充分性/忠实度(有没有准确传达信息)、事实一致性(有没有编造)。常用李克特量表(如 1 到 5 分),并报告标注者间一致性,例如 Cohen’s Kappa 或 Krippendorff’s Alpha,一致性低说明任务或标准本身模糊。

人类评估的代价是高成本、低吞吐,所以一般只在关键节点(上线前、赛后复核)抽样做。

LLM-as-Judge

用一个强模型当裁判,给待评输出打分或排序。它便宜、可规模化,能和「提示词评测」形成呼应:你设计的评分提示词(rubric)直接决定了裁判的口径,提示词越清晰,裁判越稳定。实践中要注意:

  • 位置偏差:两个答案互换前后,裁判可能改判,需做双向对比或随机化顺序。
  • 冗长偏差:裁判偏好更长更「像样」的答案,哪怕更啰嗦。
  • 自我偏好:裁判偏爱和它自己风格相近的答案。
  • 缺乏真值:裁判没有外部事实来源,可能顺着错误答案自圆其说。

缓解办法包括:给出明确评分量规、提供参考答案做对照、多个裁判交叉、以及用人类抽样做校准。LLM-as-Judge 适合做大规模的初筛与排序,但最终结论仍要有人工抽检兜底。

事实一致性

这是生成式系统最该盯住的一项:输出有没有忠实于给定素材或事实,有没有幻觉。常用做法是把「生成内容」与「来源/知识」拆成事实单元,再做对齐检查,例如用自然语言推理判断是否矛盾,或用问答式校验(根据来源能否推出该陈述)。事实一致性差,前面所有流畅度指标都失去意义。

选型建议:按任务选指标,避开陷阱

给一张速查清单:

  • 语言建模 / 预训练健康度:困惑度(辅助,不单独决策)。
  • 机器翻译:BLEU 为主,配合人工流畅度与充分性。
  • 摘要:ROUGE(尤其 ROUGE-L、ROUGE-1/2)为主,配合事实一致性检查。
  • 检索 / RAG 召回:Hit@K、Recall@K、MRR、NDCG 组合看。
  • 文本分类:准确率、精确率、召回率、F1、AUC。
  • 开放生成:人类评估加 LLM-as-Judge 加事实一致性,自动 n-gram 指标仅作参考。

常见陷阱:

  • 指标高但体验差。BLEU 高却生硬、NDCG 高但用户仍找不到想要的东西,说明指标和真实目标错位。
  • 刷分博弈。为迎合指标而投机(写短句、堆套话、过度保守),指标涨了能力没涨。
  • 指标与任务不匹配。把翻译指标套到检索,或把分类准确率套到开放生成,都会得出误导性结论。
  • 只看均值不看分布。平均分漂亮,但长尾样本一塌糊涂,上线后投诉集中爆发。
  • 忽视人工校准。自动指标跑得再顺,也要周期性用人类评估验证它还在代表真实质量。

小结

评估的本质是「用数字定义什么是好」。困惑度适合给语言模型做底层体检,BLEU 和 ROUGE 分别用精确率与召回的视角比对字面重叠,检索任务要靠 @K、MRR、NDCG 看排序质量,而生成质量最终要落回人类评估、LLM-as-Judge 与事实一致性。记住两条红线:指标必须和任务目标对齐,且永远用人工抽检为自动指标兜底。

参考与延伸阅读

  • Papineni, K., Roukos, S., Ward, T., Zhu, W. (2002). BLEU: a Method for Automatic Evaluation of Machine Translation. Proceedings of ACL 2002, pp. 311-318. DOI: 10.3115/1073083.1073135。来源:ACL Anthology P02-1040。已核验(经 ACL Anthology 核对作者、会议、年份、页码与 DOI)。
  • Lin, C.-Y. (2004). ROUGE: A Package for Automatic Evaluation of Summaries. Text Summarization Branches Out, pp. 74-81, Barcelona, ACL 2004。来源:ACL Anthology W04-1013。已核验(经 ACL Anthology 核对作者、年份、页码与变体 ROUGE-N/L/W/S)。
  • 关于用户建议核验的 arXiv:cs/0206025:经核验该编号对应的是「模糊区间格」论文(Kehagias, 2002),并非 BLEU 原始论文。BLEU 原始来源以上述 ACL 2002 论文为准。已核验(更正)。
  • 困惑度的定义与局限、MRR 与 NDCG 的计算口径,属教材级共识,具体公式细节待核实(建议以信息检索与语言模型标准教材为准)。
  • 文中涉及的模型具体困惑度数值、BLEU/ROUGE 达到人类水平的分数区间等具体数字,均标「待核实」,引用前请核对原始实验设置与评测集。
  • LLM-as-Judge 相关偏差与缓解方法,建议参考相关综述与厂商评测指引,具体结论待核实。
本文累计阅读