大模型幻觉检测长期面临一个结构性矛盾:用于训练和评测的基准数据通常是静态的,而模型在真实应用中的错误形态却是动态且多样的。固定问答对只能捕捉部分事实性错误,很难覆盖生成文本中那些看似合理但无法被单一参考答案判定的隐性幻觉。检索与验证的思路把检测流程从生成后的静态比对,扩展为基于外部证据的动态核验,这为构建更可靠的幻觉基准提供了新的可能。

一、幻觉检测基准为什么难以设计
现有幻觉检测基准大致可以分为两类:一类基于封闭式问答,例如 TruthfulQA;另一类基于生成文本的事实一致性标注,例如 HaluEval。封闭式问答的优势在于答案明确、评测简单,但它的覆盖面非常有限,模型只要在特定知识切片上表现良好,就可能在榜单上获得高分,而实际开放域生成中的幻觉问题却依然严重。生成文本标注基准更贴近真实使用,但构建成本极高,标注者需要对每个句子是否与外部事实一致做出判断,而且不同标注者对“事实一致”的理解可能存在较大偏差。
更难解决的是基准的时效性与领域覆盖问题。很多基准的参考知识来自某一时间点抓取的维基百科或新闻语料,当模型回答涉及近期事件、小众领域或长尾实体时,基准本身可能就缺乏可用的标准答案。于是出现了一个悖论:评测者在不知道正确答案的情况下,很难判断模型是否产生了幻觉。检索与验证方法试图打破这个循环,它不再要求评测集预先包含所有正确答案,而是让评测过程动态地从知识库中寻找证据,再基于证据判断生成内容的可靠性。这种做法显著降低了对静态标注的依赖,也让基准检测更接近真实场景中的事实核查流程。
此外,传统基准常常把幻觉视为一个二分类问题:句子要么正确要么错误。但实际生成中还存在大量部分正确、部分模糊或证据不足的情况。例如模型说出“某公司于2023年发布了新产品”,可能年份正确但产品名称错误,或者产品确实发布但时间不准确。二分类标注无法刻画这种细粒度错误,导致检测结果过于粗糙。检索与验证通过引入“支持、矛盾、中立”三类标签,能够更细粒度地反映生成内容与证据之间的关系,这也为基准设计提供了新的标注维度。
二、检索与验证的协同机制
检索与验证链通常由三个核心组件构成:句子拆分器、证据检索器和事实验证器。句子拆分器负责把模型生成的长文本切分为若干独立断言,这些断言是后续验证的基本单位。证据检索器根据每个断言构造查询,从知识库中返回最相关的若干条候选证据。事实验证器接收断言与候选证据,输出一个标签,表示该断言是被证据支持、与证据矛盾,还是证据不足无法判断。三个组件协同工作,才能把一段自由生成文本转化为结构化的幻觉检测结果。
检索器的质量直接决定了验证效果的上限。如果检索器无法找到与断言最相关的证据,验证器即使再强大也无法做出正确判断。实际系统中,检索器通常采用双编码器架构,将查询和证据片段分别编码为向量后计算相似度。为了提升召回率,可以使用混合检索策略,将稀疏检索与稠密检索的结果进行融合。例如先通过 BM25 召回包含关键词的候选段落,再使用基于 transformer 的稠密检索模型进行重排,这样既能保证关键词匹配,又能捕捉语义相关性。检索结果的数量也需要平衡:返回太少可能漏掉关键证据,返回太多则会引入噪声,增加验证器的误判概率。
验证器的主流实现方式包括自然语言推理模型和基于大模型的提示词判断。NLI 模型将断言作为前提,将证据作为假设,输出蕴含、矛盾或中立关系。这种方式计算开销较小,适合大规模评测,但对复杂句子和专业领域知识的表现有限。基于大模型的验证器则利用生成模型自身的推理能力,通过提示词要求其判断断言是否被证据支持,能够处理更复杂的语义关系,但成本更高且需要精心设计提示词。下面是一个最小化的检索验证流程示例,使用 Python 模拟核心逻辑。
import numpy as np
def split_sentences(text):
# 按句号、问号等切分,实际可替换为更鲁棒的分句器
import re
parts = re.split(r'(?<=[。?!])', text)
return [p.strip() for p in parts if p.strip()]
def retrieve_evidence(claim, knowledge_base, top_k=3):
# 简化版基于关键词重叠的检索,实际可使用向量检索
keywords = set(claim.lower().split())
scored = []
for doc_id, doc_text in knowledge_base.items():
doc_words = set(doc_text.lower().split())
overlap = len(keywords & doc_words)
scored.append((doc_id, overlap, doc_text))
scored.sort(key=lambda x: x[1], reverse=True)
return scored[:top_k]
def verify_claim(claim, evidence_list):
# 使用简单重合度进行验证,生产环境可替换为NLI模型
best_score = 0.0
best_evidence = None
claim_words = set(claim.lower().split())
for _, score, evidence in evidence_list:
evidence_words = set(evidence.lower().split())
if len(claim_words) == 0:
continue
overlap = len(claim_words & evidence_words) / len(claim_words)
if overlap > best_score:
best_score = overlap
best_evidence = evidence
if best_score > 0.6:
label = "支持"
elif best_score > 0.3:
label = "中立"
else:
label = "矛盾"
return label, best_evidence
knowledge_base = {
"doc1": "OpenAI released GPT-4 in March 2023.",
"doc2": "GPT-4 is a multimodal large language model.",
"doc3": "The transformer architecture was introduced in 2017."
}
generated_text = "GPT-4 was released in March 2023. It is a unidirectional language model."
for claim in split_sentences(generated_text):
evidence_list = retrieve_evidence(claim, knowledge_base)
label, evidence = verify_claim(claim, evidence_list)
print(f"断言: {claim}\n标签: {label}\n证据: {evidence}\n")
上述代码只是一个教学示例,真实系统中的验证器会使用更复杂的语义匹配。但它展示了检索验证链的基本数据流:文本先被切分,每个断言独立检索证据,再基于证据给出支持、中立或矛盾的判断。这种流水线方式可以很容易地并行化,适合大规模基准评测任务。
三、构建面向检索验证的评测集
要评估检索验证方法本身的效果,需要构建一个专门面向该流程的评测集。这个评测集至少包含三类数据:模型生成的原始文本、与文本中每个断言对应的证据片段、以及人工标注的支持标签。构建过程可以先从现有幻觉检测数据集中抽取生成文本,然后使用自动化工具将文本切分为断言。接着对每个断言,从维基百科、新闻语料或专业数据库中检索候选证据,再由标注人员对证据是否支持该断言进行判断。
标注质量是评测集可靠性的关键。标注说明需要清晰定义“支持”“矛盾”“中立”的边界。例如“支持”要求证据明确证明断言的语义内容;“矛盾”要求证据明确与断言内容冲突;“中立”表示证据与断言部分相关但不足以支持或反驳。为避免标注者主观差异,可以采用双人标注加仲裁机制,同时记录标注一致性指标。对于数据量较大的场景,也可以先使用高精度的 NLI 模型进行预标注,再由人工只审核低置信度的样本,从而降低标注成本。
一个重要的设计选择是证据的检索范围。如果评测集允许验证器访问的语料库与标注时使用的语料库完全一致,那么评测结果可能会偏向那些在该语料库上表现更好的检索器。更严格的做法是将证据检索范围限定为通用知识库,并要求验证器返回证据来源,这样评测结果才能反映系统在开放环境中的真实能力。另外,评测集还应包含一定比例的“不可验证”断言,这些断言暂时没有足够的公开证据,用来检验验证器是否能够诚实地输出“中立”而不是强行给出支持或矛盾判断。
四、评估指标与常见陷阱
检索验证系统的评估不能只看准确率,需要结合召回率和误判率综合分析。假设一个幻觉检测任务,真正例是生成文本中确实存在事实错误的断言,假正例是验证器错误地将正确断言标记为矛盾。高召回率意味着系统能找出更多真实幻觉,但往往伴随着误判率上升;高精确率意味着系统标记的幻觉大多是真实的,但可能漏掉不少错误。在基准检测场景下,用户通常更关心召回率,因为漏掉幻觉比误报的风险更大。不过在实际部署中,误报过多会降低用户对系统的信任,因此需要根据应用场景调整阈值。
检索与验证链还存在两个常见陷阱。第一是证据偏差,当检索器倾向于返回与断言语义相似的片段时,验证器可能只看到支持性的证据,而忽略矛盾证据。这会系统性地低估幻觉比例。缓解方法是要求检索器返回多样化的证据,并在验证阶段引入对抗性证据,即主动检索可能反驳断言的片段。第二个陷阱是基准泄漏,如果验证模型在训练阶段接触过评测集对应的知识库,那么评测结果会虚高。为避免这一问题,评测集应使用与训练数据完全隔离的知识来源,并定期更新知识库以检验系统在未见知识上的泛化能力。
优化方向包括多跳检索和句子级证据对齐。很多幻觉断言并不能由单一证据片段直接验证,需要组合多个来源的信息。例如“A 公司收购了 B 公司”这一断言,可能需要一条收购公告和一条公司基本信息才能完整验证。多跳检索通过迭代查询知识库,逐步收集关联证据,能够显著提升复杂断言的验证能力。句子级证据对齐则要求验证器不仅输出标签,还要指出证据中具体支持或反驳哪个词或短语,这样开发者可以定位幻觉产生的根源,并对生成模型进行有针对性的修正。