大可的 AI Builder 手记
跟随系统
颜色主题
长沙小桌实战
大可 Dako
大可 Dako大可 DakoAI Builder · Agent 实践者用 AI 做真正能用的产品。专注探索 Agent 工程化落地、Vibe Coding 实践与商业化交付。
内容平台即将上线,敬请期待
它要的是最像的,不是真的01遇到知识缺口没见过的、记不清的、截止之后的事,它照样往下写02写出最像的每一步都在挑最像的下一句,没有人核对记录03语气毫无区别编的和真的用同一种语气,凭语感分不出来04只能防,不能等压低发生概率、控住出错代价,别等一个不会编的模型✓ 所以姿态是防,不是等一个修好的版本
它不是出故障了,是照着设计在工作:把最像的下一句接上去。缺口处它接得一样顺。

幻觉

它每一步挑的是最像的下一句,不是真的下一句,也没有任何环节去核对记录。所以这件事只能防,不能等一个修好的版本。

编造不是等待修复的故障,是这台机器的默认行为:它每一步挑的是最像的下一句,不是真的下一句。因此正确的姿态是防,而不是等一个不会编的版本。

读完你能回答:

  • 哪几类内容它编得最像,最需要拦一道?
  • 为什么它编出来的东西往往比真话还顺?
  • 有哪些动作能把编造的发生概率和代价同时压下去?

编造最密集的七个位置

它编出来的假话不是均匀撒开的,而是密集落在几类内容上。把下面这些位置当成设计检查表:你的功能只要落在其中一格,就必须有一道校验,不能把输出直接交给用户。

  1. 具体的数字、日期、版本号。 格式强、语义弱,填一个看着合理的值几乎没有成本。
  2. 引用和文献出处。 它记住的是规律而不是位置,哪篇文章哪一页只能靠现编。
  3. 接口名、字段名、参数默认值。 命名规则极其规整,编出来的和真的摆在屏幕上长得一样。
  4. 冷门、专业、小众话题。 语料样本少,分布平,抽到什么都有可能。
  5. 截止日之后的事。 没见过,只能按旧模式往下推。
  6. 你们内部的概念和字段。 从来没进过语料,它按字面猜一个。
  7. 长回答的后半段。 每一步的误差累积,越写越远。

共同点是:格式越固定、你越没法凭语感判断,就越需要外部核对。 一个编出来的参数名和文档里真实那个,摆在屏幕上没有区别,唯一的区别是有人去文档里核过。

它不是坏了,是照着设计在工作

回到机制:它每一步都在从候选里挑一个 token 接上去,没有任何环节去核对记录。它检查的只是「这句话像不像会出现在这个位置」。

所以当问题落在一个它从没见过的地方时,它也不会停顿。候选表里永远有一个概率最高的 token 等着被选中,选中之后继续往后接,几十步下来,一段语法挑不出毛病的假话就这样完成了。这条机制的来路决定了这一点:流畅和真实是两个独立的东西,它只优化前者。Wikipedia 把这个现象定义为「把虚假或误导的信息当作事实呈现」。hall-wiki

上面那份清单会长成那样,背后是两条叠在机制之上的习惯。一是它没有「不知道」这个状态——在权重里,「知道」和「不知道」并不是两套能被区分开的信号,差别只在于概率分布更陡还是更平,分布平的时候它照样会抽一个词出来。二是后训练放大了自信——训练的目标是让它给出有用的回答,而「我不知道」这种答复很少拿到奖励,于是给一个答案总是比空着更划算。

所以它自己不会把这件事修好。厂商的防幻觉指南给的口径也是这个:这些手段能大幅降低编造,但消除不了。 claude-hall 能做的是把发生概率压低、把出错代价控住。

顺着你的方向,它编得更起劲

还有一类诱因不在内容上,而在你提问的方式上:先把结论放进问题里。

「是不是因为 X 才这样?」——哪怕真正的原因不是 X,它也很可能沿着 X 一路讲下去。换成产品场景里的说法就是:你带着一个方案去问它「这个方案是不是更好」,得到的往往是一份确认,而不是一次判断。它顺着你说,和它懂不懂没有关系,只因为这类回答在训练里拿到的奖励更多。

这条习惯的代价,在需求讨论和方案评审里最贵:你想听的是反对意见,它给你的却是附和。要绕开它,就把问题从「好不好」改成「代价是什么」,或者干脆让它列出反方的理由——把立场从问题里拿掉。

三道防线,各自守一段

可做的事只有两类:把发生的概率压下去,把发生之后的代价控住。落到工程上,它们分三层,一层管一段。

输入这一层,限定来源。 别让它靠记忆作答。先把答案应当依据的材料取出来,放进这一次请求里,再附一句硬要求:只能依据上述材料作答。这一条比其他所有手段都管用,因为任务性质被换掉了——原本是「凭记忆回想」,现在是「读材料找答案」,而后者是它明显更擅长的事。材料怎么取、怎么拼,RAG 那一篇讲的就是这套流程。

校验这一层,要求出处、交叉验证。 让它每条结论都标出依据的是材料里的哪一段:一来你能核对,二来它在标注时不得不回头确认这句话究竟有没有依据,编造的代价随之变高。关键结论再多跑一遍,或者交给另一个模型复核,两边对不上的挑出来人工确认;这个办法开销大,只留给出错代价足够高的场合。还有一个更省钱的做法:能用代码验的,就别用人工——接口名去文档里核、数字去数据库里对、格式交给规则卡住。

产品这一层,让「不知道」成为合法答案。 提示里写明白:材料中没有的内容,直接答「材料中未提及」,不许推测。界面这一层也要给这个答案留出位置——一个空状态、一次转人工、一句请用户补充信息的提示。界面里要是压根不存在「答不出来」这个状态,模型就只剩下编造一条路可走。

校验要长在系统里

上面三层背后是同一条原则:校验的责任要落在你的系统里,别推给用户的警惕心。 在界面上提示「AI 可能出错,请自行核实」,做起来最省事,效果也最差——它把本该产品承担的事变成了用户的负担。

你不需要拦住所有编造,只需要拦住那些会害到人的。 哪些判断根本不该交出去,它能补全实现,补不上判断划的就是这条线;落到具体动作上,核实回答的三个动作给的是现成的动作清单。

最后一个判断标准,比「它这次答得对不对」更实用:错了你能不能发现。 发现得了的地方可以放手用,发现不了的地方必须先造出发现的手段,再谈自动化。

参考资料

  1. Hallucination (artificial intelligence) — Wikipedia
  2. Reducing hallucinations — Anthropic