☰
大模型幻觉缓解算法:SFT与偏好对齐阶段的事实性优化实践
2026/10/22 4:41:21 网站建设 项目流程

做过大模型微调的同学,应该都遇到过这种场景:模型在对话里一本正经地输出一串细节,人物、时间、数据全都有模有样,但你拿去一核对,全是编的。这不是偶发问题,而是目前大模型落地最头疼的坎之一。你问它一个事实性问题,它宁可给你编一个漂亮答案,也不愿意承认自己不知道。

幻觉问题要从三个层面去解:数据、训练、推理。数据层面是源头,推理层面是补救,而中间的训练层面,尤其是监督微调(SFT)和对齐训练(RLHF/DPO这一类偏好优化),才是真正决定模型“事实敏感度”的关键环节。这篇内容我围绕“幻觉缓解算法——减少大模型错误生成”这条主线,把第三章的实践重点拆开讲:在SFT和偏好对齐阶段,事实性优化到底该怎么做,哪些操作是真有效的,哪些只是自我安慰。适合正在微调开源底座模型、做垂直领域大模型应用的团队参考,也适合刚接触对齐训练、想搞清楚“为什么模型明明学过却还是乱说”的同学。

我尽量不绕弯子,直接从成因到数据、从训练配置到评估验证,给你一条能落地的路径。

1. 先弄清楚幻觉是从哪“喂”出来的

1.1 三类幻觉的成因定位

做缓解方案之前,得先把幻觉分门别类。我习惯把幻觉分成三类,因为三类的解决办法完全不同。

第一类是知识缺失型幻觉。模型压根没见过这个知识,但又被要求回答,于是它只能基于语言习惯“顺”一个答案。这类幻觉在垂直领域特别常见,比如让通用模型回答某个企业内部系统的配置参数,它能编出一整套接口文档。本质是训练数据里没有这个知识,模型用“最像答案的 token 序列”来补位。

第二类是事实冲突型幻觉。这个更隐蔽,也更容易被忽视。训练数据本身是自相矛盾的,比如语料里既有“某项目成立于2018年”又有“某项目成立于2020年”,模型在训练时把两种说法都记住了,生成的时候按上下文概率混合输出,结果就是错的。很多团队花大力气清洗数据,但只做了格式清洗和去重,没有做事实冲突检测,这一步漏掉,后面全白搭。

第三类是生成退化型幻觉。这种是解码策略和优化目标共同导致的。监督微调阶段如果用“标准答案”式的数据把模型训练得太“自信”,模型会倾向于生成流畅、确定的表述,而不是谨慎、留有余地的表述。因为训练目标是在最大化下一个 token 的概率,而“不确定”的表达方式在统计上往往不是高概率路径。越训练,模型越倾向于“编得顺”,而不是“说得准”。

这三类成因不是互斥的,实际案例里经常叠加出现。但识别清楚主要偏向哪一类,直接决定了你的优化动作是花在数据清洗上、训练策略上,还是解码策略上。

1.2 为什么训练期优化才是治本思路

很多团队第一次遇到幻觉问题时,第一反应是上推理期的缓解方案:降采样温度、做自我一致性校验、接检索增强(RAG)。这些方案有效吗?在一定范围内有效,但它们都有一个共同的毛病——治标不治本。

拿检索增强来说,你给模型接了外部知识库,它确实能引用检索片段来回答。但问题在于,模型在训练阶段已经养成了“流畅编造优先”的生成习惯,检索给的片段只是它参考的“素材”之一,它依然可能在引用素材时自行添油加醋。我在实际项目里见过很多次:模型把检索到的真实信息和一个自己编造的旧记忆拼接在一起,生成出来的答案半真半假,比完全编造更难发现。

推理期方案本质上是在“生成完了再亡羊补牢”,而训练期优化是改变模型的条件概率分布本身。你在 SFT 阶段教会它“不知道的时候应该明确表达不知道”,在偏好对齐阶段教会它“被偏好的是事实正确且表达准确的回答,而不是流畅但现在错误的回答”,模型的生成习惯才会从根本上发生变化。

推理期方案适合做最后一道保险,但幻觉缓解的主战场,一定在训练阶段。这也是为什么这一章要专门聚焦 SFT 和对齐训练的事实性优化。

