关键词

序号关键词英文说明
1幻觉Hallucination模型生成与事实不符的内容
2事实性Factuality内容与客观事实的一致程度
3BLEUBilingual Evaluation Understudy机器翻译评估指标
4ROUGERecall-Oriented Understudy for Gisting Evaluation文本摘要评估指标
5BERTScoreBERT-based Scoring基于语义理解的评估指标
6SelfCheckGPT-基于自检验的幻觉检测
7FActScoreFActual Score原子事实评估方法
8引文准确性Citation Accuracy引用与来源的一致性
9实体级评估Entity-level Evaluation针对特定实体的准确性评估
10不确定性估计Uncertainty Estimation模型置信度评估

概述

大语言模型在生成文本时会产生「幻觉」(Hallucination),即生成的内容看似流畅合理,却与事实不符或完全虚构。这一问题被认为是当前 LLM 落地应用的最大障碍之一。在客服机器人、知识问答、内容创作等场景中,幻觉可能导致信息误导、法律风险甚至安全隐患。因此,系统性地评估和检测模型幻觉成为大模型研究的核心课题。

幻觉评估与传统文本生成评估有本质区别。传统指标(如 BLEU、ROUGE)主要衡量生成文本与参考文本的相似度,无法有效检测内容的事实性错误。例如,模型可能生成一段流畅但完全虚构的历史事件描述,BLEU 分数仍然可能较高。幻觉评估需要更深入的分析,包括事实核查、语义理解、知识溯源等多个维度。

本文将系统介绍幻觉的类型分类、自动化检测方法、事实性评估指标体系、传统生成质量评估工具,以及人类评估设计方法,最后总结当前主流的幻觉减少策略。掌握这些技术对于构建可靠的 AI 应用系统至关重要。


幻觉类型分类体系

内在幻觉与外在幻觉

根据幻觉内容与输入信息的关系,可以将幻觉分为内在幻觉(Intrinsic Hallucination)和外在幻觉(Extrinsic Hallucination)两大类。

内在幻觉指模型生成的内容与输入上下文中明确存在的信息相矛盾。这种错误相对容易被检测,因为存在可对比的「标准答案」。例如,如果输入明确提到「张三出生于 1990 年」,而模型回复说「张三出生于 1985 年」,这就是典型的内在幻觉。内在幻觉通常源于模型对上下文的理解偏差或记忆错误,在知识密集型任务中尤为常见。

外在幻觉指模型生成的内容在输入上下文中既无法验证也无法否认,通常涉及输入范围之外的外部知识。这类幻觉更难检测,因为没有明确的参照物来判断正误。例如,用户询问「2024 年诺贝尔物理学奖得主是谁」,模型给出答案,但答案的正确性需要依赖外部知识库或实时信息来验证。外在幻觉还包括模型凭空编造不存在的参考文献、数据、统计数据等。

幻觉的具体表现形式

事实性幻觉(factual hallucination):捏造不存在的 facts,包括人物经历、历史事件、科学数据等。例如声称某位并不存在的人物提出了某个理论,或声称某个实验得出了与真实情况相反的结论。

语义幻觉(semantic hallucination):在连贯流畅的句子中嵌入错误的语义关系。例如错误地描述因果关系(将相关性误读为因果性)、错误地关联实体与属性(将 A 的特征描述为 B 的特征)。

引用幻觉(citation hallucination):编造不存在的参考文献、论文标题、DOI、作者信息等。这种幻觉在学术写作辅助场景中特别危险,可能导致学术不端问题。

数值幻觉(numerical hallucination):在数字、日期、统计数据上出错。例如混淆不同年份的 GDP 数据、错误引用公司财报数字、编造不存在的调查样本量。

归属幻觉(attribution hallucination):将某人的言论、观点、作品错误地归属给其他人。例如声称某段名言出自某位名人,实际上是另一位所说或根本是杜撰。

幻觉成因分析

理解幻觉的成因有助于设计更有针对性的检测和缓解策略。幻觉的产生涉及多个层面:

训练数据层面:大模型的训练语料规模庞大,难以保证每个事实的准确性。语料中可能存在大量噪声、错误信息、过时信息,模型在训练过程中可能学习了这些错误模式。

参数知识层面:模型将知识以参数化形式存储在神经网络权重中,这种存储方式天然存在不精确性和边界模糊性。当需要召回特定知识时,模型可能「记错」或「混淆」细节。

