摘要模型生成的句子可以非常通顺,但通顺并不等于忠实原文。一个典型的例子是,原文提到某公司第三季度营收下降3%,模型却输出为增长3%,从语言角度看几乎看不出异常,但事实已经被反转。这类问题被称为事实不一致,它让摘要结果在新闻、金融、医疗等高风险场景中变得不可信。由于ROUGE、BLEU等传统指标只关注词面重合,对语义篡改几乎不敏感,很多团队直到人工抽检时才发现摘要质量存在系统性偏差。

因此,事实核查的目标不是让摘要更流畅,而是验证摘要中的每个事实陈述是否能在原文中找到支撑。对于抽象式摘要,这一目标更难,因为模型会重组句式、替换同义词,甚至在长文档中融合多条信息。本文从事实不一致的类型出发,对比自动核查方法,讨论基准构建的常见陷阱,并给出一个可运行的基于自然语言推理的核查代码示例。
一、事实不一致的类型与标注难点
事实不一致通常分为内在幻觉和外在幻觉。内在幻觉指摘要内容与输入文档冲突,外在幻觉指摘要编造了输入文档中完全不存在的信息。内在幻觉更常见于实体替换、数值改动、关系反转和否定丢失。例如原文说A公司收购B公司,摘要写成B公司收购A公司,这就是关系反转;原文给出一个具体的百分比,摘要四舍五入或直接改成另一个数,属于数值改动。外在幻觉则包括凭空出现的人物头衔、时间地点或引用来源。理解这些类型有助于设计针对性的标注规范。
标注事实一致性并不简单。两个标注员对同一句摘要是否违背原文常常产生分歧,尤其在摘要进行合理概括时,有些信息的省略并不算不一致,而过度概括又可能丢失关键条件。早期数据集采用自动扰动方式构造负例,比如把实体随机替换、删除否定词、修改数字,优点是成本低、规模大,但扰动出来的错误过于机械,与真实模型错误分布存在差距。人工标注的数据集如SummEval和FRANK更贴近真实错误,但覆盖领域有限,标签噪声也难以避免。
因此在实际项目中,建议先定义一份可操作的标注指南,明确哪些改写属于可接受的概括,哪些属于事实冲突。对于关键场景,可以只标注高风险槽位,如金额、日期、主体关系,而不是对每个分句都做完整语义判断。这样可以降低标注成本,同时让后续自动核查模型聚焦在真正影响业务的事实维度上。
二、自动事实核查方法:从浅层比对到推理验证
早期的自动核查大多基于词重叠。比如计算摘要句子与原文句子的n-gram重合度,或者用命名实体识别抽取出实体后比对是否一致。这类方法速度快,但无法处理同义改写和跨句推理。一句摘要把原文的两句话合并成一句,词重叠可能很低,但语义完全正确;反之,一个被替换成近义实体的错误也可能因为字符串不同而被误判为不一致。因此词重叠只能作为初筛信号。
基于自然语言推理(NLI)的方法把事实核查转化为蕴含判断。输入原文句子作为前提,摘要句子作为假设,模型输出蕴含、矛盾或中性三类概率。如果概率最高的是矛盾,就认为摘要与原文冲突。相比词重叠,NLI能够捕捉否定、量词和关系变化,是目前FactCC、SummaC等工具的核心思路。缺点是对训练数据领域敏感,新闻领域训练的NLI模型迁移到医疗或法律文本时性能会下降。
问题生成与回答(QGQA)是另一种思路。先将摘要中的关键事实转成问题,再从原文中寻找答案,如果答案与摘要中的实体或数值不一致,则判定为错误。例如摘要说某公司营收增长3%,可以生成问题该公司营收增长多少,然后用阅读模型从原文抽取答案5%,两者不同就触发告警。QGQA的优势是可解释性强,能明确指出哪个事实点出了问题,但流程更长,错误会在问题生成和答案抽取两个环节传播。
下面给出一个基于NLI的Python示例,使用transformers加载一个预训练的自然语言推理模型,对摘要句子和可能的原文证据句进行蕴含判断。
from transformers import pipeline
nli = pipeline("text-classification", model="microsoft/deberta-v3-base-mnli")
def check_factual_consistency(source_sentence: str, summary_sentence: str):
result = nli(f"{source_sentence} [SEP] {summary_sentence}")[0]
label = result["label"].lower()
score = result["score"]
if label == "entailment":
verdict = "consistent"
elif label == "contradiction":
verdict = "inconsistent"
else:
verdict = "neutral_or_insufficient"
return verdict, score
source = "ACME Corp's revenue fell by 3 percent in the third quarter."
summary = "ACME Corp's revenue grew by 3 percent in the third quarter."
verdict, score = check_factual_consistency(source, summary)
print(verdict, score)
这段代码只是事实核查的最小原型。真实摘要涉及多个证据句,需要先做句子对齐,把摘要句与原文中最相关的几句话配对,再分别送入NLI模型。对齐可以用BM25、稠密检索或基于嵌入的相似度排序。之后把每对句子的矛盾概率做聚合,可以取最大值或加权平均,作为整篇摘要的事实一致性分数。
三、构建可靠的事实一致性基准:数据、指标与陷阱
评估一个事实核查方法好不好,离不开可靠的基准数据。FactCC是较早的公开数据集,它从新闻文章中自动构造了正例和负例,规模大但错误类型较窄。SummEval由人工对多个摘要系统输出进行打分,覆盖忠实度、连贯性等多个维度,其中忠实度与事实一致性高度相关,但样本量只有1600条。FRANK专门针对摘要事实错误,人工标注了错误类型,适合细粒度分析。TRUE数据集则综合多个NLI和QA任务,提供更大规模的训练和测试材料。
选择基准时要注意三个陷阱。一是领域偏移,新闻语料上训练的判断器不一定能识别医疗术语的细微变化。二是类别不平衡,真实摘要中不一致句子占比通常很低,如果测试集中负例多为自动扰动生成,指标会虚高。三是标注粒度不一致,有些基准标注句子级,有些标注摘要级,混用会导致性能不可比。建议在自有数据上额外划分一个数百条的人工验证集,用基础NLI模型跑通后观察错误分布,再决定是否微调。
评估指标方面,分类任务常用精确率、召回率、F1和AUC。但对于事实核查,召回率往往比精确率更重要,因为漏掉一个关键事实错误可能造成严重后果。也可以报告错误发现率,即被判为不一致的句子中真正错误的占比。对连续分数,可以计算与人工忠实度评分的皮尔逊或斯皮尔曼相关系数。不要只看准确率,因为数据不平衡时准确率可能掩盖模型把所有句子都判为一致的懒惰行为。
四、把事实核查接入摘要生成链路
事实核查不是离线评测的专属工具,它可以作为摘要生成后的在线质检环节。基本架构是在摘要模型输出后增加一个验证模块,该模块先从原文中召回证据句,再对摘要每个分句进行NLI或QGQA判断。如果整篇摘要的不一致分数超过阈值,可以触发重写、回退到抽取式摘要或人工复核。阈值设置需要根据业务容忍度调整,例如金融简报场景阈值可以设低一些,宁可多拦截也不放过潜在错误。
工程实现上有几个优化点。第一,证据召回可以预先对原文建立向量索引,摘要生成后只查询最相近的若干句,减少计算量。第二,NLI模型可以使用蒸馏后的轻量版本,或者先做低成本的实体和数字比对,只有发现可疑差异时才调用完整推理模型。第三,把核查结果缓存下来,相同或高度相似的摘要句可以直接复用判断,避免重复计算。第四,记录每次核查的证据句和矛盾分数,方便后续分析模型在哪些事实类型上容易犯错。
还需要注意摘要长度和句子切分带来的影响。过长的摘要句子可能包含多个事实点,单个NLI判断容易混淆,建议按逗号或子句切分后分别核查。对于跨句事实,比如摘要第二句的结论依赖第一句的条件,单句核查可能漏判,此时可以用整段作为前提,或者引入更复杂的图结构方法。实践上,先用单句级核查跑通流程,再逐步补充跨句规则,是性价比更高的路径。
五、总结
解决摘要基准事实不一致,关键是认识到事实核查不是单一模型问题,而是数据标注、证据对齐、推理判断和工程集成的组合。先把错误类型定义清楚,再选择或训练适合领域的事实核查器,最后用严格但不过度苛刻的指标评估效果。自动扰动数据可以快速起步,但最终需要少量高质量人工标注来校准。
从ROUGE到事实一致性,摘要评测的核心正在从表面形式转向语义忠实。对于实际项目,建议从小规模验证开始,把基于NLI的判断器接入现有摘要流程,观察拦截比例和误报情况,再决定是否引入QGQA或知识图谱增强。只要事实核查环节能够稳定识别高风险错误,摘要系统的实用价值就会明显提升。