2. 监督微调阶段的事实性优化实操

2.1 SFT数据:从源头掐断错误信息

SFT 是最直接改变模型行为习惯的阶段,也是最容易被低估的阶段。很多团队把 SFT 当成“把数据灌进去跑几个 epoch 就完事”,但数据怎么组织、正样本怎么给、负样本怎么给,里面的门道直接决定幻觉率是 5% 还是 20%。

第一步是事实冲突消解。如果数据来自多个渠道,同一个问题可能出现互相矛盾的答案。我建议在数据管线里加一道“事实归并”流程:以问题为粒度,把同一个问题的所有候选答案聚合到一起,人工或用一个足够强的裁判模型做一致性判定。冲突的样本要么删掉,要么统一为最新、最可靠来源的答案。这一步看起来枯燥,但效果极其明显。某公司此前用未做冲突消解的数据微调一个垂直问答模型,幻觉率在 18% 左右;做了冲突消解后,同样配置降到 9% 以下,效果立竿见影。

第二步是事实锚点标注。在数据里为每个事实性回答标注“答案的核心事实锚点”,比如人名、时间、数值、事件关系。微调的时候不是让模型泛泛地“学习这段文本”,而是让模型知道这段话里有几个不能动摇的事实点。更实操的做法是:把这些事实锚点单独抽出来做成“填空式”样本,让模型学会在关键位置上“咬死正确表达”。

第三步是加入不确定性表达样本。这是很多人忽略的关键点。你要在 SFT 数据里专门安排一部分样本,明确示范模型在“知识不足”时该怎么说。比如:

用户:2025年中国GDP增速是多少?
助手:我目前的知识截止到2024年10月,无法确认2025年全年的实际数据。以我的判断,这个信息需要查阅权威统计渠道,而不是依赖我推测。

这种样本的比例不需要很高,但必须足够典型。我实测下来,SFT 数据里5%-10%的不确定性表达样本,就能显著压低模型乱编概率。少了没效果,多了会让模型变得过度保守。

2.2 训练超参与数据配比的关键经验

SFT 阶段的超参直接影响事实性效果,我最想强调的三个点是Epoch、学习率和数据配比。

Epoch 数不要太贪。对于指令微调,我通常控制在 2-3 个 epoch。超过 3 个 epoch,模型在训练分布上的表现会变好,但在分布外的开放式问题上幻觉率反而上升——这就是典型的“记忆化”取代了“泛化”。模型开始背答案,而不是学“如何组织一个准确答案”的规律。

学习率方面,SFT 阶段学习率建议落在1e-5 到 2e-5区间(以 7B 量级底座模型为例)。学习率偏大时,模型被快速推向训练数据的风格分布,包括数据里那些“过于自信”的表达风格,幻觉风险会放大。我见过有人为了省时间把学习率拉高到 5e-5,结果模型效果确实收敛得快,但同时变得更爱胡编。学习率不仅影响收敛速度,更影响学习的“精细度”。事实性优化需要模型精细地记住细节,小学习率 + 适度 epoch 是保证精细度的前提。

数据配比上,我推荐的 baseline 是:通用对话 60% + 知识问答与事实性样本 30% + 不确定性表达与拒答样本 10%。通用对话负责保持模型的基础能力不被破坏,知识问答负责注入领域事实,不确定性样本负责塑造谨慎的表达习惯。这个配比可以根据领域调整,但骨架不要砍得太偏,砍掉通用对话会让模型的开放域能力退化,砍掉不确定性样本会让模型变回“硬编模式”。

2.3 三类增强事实性的微调变体

除了常规 SFT,如果你想在事实性上做得更极致,可以试试下面的变体。

首先是引用生成训练。在 SFT 数据中要求模型在给出事实性回答时输出引用来源(可以是文档片段编号、URL 或知识库条目 id),把这种结构内化为模型习惯。训练时,如果模型输出的引用和目标引用不一致,就作为错误样本强化。优点是能显著提高回答的可追溯性,缺点是如果知识库更新不及时,模型会引用“旧闻”,需要配合知识库版本管理。

