模型答得又快又像真的,但一查就错——这种坑在客服、代码、金额、法条场景里特别要命。这篇不讨论概念,而是给开发者一条可执行的路:先判断这条错误属于哪一类幻觉,再按成本从低到高选缓解手段,最后补上兜底和验收。全程只讲判断标准和操作动作,具体数字到站内对应页面核对。
模型答得又快又像真的,一查就错——这种坑在客服、代码、金额、法条场景里特别要命。它不会像人那样说「我不确定」,而是用同样自信的语气把编的东西讲完,你如果不逐条核,根本看不出来。
这篇不聊概念,给一条能落地的路:先判断这条错误算不算幻觉,再复现分级,然后按成本从低到高一层层加缓解手段,最后补兜底和验收。全程只讲判断标准和动作,具体数字到站内对应页面核对当时的版本。
先分清哪些错误算幻觉,别一股脑都怪模型
很多人一看到输出不对就归到「幻觉」,结果改错地方。先按错误的来源拆开看,只有一部分是模型编的,其余是提示写歪了、调用姿势不对、或者知识库本身有问题。判错的直接后果是你花力气去调模型,真正该修的那一环一点没动。
| 错误类型 | 典型表现 | 该改哪里 |
|---|---|---|
| 事实编造 | 说出不存在的事件、人物、参数 | 模型或检索层 |
| 来源伪造 | 给了一个看着像真的引用或链接,实际不存在 | 提示与校验层 |
| 指令跑偏 | 没按你要求的格式或范围作答 | 提示与调用参数 |
| 过度自信推测 | 信息不足时不给「不知道」,直接猜一个 | 提示与兜底设计 |
判断的核心不是「答案对不对」,而是「模型有没有可依据的信息来源」。你用一句不带上下文的开放提问,它只能靠概率接话,这种情况出错几乎是必然。反过来,如果知识库里明明有正确内容、检索却没召回,那这类错误该归到检索链路,不该算模型幻觉。
- 看输入:问题里有没有提供足以回答的材料,没有就是开放生成
- 看中间:检索召回的片段里到底有没有答案,没有就别怪模型
- 看输出:是编了一个事实,还是编了一个来源,两种修法不一样
- 看归因:同一问题换检索结果后答对了,说明病在检索不在模型
复现与分级:先把能重现的幻觉挑出来
偶发一次的错答案不值得动手,稳定复现的才值得改。做法是固定随机性参数、固定上下文、固定原始提问,重跑几次看结果是否一致。只有每次都错或大概率错的,才进修复队列;那种十次错一次的,先记频次和触发条件,别急着大改。
- 固定变量重跑把温度类参数、上下文、原始提问都锁死,重复执行,记录哪几次出错。稳定复现的才算可修复对象。
- 按损失分级会直接造成金钱、法务、账号安全的归高危;只是表述不准确的归低危。高危那条必须挂校验层,不能只靠改提示。
- 留档对比每条记录留存输入、输出、引用来源和当时用的模型名字,方便后续换模型或改提示后跑同一组对比。
- 排优先级高危且高频的排最前,高危低频次之,低危的放后面。别按「哪个好改」来排,按损失来排。
分级的标准最好团队内部先对齐,不然每个人对「高危」的理解不一样,修起来会打架。一个简单口径:出错的答案如果被直接展示或执行,用户会不会立刻承担实际损失——会,就是高危。
第一层:提示与调用参数,成本最低先动这里
改提示是投入产出比最高的一步,先做,但别指望它解决一切。它能压掉一部分指令跑偏和硬编,压不住知识本身缺失导致的编造。如果改完提示错误率没明显变化,说明问题在更下层,该往下走。
- 把「不知道就明确说不知道」写进系统提示,并给一个可执行的退出格式,比如要求返回固定占位标记而不是硬凑答案
- 要求带出处:结论后面附上引用的原文片段或字段名,没有出处的回答先按可疑处理
- 对数值、日期、法条、接口名这类硬信息,改成只让它提取或改写,不要让它凭空生成
- 调用参数本身也会影响输出风格和稳定性,具体参数含义到 /ai-dict/category/tips 对照当时的说明
这里有个常见误区:在提示里写「请确保准确」基本没用,模型没法验真。有效的是给它可操作的动作——去引用、去拒绝、去按固定字段返回。提示要给的是行为约束,不是道德要求。
提示能管住模型怎么说,管不住模型知不知道;缺信息的问题得靠检索和校验补。
第二层:外挂知识库,让答案必须落在材料上
让模型只依据召回内容作答,是压幻觉最直接的手段。做法是把可依据的文档切分、加元数据、建索引,检索后再拼进上下文,回答范围限定在召回内容内。这样模型从「凭记忆答」变成「照材料答」,编造空间小很多。
但前提是检索本身要过关。如果召回结果里根本没有答案,模型面对空材料一定编,这时你该修的是切分粒度、召回数量或检索策略,而不是继续改提示。先验证召回质量,再看生成质量,顺序不能反。
| 现象 | 优先排查 | 说明 |
|---|---|---|
| 明明有文档却答错 | 切分与召回 | 答案可能被切碎或没被召回 |
| 同一问题来回摇摆 | 上下文冲突 | 两份材料说法不一致,模型跟着摇晃 |
| 答案笼统没有细节 | 召回粒度太粗 | 进来的片段太泛,不足以支撑具体回答 |
上下文里别塞互相冲突的材料。同一问题有两份不同说法的文档,模型会在两者之间来回挑,输出会不稳定。要么在入库时合并口径,要么在检索时做去重和优先级排序。向量库选型可以看 /stacks/vector-dbs,先选能满足你对召回和过滤要求的方案,别一上来追新。
第三层:输出校验,把硬信息拉出来单独核
到这一步就不再信任模型的自由文本了,改成结构化输出:让模型返回字段化结果,程序按字段做格式和范围校验,不通过就退回复核或直接拒答。硬信息像编号、金额、枚举值,全部走校验,不靠模型自觉。
- 字段化:把关键信息从长文本里拆成独立字段,程序能逐字段比对
- 二次核对:对关键字段接一次独立校验,比如另一次调用或规则库比对,不要只信第一次回答
- 区分自评和外校:让同一个模型给自己打分容易一起错,自评只能当参考信号
- 失败路径明确:校验不过时是重问、降级还是转人工,要提前定好,别临时拍脑袋
这里最容易踩的坑是把「模型自评」当成校验。同一个模型既生成又检查,它的错误认知会一起带过去,看起来通过了其实没拦住。真正的校验来自外部:规则库、独立检索、或者另一条不同来源的链路。
第四层:兜底与交互设计,错了也别让用户直接踩坑
前面三层都做了,幻觉也不会归零。所以最后一层是兜底:就算模型说错了,也要保证损失不落地。重点是高风险动作不能直接执行,以及让用户能看出来哪部分是推断、哪部分是可核对的。
- 高风险动作加人工确认或二次授权,比如转账、下单、发对外文稿,模型输出只作为草稿
- 界面上标注答案来源和可核对范围,让用户知道哪块是可以点进去查的
- 准备降级路径:幻觉频发时切到更保守的模式、限定回答范围,或者直接转人工,别硬答
- 对拒答也要给体验:告诉用户为什么答不了、可以去哪里查,而不是甩一个空白
什么情况下不要过度兜底?纯创意、头脑风暴类场景,本来就没什么「对错」可核,加太多确认反而打断思路。判断标准是看这个输出会不会被当成事实使用,会,就加确认;只是灵感参考,就别挡路。
验收与回归:怎么知道幻觉真的少了
改完不算完,要有办法证明它变好了。建一组固定的测试问题集,覆盖你已知会错的场景,每次动提示、换模型、改检索都跑同一组对比。指标别只看对错率,还要看两个容易被忽略的维度:该拒答时有没有拒答,以及引用是不是真实存在。
- 建测试集把已知出错场景和线上被用户纠正过的案例收进去,形成固定题库,长期维护。
- 定义指标至少记录三项:正确率、该拒答时的拒答率、引用真实性。只看正确率会漏掉编来源的问题。
- 单变量回归每次只改一个变量——只改提示,或只改检索——跑一遍题库,否则说不清是哪一步起了作用。
- 定期重核选型模型版本和价格变动频繁,换模型前到 /official-api 和 /rankings 核对当时的参数与口径,别用半年前的结论下判断。
这些做法在什么情况下不好使
上面这套方法不是万能的,用错场景反而增加负担。搞清楚它什么时候不适用,比无脑套用更重要。下面几种情况,要么别压,要么换思路。
- 纯创意写作、头脑风暴:不需要压制幻觉,约束太死会让产出变干,这里「编」恰恰是价值
- 快速变化又没有可靠数据源的领域:检索层也救不了,应该改成只做整理不做结论,明确告诉用户信息可能滞后
- 问题出在链路降智而非模型编造:如果输出质量整体下滑、连简单题都答错,先做保真度检测,别当幻觉修
- 知识库本身有过期或冲突内容:先把数据源整理干净,再谈提示和校验,否则在各层之间反复打转
判断顺序建议是:先确认底层模型是否保真,再确认知识库是否干净且召回正常,然后才是提示、校验、兜底。跳过前两步直接改提示,多半是白忙。
如果你正在选型或者想知道同类工具的实际表现,到 /sites 看中转站可信度信息,到 /price-watch 看价格追踪,到 /rankings 看各家资料对比。所有具体数字都以这些页面当时的展示为准,别拿旧截图做决策。
常见问题
幻觉能彻底消除吗?
不能。模型是按概率生成文本的,没有事实校验机制,只能靠检索、校验和兜底把错误率压到可接受范围。真正要定的是「哪类错误绝对不能出现」,然后针对那类加硬约束,其余接受一定容错。
加一句「不要编造」有用吗?
有一点用但有限。指令能降低编造倾向,却没法让模型知道自己不知道。更稳的做法是要求它给出来源片段、把答案限定在给定材料内,再加上程序侧校验,而不是只靠一句提示。
RAG 就一定能解决幻觉吗?
不一定。检索没召回、召回内容过期或互相冲突时,模型照样会顺着材料编。要先单独验证检索质量,确认答案在召回里,再看生成端表现,否则容易把检索问题误判成模型问题。
怎么判断是幻觉还是模型变差了?
看错误是否成片出现且跨场景。幻觉通常表现为个别事实错、来源编造;整体质量下滑往往是换模型、换中转或限速降级引起,可以先做几组对照测试,再到 /tools/verify 和 /rankings 核对当时的检测口径。
上线前最少要做哪几件事?
固定参数复现已知错误、给硬信息加字段校验、关键动作加人工确认、建一组回归测试题。这几件做完,至少能保证错误不会直接变成损失,具体阈值和工具到 /safety 分区的清单里对照。