☰
DeepMiner:智能体幻觉抑制的完整工程实践,从训练到推理全链路拆解
2026/10/22 2:53:43 网站建设 项目流程

做智能体时间久了,最让人头疼的往往不是模型能力不够强,而是它“一本正经地胡说八道”。你问客服机器人退款政策,它能把不存在的补贴条款编得头头是道;你让代码助手调一个三方接口,它能凭空造出根本没这个参数的函数签名。早期我们团队内部开玩笑说,这哪是智能体,这是“幻觉生成器”。直到把DeepMiner项目推倒重来,我们才意识到一件事:幻觉不是模型笨,而是训练和推理两个阶段都没有把“可信”当成一个一等一的目标去做。

DeepMiner是我们内部代号,核心就两件事:模型训练阶段的幻觉抑制,以及推理阶段的可信约束。这套东西做下来,单轮问答的事实性错误率降了将近六成,多轮场景下降得更明显。这篇文章不聊空洞的概念,我把整条链路拆开,从数据构造、训练策略、推理约束,到评测体系、踩坑记录,按我们能复现的方式完整写一遍。想做可信智能体或者正在被幻觉问题折磨的朋友,这篇就是给你准备的。

1. 先想清楚:幻觉问题到底长什么样

1.1 “靠谱”这件事,比想象中更难定义

很多人一上来就问“怎么消除幻觉”,但聊两句就发现,大家对“幻觉”的定义根本没对齐。有人指的是事实性错误(把某公司营收说反了),有人指的是逻辑断裂(前一步推导和后一步对不上),还有人指的是归因混乱(把A文档的结论安到B文档头上)。这三种问题,表面看都叫幻觉,背后的成因和解法完全不同。

我们在DeepMiner里把幻觉拆成了五类来治理:事实性幻觉、推理链幻觉、归因幻觉、边界幻觉、工具调用幻觉。事实性幻觉是模型对客观世界知识的歪曲;推理链幻觉是中间步骤错了但结论恰好蒙对,或者中间步骤和结论脱节;归因幻觉最常见于RAG场景,模型答对了但引错了出处;边界幻觉是模型对不知道的东西强行作答;工具调用幻觉则体现在智能体场景,模型编造不存在的API参数,或者把上一个工具的输出张冠李戴。分类粒度决定治理粒度,这一条是我最先想通的。

1.2 用户要的不是“永远正确”,而是“可控的错误”

做可信智能体这段时间,我最大的认知转变是:我们根本做不到让模型永不犯错,但我们可以让错误变得可控、可见、可纠正。用户真正反感的不是错误本身,而是模型用笃定的语气编造答案,且没有任何机制指出“这里我不确定”。

所以在DeepMiner里,“可信”被定义为五个可操作维度:事实准确性、答案自洽性、归因可追溯、不确定性表达、工具执行可复核。事实准确性好理解,自洽性指的是长篇输出内部不打架,归因可追溯要求每个断言都能指向证据,不确定性表达允许模型在低置信时回答“不确定”,工具可复核则要求每一次工具调用都有日志和参数校验。任何一次发版,我们都会在这五个维度上打分,缺一条就不过质量门禁。

1.3 定好边界:哪些场景“硬可用”,哪些场景“灰度放”

这个经验来自一次惨痛教训。最早我们为了展示效果,把DeepMiner放到一个金融服务问答场景里做灰度,结果模型把年化利率算错了两次。后来复盘,问题不在模型推理能力,而在于我们没给系统划定能力边界。

所谓能力边界,不是让模型“更努力”,而是用路由和控制机制把问题分诊:能查证的走RAG,需要计算的走代码解释器,纯开放闲聊就限定输出风格并降低信息密度,完全没把握的明确告知“超出我的知识范围”。这套“场景分级”思路后来成了我们的标配。我建议所有做智能体的团队都画一张表格,把目标场景按“容错率”和“可验证性”分成红黄绿三个级别,绿色场景(如内部知识问答)可以高情商高自信输出,黄色场景(如医疗健康建议)强制加免责声明和证据引用,红色场景(如法律意见)干脆不答。