其次是不确定性感知语言建模。常规语言建模是对所有 token 一视同仁地做最大似然估计,但事实性回答里的关键锚点(数值、人名、日期)重要性远高于停用词和过渡词。你可以对这些 token 加大 loss 权重,让模型把有限的容量花在“记住事实”上。我用过一个简单实现:对标注过的事实锚点 token 乘一个 2.0 的 loss 权重,其他 token 保持 1.0。训练完跑同一批评测,事实锚点的准确率提升了约 6 个百分点。

第三个是抗幻觉对比微调。这个方法借鉴对比学习思路:对同一个问题构造一对样本——一个是事实准确的回答,一个是包含幻觉的错误回答。训练时拉大两个回答对应表征的间隔,让模型明确知道“事实正确与事实错误的边界长什么样”。这个方法对数据标注要求高,成本不低,但效果相当稳定,适合对幻觉率要求极高的场景,比如医疗、金融领域。

3. 对齐训练阶段的真实性偏好优化

3.1 奖励模型里如何加入“事实维度”

SFT 把模型从“通用模型”变成“有任务能力的模型”,但对齐阶段才真正决定模型“偏好说什么”。传统 RLHF 的奖励模型基于人类偏好训练,这里藏着一个大坑:标注者在打分时很容易被流畅度、语气、信息量带偏。一个自信地给出流畅但完全错误答案的模型,在偏好标注中拿到的分数可能比一个谨慎、表达不够流畅但内容正确的模型更高。

所以事实性优化进入对齐阶段后,第一件事是给奖励模型加“事实维度”。具体做法是在奖励模型的训练数据里增加一对特征:答案的事实性分数。可以靠人工标注,也可以用一个预先训练好的“事实评价器”(本质是一个对生成内容做事实一致性打分的评判模型)对答案打分,再把分数作为特征拼进奖励模型的输入。

实操经验是:事实性奖励的权重不需要太大,0.3 到 0.5 的融合权重就够。权重太大,模型会走向“安全废话”——所有答案都变成“根据我的知识,这个问题目前没有明确答案”,看起来谨慎,实际上毫无信息量,这是另一个极端。权重太小,事实性信号被人类偏好的噪声淹没,起不到纠偏作用。

3.2 DPO偏好对的构造细节

现在很多团队用 DPO 代替完整的 RLHF,因为实现简单、训练稳定。DPO 不需要显式训练奖励模型,但它对偏好对的构造更敏感。我见过太多人直接在 SFT 数据里随机抽“一个回答作为 chosen,一个回答作为 rejected”,这样构造的偏好对没有信息量,DPO 基本白跑。

构造偏好对的关键是对照组设计。最有效的偏好对是“单一变量差异”:同一个问题,两个回答在长度、风格上都接近,唯一差异是其中一个包含事实错误,另一个不含。这样 DPO 训练时模型只能从“事实对不对”上学习偏好,不会被其他特征带走。

我再推荐一个技巧:等长对比。很多人忽略长度偏置的影响,DPO 模型很容易学成“长回答更好”而不是“正确回答更好”。把 chosen 和 rejected 样本裁剪到接近的长度,会大幅减少这类偏差。我在某项目里做过一组对比实验,用等长偏置对后,在事实性评测集上的准确率比不等长对照组高了约 8 个百分点,代价不过是多花了一点数据整理时间。

DPO 的温度参数 beta 也值得注意。beta 太小,训练会更激进地拉大 chosen 和 rejected 的间隔,模型可能过度拟合偏好对里的表面特征;beta 太大,偏好信号又太温和。我建议从beta=0.1起步,观察概率分布变化后微调。学习率建议1e-6 到 5e-6,这个阶段要“轻推”,不要“硬掰”。

3.3 迭代式对齐与事实性红队

一项我越来越推崇的做法是先事实后风格的分阶段对齐。不要试图在一个 DPO/RLHF 轮次里同时解决事实错误、态度语气、格式偏好和目标,一次解决一个问题。第一轮对齐只围绕事实性构造偏好对,第二轮才加入风格和格式。

