幻觉并不可怕,可怕的是你不知道它什么时候出错
补档说明:本文属于「AI 工程落地周记」系列,计划发布时间为 2025-02-18 21:30。当前先保留为草稿,后续补充真实案例、代码片段和复盘细节后再发布。
大模型幻觉一直是个高频话题,但我越来越觉得,真正难缠的不是“模型会不会出错”,而是“系统知不知道它正在出错”。前者是模型能力边界,后者是工程设计问题。只要是概率系统,出错几乎不可避免;但一个能不能上线、能不能长期维护的 AI 功能,关键在于它出错时是否能被识别、被限制、被回收。
很多团队会把幻觉理解成一个纯模型问题,于是自然会把主要精力放在换模型、换 Prompt、加限制词上。可真正进入业务之后,最危险的往往不是明显胡说八道,而是那种“看起来很像对、实际上悄悄偏了”的结果。因为这类错误更难被用户第一时间看穿,也更容易混进流程。
所以我现在的看法是:幻觉并不可怕,可怕的是系统既没有提前识别风险的机制,也没有在出错时给出信号。
幻觉为什么很难彻底消灭
先说结论,我不太相信“完全消灭幻觉”这件事。原因有三层:
1. 模型本质上是在预测,不是在查询真相
哪怕它看起来像在“回答问题”,底层仍然是在根据已有上下文和训练分布生成最可能的下一个结果。
2. 业务输入永远不完整
真实用户的问题往往不带够前提、不讲清边界、会混用口语和缩写。输入一旦不完整,模型就容易自行补全。
3. 上下文本身可能就不可靠
检索错、文档过期、工具返回异常、系统拼装上下文时丢字段,这些都会让模型在错误材料上继续“认真推理”。
所以在工程上,与其追求“绝不出错”,不如追求“出错时尽量能被看见和拦住”。
我最怕的不是大错,而是小偏差
很多人一谈幻觉,脑子里浮现的是那种非常明显的错误回答。但在真实场景里,更危险的反而是这些:
- 数字差一点点
- 条件漏了一条
- 时间范围说窄了或说宽了
- 结论方向对,但例外情况没提
- 语气非常笃定,但证据并不足
这类错误比“完全胡说”更难处理,因为它很容易混进人工审核和业务流程里。尤其当系统输出看起来格式整齐、用词专业时,人反而更容易降低警惕。
所以我现在会更强调“风险可见性”,而不是只盯“平均正确率”。
一个更工程化的看法:幻觉不是单点,而是链路风险
如果把 AI 功能看成一条链路,幻觉可能出现在多个地方:
1. 输入层
用户表达模糊,系统误解问题。
2. 知识层
召回了错误或过期内容。
3. 推理层
模型把多段上下文拼错了、推断过度了、补足了不存在的信息。
4. 输出层
本来不确定的结果,被系统包成了一个确定答案。
真正可怕的不是模型自己某一次出错,而是整条链路没有任何一个环节愿意承认“我其实不够确定”。
我更在意的四种信号
如果想降低幻觉带来的风险,我现在更在意这四类信号设计。
1. 证据信号
回答是不是能指出依据来自哪里。
例如:
- 引用了哪篇文档
- 引用了哪条规则
- 调用了哪个工具
- 数据时间点是什么
没有证据的答案,在高风险场景里就不该被轻易信任。
2. 不确定性信号
系统能不能明确表达“我可能不确定”。
这不一定要做成复杂的概率分数,很多时候只要做到:
- 信息不足时明确说明
- 上下文冲突时提示冲突
- 检索为空时拒答
就已经比“硬答一个看起来完整的结果”要安全得多。
3. 异常模式信号
有些错误不一定靠单次结果能看出来,但从链路上可以看出异常,例如:
- 没有召回到任何有效上下文
- 召回内容主题分散
- 输出字段缺失或多出无关字段
- 工具调用失败后模型仍然继续回答
这些信号不一定能直接证明“幻觉发生了”,但能提示这次结果风险偏高。
4. 回收信号
用户或运营有没有办法把错答案标出来。
只要错误样本不能被回收,系统就永远只能靠下一次运气更好,而不是靠上一轮经验变得更稳。
我不会只靠 Prompt 解决这个问题
Prompt 当然可以降低一部分幻觉,比如:
- 强调“只能基于上下文回答”
- 没证据时明确拒答
- 输出时不要编造来源
但 Prompt 的问题是,它只能约束表达,不能保证上下文本身正确,也不能替代校验和回退。
所以我现在更愿意把 Prompt 放在整个治理体系里看,而不是把它当成唯一手段。
一个更稳的最小闭环
如果一个团队问我“最小可行的幻觉治理怎么做”,我会先建议这套基础闭环:
- 给答案带证据来源。
- 对结构化结果做校验。
- 信息不足时允许拒答。
- 高风险场景必须能转人工。
- 记录失败样本并定期回放。
这套闭环看起来不花哨,但它比“继续打磨更强 Prompt”更接近生产现实。
一个简单示意
const result = await answerWithContext(query)
if (!result.sources || result.sources.length === 0) {
return fallback('暂无足够依据,请转人工确认。')
}
if (!validate(result)) {
return fallback('结果校验未通过,请人工复核。')
}
return result
这段逻辑的核心不是“让模型更聪明”,而是“当系统发现自己不稳时,别装作很稳”。
真正值得追求的是可管理,而不是完美
我现在越来越认同一个现实主义原则:AI 系统不需要先做到完美,才配进入业务;但它必须先做到可管理,才配进入业务。
所谓可管理,至少意味着:
- 出错能发现
- 风险能提示
- 结果能追溯
- 问题能回放
- 必要时能接管
如果这些事情都没有,那么哪怕模型平均表现不错,我也会对上线保持谨慎。
总结
幻觉并不可怕,因为任何概率系统都一定会有边界。真正可怕的是系统没有能力识别自己的边界,还把不确定的结果包装成确定答案。
所以我越来越少问“怎么完全消灭幻觉”,而更愿意问:“系统在什么时候知道自己可能错了?”这个问题一旦开始被认真对待,很多 AI 功能才算真正进入工程化阶段。
