你检索到的文档是对的,但模型生成的回答里出现了文档中根本不存在的内容,你遇到过这种情况吗?怎么解决的
P1 · rag · 🏢 京东
🏷 标签:hallucination, prompt, citation, post-processing
1️⃣ 考察意图
面试官想考察你对RAG系统“最后一公里”的掌控力——检索正确但生成幻觉,这是生产环境中最棘手的“假阳性”问题。考察类型是系统设计与debug,刁钻点在于:候选人往往只关注检索召回率,却忽略生成阶段的忠实度控制。答好了能展示你从“检索-生成-后处理”整条链路的工程思维,以及对抗LLM幻觉的实战工具箱(如引用标注、一致性检测、Prompt工程)。
2️⃣ 标准答
这个问题本质是**生成忠实度(Faithfulness)**问题,而非检索质量。我遇到过,在金融保险RAG中,模型把“保额上限100万”编造成“保额上限200万”。解决方案分三层防线:
第一层:Prompt工程硬约束
- 指令明确化:在System Prompt中写死“仅依据以下文档回答,若文档无相关信息,直接说‘未找到’”,并加few-shot示例(如“文档说A,但用户问B,回答‘未找到’”)。
- 引用锚点:要求模型输出时,每句话末尾标注来源段落ID(如
[1]),格式如“保额上限100万[1]”。这强制模型对齐文档,否则生成时无法分配ID。 - Trade-off:引用标注增加推理成本(约15% token消耗),但能显著降低幻觉率(实测从30%降到5%以下)。
第二层:后处理幻觉检测
- NLI模型:用预训练的NLI模型(如DeBERTa-v3-large-mnli)对“文档-生成句”对做蕴含检测。若预测为“矛盾”或“中立”,则标记为幻觉。阈值设为0.8(矛盾概率>0.8则拦截)。
- 语义相似度+事实一致性:对生成句和文档句做BERTScore或BLEURT计算,若相似度低于0.6,触发二次校验。坑:BERTScore对同义词敏感,需调阈值避免误杀(如“保额”vs“保险金额”)。
- 实际落地坑:NLI模型在长文档上性能下降(超过512 tokens)。解法:用滑动窗口切分文档,对每个窗口独立检测,取最差结果。
第三层:引用验证与回退
- 引用完整性检查:解析模型输出的引用ID(如
[1]),检查该ID是否在文档中存在。若不存在或ID无效,直接丢弃该句。 - 回退策略:若整段回答被标记为幻觉,回退到“仅输出文档原文”或“抱歉,无法确认”。在金融场景,我们回退到文档摘要(用T5-small生成),保证信息不编造。
- Trade-off:回退策略降低用户体验(回答变短),但规避了合规风险(保险条款错误可能引发诉讼)。
总结:三层防线不是串行而是并行——Prompt层减少幻觉概率,后处理层拦截残留幻觉,引用验证层兜底。在京东电商场景,我们曾用此方案将幻觉率从12%压到1.5%以下。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从Prompt约束、后处理检测、引用验证三个层面解决。Prompt层用‘仅依据文档+引用标注’硬约束;后处理层用NLI模型和语义相似度做幻觉检测;引用验证层检查ID完整性并回退。总结一句:RAG幻觉不是检索问题,而是生成忠实度问题,需要整条链路工程手段对抗。”
4️⃣ 高频追问 & 应对
追问 1:NLI模型误判怎么办?比如用户问“保额多少”,文档说“保额100万”,模型说“保额100万”,但NLI判为矛盾?
这是常见问题,源于NLI模型对否定和同义词敏感。应对:1)在NLI输入前,对文档和生成句做标准化(如统一数字格式、替换同义词表);2)使用多模型投票(DeBERTa + RoBERTa + BART),取多数结果;3)设置“置信度阈值”,若模型预测概率<0.7,则标记为“不确定”而非“矛盾”,走人工审核。实测多模型投票将误判率从8%降到2%。
追问 2:引用标注增加token成本,怎么优化?
优化点:1)只对关键实体(金额、日期、条款)强制标注,非关键句(如过渡句)不标注;2)用结构化输出(如JSON格式)替代自然语言标注,减少冗余;3)在推理时用FlashAttention降低计算开销。实测优化后token消耗增加从15%降到5%。
追问 3:如果文档本身有矛盾(比如两个段落说不同保额),怎么处理?
这是数据质量问题。解法:1)在检索阶段加入去重和冲突检测(如用MinHash对文档聚类,标记矛盾对);2)在Prompt中要求模型“若文档存在矛盾,请指出并选择多数观点”;3)后处理阶段用NLI模型检测生成句是否与任一文档段矛盾,若矛盾则回退到“文档存在矛盾,请核实”。金融场景我们直接返回“文档不一致,建议人工审核”。
5️⃣ 避坑 · 常见错误答法
- ❌ “我直接让模型不要幻觉,加个Prompt就行。” → ✅ 正确切入:Prompt是软约束,模型仍可能忽略,必须配合后处理检测和引用验证形成完整流程。
- ❌ “我用GPT-4做幻觉检测,效果很好。” → ✅ 正确切入:GPT-4做检测成本高且延迟大,生产环境应使用轻量NLI模型(如DeBERTa)或规则引擎,仅在关键场景调用大模型。
- ❌ “我让模型输出置信度,低于阈值就重生成。” → ✅ 正确切入:模型自评置信度不可靠(calibration差),应基于外部证据(文档-生成句一致性)做客观检测。
6️⃣ 简历呼应
- 如果你有RAG项目:从“我在XX项目中用NLI模型做幻觉检测,将幻觉率从12%降到1.5%”切入,强调工程落地细节(阈值调优、回退策略)。
- 如果你只做过传统NLP:用“文本蕴含任务(NLI)类比RAG幻觉检测,本质是判断生成句是否被文档蕴含”迁移,展示跨领域理解。
- 如果你是校招无项目:聚焦“复现DeBERTa-v3在RAG幻觉检测上的效果”,在GitHub上跑通开源数据集(如RAGTruth),并写技术博客分析阈值影响。
- 《RAGTruth: A Hallucination Corpus for Developing Automatic Evaluation Models》
- 《Faithfulness in Natural Language Generation: A Survey》
- 《DeBERTa: Decoding-enhanced BERT with Disentangled Attention》
- 《Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection》
- 《FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness》