ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

大模型幻觉治理实战:知识增强与推理时干预双管齐下

大模型幻觉治理实战:知识增强与推理时干预双管齐下

幻觉问题为什么这么难治?我从一个实际案例说起。

去年我在做一个面向专业领域的大模型问答系统,客户反馈非常直接:模型给出的答案,引用的政策条款号是真的,但条款内容对不上;引用了一篇论文,但论文标题和作者是编的。这种“一本正经地胡说八道”就是大模型幻觉的典型表现。做算法的人都知道,幻觉不根治,模型在严肃场景里根本没法用。好在经过一段时间的探索,我把重心放在了两个方向上:知识增强架构和推理时干预策略。这两个方向配合起来,能把幻觉率降到一个可以接受的范围。

这篇文章就是我基于实际项目经验整理的第二章内容,重点拆解知识增强架构怎么搭、推理时干预策略怎么落地,以及两者如何协同工作。适合正在做大模型应用落地、被幻觉问题折磨的工程师和技术负责人参考。如果你对LlamaIndex、向量检索、RAG这类技术有基础了解,阅读体验会更顺畅;就算你是刚接触大模型的新手,我也会把关键原理讲清楚,保证你能看懂并且能直接用上。

1. 内容整体设计与思路拆解

1.1 幻觉产生的根源:先说清楚“病根”在哪里

在做任何缓解方案之前,必须先理解幻觉从哪来。大模型的本质是一个概率模型,它生成文本的方式是逐token预测——也就是说,它不是在“查资料”,而是在“猜下一个词最可能是什么”。

这就带来一个根本性的矛盾:模型的参数里虽然蕴含了大量知识,但这些知识是以分布形态存储的,而不是以结构化条目存储的。当模型遇到一个它“记不准”的问题时,它会按照概率分布编造一个最合理的答案。这个答案在语言层面极度流畅,但在事实层面可能完全错误。

我把幻觉分成两类:一类是事实性幻觉,比如编造不存在的论文、错误的日期、虚构的统计数据;另一类是逻辑性幻觉,比如在推理过程中偷换概念、跳跃式得出结论。知识增强架构主要解决前者,推理时干预策略则两者都能缓解一部分,但各有侧重。

1.2 为什么单靠增大模型参数不能根治幻觉

很多人第一个反应是:模型不够大,换更大的模型是不是就好了?这个思路有一定道理,但并不彻底。从我的实测经验来看,模型参数规模增大确实能降低幻觉率,但降低幅度是递减的。且不说大模型的训练成本高得吓人,就算是千亿参数级别的模型,在专业领域的问题上依然会一本正经地编造答案。

原因在于,大模型的知识是静态的——它只学到训练截止日期之前的数据。任何新知识、任何私有领域知识、任何不公开的数据,它根本无法掌握,只能靠猜。而且模型规模越大,它的“自信程度”越高,反而更难被观察和纠正。这就好比一个经验丰富但知识已经过时的老专家,你问他新领域的问题,他会用旧框架编一个新答案,听起来还特别有道理。

所以我的核心思路是:不跟模型的概率分布硬刚,而是想办法把它的生成过程约束到真实知识的轨道上。这正是知识增强架构和推理时干预策略的切入点。

1.3 两类策略的定位与分工

我在这套方案里,把知识增强架构和推理时干预策略分别定位为“外挂知识库”和“生成刹车踏板”,两者解决的问题维度不同。

知识增强架构的核心是“把模型不知道的知识给到它”。它通过检索、图谱、结构化约束等手段,让模型在生成时能够引用真正的知识来源,而不是靠记忆硬撑。这相当于让模型从一个“闭卷考试”的学生,变成一个“开卷考试”的学生——参考书在手,抄都不会抄错。

推理时干预策略的核心是“在模型犯错的瞬间踩刹车”。它不影响模型的知识储备,而是在生成阶段加入额外的控制逻辑,比如限制采样的随机性、约束解码空间、在生成后进行事实校验等。这相当于在模型推理的每一个关键节点设置检查点,发现有风险的输出就强制修正。

两者缺一不可:只做知识增强,模型可能在复杂推理时依然走偏;只做推理时干预,模型没有正确的知识来源,干预也只能在错误答案上修修补补。

2. 知识增强架构的核心细节与实操要点

2.1 检索增强生成,RAG的正确打开方式

知识增强架构里最常用、也最容易上手的就是RAG。基本的流程是这样的:把外部知识文档切分成小块,用嵌入模型转成向量,存入向量数据库。用户提问时,把问题也转成向量,去向量库里做相似度检索,拿到最相关的几段文本,拼进Prompt里让模型基于这些文本生成答案。

这个流程听起来简单,实际落地时细节非常多。我最开始的做法是直接拿一个通用嵌入模型去处理技术文档,结果发现检索回来的片段经常跟问题对不上,模型拿到的参考知识本身就是错的,那生成结果自然更离谱。

经过几轮调整之后,我总结了几个关键点:

第一,文档切片策略直接影响检索质量。我踩过的坑是把整段章节当成一个切片,导致一个切片既包含问题相关的核心内容,又包含大量无关信息,检索出来命中率很低。现在我的做法是切成256到512个token的小块,并且尽量保持语义完整。

第二,嵌入模型的选型很关键。通用领域的嵌入模型在处理技术术语密集、专业表达较多的文本时表现不稳定。我后来换用了在专业语料上微调过的嵌入模型,检索命中率提升是很明显的。

第三,检索结果的重排序不可省略。向量检索只能解决“初步召回”,它的排序逻辑是粗略的相关性,不像精确匹配那样可靠。我引入了一个重排序层,用交叉编码器模型对召回的一批片段重新打分,只保留得分最高的3到5个片段。这个环节能让最终的生成质量上一个台阶。

下面是RAG流程中我在实际项目中常用的一个检索重排序的配置参考:

配置项推荐值说明
切片长度256-512 token太短语义不完整,太长噪声太多
召回数量前20个切片给重排序层足够的候选空间
重排序保留前3-5个切片保证Prompt长度可控,信息密度高
嵌入模型微调专业语料微调效果更好通用模型对专业术语的语义捕捉弱

2.2 知识图谱注入:让模型具备结构化约束

向量检索擅长处理非结构化文本,但在处理强实体关系的领域——比如人物关系、产品参数、业务流程——它的表现就不够用了。这时候我会引入知识图谱。

知识图谱的做法是把知识抽成“实体-关系-实体”的三元组。比如“某公司的某型号产品的额定功率是3500W”,可以表示为“某型号产品——额定功率——3500W”。把这个三元组存入图数据库,模型在回答相关问题时,就可以直接检索这个结构化的关系链,而不是去搜索一整段文本。

我的实际项目中有一个对比实验,只用RAG的版本,在回答“某个组件支持哪些接口”这种强关系型问题时,经常答不全,甚至会把另一个型号的接口参数混进来。加入知识图谱之后,这类问题的准确率提升非常明显,因为图谱约束了答案必须从真实关系链里取,不能靠猜。

不过知识图谱的构建成本不低,需要做实体识别、关系抽取、属性对齐。我的建议是不要一开始就追求全量知识图谱,先针对核心业务的高频实体建一个精准的子图,覆盖80%的高频问题,后续再逐步扩展。

2.3 微调中的知识映射与约束

除了外挂知识源,还有一种知识增强思路是把知识“固化”进模型参数里——这就是微调。通过领域数据的微调,模型会对特定术语和表达产生更强的先验概率,从而降低在领域问答中的幻觉概率。

在实际操作中,我用的是LoRA(低秩适配)这种参数高效的微调方式,在保持通用能力的前提下,注入领域知识。但我必须提醒一点,微调并不能替代RAG,它解决的是模型“在专业语境下更大概率生成合理内容”的问题,而不是“精确引用真实知识”的问题。

我做过一个测试,微调后的模型在常规领域问题上准确率有提高,但一旦问一个训练集中没有覆盖的冷门问题,它依然会回归到概率生成的模式,开始编。反而是RAG因为有了检索到的事实片段做底,冷门问题的幻觉率要低得多。所以我的推荐策略是:微调和RAG结合使用,微调负责“让模型更懂行业语言”,RAG负责“让模型有准确的事实参考”。

2.4 知识更新的闭环:防止“知识的腐化”

