幻觉:大模型的阿喀琉斯之踵
大模型生成流畅、自信但不正确的文本——这就是幻觉。它不是简单的"错误",而是模型对不存在事实的"确信"。理解幻觉的成因是构建可靠AI系统的前提。
幻觉的分类
事实性幻觉 vs 忠实性幻觉
HALLUCINATION_TYPES = {
"事实性幻觉": {
"description": "生成与客观事实不符的内容",
"subtypes": {
"实体幻觉": "编造不存在的人名、地名、机构",
"关系幻觉": "错误描述实体间的关系",
"数字幻觉": "编造不准确的统计数据",
"时间幻觉": "错误的时间线",
"来源幻觉": "编造不存在的引用来源"
},
"example": "爱因斯坦于1923年获得诺贝尔物理学奖" # 实际是1921年
},
"忠实性幻觉": {
"description": "生成与输入/上下文矛盾的内容",
"subtypes": {
"指令违背": "没有遵循用户指令",
"上下文矛盾": "与给定上下文矛盾",
"逻辑矛盾": "自身前后矛盾",
"计算错误": "推理过程中计算错误"
},
"example": "用户说'不要用Python',模型回复用Python实现"
}
}
幻觉的成因
1. 训练数据问题
class DataInducedHallucination:
def __init__(self):
self.causes = {
"数据噪声": {
"description": "训练数据本身包含错误信息",
"example": "维基百科中的错误事实被学习",
"mitigation": "数据清洗和事实核查"
},
"知识冲突": {
"description": "不同数据源对同一事实有不同表述",
"example": "不同网站给出不同的历史日期",
"mitigation": "可信度排序和数据源标注"
},
"长尾知识不足": {
"description": "小众领域数据不足,模型靠猜",
"example": "冷门历史事件的细节",
"mitigation": "RAG增强"
},
"知识过时": {
"description": "训练数据有时效性",
"example": "模型不知道最新的公司财务数据",
"mitigation": "实时检索"
}
}
2. 解码策略影响
class DecodingInducedHallucination:
def analyze(self, model, prompt, strategies):
"""分析不同解码策略的幻觉率"""
results = {}
for strategy_name, params in strategies.items():
hallucination_count = 0
for _ in range(100): # 100次采样
response = model.generate(prompt, **params)
if self._is_hallucination(response, prompt):
hallucination_count += 1
results[strategy_name] = {
"hallucination_rate": hallucination_count / 100,
"params": params
}
return results
# 典型结果:
# greedy (temperature=0): 15% 幻觉率
# temperature=0.3: 18% 幻觉率
# temperature=0.7: 25% 幻觉率
# temperature=1.0: 35% 幻觉率
# top_p=0.9: 22% 幻觉率
# top_k=50: 28% 幻觉率
3. 模型知识表示问题
class KnowledgeRepresentationIssue:
"""
模型的知识存储在参数中,不是数据库查询。
这意味着:
1. 知识边界模糊(不知道自己不知道什么)
2. 知识提取不可靠(同样的知识不同问法结果不同)
3. 知识干扰(相关知识互相干扰)
"""
def measure_knowledge_boundary(self, model, questions):
"""测量模型的知识边界感知"""
results = []
for q in questions:
# 让模型评估自己的确定性
response = model.generate(f"{q}\n\n你对答案的确定程度?(1-10)")
# 验证答案正确性
is_correct = verify_answer(q, response)
confidence = extract_confidence(response)
results.append({
"question": q,
"correct": is_correct,
"confidence": confidence,
"calibrated": (is_correct and confidence > 7) or
(not is_correct and confidence < 4)
})
calibration_rate = sum(r["calibrated"] for r in results) / len(results)
return {
"calibration_rate": calibration_rate,
"over_confident": sum(1 for r in results if not r["correct"] and r["confidence"] > 7),
"under_confident": sum(1 for r in results if r["correct"] and r["confidence"] < 4)
}
幻觉缓解技术
训练阶段缓解
RLHF中的真实性奖励:
class TruthfulnessReward:
def compute_reward(self, response, reference_facts):
"""在RLHF中加入真实性奖励"""
# 基础奖励(有用性、无害性)
base_reward = self.base_reward_model(response)
# 真实性奖励
facts_in_response = extract_facts(response)
truth_score = 0
for fact in facts_in_response:
if self._verify_fact(fact, reference_facts):
truth_score += 1
else:
truth_score -= 2 # 幻觉惩罚
# 拒绝回答也是正确的
if "我不知道" in response or "我不确定" in response:
truth_score += 0.5 # 鼓励承认不知道
return base_reward + 0.3 * truth_score
事实性微调:
def factuality_finetuning(model, factuality_data):
"""使用事实性数据微调"""
# 数据格式:(问题, 正确答案, 易混淆的错误答案)
for question, correct, misleading in factuality_data:
# 对比学习:正确答案 vs 错误答案
loss = contrastive_loss(
model, question, correct, misleading
)
loss.backward()
推理阶段缓解
RAG增强:
class RAGHallucinationMitigation:
def generate(self, question):
# 1. 检索相关事实
facts = self.retriever.search(question, top_k=5)
if not facts or facts[0].score < 0.3:
# 没有可靠来源 → 鼓励拒绝回答
return "我没有找到可靠的信息来回答这个问题。"
# 2. 带引用的生成
prompt = f"""
基于以下来源信息回答问题。
来源:
{[f"[{i+1}] {f.content}" for i, f in enumerate(facts)]}
问题:{question}
要求:
1. 只基于来源信息回答
2. 每个事实标注来源编号
3. 来源中没有的信息要明确说明
4. 如果来源信息矛盾,说明分歧
"""
return self.llm.generate(prompt)
自一致性检查:
class SelfConsistencyCheck:
def check(self, question, model, n_samples=5):
"""多次采样检查一致性"""
responses = [
model.generate(question, temperature=0.7)
for _ in range(n_samples)
]
# 提取每个回答中的事实声明
all_claims = [extract_claims(r) for r in responses]
# 检查一致性
consistent_claims = []
for claim in all_claims[0]:
appears_in = sum(1 for claims in all_claims if claim in claims)
if appears_in >= n_samples * 0.6: # 60%以上一致
consistent_claims.append(claim)
# 只保留一致的声明
verified_response = self._reconstruct(consistent_claims)
return verified_response
事实后验验证:
class FactVerification:
def verify_and_correct(self, response, knowledge_base):
"""对生成内容进行事后事实核查"""
# 1. 提取事实声明
claims = self._extract_claims(response)
# 2. 逐一验证
corrections = []
for claim in claims:
verification = self._verify(claim, knowledge_base)
if not verification["supported"]:
corrections.append({
"original": claim,
"correction": verification.get("correct_info"),
"confidence": verification["confidence"]
})
# 3. 应用修正
corrected = response
for corr in corrections:
if corr["correction"]:
corrected = corrected.replace(
corr["original"],
corr["correction"]
)
else:
# 无法修正的标记
corrected = corrected.replace(
corr["original"],
f"[未验证: {corr['original']}]"
)
return corrected
幻觉检测
内在一致性检测
class InconsistencyDetector:
def detect(self, response):
"""检测回答内部的一致性"""
# 1. 分解为声明
claims = self._extract_claims(response)
# 2. 检查声明间的矛盾
contradictions = []
for i, c1 in enumerate(claims):
for c2 in claims[i+1:]:
if self._are_contradictory(c1, c2):
contradictions.append((c1, c2))
# 3. 检查逻辑一致性
logical_flow = self._check_logical_flow(response)
return {
"claims_count": len(claims),
"contradictions": contradictions,
"logical_issues": logical_flow,
"hallucination_risk": len(contradictions) / max(len(claims), 1)
}
外部知识验证
class ExternalVerification:
def __init__(self, search_engine, knowledge_graph):
self.search = search_engine
self.kg = knowledge_graph
def verify(self, response):
"""用外部知识验证回答"""
claims = self._extract_claims(response)
results = []
for claim in claims:
# 搜索验证
search_results = self.search.query(claim["text"])
support_score = self._compute_support(claim, search_results)
# 知识图谱验证
kg_result = self.kg.query(claim["entities"])
results.append({
"claim": claim,
"search_support": support_score,
"kg_support": kg_result,
"verified": support_score > 0.5 or kg_result["found"]
})
return {
"total_claims": len(claims),
"verified_claims": sum(1 for r in results if r["verified"]),
"unverified": [r for r in results if not r["verified"]],
"overall_confidence": sum(r["verified"] for r in results) / max(len(results), 1)
}
评估基准
HALLUCINATION_BENCHMARKS = {
"TruthfulQA": {
"description": "测试模型是否模仿人类谬误",
"metric": "真实性百分比",
"best_models": "GPT-4o: 75%, Claude-4: 78%"
},
"HaluEval": {
"description": "幻觉评估基准",
"metric": "非幻觉率",
"best_models": "GPT-4o: 88%"
},
"FactScore": {
"description": "原子事实精确度",
"metric": "事实得分",
"best_models": "GPT-4o: 0.74"
},
"TrueQA": {
"description": "复杂事实问答",
"metric": "准确率",
"best_models": "GPT-4o: 65%"
}
}
结语
消除幻觉是一个多层防御工程:训练阶段减少幻觉倾向,推理阶段提供事实依据,后处理阶段验证修正。没有任何单一技术能完全消除幻觉,但组合使用可以将幻觉率从30%+降低到5%以下。对于需要高可靠性的应用(医疗、法律、金融),RAG+事实验证+人工审核的三层防护是必要的。记住:模型不知道自己不知道什么——这是幻觉的根本原因,也是所有缓解策略的出发点。