RAG 二次生成怎么减少幻觉?
结合提示工程与约束生成策略,降低大模型幻觉
原题:在RAG系统中,通过大模型对检索结果进行二次生成,如何有助于减少幻觉现象?请结合提示工程或约束生成策略说明。
评估与监控 · 字节真题
回答与解析
核心机制:检索结果作为"锚定"约束
大模型二次生成减少幻觉的本质,是将检索结果作为事实边界,约束模型在知识范围内作答,而非依赖参数化记忆进行外推。
提示工程策略
1. 引用标注提示(Citation Prompting)
"请基于以下参考资料回答问题,并在答案中标注引用来源编号。
若资料不足以回答,请明确说明'根据现有资料无法确定'。"
- 强制模型建立生成内容与检索片段的显式关联
- 便于后续溯源验证,也增加模型"说谎"的心理成本
2. 上下文优先级提示
"优先依据提供的参考资料,而非你的内部知识。
当两者冲突时,以参考资料为准。"
- 明确知识优先级,缓解模型过度自信问题
3. 不确定性表达引导 要求模型对低置信度内容使用弱化表达("可能"、"据资料显示"),对无法确认的内容主动拒绝回答。
约束生成策略
1. 检索结果强制绑定
- 限制生成token只能从检索内容的词汇分布中采样(constrained decoding)
- 或要求生成内容必须与检索片段的embedding相似度超过阈值
2. 结构化输出约束 强制输出格式包含:
- 直接引用原文的关键句
- 推理链(检索内容→结论的推导步骤)
- 置信度评分
3. 动态温度调整 对检索匹配度高的部分使用低温度(确定性生成),对需要综合推理的部分适度提高温度,平衡事实准确性与表达流畅性。
关键认知
提示工程是软约束,依赖模型遵循指令的意愿;约束生成是硬约束,从解码层面限制输出空间。实际系统中通常两者结合,并配合生成后验证(如NLI模型检验答案与检索内容的一致性)形成多层防护。
学习建议
建议系统学习该知识点
口语版讲法(约4分钟)
- 本质是锚定事实边界
- 提示工程做软约束
- 约束生成做硬限制
- 落地要分层配合风险
- 可延伸点:自检机制
这道题其实是在问,怎么用检索结果把大模型'拴住',不让它自由发挥产生幻觉。说白了,检索回来的内容就是事实边界,二次生成的核心就是让模型在这个框里作答,而不是靠它自己记忆去猜。
我先说提示工程这边,它属于软约束,就是靠指令让模型听话。最常用的一个手法叫引用标注,我让模型必须基于给定资料回答,每条结论后面标上出处编号,如果资料不够就明确说'根据现有资料无法确定'。这招好处是强制建立生成内容和检索片段的对应关系,万一出了问题也好溯源。还有一个优先级提示,明确告诉模型'参考资料优先于你的内部知识,冲突时以资料为准',这能缓解模型过度自信的问题。另外就是引导模型对不确定的内容用'可能''据资料显示'这类弱化表达,实在拿不准就直接拒答。
但提示工程有个问题,它依赖模型愿不愿意遵守指令,要是模型叛逆或者指令理解偏了,效果就打折扣。所以还得上硬约束,也就是从解码层面限制输出空间。比如约束解码,限制生成的 token 只能从检索内容的词汇分布里采样,或者要求生成内容的 embedding 和检索片段相似度超过某个阈值,超了就截断。再比如结构化输出,强制模型输出格式里必须包含直接引用的原句、推理链、置信度评分,这样每一步都有据可查。还有一个技巧是动态调整温度,对检索匹配度高的部分用低温度,保证事实准确;需要综合推理的地方稍微提高温度,让表达更自然。
实际落地的时候,我不会只用其中一种,而是软硬结合,再加一层生成后验证。比如拿一个 NLI 模型去判断生成内容和检索片段是否一致,不一致就拒绝输出或者重新生成。举个例子,客服场景里用户问退款政策,检索到的是满减规则,如果模型直接拿满减规则回答退款,就出幻觉了。这时候 NLI 模型就能拦住。
这里有个坑要特别注意:所有约束的前提是检索质量本身要过关。如果检索回来的内容就是错的或者不相关,你约束得再严也没用。所以我会先确保检索链路靠谱,比如用 Hybrid Search 把关键词和向量结合起来,再配合 Rerank 把最相关的片段顶上去。另外,温度调整也得小心,如果检索匹配度高的部分温度设太低,生成内容可能过于死板,像在念原文,用户体验不好。
所以我的整体思路是:把提示工程、约束生成、生成后验证三层叠起来,同时持续监控检索召回率和忠实度指标。比起花里胡哨的提示词,我更看重检索质量和硬约束的兜底能力。
说到验证,其实还有一个方向是让模型自己对自己生成的内容做自检,比如 Chain-of-Verification,先生成答案,再针对答案里的关键事实生成验证问题去检索,最后对比修正。这个思路在事实密集型场景里特别有用,但开销也会翻倍,怎么平衡准确率和成本,我觉得是落地时值得深挖的点。
关键一句:模型自检机制(Chain-of-Verification)在事实密集型场景中能提升准确率,但会带来额外开销
面试官还可能这样问
- 问法 1 · 场景切入
假设你在做一个电商客服RAG,用户问“这个订单什么时候发货”,系统检索到物流规则,但大模型可能自己编一个时间。你怎么通过二次生成来避免这种幻觉?
- 问法 2 · 层层追问
RAG里检索结果给大模型,它为什么还会编造?……那你怎么让生成内容必须基于检索?……如果提示词说“请依据资料回答”还不够,还有什么更硬的手段?
- 问法 3 · 直球架构
在RAG中,大模型对检索结果做二次生成时,提示工程和约束生成分别怎么减少幻觉?具体说说提示怎么写、解码怎么约束。