2. 训练侧:把可信度焊进参数里

2.1 可验证数据,比“高质量数据”更值得花力气

训练侧第一件事,也是最容易被低估的事,是数据构造。很多人以为用GPT-4蒸馏一批数据微调就能减少幻觉,实测下来方向没错,但体感提升有限。原因很简单,蒸馏数据本身可能带幻觉,你是在用另一个模型的幻觉污染自己的模型。

DeepMiner在数据侧定了一条铁律:优先使用可验证数据。所谓可验证,就是每一条训练样本里的关键事实都能在外部知识库、代码执行结果或结构化数据表里找到精确对应项。我们组了一个流程:先采集领域文档,切成句子级片段,用检索器为每个片段匹配到强相关的结构化事实三元组,再由标注者把模型生成的答案和片段原文做细粒度对齐,凡是有哪怕一个实体对不上,这条数据就进“负例池”。

这条流水线跑起来后,训练集里的无据断言几乎清零。一个很实在的收益是,后续对齐阶段用的偏好对更干净,模型也更容易学到“忠实原文”的分布。我强烈建议不要在原始语料上直接做SFT,至少先跑一两轮可验证性过滤,哪怕只是粗略地用规则把明显过时的数据剔除,效果都有肉眼可见的差别。

2.2 对撞式偏好优化:让模型看够“反面教材”

只有正面数据是不够的。模型要理解什么是“不可信”,你得让它密集地看到不可信的样本长什么样,以及为什么不可信。这一步我们用的是对撞式偏好训练,思路说白了很朴素:同一道题,构造一个忠实回答和一个幻觉回答,让模型去学“我更喜欢哪个”以及“为什么不选另一个”。

实现上,DeepMiner没有从零训RLHF,而是基于已有的对话模型做DPO微调。策略分两层:第一层是纯偏好,用DPO把忠实回答的logprob拉高,把幻觉回答压下去;第二层是“拒绝式偏好”,专门训练一条分支,让模型在证据不足时学会输出“目前可获取的信息不足以支持该结论”。

效果最明显的一个点:训练前,模型面对“某公司2024年Q3营收”这类问题时有四成概率编一个数字,训练后这个概率降到个位数,代价是“拒答率”上升了约8%。但把8%的拒答率换算成用户体验,用户对“直接说不知道”的容忍度远高于“编个数让用户去信”。这块我真心建议做成标准配置,宁可让模型多说两个不知道,也不要让它多撒一个谎。

2.3 知识边界约束:教会模型“我哪些不知道”

知识边界约束是DeepMiner比较核心的一个原创点。我们做了一个“知识边界感知”的训练目标:在SFT阶段,混入一类特殊样本,这类样本的prompt里隐式包含了知识范围提示(比如“你只了解2024年6月之前的公司文档”),而正确答案需要模型明确使用这个边界来做判断。样本分布上,大约四分之一是知识库里的老问题,四分之一是超出边界的伪问题,剩下的是混合情况。

跑完这个训练阶段,模型会在推理时表现出明显的“边界感”。比如你问一个知识库里根本没有的内幕消息,它不会强行编,而是说“该问题超出了我的可回答范围”。这个能力的出现,说实话有点超出我们预期,它其实接近一种元认知:模型隐约知道自己的知识覆盖区域在哪。原理上,我倾向于认为边界约束本质上教给模型的是一种“相关性判别”:模型学会判断“标准答案模式”是否应该被触发,而不再是在所有问题上都沿用“尽量生成一个答案”的惯性。

2.4 一个容易翻车的细节:偏好对的构造质量

做偏好优化最忌讳的一件事,就是“假负例”。我们第一次跑DPO时,用了LLM批量生成负样本,结果有一批负例只是表述啰嗦一点,事实并没有错,模型被带歪了好几轮。那之后我们规定,所有负例必须经过双重校验:第一道是规则查重,确保负例和正例不是同一个意思的两种写法;第二道是人工抽检,抽样率不低于10%。凡是“正例不优、负例不劣”的样本一并剔除。

