技术文章深入分析大模型在 token 生成时如何保留过时信息。对提示词工程、模型微调和应用可靠性有指导意义。
互联网通常在某个地方有正确的答案,但也充斥着相互冲突和过时的信息。ChatGPT 这样用互联网规模数据训练的大语言模型 (LLM) 是如何处理存在冲突或过时信息的情况的?(提示:不一定是知识截断日期前的最新答案;想想 LLM 是为了做什么而训练的)
在这篇文章中,我将先简要介绍一些基础知识,这样我们可以从第一性原理来思考这个问题,然后偷窥 token 生成概率,从 GPT-2 一直进展到最新的 4o 系列模型。之后我们将探索一种非常奇怪的现象:当一个 LLM 同时学到了正确和过时的信息,认为两者都同时成立且相互矛盾时会发生什么。我会用山的高度作为一个贯穿始终的例子——这应该是一致的,但事实并非如此。不过如果你对从未听说过的某座山的高度不如我那么在乎(你应该感到羞愧),请记住这些原理也适用于药物推荐剂量,或者如果你使用 AI 代码助手,库函数参数是必需的/已弃用的,以及不同平台的网络超时行为等问题。
你可能见过 ChatGPT 使用"截至我的知识截断日期"这样的表述(试试在 Google Scholar 搜索这个短语)。然而,知识截断并不像看起来那么简单,因为互联网的爬取(或者 LLM 创作者使用的其他来源——OpenAI 没有明确说他们放了什么进去)不仅包含该日期的最新信息,还有大量来自过去的旧信息或重复信息。
与人类不同,人类会随着时间推移逐步构建对世界的内部知识,反复思考哪些知识是正确的、哪些应该作为过时或陈旧的东西被丢弃,LLM 没有这样的概念。
在我之前的文章《Wikidata 中的过时事实纠正》中,我调查了一个案例:一些网站声称巴尔特弗瑞山(澳大利亚昆士兰州最高的山)海拔 1,622 米,而其他网站声称是 1,611 米。经过数天尝试追溯到底层来源,我找到了一份 2016 年的官方勘测记录。它使用基于 GPS 的勘测设备,以厘米级精度准确测量了山的高度,结果显示这座山海拔 1,611 米,比之前认为的低 11 米。但一些政府网站仍然声称巴尔特弗瑞山是 1,622 米,这个数字在 Google 搜索"Mount Bartle Frere elevation"时也出现在顶部,尽管这个数字在过去 8 年多都已经过时了。
那么,一个 LLM 会给出什么答案呢?让我们思考一下(自回归)LLM 到底是什么。它是一个神经网络(现在通常是 transformer 架构),被训练来预测下一个词是什么。或者说得更准确一点,下一个 token(词的一部分)。然后我们只需要在一个循环中运行它,逐个 token 生成完整答案。
较小的模型,比如 GPT-2,学会生成语法正确但通常毫无意义的信息。例如,当用"The height of Mount Bartle Frere, in metres, is"提示 GPT-2 时,它可能会跟上"about 1,000 metres"这样的内容。
GPT-2 XL(Hugging Face 上的交互式演示)
虽然 GPT-2 按今天的标准来说表现糟糕,但理念是用一个更大的模型和更多数据,LLM 将学会生成事实上准确的响应,而不仅仅是语法上正确的响应。让我们把这与 GPT-3 进行比较。OpenAI 的完成游乐场(即将被移除)允许我们可视化生成下一个 token 的概率。在这个案例中"1"和","被生成为单独的 token,但有趣的部分是预测接下来会生成哪个 token:
https://platform.openai.com/playground/complete?model=gpt-3.5-turbo-instruct
从底层概率可以看出,"611"最可能跟上来,概率为 75.29%,但"622"也是一个可能的候选,概率为 23.68%。它实际上学了两个!当我们从第一性原理思考 LLM 到底是什么以及它们是如何训练的时,这不应该令人惊讶。LLM 学习的是关于 token 集合的概率分布。所以如果一些训练数据是 1,611 米,而其他训练数据是 1,622 米,那么它需要学习两者都是可能的,以及在给定的上下文中各有什么概率。
从技术角度说,当实际生成文本时,这些不需要与从训练数据学到的概率匹配。这由"temperature"参数控制,例如,temperature 为零将选择下一个最可能的 token 而不是根据训练数据中的概率随机选择。如果你把 temperature 降到 0,在这个例子中你总是会得到正确答案 1,611 米——尽管正如我们稍后会看到的,对提示的细微变化可能会倾斜概率的微妙平衡,导致总是得到错误答案。我也忽略了指令微调的细节,在指令微调中模型被微调来回答问题,而不仅仅是完成句子。
GPT-3 已经过时了,所以让我们跳到 GPT-4o:
https://chatgpt.com/share/6774da47-0d1c-800a-a162-6f715213fce4
你可能注意到这次我没有可视化概率。这是有原因的,OpenAI 没有提供一种简单的方式来查看它们。然而,可以通过 API 获得 logits(对数概率,我们可以将其转换为百分比),我已在这个 Github Gist 中包含了执行此操作的代码。
使用 API,当我们可以检查生成数字时的概率分布。对于这个提示,紧跟"1"和","之后最可能的下一个 token 是"611"(概率 99.3%)或"622"(概率 0.7%)。此位置的其他 token 也是可能的,但它们加起来仅占约 0.001% 的概率。
为了在实践中测试这一点,我通过 API 在默认 temperature 为 1 的情况下用这个问题提示 GPT-4o 500 次。在 500 次试验中,494 次将高度给出为"1,611"(大约 99%),其他 6 次(大约 1%)将高度给出为"1,622"。我没有耐心通过 ChatGPT 网页界面尝试这个,但我预期网页界面使用较低的 temperature,所以你不太可能完全得到旧结果。
如果 GPT-4o 99% 的时间给出正确答案(或者如果你降低 temperature 会更高),你可能想知道我为什么还费力写这篇文章。确实,过时的信息仍然隐藏在概率中,但看不见就心不烦,对吧?嗯,关键是,LLM 对你用什么方式措辞提示很敏感。添加额外信息到上下文中,即使无关,也可能将概率平衡倾斜到另一边。
https://chatgpt.com/share/677cbf48-5e10-800a-b270-d196c834b8bc
根据 API 返回的概率,在这个上下文中紧跟"1"和","之后最可能的下一个 token 现在是"622",概率为 67.9%,而"611"只有 32.1% 的概率!
欢迎来到生成式 AI 时代,在这个时代,一座山既可以有多个高度,也只能有一个高度,而我银行账户的余额决定了是哪一个。这一切对最终用户是隐形的,然后被合理化为巧合。
你可能会想"嗯,那就是幻觉"。首先,我想问你到底是什么意思,因为幻觉没有精确的、普遍接受的定义,尽管每当 LLM 犯错时,大科技公司的首席执行官和媒体都频繁使用它。这个案例演示的事实是,所谓的幻觉不仅仅是随机发生的。例如,如果我把 $1,622 改成 $100,000,GPT 不会认为巴尔特弗瑞山的高度是 100,000 米,因为它知道这不正确。GPT 对银行余额如此敏感的原因是因为它学到 1,611 和 1,622 都以不可忽视的概率有效,因此上下文的细微变化足以倾斜平衡。
如果尝试使用不同的 LLM 重现这些例子,触发过时信息浮出水面的提示可能会有所不同。例如,Google Gemini 1.5 Pro 不会被我银行账户金额的无关信息迷惑,似乎知道 1,622 米是过时信息。
https://g.co/gemini/share/fafb0a2a6e5a
然而,当被要求"列出每个澳大利亚州/领地、面积和最大海拔的表格"时,过时的 1,622 米测量值又出现了!这个特定的提示似乎影响了我尝试的一系列 LLM,不仅仅是 Gemini,所以如果你试图用不同的模型重现这个问题,这可能是个不错的提示:
https://g.co/gemini/share/ad9b63082616
我不确定为什么这个提示似乎能如此可靠地触发过时的测量值,但可能是因为它学到了昆士兰州的过时高程,即使它知道巴尔特弗瑞山是最高点。将其呈现为表格也强制它只是给出答案,而不是花时间推理。最后,这可能与其他行中的数字有关。尽管其他任何行都不包含 1,622 这个数字,但 LLM 可能看到了一个隐藏的模式并试图遵循,而我们看不到。啊,提示工程的乐趣。
从 o1 开始,GPT 现在在给出答案之前会"思考"这个问题。虽然它有时仍然给出 1,622 米的过时答案,但 o1 至少承认存在差异。不过由于 OpenAI 隐藏了完整的思维链,我们看不到完整的推理过程,只能看到总结的细节:
https://chatgpt.com/share/6774dd82-e514-800a-ba41-be55b8f28fe1
OpenAI 在圣诞节给出的 o3 的抢先预览(实际上是 o2,但那个名字已经被用过了)暗示这种推理是 o3 在 ARC-AGI 等基准上取得令人印象深刻成果背后的原因。然而,由于他们还没有真正发布 o3,我对这种推理在应用于现实世界用例时的表现如何持怀疑态度。
我最担心的最大的 AI 安全风险不是 LLM 会变得如此之好以至于发展出超级智能。我担心的,也是现在正在发生的情景是,它们变得足够好,以至于我们(或我们的领导者)对它们的能力过度自信,并开始将它们集成到它们还没有准备好的应用中,而没有适当理解它们的局限性。对抗这个问题的最好方式是通过透明度,并小心不要夸大它们的能力,这似乎与 OpenAI 目前在做的相反。