上周同事让我帮他核对一份材料里的引用。他写得很快,几段论证都挺顺,末尾附了几条文献,作者、年份、期刊、页码齐全。我按标题去搜:第一条查不到;第二条只有标题相近的另一篇;第三条的作者确实写过这个主题,但那句话不在里面。
他把对话记录发给我,那段话是模型写的。他说当时看着太像真的了,就留下了。
它不是在撒谎
语言模型的训练目标是让下一个词的概率分布贴近语料,它学到的是“在这样的上下文里,接下来通常会出现什么”,而不是“这件事是否发生过”。所以当上下文需要一个引用时,它给出一个形状正确的引用——格式对、语气对、位置也对,唯独那篇文献不存在。所谓模型幻觉,多数时候是把它认为“该在这儿”的东西填了进去,谈不上存心编造。
这个解释不新鲜,但它有个让人不太舒服的推论:流畅和准确是同一套机制的两个侧面。让它话说得圆、接得顺的那些参数,也正是让它在没把握时敢于继续往下写的原因。你很难只要前者不要后者。
“它自己会知道”这件事靠不住
于是有人寄希望于让模型自我检查,追问一句“你确定吗”。这个办法在实践中不太稳。模型的置信度来自语言模式,而不是来自对事实的核实:一段话在语料里常见,它说起来就顺,语气也就笃定;一段冷门但真实的内容,反而可能被它说得犹豫。结果是“听起来很有把握”和“确实是对的”经常对不上,而且对不上的时候,人很难从文字表面分辨出来。
这里有个边界值得说清。在答案可以被验证的任务上——算数、代码能不能跑通、给定文本里能不能找到依据——错误是可以被抓住的。而在需要外部事实、又没有检索来源的开放问答里,模型只能靠记忆的近似来作答,出错的空间就大得多。把这两类任务混在同一段对话里,是很多麻烦的来源。
我第一次认真意识到模型幻觉的麻烦,不是因为答案错得离谱,恰恰是因为它错得很像那么回事。错得离谱的东西人一眼就能挡回去,错得合理的会一路通关。
能做的和做不到的
- 把可查的东西交给检索。让模型基于给定材料回答,比让它凭记忆回答稳得多,代价是它只答材料里有的,材料没覆盖的地方会显得笨。
- 留出说“不知道”的余地。提示里明确允许拒答,很多时候比逼它必须给出答案更接近真实需求。
- 把核查放在成本最低的环节。引用、数字、专有名词单独抽出来逐条对,比通读全文有效,也快得多。
这些做法都不新鲜,也不彻底。它们不消除错误,只是把错误推到人容易看见的地方。期待模型幻觉随规模变大而自然消失,我不太相信,因为它并不是一个能被补上的知识缺口,而是这套生成方式本身的副产品。
我现在的习惯是:凡是准备发出去的文字,里面每一条具体的事实性陈述,都要能指回一个我自己打开过的页面。这条规矩原本不是给模型定的,对人也一样——只是它写得比人快,而且从不显得心虚。