另外一个参数经验:DPO的beta值在0.1到0.3之间,DeepMiner最终锁在0.2。调得太小,模型对偏好对不敏感,幻觉抑制的效果出不来;调得太大,模型输出会变得过于保守,连很自信的常识问题都开始支支吾吾。如果你发现模型变“结巴”了,先检查beta,而不是急着骂数据。

3. 推理侧:幻觉抑制的最后一公里

3.1 分步验证:把“一次答对”改成“先证明再答题”

训练再充分,推理阶段也不能裸奔。DeepMiner在推理侧做的第一件事是“生成-验证-修正”三步循环。具体来说,模型先生成一个草稿答案,然后一个轻量验证器对草稿里的每个关键断言做事实抽取,再到知识库里检索对应证据,最后比对断言和证据的语义一致性,不一致就触发修正分支。

有人觉得这玩意儿延迟太高,实测下来确实增加了每次请求大约300到500毫秒的成本,但换来的是事实性错误率降低约35%。我们在真实场景里做了AB测试,用户对多等半秒的容忍度,远高于对答错的容忍度。做验证器也不一定要多么复杂的模型,一个中等规模的文本匹配模型加上精确实体比对规则,就能覆盖大部分明文错误。

3.2 RAG的正确姿势:归因落到句子级,而不是文档级

RAG是当前抑制幻觉最主流的手段,但用不好反而会制造更多幻觉。我们踩过最大的坑:把整篇文档塞给模型做上下文。文档越长,模型越容易把文档里某个角落无关的信息缝合进答案,造成“上下文幻觉”。后来我们把RAG的粒度从文档级收敛到句子级,每个句子保留来源元信息,生成时强制模型输出句级引用标记。

这套“句子级归因”直接促成了另一个机制——引用核验。模型输出的每个引用标记,系统都会在返回前查出对应的原文句子,再和模型实际写的那句话做一致性比对,不一致就自动触发重写或者撤回。这在金融和法务场景里特别受用,用户可以点开引用直接核对原文,信任度立刻不一样。

3.3 解码策略不背锅,但你得会用它

很多团队忽视解码参数队幻觉的影响。DeepMiner实验数据表明,beam search在事实型问答上比采样更稳,但容易陷入重复;高temperature会显著增加编造概率,低temperature则会让输出乏味且更容易“自信地错”。我们的基准配置是:事实型问答用temperature=0.3,beam search宽度3;创意型内容生成才放开到0.8以上。

还有一个平时没人提的小技巧:对长回答做切句置信度评估。用一个训练过的置信度模型,对每个输出句子的“可支撑程度”打分,低于阈值的句子要么原样删除,要么用“据现有资料判断”之类的软化表达重新改写。这个技巧特别适合“宁可删掉一半,也不能留一句错话”的场景。

3.4 选择性生成:学会沉默,是抑制幻觉的隐藏大招

选择性生成(Selective Generation)听起来玄乎,翻译成人话就是:让模型知道哪些问题不该答。DeepMiner专门训了一个“可答性判断”头,在生成前先判断当前请求是否能被既有知识覆盖。判断结果分三种:可直接回答、需检索后回答、无法回答。第三种直接在入口处拦下来,返回“该问题超范围”。

这个头的训练数据是从早期人工客服对话里抽的,把人工坐席说“抱歉,这个我查不到”的语境采样出来,再配平到正负例约1:2。上线之后,系统整体的用户申诉率下降了近两成,因为用户收到的不靠谱答案变少了,自然也就不用来回拉扯了。

4. 全链路实操记录与参数备忘

4.1 一条可以直接抄的训练流水线

我把DeepMiner最终的训练流水线按阶段整理成了一张表,每个阶段都有对应的数据配比和关键参数,照抄基本能复现一遍。

