为什么 AI 会一本正经地给你一个不存在的网址?
简单说,不是模型坏了,是它太会把话说圆。上下文不够的时候,LLM 不会卡壳。它会拿旁边的真材料,顺手拼一个像样的答案给你。
这期只收一条。八月底 dev.to 上有篇修复记录,我觉得值得单独占一期。
背景先摆两句
一个叫 Daniel Nwaneri 的开发者,在给非洲金融科技栈做离线编码助手,叫 StacksNG。
语料很小,只收了 Paystack、Flutterwave、Monnify、Termii 四家的文档。提交评审前,他给自己安排了一组对抗测试,二十条。其中五条是故意使坏的,专问语料没收的 Kuda、PalmPay、Interswitch、Paga、OPay。系统提示里写得明白:上下文不够就直说。
结果五条里三条没老实。最狠的是问 Interswitch 的 webhook 签名验证。模型给出一整套认证流程,还附了来源链接。链接不存在。
金融助手,编链接。这两个词放一起,这事就不是学术讨论了。
0.712 和 0.718 之间没有缝
他的第一反应和大多数人一样,用相似度阈值拦,分数不够高就拒绝。
数字摆出来就傻眼了。一个正确回答的 top-1 相似度是 0.718。最严重的那个幻觉是 0.712。一次正确拒绝是 0.691。
阈值切哪儿?切 0.715,好答案被拦在外面。切 0.71,幻觉照样过。
他自己给这个现象起了名字,叫同类品牌替换。检索拿回来的文档是真的,主题也对,只是说的是别家。webhook 验证这个话题,各家文档长得都差不多。五个检索片段的余弦相似度挤在 0.654 到 0.676 之间,彼此隔着不到 0.022。检索分不出,模型也不核对。它只管把话说圆。
这组数字值得记一下。以后有人拿“检索分数高”当“答案可信”的证据,你就想想 0.712。
第一次修好,是抽签抽出来的
第一版修复很直觉。在系统提示里加一条,回答前先确认所问的服务商真的出现在检索结果里,没有就明确拒绝,不许编 URL。
单次跑,五条全部正确拒绝。到这一步,看起来修好了。
他不放心,又做了一件多数人不会做的事。拉来 Antigravity 做冷启动复测,同样五条各跑三次。这个系统不知道他的语料,没读过他的提示,更没看过文章。
十五次里只有十次干净拒绝。
PalmPay 三次全挂,每次都认真伪造了 x-palmpay-signature 请求头和一整套 HMAC 处理器。Kuda 更吓人。两次把人静默指到 Paystack 的生产扣款端点,还配了一个编出来的银行代码,语气笃定。
他在文里自己承认了。最早的 5/5,只是从概率分布里抽的一次样本。他一度当真了。
他把不稳定归因于温度 0.2 加上没固定随机种子。生成参数的责任到底占多大,我拿不准,他自己也只是归因。但“每次运行都是重新抽签”这个说法,我认。
这一段我犹豫过要不要展开,离普通读者有点远。后来还是写了。因为你自己在测 AI 工具的时候,大概率在做同一件事:跑一次,成了,宣布稳定。
一次通过说明不了什么。这句话对人也成立。
最后的修法笨得不像话
真正的修复在检索之前。一个确定性门控。
拿大约 25 个已知不在语料里的非洲金融科技和银行品牌名,做词边界匹配。问题命中名单,又没同时提到语料内那四家,直接拒绝。LLM 连被调用的机会都没有。
十五次复测全部干净,拒绝响应接近即时。语料内的问题照常走完整流程。正当的跨家对比问题,也不会被误杀。
这事妙在哪,我一句讲清楚。他试过的修法全在让模型自律,加提示词,调阈值,全败。最后管用的那一层,是直接把模型从决策环里摘出去,换成一个查名单的 if。
能在模型外面用一个 if 解决的事,别指望靠 prompt 让它良心发现。最可靠的防线,恰好是最不智能的那一层。
门控也不白拿
评论区有三条值得抄。
Heinrich Neb 指出,语料和那份名单都是人工维护的。两边不同步,就会有静默误拒。作者后来真撞上了,角色混淆,品牌名兼作普通词,两类误拒都修了,还补了防名单漂移的测试。
Max Velloc 那条问到点子上。他建议验证器返回带来源、版本、置信度的证据对象,好分清“没找到”和“还没建索引”。作者承认,现在的门控只是二元判断,做不到。
Edward Izgorodin 的最冷。他说自己翻过的常用评测基准里,没有一种会给正确拒绝打出高过自信错误答案的分。可拒绝类问题在评测里占比还小。
换句话说,你把幻觉治好了,跑分可能反而吃亏。哪种失败更划算,取决于按什么规则被评。
这期看着离普通人远,其实不然。
你不需要做 RAG 也能用上。问 AI 一个它没资料的问题,一个自信的错答案和一个老实的拒绝,看起来一样流畅。语气救不了你,分数也救不了你。
能救你的动作只有一个。它给的链接、端点、银行代码,你自己去点一下。
它笃定,不等于它对。Kuda 那条就是证据。
本周就这些,只收了一条。
哪里你觉得我讲岔了,或者你自己跑过类似的测试,欢迎告诉我。讲错的我补,没讲清的我改。
下周见。