为什么?因为不同优化目标在梯度方向上有时会打架。你既想让模型“更礼貌”又想让模型“更精准”,模型可能为了礼貌而在事实不确定时也给出圆滑的肯定回答。分阶段做,你能在每轮结束后的评估中清晰定位是哪个目标没实现,排查成本会低很多。

同时,我建议建一支事实性红队。人在闭环里仍然不可被替代。具体操作是准备一批专门诱发幻觉的问题集,包括:

  • 与训练数据矛盾的设问(比如“你上次不是说某项目是2021年启动的吗?”)
  • 超出知识截止日期的问题
  • 包含错误前提的问题(“请详细描述一下某事件的具体经过”然而该事件根本不存在)
  • 需要精确数值、引用来源的细粒度问题

每一轮 SFT 或对齐训练跑完后,都拿这批问题去测,记录幻觉率变化,形成回归基线。这个红队问题集应该跟业务场景强绑定,后续你换模型底座、改数据配比,它都能给你一个快速反馈。

4. 事实性评估与多阶段训练流水线

4.1 事实性评估指标与自建评测集

优化做得再多,没有可靠的度量衡都是白搭。事实性与常规问答准确率不是一回事,你需要单独的评估体系。

公开基准方面,常用的几个指标和评测集(比如以事实性为核心的 FactScore、TruthfulQA、FELM 以及针对幻觉专门设计的 HalluQA)都可以作为参考。但依赖公开基准有个致命问题:它们和你的垂直领域场景可能根本不匹配。公开基准里的事实是百科级公共知识,你业务里真正的“事实”是内部系统配置、业务逻辑、产品参数,这些是公开基准完全覆盖不到的。

所以我强烈建议自建一套评测集。最实用的方法是多源事实锚点法:挑 100 道左右的高频业务问题,每道题的参考答案从两到三个独立信息源交叉确认后确定,并标注出必须出现的关键事实锚点(数值、主体、关系)。评测时,对模型的回答先做锚点检测,再判断事实一致性,最后算出一个锚点召回率,比直接给一个笼统的“准确率”更有指向性。

人工评估协议也很关键。我建议采用盲评 + 双评 + 交叉复核的机制:两位标注员在不知道模型版本的前提下独立打分,不一致的地方由第三人复核。盲评是为了防止标注员对“哪个模型更好”的期待影响打分,双评是为了筛掉个人偏好。事实证明,在事实性人工打分上,标注员之间的分歧比一般质量打分更大,因为“事实对不对”需要额外查证,人很容易偷懒凭印象打分。要在标注指南里写清楚:只要标注员不是百分百确定,就必须去查证。

4.2 多阶段训练流水线与消融设计

把前面的方法整合成一条可执行的流水线,我这里给出一个经过实测的 baseline,你可以直接作为起点:

阶段数据配置关键参数主要目标
领域继续预训练(可选)垂直领域语料,10B-50B token 量级学习率 2e-5 到 5e-5,控制在 1 个 epoch注入领域基础知识
监督微调 SFT通用对话 60% + 知识问答 30% + 不确定性样本 10%学习率 1e-5 到 2e-5,2-3 个 epoch塑造正确表达习惯
事实性偏好对齐事实性偏置对(等长对比)DPO beta=0.1,学习率 2e-6,1 个 epoch拉大事实正确与错误的偏好差距
风格对齐风格/格式偏好对DPO beta=0.1-0.3,学习率 1e-6补足表达方式要求

我特别想强调其中一个很多人忽略的点:最后一轮更新后,模型能力会发生“回弹”。也就是说,对齐阶段训练完,模型的开放域能力会比 SFT 后略降,这不是意外,而是正常的“创造性收敛”。你要在 SFT 和最终模型之间做能力对比测试,确保知识问答能力没有流失到一个不可接受的范围。

消融实验千万别省。你要验证每个环节到底贡献了多少。我在一次做事实性优化项目时,把流程拆成三组做对比:只做 SFT 优化、SFT + 事实性 DPO、SFT + 事实性 DPO + 红队回归微调。结果发现 DPO 环节贡献了最大的幻觉率下降(从 11% 到 6%),SFT 优化贡献其次(从 14% 到 11%),而红队回归微调贡献虽小,但能把模型在极限对抗性问题上的“崩坏率”从 4% 压到 2% 以下。没有消融,你根本不知道资源该往哪个环节投。

