资讯动态

RAG实战:检索增强生成如何有效降低大模型幻觉

发布时间:2026/10/13 5:18:01 来源:尧图企业网站定制
我最初做这个项目纯粹是被大模型“一本正经胡说八道”逼的。当时接了一个某行业的智能问答系统开发给大模型投喂了一堆内部资料结果它在回答一个非常冷门的设备参数时自信满满地给出了一个看似严谨、实则完全错误的数据。后来一查那个参数它压根没见过属于典型的“记忆编造”——也就是幻觉问题。才真正决定把精力砸在RAG上也就是检索增强生成让模型先“查书”再开口回答。这篇文章就想把这些实战经验掰开揉碎了讲讲特别是它的降幻觉逻辑、完整工作流以及我在落地过程中踩过的坑希望能给正在被幻觉困扰的朋友一些直接可用的参考。1. 大模型为什么会“编答案”幻觉的根源拆解要理解RAG为什么能把幻觉降下来得先搞清楚大模型那些胡说八道的话到底是怎么来的。很多人以为模型在说谎其实它压根没有“说谎”这个概念它只是在做一件它最擅长的事根据概率预测下一个最合理的词。1.1 参数化记忆的天然缺陷大模型的知识全部压缩在几十亿甚至上千亿的参数里。你可以把参数想象成一张巨大的、密密麻麻的索引表模型回答问题时就是在这张“索引表”里检索匹配的信息。问题是这张索引表是训练时写死的一旦训练完成它就再也无法更新。现实世界的知识日新月异一个发生在2024年11月的行业新规一个刚上线产品的内部配置细节对模型来说都是盲区。更麻烦的是当模型遇到一个它“索引表”里完全没有的知识点时它不会像人一样老老实实说“我不知道”它的训练目标让它必须生成一个语法通顺、逻辑自洽的回答。为了这个“通顺”和“自洽”它就会调用最相近的、甚至东拼西凑的参数片段来填充于是产生了幻觉。这就像让一个没去过某城市的人画该城市的地铁图他只能凭对其他城市地铁的印象瞎画一张看着像那么回事实际上全是错的。1.2 模型置信度与事实正确性并不同步还有一个很容易被忽略的细节大模型在回答时往往会给出一个看似极高的置信度但置信度高低跟答案是否正确没有必然关系。我在项目里做过测试让同一个模型回答同一个事实类问题它给出某个答案时token的概率分布非常集中、看起来信心十足但那个答案依旧是错的。原因在于模型优化目标是预测下一个token的流畅度而不是校验事实。它把“这段文字看起来像是权威资料里会出现的措辞”当成了“这段文字是真实正确的”。这种“流畅即正确”的倾向是幻觉产生的深层机制。这也解释了为什么单纯靠“提示词强调不要乱说”收效甚微——你没法通过几句指令改变它底层训练形成的概率分布。1.3 幻觉的类型化两种完全不同的“错法”做技术方案时不能笼统地说“有幻觉”得把幻觉拆开看因为不同类型的幻觉对应不同的处理策略。我在实践中倾向于把幻觉分成两大类。第一类是事实性幻觉也叫“硬错误”指的是输出的内容里有明确的、可验证的实体错误比如日期不对、人名弄错、参数值对不上。这类幻觉最致命因为它是客观错误用户一旦核对就能发现。RAG在解决这类问题上效果最明显因为检索到的知识片段能直接给模型提供标准答案。第二类是逻辑性幻觉也叫“软错误”指的是单个事实点都是对的但组合起来的推理链条是错的。比如模型正确引用了某产品的两个独立功能却错误地推导出“这两个功能可以联动”。这类幻觉RAG能部分缓解但无法根治因为检索回来的碎片化信息反而可能让模型在拼接时产生错误的逻辑联系。理解这两类区别很重要。很多团队做完RAG发现幻觉还是没消失往往就是把这两类混在一起了用检索增强去解决逻辑推理问题自然隔靴搔痒。2. RAG的完整工作流从“查书”到“答题”的四步走RAG的核心思想一句话就能讲明白先让模型去外部知识库里检索相关资料再把检索到的资料连同问题一起喂给模型让它基于资料作答。但落地到系统架构上远比这复杂。我把它拆成四个环节每个环节都有讲究。2.1 知识准备阶段把“书”变成模型能查的索引想象你要建一个图书馆但把几万本纸质书直接堆在桌上让读者翻效率是灾难性的。RAG的第一步就是把这个“图书馆”整理成带索引的卡片柜。具体来说就是把原始文档PDF、Word、网页等拆分成小块也叫“分块Chunking”再让Embedding模型文本向量化模型把每个块转换成一串高维向量最后存入向量数据库。这里最核心的难点是分块策略。块太大检索出来的片段包含大量无关噪声模型容易被带偏块太小上下文信息不完整检索精度又不够。我的经验是按语义边界切分而不是按固定字符数硬切。比如某产品的技术文档我会优先按“章节-小节-段落”的层级结构来切一个块对应一个相对完整的语义单元比如一个操作流程、一个参数表、一个注意事项。还得处理另外一个问题文档里经常有表格、图片、复杂的排版。表格还好办转换成Markdown格式后语义基本能保住但图片里嵌入的“图片型PDF”是一大坑只做文本提取会丢一半信息。这种情况下我通常引入OCR光学字符识别工具做预处理先把图片里的文字提出来再走后续流程。2.2 检索召回阶段把最相关的“几页书”挑出来知识库建好后用户提出问题时系统先把这个问题的向量化结果放到向量数据库里做相似度搜索把最相近的Top-K个文本块捞出来。这个“相似度搜索”看着简单实际操作中坑非常多我在后面专门开一节讲。检索阶段有几个关键参数需要调优Top-K值、相似度阈值以及向量距离度量方式。参数作用我的建议Top-K召回多少个文本块建议5~10之间太小答不全太大噪声多相似度阈值过滤掉相关度太低的块建议根据测试集校准通常0.7~0.85之间距离度量衡量向量相似度的方式常用余弦相似度Cosine Similarity对文本语义好召回阶段的核心矛盾是召回太少怕漏系统答不上来召回太多怕吵系统被无关信息干扰。实际调优时我会先设一个较大的K值如15~20观察哪些块是真正有用的再逐步收紧到最合适的范围。2.3 增强融合阶段把“书上的答案”拼进提示词这一步是最能体现RAG工程技巧的地方也是很多新手最容易做错的地方。检索到的文本块不能简单粗暴地一股脑塞进提示词里需要做一定的处理和编排。我常用的做法是在提示词里明确区分“检索到的参考知识”和“模型自身的知识”两个来源同时设定极其强硬的指令规则。一个简化版的提示词模板大致长这样你是一个知识渊博的问答助手请严格基于以下“参考知识”来回答用户的问题。 【参考知识开始】 {这里填充检索到的相关文本块块与块之间用分隔符隔开} 【参考知识结束】 回答要求 1. 如果参考知识包含答案请优先基于参考知识作答并在回答末尾标注[引用]来源编号。 2. 如果参考知识不包含答案请直接回答“抱歉根据现有资料我无法回答该问题”严禁自行编造。 3. 回答时不要重复参考知识的原文请组织自己的语言进行概括表达。 4. 如果参考知识之间存在矛盾请指出矛盾的来源而非强行调和。这版提示词我反复迭代过很多次。其中第2条最重要它给了模型一个“合法认输”的出口。没有这个出口模型哪怕知道参考知识里没答案它也倾向于凑一个答案出来。这也是降幻觉的关键心理机制——你得允许模型说有它不知道的事。2.4 生成回答阶段带着“小抄”上考场最后一步就是调用大模型生成答案。这一步的形式可以有很多种可以接在线的大模型API也可以接本地部署的开源模型。我最初的版本用的是通用模型配合上面的增强提示词幻觉率直接砍掉了大半。这里有个容易忽视的注意点生成阶段的参数设置也会影响幻觉。比如Temperature温度系数控制随机性调太高模型就更容易自由发挥。在处理事实型问答时我会把温度调到很低的水平比如0或者0.1让它更保守、更贴近参考知识。另外如果要求答案必须可溯源还可以在生成阶段让模型输出“引用来源”。比如按照第几个文本块回答的就把编号标出来这样用户在界面上直接点编号就能看原始出处。这不光提升了可信度也方便我们对生成质量做后续审计和分析。3. 落地RAG最容易翻车的三个环节如果说上面四步流程是“标准答案”那接下来要聊的就是“现实考卷”。我把踩过的坑集中在三个环节Embedding选型、分块策略、检索质量。这三个环节任何一处出了问题整个RAG系统的降幻觉效果都会大打折扣。3.1 Embedding选型并不是模型越大越好最开始做RAG时我的想法很朴素选一个参数最大的Embedding模型应该是效果最好的吧实际测下来发现这个判断标准要靠不住。真正关键的是Embedding模型的训练语料和你的知识库领域是否匹配。比如我用一个面向通用开放域文本训练的Embedding模型来处理某行业的垂直技术文档效果就非常差。因为文档里全是专业术语、特定缩写和内部黑话通用模型压根没学过这些词之间的语义关系“余氯传感器”和“在线监测模块”在通用模型看来八竿子打不着但在实际技术文档里它们可能经常出现在同一个操作场景中。这种情况下的解决方案通常有两种。一是使用领域适配的Embedding模型比如找专门针对行业语料预训练过的模型二是基于自己的知识库做微调或继续训练有点类似于让Embedding模型“入乡随俗”。选Embedding模型另一个需要关注的点是向量维度。维度越高表达语义的能力通常越强但存储成本和检索成本也随之上升尤其在知识库达到百万级文本块后高维向量对性能的压力会非常明显。我一般会用一个小数据集跑AB对比不能只看检索命中率还要看问答的最终质量。3.2 分块策略的精细化调整切成多大才有最佳效果分块大小这个参数看起来只是“数字调大调小”实际上是质量和性能之间的博弈。我做过一组对照实验固定其他条件不变只调整分块大小结果问答准确率差了将近二十个百分点。分块太小的典型问题是语义断裂。比如切到一句话一个块检索到“温度超过45摄氏度”但丢掉的前文“当设备在高温环境下持续运行”没被召回模型就不知道45摄氏度的约束条件是什么只能放飞想象。分块太大的问题是引入了大量无关信息。有一回我把一个章节整体作为一个块检索出来的块里包含了目标信息但也夹杂了两页纸的安装说明。模型生成答案时受无关内容干扰反而把正确的核心参数答偏了。我最终的实践心得是混合分块策略基础分块按标题层级切到二级或三级标题每个块的文本量控制在500~800字之间对于特别重要的内容再额外切一层更细粒度的“关键句子块”和基础块一起灌进知识库。检索的时候根据问题的类型和数据特征决定优先召回哪一种级别的块。3.3 检索质量相似度分数高不代表内容真正相关在我的实际测试里这是最坑的一环。向量检索的本质是用高维空间中的“距离”来模拟语义相似度但距离近≠内容靠谱。典型场景是问到某个产品的问题检索系统把同一产品线的所有内容都捞上来了分数都很高但真正回答问题的答案只有一个块。模型面对一堆相似但不完全对口的文本极容易“张冠李戴”把A型号的参数安到B型号上。处理这个问题我用了一个组合拳方案混合检索。先做稀疏检索也就是基于词频统计的传统搜索方法。接着做稠密向量检索也就是Embedding模型的语义检索。最后把两者的结果通过一个融合算法比如加权或者排序合成最终召回列表。这样做的道理很简单语义检索擅长理解“用户意图”但有时会忽略精确的关键词匹配关键词搜索笨但碰到专业术语、型号编码这类词往往精准得可怕。另外查询改写也是一个被低估的降幻觉手段。用户提问时经常带口语化表达比如“那个新出来的检测仪能扛住多高温度”直接把这句话拿去检索效果会非常差。我一般在检索前先让大模型把用户问题改写成规范的、面向检索的句式“这款新型检测仪的最高工作温度是多少”再去做向量检索。这一步对最终答案质量的提升非常显著。4. 怎么量化“幻觉降了多少”搭建一套靠谱的评测体系有一句吐槽说得挺对没有评测体系的RAG优化纯粹是拍脑袋调参。这个阶段花了最多的时间因为很多幻觉是隐蔽的屏幕上看感觉“答得还行”但你真要一个指标一个指标去量化才发现标准特别难定。4.1 构建评测集不能用训练过的数据当考卷评测集说白了就是“考卷”这个考卷必须覆盖三种题型已知答案的题目、答案不确定的题目、需要多个知识块拼接推理的题目。这里有个大坑是数据泄漏。我曾经犯过这个错评测集里的文本块直接取自知识库的某份文档而这份文档和Embedding模型的训练数据高度重叠。结果检索命中率表面好看实际换一批新题目就掉回原形。评测数据必须从知识库里抽出来做“留出集”或者另外找一批相近但不在库里的题目来测试。建造评测集时我通常组织了几百道题按难度分成三层难度层级题目特征考察目标基础层可直接在单一文本块中找到答案检索精确度交叉层答案分散在多个文本块中需要拼接多跳推理能力对抗层故意问知识库中不存在的内容拒答能力即能否抵抗幻觉第三层特别重要。降幻觉不仅仅是“该答对的答对”还是“不该答的得有勇气拒绝”。很多RAG系统表面评测分数很高一问细节就露馅就是因为对抗层题目太少系统根本没有形成“认怂”的能力。4.2 评测指标别只盯着准确率还要看“引用正确率”衡量RAG的效果我至少会记录三个指标回答准确率、检索召回率、引用准确率。这里的引用准确率很特别它指模型给出的回答所引用的文本块是否真的包含答案且没有把不相关的块当成依据。这个指标能暴露出一个常见问题模型把检索回来的“错误块”当成了救命稻草。比如说它明明能基于自己的知识答对但因为看到某个检索到的块很相似就强行引用它来答题反而答错了。这种“检索误导”现象很隐蔽单看准确率不一定能发现但引用准确率一塌糊涂就暴露了。评测方式上我采用了大模型评审加人工抽检的组合。先让一个评审模型按设定的打分规则批量给答案质量打分再抽出一部分分数存疑的答案由人工做二次判断。这么做既能控制评测成本也能保证最终结论相对可靠。4.3 几组实测数据基线对比到底降了多少幻觉配套的这个评测体系我拿到了几组很有意思的对比数据。不卖关子先说结论方案回答准确率引用准确率幻觉率对抗层纯大模型直接问答62%-84%基础RAG不分块优化78%71%40%优化RAG混合检索查询改写强提示词91%88%9%纯大模型直接问答时对抗层题目里84%都“硬着头皮”给了答案基本全错这叫“胡编率”。优化后的RAG系统在对抗层只有9%的情况下会试着作答剩下91%都正确拒答系统会指出“根据现有资料无法回答该问题”幻觉率降幅接近九成。这些数据说明了两个事情第一RAG确实能大幅度降低幻觉但需要系统工程配合不是加个检索环节就完事第二拒答能力是降幻觉的隐形核心一个敢于说“不知道”的系统比一个强行作答的系统可靠太多。5. RAG的边界与进阶方向哪些幻觉它解决不了接下来能怎么走RAG不是银弹。这点我越做越有感触。它擅长解决的是“知识盲区”带来的事实性幻觉但对“逻辑推理幻觉”和“检索不当导致的误导幻觉”它只能缓解不能根治。这个认知会直接影响你对系统的期望值和投入方向。5.1 RAG解决不了的两类问题第一类是推理幻觉。比如你问“设备的A功能和B功能同时开启时功耗是两者相加吗”知识库里可能分别记载了A功能的功耗、B功能的功耗但压根没提两者叠加的场景。即便RAG把两块知识都检索到了模型在拼接推理时仍然可能凭“感觉”给出一个并不正确的结论。Retrieval-Augmented Generation擅长的是增强记忆不是增强推理。第二类是检索噪声导致的强制关联幻觉。有时候召回质量不够好捞回来的五个块里四个都有用一个是完全不相关的。大模型可不会像人一样自动忽略噪声它会把那个无关块也当作参考依据努力“圆”出一个逻辑自洽的回答结果就是被带偏。5.2 我的进阶尝试图谱增强与自我反思针对推理类问题我在后期做了一个改良方向知识图谱增强RAG。思路很简单把文档里的核心实体、实体属性和实体关系抽出来建一张知识图谱。检索的时候不仅找相似文本块还顺着图谱的边去找到关联实体。这个方案在处理“多实体多跳关系”的问题上比纯向量检索稳了很多。另外一个很有用的方向是自我反思机制。生成答案前先做一个“前置校验”让模型自己回答一遍再让它回答“基于检索到的文本块这个回答是否站得住脚”如果校验通过才输出不通过就重写。这本质上是给RAG加了一道质检关卡虽然增加了调用成本但换来更稳的事实正确性这在严肃领域是非常值的。把RAG和微调结合也是一个思路。如果某类问题反复出现经常用到同样的知识块与其每次都靠检索召回去拼不如把这类高频知识直接微调进模型权重。这样既有检索兜底又有内化知识提速两条腿走路。最终还是要回到一开始那个问题RAG是怎么把幻觉降下来的说到底它做了一件特别朴素的事——给大模型配了一本可以随翻随查的参考书并且严格要求它“查完再答”。这套机制不好看但很管用。如果你手头也有一个被幻觉折磨的问答系统不妨从分块和提示词这两个最小的切入点开始改造我敢说改动一天之内你就能看到明显的区别。然后沿着评测、检索、进阶的方向一步步往下走幻觉会让你看到它真实可控的一面。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