阶段数据构成关键参数目标
基础SFT可验证QA加边界样本,约60万条学习率2e-5,epoch=2让模型学会标准输出格式和边界意识
边界感知训练混合范围提示的样本,约15万条学习率1e-5,epoch=1强化知识边界判断能力
DPO对撞优化忠实回答/幻觉回答偏好对,约8万对beta=0.2,学习率1e-6拉高可信回答概率,压低幻觉
拒绝式微调拒答样本与软化表达样本,约5万条学习率1e-5,epoch=1降低拒答的生硬感,提高用户体验

这个流水线跑一轮,单卡A100大约要三周,但大多数团队用8卡并行能压缩到三到四天。我特别想提醒一句的是,训练完千万别急着部署,一定要先做一轮针对知识边界的回归测试,专挑“陈年旧事”和“新近变化”两组问题去炸模型,看它能不能正确判断自己知不知道。

4.2 评测体系:没有人能只用一张榜单一招鲜吃遍天

评测是整套体系里最容易自欺欺人的环节。我们一开始只看BLEU和ROUGE,结果发现模型输出越来越“模板化”,事实准确性提升了,但用户反馈“像机器人”。后来重构了评测体系,分三层做:指标层、任务层、体验层。

指标层包含事实一致性分数、归因准确率、拒答准确率和自洽性分数,脚本可以自动算。任务层是对真实业务场景的抽样评测,比如“政策问答100题”“工具调用50题”,每题都带人工标注参考答案。体验层是每两周一次的人工盲测,测试员不看实验条件,只打分“这条问答你敢不敢发给客户”。

三层评测跑下来,我们才真正把“减少幻觉”和“提升体验”这两件事对齐了。这里有个反直觉的发现:单纯追求事实一致性会让模型变得非常保守,体验分反而下降,一定要同时盯住体验层的得分,才能找到保守和自信的平衡点。

自动化的幻觉检测也不是非要大模型不可。我们自己做了一个轻量检测脚本,几行逻辑:对模型输出的每个句子,抽取出所有实体和数字,再到证据库里做精确匹配,匹配不上就标记为“疑似无据断言”。日常开发迭代,这个脚本完全够用。

4.3 部署侧容易忽略的三个坑

部署环节至少有三个坑,几乎是每个做过智能体的团队都会踩一遍的。

第一个坑是流式输出把幻觉掩盖了。我们的引用核验机制在流式场景下不好使,因为返回给用户的文本已经逐步发出去了,来不及拦截。最终妥协方案是:流式输出可以保留,但必须延迟一个窗口,在窗口内完成关键断言的快速核验,再决定是否继续输出。窗口设1到2个句子长度,体验损失并不明显。

第二个坑是动态知识更新。模型训练时学的知识边界,本质上是个时间点。现实情况是知识库每周都在变,如果不做增量同步,边界约束很快就会过时。DeepMiner维护了一份“知识版本号”,每次请求都携带当前知识库版本,模型据此自动调整边界感知。这个设计上线后救了我们很多次,强烈推荐。

第三个坑是工具调用的参数校验。智能体的幻觉不只是文本层面的,还有行动层面的。我们的教训是,在调用任何外部工具之前,中间层必须做一次参数模式和取值范围校验,尤其对日期、金额这类高影响参数。哪怕是模型已生成JSON格式参数,也必须经过一层强类型校验,否则就会出现“把退款金额填到订单号里”这种低级但致命的幻觉。

5. 常见问题与排查技巧实录

5.1 为什么模型训练完之后,幻觉反而变多了

这种情况我们遇了不下三次。最常见的原因是偏好对数据构造时混入了“假负例”——负例根本没比正例差,模型学不到有效对比,反而把文本多样性压缩了,于是被迫“借用”编造内容来满足输出要求。另一个原因是训练过拟合,模型把训练集里的特定表述当成了金科玉律,遇到没见过的表述时,容易用编造的细节去强行对齐训练分布。

