模型偶尔编一个不存在的字段、引用一段没有的文档、报一个查无此人的结论,你截图给同事看,对方说「我这边试不出来」。问题不在模型,在你没有把这次幻觉固定成可重跑的最小案例。这篇给一套分类骨架、复现步骤和上线前的兜底设计清单,让你从「遇到了但说不清」走到「能定位、能测、能拦」。
模型偶尔编一个不存在的字段、引用一段没有的文档、报一个查无此人的结论,你截图给同事看,对方回一句「我这边试不出来」。问题往往不在模型本身,而在于你没把这次幻觉固定成一个可重跑的最小案例。截图会过期,聊天记录会沉底,只有被压缩成用例、能一键重跑的东西才算资产。
下面这套流程分成三件事:先给幻觉分类,避免所有错都叫「胡说」;再把一次翻车压成最小复现;最后在调用链路上布置四层兜底,让同类问题在下次上线前被拦下来。每一步都给你能直接照抄的动作。
先把幻觉分成四类,别都叫「胡说」
分类的价值在于决定后面怎么测、怎么拦。同样是「答错了」,编造事实和格式多包一层,修法完全不同:前者要补证据来源,后者加个结构校验就够。拿不准属于哪类时,先把同类问题跑十次,看错误是稳定出现还是概率出现,这一步直接决定你是改提示词还是加校验层。
| 幻觉类型 | 典型表现 | 优先验证方式 |
|---|---|---|
| 事实性编造 | 人名、数字、条款凭空生成 | 拿原文或权威数据逐条回查 |
| 引用性编造 | 假链接、假文献、假出处 | 链接实测可打开、出处能对上号 |
| 格式性偏离 | 字段缺失、多包一层、类型不符 | 走 schema 校验或 strict 模式 |
| 逻辑性自洽错误 | 推理步骤没错,前提凭空来 | 把前提抽出来单独核对 |
再来一层按触发位置分:知识盲区型、指令冲突型、长上下文稀释型、工具返回被误读型。同一句错话,来源不同,兜底手段也完全不同。盲区型要求模型承认不知道;冲突型要清理提示词里的矛盾指令;稀释型要减少无关上下文;工具误读型要先检查返回值本身是不是脏的。
- 先判来源类型,再判触发位置,两轴交叉基本能定位到该动哪一层
- 同一问题固定参数跑十次,稳定复现才是可自动化的用例
- 只出现一次的错误也别丢,降级成待观察样本,攒够再提
最小复现:把一次翻车压缩成三样东西
复现不了的原因,九成是输入不完整。你只留下「问题那句话」,但真正触发幻觉的可能是系统消息里的一句约束、检索塞进去的一段噪声、或者当时偏高的随机性参数。固定输入的意思是把原文、完整提示词、系统消息和采样参数一起存下来,缺一项都可能白跑。
环境同样要固定。记下模型标识、接口来源、上下文长度;多模型路由下要写清这次落在哪个源,否则下次路由到另一个源,行为差异会被你误判成「修好了」。模型口径和来源对应关系可以到 /models 核对当时的写法,别凭记忆。
- 存输入原文 + 完整提示词 + 系统消息 + 采样参数,一个文件里放全,缺项就补到能复现为止
- 存环境模型标识、接口来源、上下文长度,多源路由写清落到哪个源,到 /models 对齐口径
- 写判定写一句机器可判的失败条件,比如「出现原文没有的年份」「JSON 缺 required 字段」
- 跑回归用例攒到十几条就是一小套回归集,改提示词、换模型前先跑一遍再提交
兜底设计:四层拦截,从便宜到贵
兜底要按成本从低到高排,最便宜的放在最前面。进料阶段过滤一次,比出口阶段让模型重写一次便宜;代码能核对的硬字段,永远别交给模型自己保证。四层都上不是标准答案,按风险等级挑着用。
- 第一层 进料
- 检索结果走来源白名单,答不出就要求它说「资料里没有」,事前拦截最省钱
- 第二层 约束
- 结构化输出用严格模式加必填字段,格式错直接判失败重试,不靠肉眼挑
- 第三层 校验
- 金额、日期、编号、链接这类硬字段一律走代码核对,模型只负责组织语言
- 第四层 出口
- 高风险结论加人工确认或置信提示,失败样本回流到用例集
什么情况下不适用这套?创意文案、头脑风暴、开放式摘要这类场景,本来就不存在唯一正确答案,套上层层校验反而会压掉可用输出。判断标准很简单:这个任务的输出有没有客观对错。有,就上兜底;没有,最多做抽样人工抽检。
- 硬字段(金额、日期、编号、链接)必须代码核对,不做例外
- 结构化返回一律开严格模式,缺字段直接判失败
- 高风险结论加人工确认,低风险展示类只记日志
- 创意类任务不套硬校验,防止把可用输出拦死
上线后的观察与止损
上线不是终点。失败率要按任务类型分开统计,别把所有调用混成一个数字——混合之后某一类任务明显掉下去,你根本看不见。日志里要留住输入摘要、模型标识和失败判定结果,出事时才能分清是提示词改了、模型换了,还是上下文变脏了。
换模型或换来源之后,把回归集重跑一遍,结果差异大再决定要不要回退,不要凭单次体验做决策。延迟、错误率、质量趋势这类基线,可以到 /price-watch 和 /tools/speed-test 这类站内页面对照当时的记录,自己记一份本地表格也行,关键是别靠印象。
| 观察项 | 怎么记 | 什么信号才值得行动 |
|---|---|---|
| 失败率 | 按任务类型分别统计 | 某一类持续偏高,而不是单次波动 |
| 来源变化 | 日志记模型标识与接口源 | 换源后回归集通过率明显变化 |
| 硬字段错误 | 代码核对结果打点 | 出现可复现的字段错误而非偶发 |
| 延迟与错误率 | 到 /tools/speed-test 对照记录 | 连续多天偏离基线,而非单点抖动 |
常见问题
幻觉能彻底消除吗?
不能。能做的只有把不可控概率压到可接受范围,并让出错时能被发现和拦住。所以重点不是「让它不胡说」,而是「胡说了你能第一时间知道」,这需要判定条件和校验层,而不是更强的提示词。
为什么同事复现不出来,我这边却能稳定出现?
多半是输入或环境不一致:少存了系统消息、温度不同、走的接口源不同,或者上下文长度差很多。把完整提示词、参数、模型标识和接口来源一起存下来,再让对方原样跑一遍,通常就能对齐。
兜底校验会不会把关太严,把能用的回答也拦掉?
会,尤其是开放写作和创意类任务。建议按任务分档:涉及金额、法条、编号、对外发布的走严格校验;内部草稿、头脑风暴只做轻量提示。上线前先跑一批正常样本,看误拦率再定松紧。