知识增强还有一个常被忽略的问题:知识是会过时的。我见过不少团队,把RAG系统上线之后就再也不管知识库了,半年之后用户问新政策、新产品参数,系统还在检索旧文档,生成结果自然就过时了。

所以知识库一定要有更新闭环。我会在系统里做一个“知识版本管理”的模块,每次文档更新后重新进行切片和向量化,并在向量数据库里保留多个版本。同时用定时任务扫描知识源,发现文档变更就触发增量更新。

这里有一个操作细节值得注意:增量更新时,旧的向量不能全部删掉重来,因为重建索引的成本很高,而且会影响线上服务的稳定性。我采用的是“按文档粒度更新”的策略——只有变更过的文档才重新嵌入,其他文档的向量保持不变。

3. 推理时干预策略的实现路径

3.1 解码参数的精细化调控:温度、Top-p、Top-k怎么配合

推理时干预最直接的手段就是调整生成参数。很多人对这部分的理解停留在“温度调低一点答案更保守”,但真正落地时,参数之间的配合关系才是关键。

温度(temperature)控制概率分布的平滑度,温度越低,模型越倾向于选高概率的token,也就是越保守。Top-p控制采样的候选集大小,只从累计概率达到p的最小token集合中采样。Top-k则是直接限制候选集为概率最高的k个token。这三者不是互斥关系,实际运行时Top-k先过滤一遍,Top-p再过滤一遍,最后再通过温度调整概率分布。

我在项目里调试出来的推荐组合是:准确率要求高的场景,温度设置在0.6到0.8之间,Top-p设置在0.9到0.95之间,Top-k设置在40到50之间。这样的配置能让模型保持一定的表达能力,同时减少因采样过于随机导致的愚蠢错误。

如果场景要求更高,比如医疗或金融领域的自动回答,我会直接设置温度为0,也就是贪心解码——每次只选概率最高的token。这样一来生成的多样性基本消失,但确定性大幅提升,幻觉率也会明显下降。代价是输出会偏保守,有时显得“机械”,但对准确性优先的场景来说完全值得。

3.2 约束解码:从源头限制非法生成

约束解码是一种更强硬的干预方式。它的思路是:在每一步生成token时,除了看模型输出的概率分布,还引入一个约束条件,把不符合约束的token概率直接置为0。

举一个具体的例子。在某个项目中,模型的输出格式必须遵循一个固定的JSON结构,字段名和值的类型都有要求。模型经常出现的问题是字段值类型不对,或者多生成一个没有定义过的字段。我用的方案是:写一个基于JSON Schema的约束器,在每一步生成时判断当前token是否会导致JSON结构非法,如果会,就把这个token的概率改为0。这样生成的JSON结构永远不会错。

Logic constraint的解码在实现上有两种方式,一种是通过修改生成器的decoding函数,在每一步生成前手动过滤logit;另一种是使用现成的约束解码框架,这些框架会按照语法约束自动生成合法的token序列。我的经验是,如果约束是简单规则,自己实现逻辑更清晰;如果约束是复杂的语法,比如编程语言的CFG(上下文无关文法),用现成框架会更省力。

3.3 延迟验证:生成之后的事后校验

推理时干预不能只盯着生成过程,生成之后的事后校验也非常关键,我称之为延迟验证。具体做法是:在模型输出完整答案之后,再让模型对答案进行一轮或多轮自我评估,确认它是否与参考知识一致,是否回答了问题的核心,是否包含可疑的细节。

延迟验证的具体实现有两种形式。第一种是让模型自评,直接把生成结果反馈给模型,要求它对照参考知识检查,标注可疑点,然后重新生成答案。第二种是写一个独立的事实一致性校验器,用规则或者另一个更强的小模型去抽取出答案中的断言,再和参考文档进行比对,任何一个断言查不到来源,就标记为“未证实”。

我在项目中用的是第二种方案,因为自评法的瓶颈很明显——模型编造出来的内容,再用它自己的“认识”去判断,几乎判断不出问题。独立校验器就不一样,它把“生成”和“验证”的角色分开了,验证器不需要理解逻辑,只需要做事实比对。

延迟验证有一个副作用值得注意:重复验证会显著增加推理延迟。对于在线系统来说,一次验证多出的100-200毫秒可能还能接受,但如果要对长答案逐句验证,延迟会翻倍。我的权衡方案是分档处理:短答案(少于200字)做一次整体验证,长答案先抽取关键断言再做验证,这样能在准确率和延迟之间找到平衡点。

