关键词
| 序号 | 关键词 | 英文 | 说明 |
|---|---|---|---|
| 1 | 幻觉 | Hallucination | 模型生成与事实不符的内容 |
| 2 | 事实性 | Factuality | 内容与客观事实的一致程度 |
| 3 | BLEU | Bilingual Evaluation Understudy | 机器翻译评估指标 |
| 4 | ROUGE | Recall-Oriented Understudy for Gisting Evaluation | 文本摘要评估指标 |
| 5 | BERTScore | BERT-based Scoring | 基于语义理解的评估指标 |
| 6 | SelfCheckGPT | - | 基于自检验的幻觉检测 |
| 7 | FActScore | FActual 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 仍然依赖参考文本,无法独立判断事实正确性。
人类评估设计方法论
评估者选择与培训
高质量的人类评估需要精心选择和培训评估者。评估者应具备:
- 领域基础知识,能够判断内容正确性
- 一致的评分标准,理解各维度的定义
- 足够的耐心和注意力,保证评估质量
评估者筛选流程:
- 初始筛选:测试基本判断能力和领域知识
- 培训阶段:学习评估标准,完成练习题
- 校准测试:评估标准化样本,对比与专家标注的一致性
- 正式评估:通过校准测试的评估者参与正式评估
多维度评估框架
幻觉评估应覆盖多个维度,而不是简单的二元判断(正确/错误):
| 维度 | 评估问题 | 评分标准 |
|---|---|---|
| 事实准确性 | 主要事实是否与已知事实一致? | 完全准确 / 轻微偏差 / 明显错误 / 完全虚构 |
| 细节可靠性 | 具体细节(数字、日期、名称)是否可靠? | 完全可靠 / 存在可疑细节 / 存在明显错误 |
| 引用准确性 | 引用、参考文献是否真实存在? | 全部准确 / 部分准确 / 存在虚构引用 |
| 逻辑一致性 | 与前文是否保持逻辑一致? | 完全一致 / 存在轻微矛盾 / 明显自相矛盾 |
| 整体可信度 | 综合考虑,你有多大把握相信这段内容? | 非常相信 / 基本相信 / 不太相信 / 完全不信 |
评估协议设计
为保证人类评估的可靠性和效率,需要设计清晰的评估协议:
# 幻觉评估协议 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 工具检验前后文的逻辑矛盾
相关资源
- LM_Eval评估框架 - 综合了解模型评估体系
- 模型压缩技术 - 压缩对幻觉的影响
- 提示工程 - 通过提示减少幻觉
- 检索增强生成RAG - RAG 技术详解
本文档由 AI 辅助生成,内容经过严格审核