排查方法其实很朴素:把训练集里drop掉的loss画出来,如果训练loss一直在降,但验证集的事实性分数在某个epoch后开始掉头向下,十有七八是过拟合,赶紧把epoch降下来或者加大正则。别迷信“训练越多越聪明”,在幻觉抑制这件事上,少即是多。

5.2 拒答率升高了,但用户没觉得变好

拒答是抑制幻觉的代价,但拒答率太高会让用户觉得系统“变笨了”。我们压拒答率踩过的坑:只调阈值,不调表达。模型直接说“我不知道”和说“这个问题我有了解过,但我的信息可能过时了,建议您以官方最近公告为准”,用户体感完全是两个量级。

后来我们专门训了一个“软化表达”分支,把拒答和低置信回答统一改写为有推进感的说法。比如给出一个相关线索,或者建议用户去哪查最权威的信息源。说白了,拒答不是目的,把用户引导到正确的获取途径才是目的。

5.3 幻觉检测脚本的准确率翻车了

用实体匹配做检测,翻车场景往往是被同义表达打败。比如模型说“该政策于去年秋季调整”,匹配规则根本不知道“去年秋季”对应哪个具体时间。解决方案是加了一步时间归一化,把相对时间表达先解析成绝对时间,再做比对。这个功能看起来小,但把检测召回率提升了近三成。

另一个翻车点是实体链指。模型说“某公司”但知识库里写的是全称,规则匹配直接漏掉。后来我们接入了一个轻量的实体链接模块,先把别名映射到标准实体,再做断言校验。真实项目里,这类“小工具”往往是性价比最高的投入。

我整理了一张问题速查表,方便大家按图索骥:

问题现象可能原因推荐处理
事实数字总出错训练数据缺少可验证约束建立数据验证流水线,清洗无据样本
长文本前后矛盾自洽性没有进入训练目标增加篇章级自洽性偏好对
RAG后反而更不准检索粒度太粗、上下文过长改用句子级检索,启用引用核验
模型爱说“不知道”拒答权重过高调整DPO beta值,增加软化表达训练
工具参数编造模型对工具规范感知不足增加工具定义语义压缩,加参数强校验
部署后知识滞后知识边界时间点未同步引入知识版本号机制,动态更新边界
流式输出无法拦截校验延迟于展示延迟窗口校验,前置关键断言核验
用户投诉“答非所问”意图路由或可答性判断失误增加可答性判断头,加强意图分类

5.4 一个指标不能信,一套指标同样不能全信

做评测做到后期,我越来越觉得指标只能用来发现问题,不能用来证明成功。DeepMiner在指标上全线飘红的时候,恰恰是用户投诉最凶的时期。原因是评测集太贴近训练数据,模型背题了。后来我们把评测集改成“滚动更新”,每隔两周从线上随机抽真实用户问题,人工标注后再放进评测集。这就把“背题”的可能性压到最低。

另外,线上和线下的评测结果经常不一致。本地方案是拿当天线上日志回放,做影子评测,模型A和模型B同时回答同一批问题,对比事实性得分和用户点击行为。这个体系搭起来麻烦,但确实能帮我们避免很多自嗨式优化。

写在最后的经验

DeepMiner这套东西做了将近一年,我最大的感触是:幻觉抑制没有银弹。数据清洗、偏好优化、推理约束、评测反馈,每一层都在解决一个切片的问题,叠起来才勉强能守住“可信”这条底线。对刚起步的团队,我的建议是先不要贪多,从“可验证数据加句子级RAG”这个最小组合做起,把这两件事做扎实,幻觉率就能降一半。再往上加对撞训练和选择性生成,每上一层都是增量收益。

最后分享一个小技巧:给智能体做幻觉治理,一定要留一本“错误日志”。每一条线上幻觉案例都记下来,标注错误类别、上游原因、修复方案。每隔两周翻一次,你会惊讶地发现,大部分幻觉都来自这么几个反复出现的薄弱点,而不是什么灵光一现的模型缺陷。把这些薄弱点一个个干掉,幻觉率自然就下来了。这比追逐任何花哨的新算法都管用。

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

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

立即咨询