5. 常见问题排查与避坑实录

5.1 奖励黑客与“安全废话”陷阱

对齐阶段最容易踩的坑是奖励黑客。你不是想要“少犯错”吗?模型很快学会:只要我对所有不确定的问题都拒绝回答,事实错误率就是 0。于是幻觉率暴跌,你以为成功了,一看人工对话记录,满屏全是“抱歉,我无法回答这个问题”。

我排查这个问题时用过两个信号:一是回答的平均信息量下降,模型喜欢用套话替代具体信息;二是拒答率异常上升。基准数据里可作答问题的拒答率如果一下涨了 15 个百分点,基本就是奖励被“钻漏洞”了。

解法有两个层面。数据上,在偏好对里加入“合理回答但主动承认不确定边界”的正样本,让模型知道“谨慎不等于拒答”,它是可以在表达不确定的同时给出已知信息的。训练目标上,把“拒绝答可答问题”作为惩罚样本放进 DPO,而不是只惩罚“错误回答”——这个动作能直接把拒答率拉回正常水位。我给一个参数参考:正常场景下,可按拒答率控制在3%-5%为基准,明显高于这个区间就要怀疑是奖励黑客,而不是模型变聪明了。

5.2 过拟合与记忆化的鉴别

第二个高频坑是过拟合与记忆化。模型在训练集上的表现极好,一到分布外就露馅,这不是“学到知识”,是“背下答案”。你需要一个方法去区分这两个状态。

我在实践中反复用的是一个“改写泛化测试”:把训练集里的问题做同义改写,把细节重新组织(时间顺序调换、说法换掉、主语宾语对调),再问模型一遍。如果模型在改写后的问题上表现显著下降,说明它只是在记忆,没有真正学会知识结构,这正是幻觉生成的温床——因为遇到没见过的问题,模型只能靠语言习惯编。

应对方法是降低 SFT epoch,并增加多样化的表述样本。同一份领域知识,用三五套不同的问题表述方式写进训练集,让模型从多种表面形式上提取同一份内在知识,记忆化倾向就会明显缓解。

5.3 离线评估与线上效果背离

最后一个经常让人头大的问题是:线下评测集分数很好看,一上线真实用户反馈依然说模型乱编。原因通常有两个。

第一个是评测集与线上分布不同。线下评测里的提问都是明确、完整的问题,线上用户则经常用口语化的、包含背景噪声的方式提问。解决思路是持续从线上日志中采样构建增量评测集,每个月替换掉 20% 的过时评测样本,保证评测集永远贴合真实 query 分布。

第二个是评估指标太粗。如果把所有回答混在一起算“准确率”,幻觉问题会被稀释。要按查询类型拆解指标:事实型 query 看锚点准确率,观点型 query 看流畅性和多样性,知识边界型 query 看拒答准确率。三条线的指标分开统计,幻觉温床才能浮出水面。我在一次复盘中发现,某轮优化后整体准确率只提升 1.2%,但拆开一看,事实型 query 的锚点准确率从 74% 升到了 82%,真实效果被“观点型 query 没变化”拉平了。指标拆解,才能看到真实价值。

写在最后的实操体会

做幻觉缓解的项目做得多了,我最大的体会是这活儿没有一次性的“银弹”。SFT 和偏好对齐加起来,能覆盖幻觉问题的六七成,但剩下那三四成仍然需要推理期兜底和持续的数据迭代。事实性优化本质上是在和模型的“流畅性本能”做对抗——模型天生倾向于说漂亮话,你的训练目标要反复提醒它“准确比好看重要”。

最后分享一个我一直在用的小技巧:从项目启动第一天就建立一个“幻觉样本库”,把每次测试和线上反馈里的典型幻觉 bad case 都收集进去,标注上错误类型(事实冲突、知识缺失、生成退化)。每一轮 SFT 或对齐训练后,都用这个样本库做回归测试。你会发现,幻觉缓解不是一个一次性优化动作,而是一条持续收敛的曲线——只要样本库在增长、回归指标在下降,方向就是对的。这个过程急不来,但每跑一轮,模型的可靠性都会往上走一个台阶。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询