
🧠 记忆锚点:先分清没证据、错证据、冲突证据还是没用证据;低温度不能补回缺失证据,覆盖不足应澄清或拒答。
💡 答案要点
幻觉来源分类:
| 幻觉类型 | 原因 | 示例 |
|---|---|---|
| 检索幻觉 | 检索内容不相关,模型自行编造 | 问A知识,找到B知识,模型混用 |
| 融合幻觉 | 多个 chunk 信息矛盾,模型错误融合 | 文档A说10%,文档B说20%,模型说15% |
| 过度推断幻觉 | 模型超出检索内容范围推断 | 文档说"可能",模型断言"一定" |
| 记忆幻觉 | 模型用训练记忆覆盖检索内容 | 检索到最新数据,模型仍用旧知识 |
对应解决方案:
全链路治理框架(面试体系化回答):
从上游到下游,从源头到兜底:
1. 检索侧(源头):混合检索+Chunk优化+Rerank
→ 保证送给模型的上下文准确,从源头减少幻觉
2. 生成侧(过程):Prompt强约束+Few-Shot示例
→ 无答案直接说不知道、禁止编造、关键信息必须和原文一致
3. 校验侧(兜底):事实一致性校验+引用溯源
→ 不合格的拦截重生成
4. 迭代侧(长效):bad case 回流机制
→ 线上幻觉案例回流,持续优化检索和Prompt关键数字强校验(金融/政务场景加分):
金融场景对数字、政策条款要求极高:
- 提取答案中的关键数字/条款,与检索原文比对
- 不一致 → 拦截重生成或明确标注
- 例:答案中"利率3.85%"必须能在原文中找到对应表述bad case 回流闭环(面试加分):
线上反馈幻觉案例 → 人工标注 → 归因(检索错/生成错)
→ 检索错:优化Chunk/Embedding/Query改写
→ 生成错:优化Prompt/加校验规则
→ 回归测试 → 上线展开 Python 代码示例(34 行)
python
class HallucinationGuard:
"""幻觉防护三层体系"""
# Layer 1: 预防 - 让模型只能基于检索内容回答
SYSTEM_PROMPT = """
你只能根据提供的<context>内容回答问题。
如果context中没有相关信息,回答"根据现有资料无法回答该问题"。
不要推断或补充context中没有的信息。
每个关键论断必须引用对应的context片段。
"""
# Layer 2: 检测 - 答案与来源的一致性验证
async def check_faithfulness(
self, answer: str, sources: list[str]
) -> float:
"""RAGAS Faithfulness 评估:答案有多少来自检索内容"""
prompt = f"""
判断以下答案中的每个陈述是否能从来源文本中找到依据。
答案:{answer}
来源:{sources}
输出 JSON: {{"faithful_score": 0.0-1.0, "unsupported_claims": []}}
"""
result = await llm.complete(prompt)
return result["faithful_score"]
# Layer 3: 兜底 - 低置信度转人工
async def safe_answer(self, query: str, context: list) -> str:
answer = await llm.generate(query, context)
score = await self.check_faithfulness(answer, context)
if score < 0.7:
# 置信度低 → 明确告知不确定
return f"基于现有资料,{answer}(注:该回答置信度较低,建议人工核实)"
return answer实际指标目标:
幻觉率(Faithfulness < 0.7 的比例):< 5%
RAGAS Faithfulness 均值:> 0.85
无法回答率(主动拒答):5-15%(合理范围,优于编造)面试话术:
"RAG 幻觉我用三层防护:1) Prompt 层约束模型只能引用 context 内容,未找到时主动说'无法回答';2) 低 Temperature(0.1-0.2)让模型保守生成;3) RAGAS Faithfulness 指标持续监控,评分<0.7 的回答标记为低置信度并转人工审核。生产环境幻觉率控制在 3% 以内。"
📚 参考:RAG 原论文(基于证据生成降低幻觉)