推理生成层面:自回归生成机制追求流畅性和连贯性,模型倾向于生成看起来「合理」的内容,而非严格验证每个事实。这种生成倾向可能导致在不确定时「填填补补」。

提示理解层面:用户 query 的模糊性可能导致模型误解意图,从而生成偏离正确方向的回复。


自动化幻觉检测技术

基于置信度的方法

模型固有的概率分布包含了关于生成内容不确定性的信息。句子级别的困惑度(Perplexity)和 token 级别的预测概率可以近似作为幻觉检测的信号。当模型对某个 token 的预测概率较低时,说明模型对该内容不太「有信心」,可能存在较高的幻觉风险。

Token 概率分析:计算生成文本中每个 token 的对数似然,识别低概率区域。公式为:

低于平均分或设定阈值的 tokens 被标记为潜在的幻觉风险点。

句子级困惑度:对每个生成的句子独立计算困惑度,高困惑度句子更可能包含幻觉内容。这种方法计算成本适中,可用于实时检测。

语义熵(Semantic Entropy):Google DeepMind 提出的方法,不只关注 token 概率,而是估计生成内容的语义空间分布。通过采样多次生成并聚类,量化模型对生成内容的语义确信程度。语义熵定义为:

其中 是语义等价句子簇的集合。

SelfCheckGPT 自检验框架

SelfCheckGPT 是由 MIT 和 Google 联合提出的幻觉检测框架,其核心思想是「让模型自己检验自己」。该方法利用 LLM 本身作为检验器,通过分析单个问题多个响应之间的一致性来判断幻觉程度。

from self_check import SelfCheckGPT
 
# 初始化自检验器
checker = SelfCheckGPT(
    model_name="gpt-3.5-turbo",
    threshold=0.5
)
 
# 待检验的问答对
qa_pairs = [
    {
        "question": "谁发现了青霉素?",
        "response": "青霉素是由亚历山大·弗莱明在1928年偶然发现的。"
    }
]
 
# 执行自检验
results = checker.check(qa_pairs)
 
for result in results:
    print(f"事实性得分: {result['factuality_score']:.3f}")
    print(f"可疑句子: {result['flagged_sentences']}")

SelfCheckGPT 的优势在于不需要外部知识库或其他模型,理论上适用于任何 LLM。但其局限性也很明显:依赖模型自身的能力,如果模型本身就无法正确判断某事,自检验效果也会打折扣。

FActScore 原子事实评估

FActScore 由 MIT CSAIL 提出,是一种细粒度的原子事实级别幻觉评估方法。该方法将模型生成的回复拆解为多个「原子事实」(Atomic Facts),然后对每个原子事实独立进行事实核查。

from factscore import FActScore
 
# 初始化评估器
evaluator = FActScore(
    openai_key=os.getenv("OPENAI_API_KEY"),
    verbose=True
)
 
# 待评估的生成内容
generated_text = """
阿尔伯特·爱因斯坦(1879-1955)是一位德裔美国物理学家,
被誉为现代物理学的奠基人之一。他于1905年发表了狭义相对论,
1915年提出了广义相对论。1921年,爱因斯坦因光电效应研究
获得诺贝尔物理学奖。
"""
 
# 参考知识库(可以是 Wikipedia API 或本地知识库)
reference_source = "wikipedia"
 
# 执行评估
score = evaluator.evaluate(
    response=generated_text,
    reference=reference_source
)
 
print(f"FActScore: {score['factual_score']:.2%}")
print(f"原子事实总数: {score['total_atoms']}")
print(f"正确事实数: {score['correct_atoms']}")

FActScore 输出每个原子事实的正确性标注,并汇总为总体的事实性得分。这种粒度的评估能够精确定位幻觉发生的位置,为后续的错误分析和修复提供指导。

引用验证与 RAG 校验

在 RAG(检索增强生成)系统中,幻觉检测可以与检索模块联动。通过比对生成内容与检索到的参考文档,可以系统性地检测和纠正幻觉。

