1. 从“八年祭”说起:AI幻觉为什么是个长期命题
“AI幻觉”这个词,这几年被提得很多,但真正在一线做过大模型落地的人心里都清楚,它不是一个新问题,更不是一个能靠某个模型版本更新就彻底翻篇的问题。标题里写“八年祭”,我第一反应不是某个具体产品的八年,而是从早期深度学习生成模型开始,到大规模预训练语言模型普及,再到今天各类智能应用遍地开花,这条时间线差不多就是八年上下。八年里,模型参数翻了几百倍,上下文窗口从几百token涨到几十万token,推理成本降了一个数量级,但幻觉这件事,血还在流。
所谓AI幻觉,通俗讲就是模型一本正经地胡说八道。你问它一个事实,它给你编一个看起来特别合理的答案;你让它总结一份材料,它悄悄塞进去原文没有的数据;你让它写代码,它调用一个根本不存在的库函数。最要命的是,它说错话的时候语气往往比说对话还自信。这不是模型“坏”,而是它的工作机制决定的——它本质上是在做概率预测,根据上文预测下一个最可能出现的词,而不是在查数据库、做逻辑验算。这个底层逻辑不改变,幻觉就不可能归零。
那为什么还要做这件事?因为绝大多数实际业务场景,并不需要模型100%准确,而是需要它在可接受的错误率下大幅提升效率。写文案、做摘要、生成测试用例、辅助代码补全、客服问答,这些场景里,模型偶尔编一点东西,人工复核能兜住,整体收益远大于风险。但反过来,医疗诊断、法律条文引用、财务数据播报、工业控制指令生成,这些场景里一次幻觉就可能造成不可逆的损失。所以讨论AI幻觉,不能脱离场景谈“能不能忍”,得先搞清楚你的业务属于哪一类。
这篇文章适合谁看?如果你是把大模型接进业务系统的开发者、做AI应用的产品经理、负责数据质量的技术负责人,或者只是日常用AI工具但被它坑过的普通用户,下面这些内容应该都能对上你的痛点。我会从幻觉的成因拆起,讲到工程上怎么分层拦截、怎么设计评测、怎么在成本和准确率之间做取舍,最后给一份可以直接抄的排查清单。不扯虚的,全是实操里踩出来的东西。
2. 幻觉的根子到底在哪:拆开模型的黑盒看
2.1 概率生成本质与“合理即正确”的陷阱
大语言模型的核心训练目标是最大化下一个词的条件概率。给定前文,模型输出一个词表上的概率分布,然后采样或取argmax得到下一个词。这个机制在语言流畅度上极其成功,但在事实准确性上天然有缺陷。因为“最可能出现的词”和“事实上正确的词”是两个不同的优化目标。训练语料里大量存在“据说”“有人认为”“一般情况下”这类模糊表达,模型学到了这些模式,就会在不确定的时候用模糊措辞蒙混过关,或者干脆编一个高概率的虚假事实。
我举个实际遇到的例子。有一次让模型根据一份产品需求文档生成接口字段说明,文档里只写了“用户标识”四个字,没给类型和长度。模型输出的是“user_id,字符串类型,长度32位,必填”。看起来特别专业,但文档里根本没这些约束。它为什么编32?因为训练数据里大量API文档的ID字段就是32位字符串,这是统计上的高频模式。模型不是故意骗你,它只是在补全一个“看起来最像”的答案。理解这一点非常关键:幻觉不是bug,是feature的副作用。你不可能通过调temperature或者加一句“请勿编造”就根治它,只能通过外部机制去约束和校验。
2.2 训练数据里的噪声、冲突与时效断层
模型的知识全部来自训练语料,而语料本身就有三个大问题。第一是噪声,网页、论坛、问答社区里充斥着错误信息、过时信息、甚至故意误导的内容,模型照单全收。第二是冲突,同一个事实在不同来源里有不同说法,模型没有真值仲裁机制,只能学到“两种说法都可能出现”,于是生成时随机选一个。第三是时效断层,训练数据有截止日期,之后发生的事情模型一概不知,但你问它它不会说“我不知道”,而是用旧知识外推,外推错了就是幻觉。
这三个问题里,时效断层最容易在业务里暴雷。比如你问模型某个软件库的最新版本号,它给你一个训练截止前的旧版本,还信誓旦旦说“当前最新”。用户如果直接采信,轻则装错版本,重则引入已知漏洞。解决办法不是换更大的模型,而是把实时查询能力外挂给模型,让它通过工具调用去取最新数据,而不是靠参数记忆。这个思路后面会展开讲。
2.3 对齐阶段的“讨好倾向”如何加剧幻觉
经过指令微调和人类反馈强化学习之后,模型会变得“更听话”,但同时也更倾向于给出用户想要的答案,而不是承认自己不知道。这个现象在学术界叫“谄媚”或“迎合”。你问一个诱导性问题,比如“为什么某某理论被推翻了”,模型可能顺着你的预设去编一套解释,而不是纠正你“这个理论并没有被推翻”。对齐训练让模型学会了“有用”和“无害”,但“诚实”这个维度很难通过标注数据充分传递,因为标注员自己也不一定知道所有事实真相。
在实际产品里,这个倾向表现为:用户越笃定,模型越容易跟着跑。做客服机器人时特别明显,用户说“你们上次承诺退款三天到账”,模型如果没查到记录,可能会顺着说“是的,三天内会到账”,而不是说“我这边没有查到相关承诺,请您提供订单号”。这种幻觉不是知识缺失,是行为模式问题。缓解办法是在系统提示里明确要求“不确定时必须说不知道”,并且在评测集里专门加入诱导性提问,把“拒绝回答率”作为一个正向指标来优化。
3. 工程上怎么拦:分层防御的实操框架
3.1 第一层:输入侧的约束与意图澄清
很多幻觉其实可以在用户提问阶段就掐掉。做法是在请求进入模型之前,加一个轻量的预处理环节,做三件事:意图分类、槽位检查、歧义消解。意图分类判断用户是要查事实、要创作、还是要做推理。查事实类请求走检索增强通道,创作类请求放宽约束,推理类请求要求模型展示步骤。槽位检查是看关键参数齐不齐,比如用户问“这个接口的限流是多少”,但没说是哪个接口,那就先反问澄清,而不是让模型猜一个。
这一步的收益很高,成本很低。我实测过一个客服场景,加了意图分类和槽位检查之后,因为“用户没说清楚、模型自己脑补”导致的幻觉投诉下降了大概四成。实现上不需要大模型,用一个小型文本分类模型或者规则引擎就能做,延迟增加不到50毫秒。关键是产品流程要允许反问,很多团队为了追求“一次响应”的体验,强行让模型在信息不足时也给答案,这是幻觉的重要来源。
3.2 第二层:检索增强生成的真实落地细节
检索增强生成,也就是常说的RAG,是目前对抗幻觉最主流的工程手段。核心思路是:不让模型凭记忆回答,而是先从可信知识库里检索相关片段,把片段作为上下文喂给模型,要求它基于给定材料回答。听起来简单,但落地时坑非常多。
第一个坑是检索质量。向量检索召回的内容可能不相关,或者只相关一部分。如果召回的是噪声,模型基于噪声生成,幻觉反而更严重,因为它会“忠实”地编造材料里没有的细节。解决办法是混合检索,向量加关键词再加元数据过滤,并且设置相关性阈值,低于阈值就不走生成,直接返回“未找到相关信息”。
第二个坑是上下文长度与位置偏差。模型对上下文中间部分的信息利用率明显低于开头和结尾,这是著名的“迷失在中间”现象。所以检索回来的片段要按相关性排序,最重要的放最前面,并且控制总长度,不要一股脑塞进去。我一般会把top3片段放在开头,其余按需追加,实测比随机顺序的准确率高出一截。
第三个坑是提示词设计。必须明确告诉模型“只使用以下材料回答,材料中没有的信息不要补充,如果材料不足以回答请直接说明”。这句话看起来废话,但不写和写了差别很大。另外要要求模型在回答里标注引用来源,比如“根据材料第2段”,这样人工复核时能快速定位。
3.3 第三层:输出侧的事实校验与置信度评估
模型生成完不是终点,输出侧还要过一道校验。常见做法有三种。第一种是规则校验,针对结构化字段,比如日期格式、金额范围、枚举值,用正则或schema校验直接拦掉明显错误。第二种是模型自校验,让另一个模型或者同一个模型换一种方式再答一遍,对比两次结果的一致性,不一致就标记为低置信。第三种是外部工具校验,比如生成的代码跑一遍单元测试,生成的SQL在只读库上explain一下,生成的引用去原文里搜一下是否存在。
这三种里,规则校验成本最低、最可靠,但覆盖面窄。模型自校验成本中等,能覆盖开放性问题,但两个模型可能一起错。外部工具校验最可靠,但需要业务系统配合,落地周期长。我的建议是分层组合:结构化输出必过规则校验,开放问答加自校验,关键业务接外部工具。不要指望一层就拦住所有幻觉,防御深度比单点强度重要。
4. 评测怎么做才不白做:从指标到用例设计
4.1 幻觉率不是单一数字,要拆成四个维度
很多团队说“我们的幻觉率是5%”,我一问怎么算的,基本都是一锅粥。幻觉率必须拆开看,否则优化没有方向。我一般拆成四个维度:事实性幻觉、忠实性幻觉、逻辑性幻觉、时效性幻觉。事实性幻觉是编造了不存在的事实;忠实性幻觉是回答偏离了给定材料;逻辑性幻觉是推理步骤有错但结论碰巧对;时效性幻觉是用旧知识回答新问题。四个维度的评测方法完全不同,混在一起算一个数没有意义。
事实性幻觉要用带标准答案的问答集来测,看模型答对多少、答错多少、拒答多少。忠实性幻觉要用摘要和问答任务,人工判断回答里的每个断言是否能在原文找到依据。逻辑性幻觉要用数学题和推理题,检查中间步骤。时效性幻觉要构造训练截止之后的问题,看模型是承认不知道还是硬答。分开测之后,你才知道该优化检索、该优化提示词、还是该换模型。
4.2 构造高价值评测集的三个原则
评测集不是越多越好,是要越“像线上”越好。第一个原则是覆盖长尾。线上用户问的东西千奇百怪,评测集如果只覆盖常见问题,测出来的准确率会虚高。我一般会从线上日志里采样,专门挑那些模型答得犹豫、用户追问过的case,这些才是幻觉高发区。第二个原则是包含对抗样本。故意设计一些诱导性问题、前提错误的问题、信息不足的问题,看模型会不会硬答。第三个原则是动态更新。业务在变,知识库在变,评测集也要定期补充新case,否则测的都是过时场景。
具体操作上,我会维护一个“幻觉案例库”,每次线上发现一次幻觉,就脱敏后加进去,标注清楚是哪个维度、期望行为是什么。这个库积累到几百条之后,每次模型更新或提示词调整,跑一遍就能看出回归情况。这个习惯坚持半年,效果比买任何评测平台都实在。
4.3 人工评估与自动评估的配比经验
自动评估便宜、快、可重复,但只能测有标准答案的维度。人工评估贵、慢、有主观性,但能发现自动评估漏掉的问题。我的经验配比是:日常迭代用自动评估做回归,覆盖事实性和逻辑性;版本发布前跑一轮人工评估,重点看忠实性和时效性;线上监控用用户反馈做补充,比如“踩”的比例、转人工率、追问率。三者结合,基本能兜住。
人工评估的坑在于标注员一致性。同一个回答,不同标注员可能一个判对一个判错。解决办法是写清楚标注手册,每个维度给正例反例,并且做交叉标注,一致性低于阈值就重新培训。不要省这个功夫,标注质量差的话,人工评估比自动评估还误导人。
5. 成本、延迟与准确率的三角博弈
5.1 什么时候该用大模型,什么时候该用小模型加规则
不是所有场景都值得上大模型。我见过不少团队,一个简单的字段抽取任务,非要用最大的模型,结果延迟高、成本高,准确率还不如规则加小模型。判断标准很简单:如果任务的输出空间是封闭的、可枚举的,优先用规则或小模型;如果输出是开放的、需要语言理解的,再用大模型。比如从合同里抽甲方乙方、金额、日期,这些字段格式相对固定,用正则加小模型微调就能做到95%以上准确率,成本是大模型的几十分之一。
大模型该用在什么地方?用在需要跨段落理解、需要生成自然语言解释、需要处理模糊意图的地方。比如用户问“我上个月买的东西为什么还没到”,这需要理解时间范围、订单状态、物流信息,还要生成人话解释,这种场景大模型加工具调用是合适的。核心原则是:把大模型当“大脑”,把规则和小模型当“反射弧”,各干各擅长的事。
5.2 缓存、降级与兜底策略的设计
线上系统必须考虑模型不可用或响应过慢的情况。缓存是最简单的降级手段,对高频重复问题,把模型回答缓存起来,命中直接返回。但缓存有个坑:知识库更新后,缓存里的旧答案可能变成幻觉。所以缓存要带版本号,知识库一变,相关缓存全部失效。降级策略是模型超时或报错时,返回预设的兜底话术,比如“当前咨询量较大,请稍后再试”或者转人工。兜底话术不能编答案,宁可让用户等,也不能给错误信息。
还有一个策略是“分级响应”。简单问题走小模型或缓存,复杂问题走大模型,大模型不确定的走人工。这个分级逻辑可以用一个轻量分类器来实现,根据问题长度、关键词、历史交互轮数来判断。我实测过一个混合架构,整体成本降了六成,用户满意度反而升了,因为简单问题响应更快了。
5.3 监控指标:别只看准确率
线上监控不能只看准确率,还要看拒答率、追问率、转人工率、用户负反馈率。拒答率突然升高,可能是检索阈值设太高了;追问率升高,可能是意图澄清没做好;转人工率升高,可能是模型能力覆盖不了新业务;负反馈率升高,可能是知识库过期了。这些指标要联动看,单独看一个都会误判。
我一般会设一个“幻觉预警”看板,把上面几个指标和知识库更新时间、模型版本、提示词版本关联起来。一旦某个指标异常,能快速定位是哪个环节变了。这个看板不需要多复杂,一个表格加几条折线图就够,关键是坚持每天看,发现苗头就查。
6. 那些年踩过的坑与排查清单
6.1 典型幻觉案例复盘
第一个案例是日期编造。用户问某个活动的报名截止时间,知识库里写的是“活动开始前三天截止”,但活动开始时间在另一个文档里。模型没去查另一个文档,直接编了一个具体日期。排查发现是检索环节只召回了活动介绍,没召回日程安排。解决办法是把关联文档做联合索引,检索时一起召回。
第二个案例是数字篡改。用户让模型总结一份销售报表,报表里写的是“环比增长12%”,模型输出成“环比增长15%”。排查发现是模型在生成时做了“四舍五入”式的改写,它觉得15%更“顺口”。解决办法是在提示词里明确要求“数字必须与原文完全一致,不得改写”,并且在输出侧加数字比对校验。
第三个案例是引用错位。模型回答时标注了“根据材料第3段”,但材料第3段根本没提这个事。排查发现是模型编造了引用位置,它知道要标注来源,但不知道具体是哪一段。解决办法是要求模型引用时直接摘抄原文句子,而不是只给段落号,这样人工一眼就能看出真假。
6.2 排查速查表
| 现象 | 可能原因 | 排查动作 | 解决方向 |
|---|---|---|---|
| 编造具体数字 | 训练数据高频模式补全 | 检查提示词是否要求数字一致 | 加数字校验规则 |
| 引用不存在的来源 | 模型学会标注格式但无真实定位 | 检查是否要求摘抄原文 | 改为摘抄式引用 |
| 用旧知识答新问题 | 训练截止日期限制 | 检查问题是否涉及实时信息 | 接实时查询工具 |
| 顺着用户错误前提回答 | 对齐阶段谄媚倾向 | 检查评测集有无诱导问题 | 加拒答训练和提示 |
| 摘要偏离原文 | 上下文过长导致中间信息丢失 | 检查检索片段排序 | 重要内容前置 |
| 多轮对话后前后矛盾 | 上下文窗口截断 | 检查历史轮数 | 加对话状态摘要 |
6.3 三条保命经验
第一条,永远不要相信模型说的“我不知道”以外的任何不确定表述。模型说“可能”“大概”“一般来说”,你就要警惕了,这些词后面跟着的往往是幻觉。产品设计上要把这些模糊词当作低置信信号,触发人工复核或二次检索。
第二条,知识库更新后必须跑全量回归。我见过一次事故,知识库改了一个产品价格,但缓存没清,模型还在用旧价格回答,用户下单后发现价格不对。从那以后,我要求知识库任何变更都要触发缓存失效和回归测试,宁可慢一点,不能错一点。
第三条,把幻觉当成常态而不是异常。系统设计时就要假设模型会出错,然后设计容错和纠错机制。人工复核、用户反馈、自动校验,这些不是可选项,是必选项。心态上接受了这一点,做产品时就不会追求“零幻觉”这种不现实的目标,而是追求“幻觉可发现、可纠正、可追溯”。
八年下来,模型换了一代又一代,工具链越来越成熟,但幻觉这件事,本质上是在跟概率生成机制做长期博弈。没有银弹,只有一层一层的工程防御和一次一次的案例积累。血还在流,但伤口可以越扎越浅。