3.4 迭代自校正机制:让模型“两遍思想”

迭代自校正算是延迟验证的进阶版。它的流程是:先生成一个初始答案,然后让模型对答案进行批判性审查,指出潜在问题,再基于这些问题重新生成答案。这个过程可以循环多轮,直到质量评估达到阈值或者轮数用尽。

我实际测试下来的结论是:两轮(生成-批判-重写)带来的提升是最明显的,第三轮之后提升很少,但延迟增长是线性的。所以实际部署时,我通常把最大迭代次数设成2轮,这样既能享受到自校正的红利,又不至于拖垮响应时间。

迭代自校正在实现时有一个坑:重写之后的答案可能反而变得更差。原因在于当模型对自己的初稿提出过度的挑剔意见,二稿会过度修正,丢掉初稿里本来正确的部分。我的应对策略是:在重写之前,把初稿里的事实性关键片段锁定下来,二稿只需要修正语言表达和逻辑衔接,不能篡改锁定的关键内容。

4. 知识增强与推理时干预的协同工作流

4.1 分层防御架构的设计原则

单一策略都有局限,真正有效的是把多种策略按层次组织起来,形成一个协同工作流。我在项目里搭建的是一个四层防御架构:

第一层是输入检测层。在用户问题进来之后,先做意图识别和分类,判断这个问题是否需要外部知识。有些闲聊性质的问题,根本不需要走检索链路,直接让模型自由发挥即可。这一步的作用是节约算力,避免所有请求都走一遍RAG。

第二层是知识增强层。对于需要外部知识的问题,走RAG检索流程,同时判断是否需要叠加知识图谱查询。这里有一个关键决策点:如果检索结果的相关性得分低于阈值,说明知识库里可能没有覆盖这个问题,这时候宁可让模型说“我不确定”,也不能让它硬答。

第三层是生成控制层。解码参数根据任务类型动态调整,对事实性要求高的任务采用更保守的采样参数,配合约束解码保证输出格式和内容边界。

第四层是验证纠错层。生成完成之后做延迟验证,验证不通过就交给迭代自校正机制重写,直到通过或者达到最大轮数。

4.2 任务类型驱动的策略自动切换

并不是所有问题都需要走完整的四层架构,那会让延迟高到无法接受。我设计了一个任务类型驱动的策略切换机制,把所有问题分成三类:

第一类,事实问答类。典型问题比如“某设备的最大功率是多少”,这类问题必须准确,走全链路:输入检测、RAG检索、知识图谱查询、保守采样、延迟验证。

第二类,生成创作类。比如“写一段营销文案”,这类问题对事实性要求低,对创造性和语言流畅度要求高,我直接跳过RAG和知识图谱,采用较高的温度参数,只做轻量级的格式约束。

第三类,开放闲聊类。这些完全不涉及事实判断,模型直接回答,不做RAG也不做验证。

这个分类逻辑做完之后,系统的平均延迟反而比之前统一模式下降了,因为大部分请求都走的是轻量级链路,只有真正的知识型问题才用重链路。

4.3 协同工作流的完整示例

我以一个具体的用户问题为例,完整走一遍这套工作流。用户问:“某型号机器人的最大负载是多少?它能搬运的最大物体尺寸受什么限制?”

输入检测层先判断这是一个事实问答类问题,需要走知识增强链路。RAG检索层在知识库中检索,召回了几篇涉及该型号机器人参数的文档片段,重排序后挑出相关片段。同时知识图谱层查询了该型号的“最大负载”属性,拿到一个确定的数值。

生成层把检索到的片段和知识图谱三元组一起拼进Prompt,温度设为0.7,Top-p设为0.92,约束解码确保输出格式能解析成Markdown列表。

模型生成的答案是:“该型号最大负载为10kg。根据文档描述,搬运物体的尺寸限制主要受末端执行器开合范围和手臂工作半径影响,具体来说……”。此时进入验证层,事实校验器抽取两个关键断言:“最大负载10千克”和“尺寸限制受末端执行器和手臂工作半径影响”,逐一与参考文档比对,都能找到来源,验证通过,答案直接返回给用户。