class RAGHallucinationChecker:
    def __init__(self, retriever, generator, threshold=0.7):
        self.retriever = retriever
        self.generator = generator
        self.threshold = threshold
    
    def check_and_regenerate(self, query, max_retries=3):
        for attempt in range(max_retries):
            # 检索相关文档
            docs = self.retriever.retrieve(query, top_k=5)
            
            # 带参考上下文生成
            response = self.generator.generate(
                query=query,
                context=docs,
                citation_mode="explicit"  # 要求显式引用
            )
            
            # 验证引用准确性
            citations = self.extract_citations(response)
            verified = self.verify_citations(citations, docs)
            
            if verified['accuracy'] >= self.threshold:
                return response, verified
            
            # 如果引用不准确,尝试修正生成
            query = self._augment_query_with_feedback(query, verified)
        
        return response, verified
    
    def verify_citations(self, citations, docs):
        results = []
        for cite in citations:
            # 检查引用内容是否能在参考文档中找到支持
            supported = self.find_supporting_evidence(cite['text'], docs)
            results.append({
                'citation': cite['text'],
                'supported': supported,
                'source': cite.get('source')
            })
        
        accuracy = sum(1 for r in results if r['supported']) / len(results) if results else 0
        
        return {
            'accuracy': accuracy,
            'details': results
        }

事实性评估指标体系

精确率与召回率视角

在幻觉检测的语境下,精确率和召回率有特殊的含义:

幻觉召回率(Hallucination Recall):在所有虚假信息中,检测方法能够识别的比例。高召回率意味着较少漏检,但可能伴随较多误报。

幻觉精确率(Hallucination Precision):在所有标记为虚假的内容中,真正虚假的比例。高精确率意味着检测结果可信,但可能遗漏部分幻觉。

实践中,需要根据应用场景在精确率和召回率之间权衡。在高风险场景(如医疗、法律建议),应优先提高召回率,即使牺牲一些精确率;在低风险场景,可以适当放宽要求以避免过度警告干扰用户体验。

Knowledge Conflict 评估

现实世界存在大量「知识冲突」—— 不同来源提供相互矛盾的信息。评估模型在知识冲突场景下的表现是事实性评估的重要组成部分。

冲突检测能力:模型能否识别出不同知识来源之间的矛盾?

冲突解决策略:当检测到冲突时,模型采用什么策略?(信任权威来源、时间戳更新、最近原则、拒绝回答)

冲突情境下的准确性:在存在冲突的情况下,模型选择信任某一来源时,其最终回复的准确性如何?

Note

评估设计要点:设计知识冲突评估数据集时,需要包含多种类型的冲突(实体属性冲突、时间线冲突、因果关系冲突等),并标注每个冲突的正确处理方式,以便进行标准化的评估。


传统生成质量评估指标

BLEU 及其局限性

BLEU(Bilingual Evaluation Understudy)最初为机器翻译设计,通过计算 n-gram 精确率来衡量生成文本与参考译文之间的相似度。BLEU 的核心公式为:

其中 BP 是简短惩罚因子, 是 n-gram 精确率, 是各阶 n-gram 的权重。

from sacrebleu import sentence_bleu, corpus_bleu
 
# 句子级 BLEU
hypothesis = "The cat sat on the mat."
reference = "The cat is sitting on the mat."
 
score = sentence_bleu(hypothesis, [reference])
print(f"Sentence BLEU: {score.score:.2f}")
 
# 语料库级 BLEU
hypotheses = ["The cat sat on the mat.", "It is a good day."]
references = [["The cat is sitting on the mat."], ["It is a nice day."]]
 
corpus_score = corpus_bleu(hypotheses, references)
print(f"Corpus BLEU: {corpus_score.score:.2f}")

BLEU 的局限性在幻觉评估场景下尤为明显:

  • 无法检测语义偏差:即使生成内容语义错误,只要用词接近参考就能获得高分
  • 依赖单一参考:真实世界往往存在多种合理表达方式
  • 忽略事实一致性:BLEU 分数高的文本不一定事实正确

ROUGE 评估套件

ROUGE(Recall-Oriented Understudy for Gisting Evaluation)是一组基于召回率的评估指标,主要用于文本摘要任务。常用变体包括:

ROUGE-N:计算 n-gram 的召回率(与参考重叠的 n-gram 数 / 参考中的 n-gram 总数)

ROUGE-L:基于最长公共子序列(LCS)的评估,考虑句子级结构

ROUGE-S:基于 skip-bigram 的评估,允许中间间隔任意词

from rouge import Rouge
 
