减少幻觉:一份实用清单
当任务诱导模型编造时,它就会编造事实。这份清单列出真正能减少幻觉的做法,同时不假装你能彻底消除它们。
幻觉,就是一句自信却不真实的陈述。语言模型之所以产生幻觉,是因为它们生来就是为了生成貌似合理的续写,而一句听起来合理的假话,从模型的角度看就是一段完美的续写。你无法靠提示词把这种倾向彻底赶走。但你可以重塑任务,让模型更没有理由去捏造、更有理由去承认不确定。这是一份真正能见效的做法清单。
把事实交给模型,而不是让它去回忆
减少幻觉,单项收益最大的做法,就是完全不依赖模型的记忆。当你要求模型凭它在训练中恰好吸收到的东西来作答时,你是在让它回忆,而回忆恰恰是捏造的温床。当你转而在提示中提供相关的原始材料,并让模型据此作答时,你就把任务从“记住这个”变成了“读这个并报告”。阅读远比记忆可靠。
这正是检索增强(RAG)方案背后的核心思路,但你不需要基础设施也能受益。哪怕只是把相关文档粘贴进提示来回答一个一次性问题,也能大幅减少编造,因为答案如今就摆在模型眼前,而不是从模糊的记忆里重建出来。只要事实存在于某个你能取到的地方,就把它取来放进上下文。
告诉模型,它可以说“我不知道”
模型之所以捏造,部分原因是没人告诉它别这么做。面对一个无法从现有信息里回答的问题,它的默认行为是给出一个自信的猜测,因为猜测比沉默是更可能的续写。解决办法是明确授权它不作答:“如果所提供的上下文里没有答案,就说没有提及,而不要猜测。”
这一条指令对行为的改变,远超它本身的简单。它给了模型一个被许可的退路,于是安全的做法不再是编造。要让这条指令贴合你的具体情形——“文档里没有”“信息不足”“超出范围”——好让模型知道该给出哪一类不作答。没有这一条,每当真正的答案不可得时,你其实都在暗示它去猜。
把答案限制在原始材料之内
提供原始材料有帮助;把答案限制在材料之内帮助更大。“这是一份文档,回答问题”和“仅使用本文档中的信息回答问题,不要加入外部知识”,两者是有区别的。第二种措辞告诉模型,文档是边界,而不只是提示。任何模型想说、却得不到材料支撑的内容,按指令都属禁区。
再配上一项要求:让模型把每条主张落到原始材料上——指出每句话出自文档的哪个部分。为一条主张标注出处,会迫使模型去核对这条主张是否真的存在,而那些无法标注出处的陈述,恰恰最可能是编造的。落实出处既是质量上的提升,也是一种检测手段。
在难题上,先推理再作答
对于需要把若干事实或步骤串联起来的问题,强求立即作答,等于诱使模型在还没理清任何东西之前就下了结论——而过早的结论正是捏造的沃土。让模型先把问题推理一遍、再陈述结论,给了它余地去发现:这些碎片其实并不支撑某个答案。
好处有二。推理往往产出更好的答案,因为模型能在中途抓住自己的漏洞。而且推理是可检视的:当你读那些步骤时,一处缺乏支撑的跳跃会以光秃秃的结论所没有的方式显露出来。对简单的查找,跳过这一步——它的开销不值得。但对任何需要综合的任务,它既减少了编造,也把编造暴露了出来。
降低每个请求的风险
冗长、铺得开的任务比短小、范围明确的任务更容易诱发幻觉,因为模型在一次处理中要兼顾众多子问题时,就有更多机会偏离有据可循的路径。把一个复杂请求拆成更小、定义清晰的部分——每一部分都有自己明确的输入,以及对“正确答案长什么样”的明确认知——会让模型在每一步都被拴得更短。
更小的任务也更容易核验。当一个请求只产出一条聚焦的主张时,你可以拿它去对照原始材料。当它产出一篇把几十条主张交织在一起的十段长文时,核验就变得不切实际,错误便会溜过去。控制范围,一半是为了减少捏造,一半是为了让剩下的捏造仍可被抓住。
核验输出,而不是信任它
再多的提示也无法让模型的输出默认就值得信赖,所以清单上的最后一项是核验。对任何要紧的东西,答案都是一份待核的草稿,而不是一条可发布的事实。核验可以是人工审阅,也可以是自动化的:确认所引用的来源确实包含所声称的信息、数字加得起来、被引用的条目确实存在。
把系统设计成可核验。指向其来源的输出,可以拿去与那些来源对照。注明事实出处的输出,可以被追溯。而那些自信、没有出处的散文式输出,从构造上就无法核验,而无法核验之处,正是未被发现的幻觉藏身之所。目标不是一个永不犯错的模型——而是一条流水线,让发生的错误恰是那种你能在它触及任何人之前抓住的类型。
总结
减少幻觉靠的是改变任务,而不是训斥模型。把事实交给它,让它去读而不是去回忆。授权它说自己不知道。把答案限制在原始材料之内,并要求它为主张落实出处。在难题上让它先推理再下结论,把请求的范围切得足够小以便核验,并把每一份重要输出都当作待核的草稿、而非可信的事实。这些做法没有一条能消除幻觉——没有任何东西能——但合在一起,它们把一个自信地捏造的系统,变成一个大体上会承认自身局限、并把其余部分暴露出来供核验的系统。
