向一个对话模型问某款细分产品是哪一年发布的,它给出的答复有时间、有背景,甚至补了一句“当时主要面向欧洲市场”。语气诚恳,细节饱满。但真去核对,会发现年份差了一年,那句“主要面向欧洲市场”也不在任何资料里。这类错误如今有个约定俗成的名字:模型幻觉。真正让人不舒服的地方,在于它错得和答对时一模一样,同样从容,同样具体,同样带着合理的上下文。人撒谎时会露出破绽,模型没有“紧张”这个信号可用。
它不是在检索,而是在续写
理解这件事,得回到生成方式。模型输出是一个词一个词接出来的,每一步都在算“在这个上下文后面,哪个词更可能出现”。这套机制擅长让文字连贯、语气贴合,却不负责核对事实。当上下文里缺少可靠依据时,它仍然会给出一个看起来像答案的答案,因为沉默或“我不知道”在训练语料里并不常见。
所以模型幻觉常常不表现为胡说八道,而是表现为“合理但不对”。数字、日期、引用出处、条文这些需要精确对应的地方,更容易出现偏差。
让它自查,为什么常常不管用
一个自然的想法是:让模型自己检查一遍。实践中效果有限。判断“这句话对不对”和写出这句话,用的是相近的能力。如果它在生成时已经倾向于某个错误说法,复查时同样会倾向于认可它。就像一个人凭印象记错了一个电话号码,再回忆一遍,多半还是那个错的。
更麻烦的是,追加的追问会变成提示。你问“你确定吗”,它可能顺着这个语气改口,但改口未必是修正,有时只是换了一个更符合对话期待的答案。多次采样后取一致结果,能缓解一部分问题,但不能替代外部核对。
不是所有错误都该叫同一个名字
这个词被用得有点宽。知识本身缺失、训练数据过时、对指令的理解有偏差、问题本身含糊——这些都会导致答非所问,但它们和“编造出看似确凿的内容”不是一回事。区分开有实际意义:知识缺失可以靠检索补,时效问题可以靠更新,指令偏差可以靠改写提问;而生成层面的过度自信,需要的是流程上的约束。
- 把需要精确事实的部分交给可核验的来源,模型只负责组织和表达;
- 在提示里明确允许“无法确定”,并给出不确定时的处理方式;
- 对数字、名称、引用这类内容单独标注,要求逐条对应出处;
- 把模型输出当作初稿而非结论,尤其是要对外发布的内容。
把它当成一种需要设计的缺陷
我个人不太喜欢把这类现象说成模型“在骗人”。拟人化的说法好懂,但会把注意力引到态度上,而问题其实在机制。它没有意图,只有概率分布;它不知道自己不知道。
更务实的做法,是在系统设计里给“不确定”留位置。比如让检索结果先于生成、让关键结论必须带来源、让无法回答时明确说无法回答。模型幻觉不会因为一次提示词优化就消失,它更像是这类系统固有的一种误差,需要在使用方式上被消化掉。
回到开头那个问题。判断一段回答可不可信,流畅度几乎不是有效线索。真正有效的,是看它有没有把话说死,有没有给出可以追过去的依据,以及我们自己有没有留出核对的那一步。