整个过程耗时大约700毫秒,其中检索和重排序占了300到400毫秒,生成占200到300毫秒,验证占了剩余部分。作为参考,如果用户问的是闲聊问题“今天天气真好,你说是不是”,请求会直接走轻量级链路,耗时只有150毫秒。

我感觉分层架构的核心思想就是一句话:让人工智能的每一个决策都有明确的依据。如果某个环节没有依据,就停下来请求源、请求验证,而不是自动生成一段包装好的错误。

5. 部署调优中的实测记录与避坑指南

5.1 知识库切分与检索参数的实战调优

知识库切分这个环节,我对切分器做了很多对比实验。开始的切分单位是一个章节或一个自然段,后来发现问题在于一个自然段里经常包含多个主题,模型检索出来的片段主题不纯,回答容易偏。

我最终采用的方案是语义切分:先用无监督算法计算每个句子之间的语义相似度,相似度较低的地方就作为天然切分点。这种方式得到的片段在语义上更完整、更专注,检索命中率有明显提升。

还有一个容易被忽略的参数是检索结果的Top-k。我在项目里试过从5调到20,发现Top-k=5的时候经常漏掉关键信息,但Top-k=20的时候Prompt太长,模型会因为“信息过载”而开始混用不同片段的内容。最后定在10到15之间,并且配合重排序把真正有用的3-5个片段挑出来。

5.2 干预力度与生成质量的平衡

推理时干预最怕的就是过度干预,输出变得干巴巴的,像机关文件一样。我在实际调优里总结了一个规律:干预强度与任务准确性正相关,与用户接受度负相关。

温度低于0.5的生成结果虽然错误少了,但回答会显得死板、缺乏条理,用户反馈“读起来不像人话”。我调整思路之后,不对全部内容做统一干预,而是做分区干预:开头和中间的推理部分保持正常温度,但结论中的事实性表述采用更低的温度和更强的校验约束。这种混合策略既保持了可读性,又保证了结论的可靠性。

5.3 对幻觉率的衡量:没有指标就没有优化

做任何优化前,先要有可量化的指标。我给项目搭的评估包含三个维度:

第一个是检索命中率,反映知识库和检索器的质量,标准是黄金答案的文本片段是否在Top-k结果中命中。

第二个是幻觉率,我用的定义是“答案中无法从参考文档中找到来源的断言数量与总断言数量之比”。

第三个是端到端准确率,用一套人工标注的数据集来评判答案完全正确、部分正确、错误这三种分类的比例。

我维护了一个500多条的评测集,每次改方案都会跑全量回归。不夸张地说,这个评测集是我调优路上最值钱的投资——你以为自己改对了一个参数,回归测试一跑才发现某个领域的准确率跌了好几个点,这种事情发生过很多次。

5.4 常见坑以及排障表

现象可能原因解决方案
检索结果与问题不相关切片语义不完整,或嵌入模型不匹配改用语义切分,在专业语料上微调嵌入模型
答案引用来源张冠李戴重排序环节缺失或Top-k过大增加交叉编码器重排序,压缩最终引用片段数
增强后的答案依然不真实知识库更新不及时,或检索到过期文档增加知识版本管理,设置增量更新定时任务
干预后的输出变得机械生硬施加了全局的弱解码或超低温度改为分区干预,仅在结论性事实处强化约束
延迟超标每次请求都走全链路检索加多轮验证任务分类,轻量链路处理闲聊与创作,全链路保留给知识型问题
多次自校正后答案更差重写过程中篡改了初稿中的关键事实核心事实片段在重写前锁定,只允许改逻辑和语言

最后再提醒一句:知识增强架构也好,推理时干预策略也好,它们都不是“装一个插件,幻觉从此消失”的一键式方案,而是一套需要持续调优的工程体系。我的体会是,幻觉缓解本质上是在和模型的概率本性做博弈,每一步干预都要在准确性、流畅性、延迟之间反复权衡。真正有效的方案,永远是把你自己的业务知识、对错误的定义、对质量的约束,扎扎实实地织进模型的生成链条里。

每个人面对的场景不一样,踩坑的具体路径也不一样,但我希望这篇文章能帮你在做架构决策时少走几条弯路,至少不用重复我交过的那些“学费”。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进