# 初始化 ROUGE 评估器
rouge = Rouge()
 
# 待评估文本对
hypothesis = "The cat sat on the mat."
reference = "The cat is sitting on the mat."
 
# 计算 ROUGE 分数
scores = rouge.get_scores(hypothesis, reference)
 
print("ROUGE-1:", scores[0]['rouge-1']['f'])   # Unigram F1
print("ROUGE-2:", scores[0]['rouge-2']['f'])   # Bigram F1
print("ROUGE-L:", scores[0]['rouge-l']['f'])   # LCS F1

在幻觉评估中,ROUGE 更多作为辅助指标,用于评估生成内容的完整性和结构相似度,而非事实准确性。

BERTScore 语义评估

BERTScore 由 UC Berkeley 提出,利用预训练语言模型(如 BERT)的上下文嵌入来计算生成文本与参考文本的语义相似度。这一方法克服了传统词匹配指标无法捕捉语义的问题。

from bert_score import score
 
# 待评估文本
cands = ["The cat sat on the mat."]
refs = ["The cat is sitting on the mat."]
 
# 计算 BERTScore
P, R, F1 = score(cands, refs, lang='en', rescale_with_baseline=True)
 
print(f"Precision: {P.mean():.4f}")
print(f"Recall: {R.mean():.4f}")
print(f"F1: {F1.mean():.4f}")

BERTScore 的优势在于能够识别同义词和语义等价表达,即使是不同的词汇选择,只要语义相近就能获得较高分数。但 BERTScore 仍然依赖参考文本,无法独立判断事实正确性。


人类评估设计方法论

评估者选择与培训

高质量的人类评估需要精心选择和培训评估者。评估者应具备:

  • 领域基础知识,能够判断内容正确性
  • 一致的评分标准,理解各维度的定义
  • 足够的耐心和注意力,保证评估质量

评估者筛选流程

  1. 初始筛选:测试基本判断能力和领域知识
  2. 培训阶段:学习评估标准,完成练习题
  3. 校准测试:评估标准化样本,对比与专家标注的一致性
  4. 正式评估:通过校准测试的评估者参与正式评估

多维度评估框架

幻觉评估应覆盖多个维度,而不是简单的二元判断(正确/错误):

维度评估问题评分标准
事实准确性主要事实是否与已知事实一致?完全准确 / 轻微偏差 / 明显错误 / 完全虚构
细节可靠性具体细节(数字、日期、名称)是否可靠?完全可靠 / 存在可疑细节 / 存在明显错误
引用准确性引用、参考文献是否真实存在?全部准确 / 部分准确 / 存在虚构引用
逻辑一致性与前文是否保持逻辑一致?完全一致 / 存在轻微矛盾 / 明显自相矛盾
整体可信度综合考虑,你有多大把握相信这段内容?非常相信 / 基本相信 / 不太相信 / 完全不信

评估协议设计

为保证人类评估的可靠性和效率,需要设计清晰的评估协议:

# 幻觉评估协议 v1.0
 
## 评估流程
 
1. **阅读指令**(约 5 分钟)
   - 理解幻觉的定义和分类
   - 熟悉各维度的评分标准
   - 回顾评估示例
 
2. **准备工具**(约 2 分钟)
   - 打开评估界面
   - 准备好参考材料(如果是知识密集型任务)
 
3. **逐条评估**(每条约 3-5 分钟)
   - 仔细阅读生成内容
   - 对每个维度进行独立判断
   - 必要时进行事实核查
   - 记录评估结果和理由
 
4. **质量检查**(约 10% 样本)
   - 复核已完成的评估
   - 检查评分一致性
 
## 注意事项
 
- 每个样本至少由 3 名评估者独立评估
- 评估者不知道哪个是 baseline 哪个是新模型
- 允许评估者标记「不确定」,但不计入统计
- 发现系统性错误时暂停评估,反馈给项目负责人

Inter-annotator Agreement 分析

评估结果的可靠性需要通过一致性指标来验证。常用指标包括:

Cohen’s Kappa(:衡量两位评估者之间的一致性,适用于二元判断。

其中 是观察到的一致率, 是期望的随机一致率。

Krippendorff’s Alpha:适用于多位评估者、多分类、可处理缺失值的通用一致性指标。

from irr import cohens_kappa, krippendorffs_alpha
 
# 两位评估者的二元判断
rater1 = [1, 0, 1, 1, 0, 1, 0, 0, 1, 1]
rater2 = [1, 0, 0, 1, 0, 1, 1, 0, 1, 0]
 
kappa = cohens_kappa(rater1, rater2)
print(f"Cohen's Kappa: {kappa:.3f}")
 
# 多位评估者的多分类判断
all_ratings = [
    [2, 3, 2, 3, 2],  # 样本1的5位评估者
    [1, 2, 1, 2, 1],  # 样本2的5位评估者
    [3, 3, 3, 2, 3],  # 样本3的5位评估者
]
 
alpha = krippendorffs_alpha(all_ratings)
print(f"Krippendorff's Alpha: {alpha:.3f}")

通常认为 表示一致性良好, 表示高度一致。如果一致性较低,需要重新校准评估标准或增加培训。


幻觉减少策略

检索增强生成(RAG)

RAG 是当前最主流的幻觉缓解技术。通过在生成过程中引入外部知识检索,模型可以「参考」真实文档而非完全依赖内部知识。

基础 RAG:检索相关文档作为上下文注入 prompt

Self-RAG:自我反思检索增强,由斯坦福提出,模型在生成过程中判断是否需要检索以及检索内容的质量

Corrective RAG:在最终输出前增加纠正步骤,识别并修正低置信度内容

class CorrectiveRAG:
    def __init__(self, retriever, generator, judge):
        self.retriever = retriever
        self.generator = generator
        self.judge = judge  # 用于评估内容置信度
    
    def generate(self, query):
        # 检索相关文档
        docs = self.retriever.retrieve(query, top_k=5)
        
        # 生成初始回复
        response = self.generator.generate(
            query=query,
            context=docs
        )
        
        # 评估回复质量
        quality = self.judge.evaluate(response, docs)
        
        # 如果质量不达标,进行修正
        if quality['confidence'] < 0.7:
            # 识别低置信度部分
            low_conf_parts = quality['low_confidence_spans']
            
            # 对每个低置信度部分进行针对性检索
            for span in low_conf_parts:
                retrieved = self.retriever.retrieve(span, top_k=3)
                span_response = self.generator.generate(
                    query=span,
                    context=retrieved
                )
                response = response.replace(span, span_response)
            
            # 再次评估
            quality = self.judge.evaluate(response, docs)
        
        return response, quality

不确定性感知生成

让模型学会「知道自己不知道」是减少幻觉的重要方向。

Token 级别不确定性:在生成每个 token 时输出置信度,低置信度区域进行特殊处理(如截断、标记)

话语级别不确定性:要求模型在回复后附上「确定性评估」,明确指出哪些内容是确信的,哪些是不确定的

# 带不确定性标注的 prompt 设计
system: |
  你是一个严谨的信息助手。在回答问题时:
  1. 对于确信的内容,使用【确信】标记
  2. 对于不确定的内容,使用【不确定】标记并说明原因
  3. 对于完全不了解的内容,直接说明不知道,不要编造
  
  回答格式示例:
  【确信】阿尔伯特·爱因斯坦是相对论的提出者。
  【不确定】他是否获得过诺贝尔和平奖(需要查证)。
  【不确定】他是否来过中国(信息不一致)。

Chain-of-Thought 与自我验证

要求模型在最终答案前展示推理过程,可以显著减少推理错误导致的幻觉。进一步的「自我验证」要求模型检查自己的推理是否自洽。

def self_verification_prompt(query, response):
    verification_prompt = f"""
    原始问题:{query}
    模型回答:{response}
    
    请验证上述回答的正确性:
    1. 列出回答中的每个关键断言
    2. 对每个断言判断:是否能在你的知识中找到支持?
    3. 如果发现错误,指出具体是哪一步推理出了问题
    4. 如果完全正确,确认回答是可靠的
    
    验证结果:
    """
    
    return verification_prompt

后处理纠正机制

在模型生成后,通过规则或辅助模型进行错误检测和纠正:

  • 实体链接验证:将生成内容中的实体链接到知识库,验证存在性
  • 数值范围检查:检查数字是否在合理范围内(如年份在合理历史范围内)
  • 逻辑一致性检验:使用 NLP 工具检验前后文的逻辑矛盾

相关资源


本文档由 AI 辅助生成,内容经过严格审核