测评 AI 摘要工具,ROUGE 可以描述候选摘要与参考摘要的文字重叠,但不能代替事实核对。一份摘要即使保留所有数字和大部分词,也可能把“通过”和“失败”的数量颠倒。应分别保存原文、人工参考、候选摘要及人工事实结论,再计算指标。
下面用三份人工候选演示 ROUGE-1 与 ROUGE-L。没有调用摘要模型;代码在本地实际运行,分数不是某款 AI 摘要工具的效果数据。中文切分规则会明确写出,便于复算,而不是把默认英文处理当成通用中文评分。

固定原文、参考和三个候选
教学原文为:“团队周一测试了20个样本,其中18个通过,2个失败。负责人要求修复失败样本后再发布。”它是人为构造的材料,没有真实项目或测试数据。
| 记录 | 文字 | 需要人工检查的点 |
|---|---|---|
| 参考与 A | 20个样本中18个通过、2个失败,修复后再发布。 | 保留总数、通过/失败关系与发布条件 |
| B | 20个样本中2个通过、18个失败,修复后再发布。 | 数字都在,但通过与失败数量颠倒 |
| C | 20个样本中18个通过、2个失败,立即发布。 | 数量正确,但把修复后发布改成立即发布 |
参考摘要不必逐字复述原文,但应先由人确认它保留了任务要求的重要信息。不同用途允许不同省略:会议行动摘要可能必须保留执行条件,阅读提要可能重视主题。先确定这些要求,不能按工具输出事后改规则。
ROUGE-1 与 ROUGE-L 的含义
ROUGE-1 衡量切分后单个 token 的重叠;ROUGE-L 根据最长公共子序列计算匹配。输出包括 precision、recall 与 fmeasure,即候选匹配比例、参考覆盖比例及两者组合。Google Research 的 rouge-score 实现介绍这些指标,RougeScorer 官方源码说明可提供带 tokenize 方法的自定义切分器。
本例把基本汉字逐字切分,把连续英文字母或数字作为一个 token,并丢弃其他符号;例如 18 是一个 token,而“通过”拆成“通”和“过”。这是透明的演示口径,不是所有中文 ROUGE 报告都采用的统一标准。它没有覆盖全部 Unicode 汉字、单位和小数处理,真实资料应按需要完善并记录版本。
切分不同,分数就可能不同。不能把逐字结果与按词分词、另一种规范化或另一个参考摘要的结果直接比较。本文不使用英文词干化,也不把 ROUGE-L 与按摘要句界处理的 ROUGE-Lsum 混为同一个指标。
安装并运行中文演示
本例在 Windows、Python 3.11.15、rouge-score 0.1.2 运行。先执行 python -m pip install rouge-score==0.1.2,再把代码保存为 summary_scores.py,运行 python summary_scores.py。
import json
import re
from rouge_score import rouge_scorer
# Teaching text, reference and candidates; no summarization model is called.
source = '团队周一测试了20个样本,其中18个通过,2个失败。负责人要求修复失败样本后再发布。'
reference = '20个样本中18个通过、2个失败,修复后再发布。'
candidates = {
'A_exact': reference,
'B_swapped_counts': '20个样本中2个通过、18个失败,修复后再发布。',
'C_early_release': '20个样本中18个通过、2个失败,立即发布。',
}
class CharTokenizer:
def tokenize(self, text):
return re.findall(r'[A-Za-z0-9]+|[\u4e00-\u9fff]', text)
tokenizer = CharTokenizer()
scorer = rouge_scorer.RougeScorer(['rouge1', 'rougeL'], tokenizer=tokenizer)
output = {}
for name, candidate in candidates.items():
output[name] = {
metric: {key: round(getattr(score, key), 4)
for key in ('precision', 'recall', 'fmeasure')}
for metric, score in scorer.score(reference, candidate).items()
}
print('reference_tokens', tokenizer.tokenize(reference))
print(json.dumps(output, ensure_ascii=False, indent=2))
print('source_retained', bool(source))
实际本地输出:
reference_tokens ['20', '个', '样', '本', '中', '18', '个', '通', '过', '2', '个', '失', '败', '修', '复', '后', '再', '发', '布']
{
"A_exact": {
"rouge1": {
"precision": 1.0,
"recall": 1.0,
"fmeasure": 1.0
},
"rougeL": {
"precision": 1.0,
"recall": 1.0,
"fmeasure": 1.0
}
},
"B_swapped_counts": {
"rouge1": {
"precision": 1.0,
"recall": 1.0,
"fmeasure": 1.0
},
"rougeL": {
"precision": 0.8947,
"recall": 0.8947,
"fmeasure": 0.8947
}
},
"C_early_release": {
"rouge1": {
"precision": 0.8824,
"recall": 0.7895,
"fmeasure": 0.8333
},
"rougeL": {
"precision": 0.8824,
"recall": 0.7895,
"fmeasure": 0.8333
}
}
}
source_retained True
先核对 reference_tokens 中数字 20、18、2 没有被拆成多个数字字符。B_swapped_counts 的 ROUGE-1 F 值为 1.0,因为所有单个 token 的数量仍相同;ROUGE-L F 值为 0.8947,却没有证明通过/失败关系正确。C_early_release 的两个 F 值均为 0.8333,发布条件仍被改变。
source_retained 为 True 只表示变量里保留了原文,不表示代码已做语义核对。这个评分器比较 reference 与 candidate,不会读取 source 来判断事实。将三个候选与上表逐项对照,才能说明 B 和 C 为何不合格。
建立一张独立的事实核对表
| 原文事项 | A | B | C |
|---|---|---|---|
| 总共 20 个样本 | 保留 | 保留 | 保留 |
| 18 通过、2 失败 | 保留 | 关系颠倒 | 保留 |
| 修复失败后再发布 | 保留 | 保留 | 变成立即发布 |
真实检查至少区分三个问题:写出的事实是否受原文支持;任务要求的重要事实是否被遗漏;是否加入了原文没有的结论。数字、人物、时间、否定、条件和因果关系应按陈述核对,而不是只看词是否出现。
缺少一个可省略的背景细节,与把关键发布条件删掉,并不具有相同含义。严重程度应在测试前按摘要用途定义,不能把“参考里所有字都出现”当成所有任务的合格标准。
换成真实工具怎样保持评测可比较
- 固定一组获授权原文和摘要要求,例如重点、长度与必须保留的条件。
- 由独立人工制作参考并列出重要事项,不把待测模型输出直接设成标准。
- 同样要求交给候选工具,保留文档编号、模型/版本、提示词、参数、日期与全部输出。
- 对齐原文、参考、候选,先处理空输出、缺失和错配,再按相同切分规则计算指标。
- 单独审查事实、遗漏、新增与表达质量,报告具体失败样本及覆盖范围。
多篇文档应约定汇总方式,例如逐篇计算后报告分布或平均值,并保存逐篇结果;不把长文的 token 量和短文篇数随意混成一个分母。阈值需要按真实任务和人工合格结论校准,本文的三个样例不足以确定上线阈值。
下一步
先复算这个数字颠倒反例,确认高 ROUGE 仍能对应不合格摘要。随后选择一小批代表性原文,冻结参考与重要事项清单,把指标和人工结论放在同一行审核。官方实现资料核对日期为 2026 年 10 月 1 日,本文没有实际摘要产品运行结果或效果排名。
想先取得一份能回查来源的摘要基线,可阅读本站中文抽取式摘要的选句与事实遗漏检查。原句直接抽取也可能丢失重要上下文,评价时仍应保留独立事实表。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/32896.html