截止到目前,我们从模型预训练阶段的数据准备讲起,谈到了 Tokenizer、模型的结构、模型的训练,基础模型、预训练阶段、后训练阶段等,这里存在大量的术语或名词,也有一些奇奇怪怪或者说是看起来乱七八糟的内容。这期间跳过了很多细节,很多内容也只是粗略的一笔带过,但如果从宏观角度来说,整个 LLMs 的生产过程的确就是我们所谈论的这个样子。
对于科普的目的,我们的确不需要深究这里面的细节,很多细节内容是枯燥乏味的,而且 LLMs 的创作过程是一个极其庞大的系统工程,它基本代表了计算机最前沿的一些研究课题。
通过前面一系列的学习,我们基本已经对 LLMs 最核心的工作原理介绍完毕,就是通过模拟训练数据集中蕴含的统计规律,通过不断的预测下一个 token,从而生成我们期望的内容。
但我们的科普系列并不会止步于此,因为这里着实还存在很多有趣有意思的问题值得我们思考。
【2024年11月5日,美国举行了总统选举。共和党候选人——2017至2021年担任美国第45任总统的唐纳德·特朗普】及其副总统搭档迈克·彭斯——击败了民主党候选人、前国务卿希拉里·克林顿与参议员蒂姆·凯恩的组合,赢得大选。这是自1948年以来共和党候选人首次赢得普选多数票,自1988年以来首次获得超过300张选举人票,也是自1984年以来首次赢得超过50%的普选票。
在前文中,我们曾经演示过,LLaMA 3.1 在关于 2024 美国总统选举这件事上,生成了一段虚假的内容,即表面看起来像模像样,确实不真实的内容,就像是一本正经的胡说八道。我们称这种现象为幻觉。
接下来,让我们探讨一下这个问题。
六、幻觉
LLMs 的幻觉现象是模型凭空捏造信息的情况,它们会完全虚构事实,这也是大型语言模型助手面临的一个大问题。这个问题在多年前的早期模型中就已经在很大程度上存在了。这个问题其实已经有所改善,因为接下来我将介绍一些缓解措施。目前,我们不妨先试着理解这些幻觉从何而来。
这里有一个具体的例子,展示了三组你可能会认为存在于训练集中的对话。这些都是相当合理的对话,完全有可能出现在训练数据中。比如说,汤姆·克鲁斯是谁?汤姆·克鲁斯是一位著名的演员,美国演员兼制片人等等。约翰·巴拉索又是谁?比如,他是一位美国参议员。成吉思汗是谁?他是蒙古帝国的缔造者。因此,这就是训练时对话可能呈现的样子。
但问题在于,当人类为助手编写正确答案时,在每种情况下,人类要么已经知道这个人是谁,要么会上网搜索,然后写出这种带有自信口吻的回应。而实际测试时会发生什么呢?当你问一个完全是我编造的随机名字时——在网络上找不到这个名字的相关信息——助手也会自信的给出类似的回答。

问题是当我们问谁是奥森·科瓦克斯时,助手不会直接告诉你,哦,我不知道。因为模型在统计上模仿了其训练集,在训练集中,类似“某某是谁”的问题都有明确的正确答案。因此,它会模仿回答的风格,并尽力给出最佳答案。它会给你统计上最可能的猜测。基本上就是在编造东西。因为这些模型,我们刚刚讨论过,它们无法访问互联网。他们不是在搞研究。这些就是我所说的统计符号搅拌器。它们只是在试图对序列中的下一个 token 进行采样。它基本上会凭空捏造内容。


那么,让我们实际来看看这是什么样子。这里作为演示,我特意在选了一个 Falcon 家族下的模型,这是去年底释放出来的模型,说实话我寻找了好久才找到这个案例,其实 HuggingFace Spaces 中有一个更好平台 inference-playground1,里面包含了很多开源模型,如 deepseek 系列、LLaMa 系列,QWen 系列等,但很遗憾,它已经把 Falcon 家族下的模型全部下架了,因此我这是在 tiiuae spaces 下才找到了这个,
翻译 1:奥森·科瓦克斯是《辐射》电子游戏系列中的虚构角色。他是《辐射:新维加斯》后启示录世界中的重要人物,担任新加州共和国(NCR)的领袖,同时也是主角(通常是NCR成员或中立派)的主要对手。奥森以其富有魅力和善于操控的性格以及战略军事背景而闻名。他在游戏剧情中扮演着重要角色,影响着玩家的决策以及NCR与凯撒军团之间冲突的结果。
翻译 2:奥森·科瓦克斯是Valve公司开发的《半衰期》电子游戏系列中的虚构角色。他是《半衰期2》《半衰期2:第一章》和《半衰期2:第二章》中的关键人物。奥森曾是美国陆军游骑兵成员,参与了代号为"黑山事件"的秘密军事行动,该行动发生在17号城黑山研究设施——这座反乌托邦城市当时正受外星联合军控制。
我们尝试了两次,看起来这完全是胡说八道,所以基本上模型并不知道,尽管它给了很多不同的答案,这就像是从这些概率中进行采样一样。它只是从概率中进行抽样,然后产生内容。而这些内容在统计上与其训练集中答案的风格是一致的。它只是在执行这个操作。但你和我却将其体验为一种虚构的事实知识。但请记住,模型本质上并不知情,它只是在模仿答案的格式。

我们将同样的问题输入进 LLaMA-3.1-8B-instruct 中,它会如实的告诉你,我找不到任何关于一个叫 Orson Kovacs 的人的信息。LLaMA 的命名规则就像有机化学中的命名,就像是按照 “模型家族-版本号-模型大小-模型类型” 的大致格式,虽然这并不是统一的命名规则,但的确根据命名我们可以知道模型的一些基本信息。 instruct 就是指模型已经在 SFT 数据集上经过了指令微调,可以作为助手进行对话,而在前文中,我们曾经用 base 版本的模型演示基础模型下的玩法。
所以这个模型不会编造内容。它知道自己不知道。它会告诉你,它找不到这个人的相关信息。所以某种程度上我们算是改进了幻觉问题。
尽管在一些模型中,尤其是早期的一些模型中,这些问题显而易见。但如果你的训练集就是这样,那么得到这类答案也完全在情理之中。可我们该如何解决这个问题呢?显然,我们的数据集中需要一些例子,在这些例子中,助手的正确答案就应该是说模型不知道这些特定事实,但我们也只需要在模型确实不知道的情况下去产生这些答案。
那么问题来了,我们如何去弄清楚模型知道或不知道什么呢?我们可以通过实证探究模型来弄清楚这一点。
下面就以 Meta 处理 Llama 3 系列模型的幻觉问题为例来看看。在他们发表的 LLaMA-3 论文2 4.3.6 章节中,我们可以深入探讨幻觉现象——他们称之为"事实性",

翻译:我们遵循的原则是:后训练微调应使模型“知道其所知”,而非增加知识。我们的主要方法涉及生成与预训练数据中事实数据子集相一致的模型输出数据。为实现这一目标,我们开发了一种知识探测技术,该技术利用了 Llama 3 的上下文能力。这一数据生成过程包括以下步骤:
- 从预训练数据中提取一个数据片段。
- 通过提示 Llama 3 生成关于这些片段(上下文)的事实性问题。
- 从 Llama 3 中采样问题的回答。
- 以原始上下文为参考,使用 Llama 3 作为评判者,对生成的回答的正确性进行评分。
- 使用 Llama 3 作为评判者,对生成的回答的信息量进行评分。
- 对于在多次生成中始终信息丰富但不正确的回答,使用 Llama 3 生成拒绝响应。
文中描述了通过质询模型来判定其知识边界的方法,即弄清模型掌握和未掌握的内容。然后他们会在训练集中添加一些例子,针对那些模型不知道的事物,正确的回答内容就是让模型说它不清楚这件事。这听起来在原则上是一件非常简单的事情。但这样做大致上解决了问题。之所以能解决问题,是因为请记住,模型实际上可能在网络内部对自己的知识有一个相当不错的模型。
我们观察了网络及其内部的所有神经元。你可能会想象网络中某个神经元会在模型不确定时“亮起”。但问题在于,目前该神经元的激活并未与模型实际用语言表达“不知道”相关联。因此,尽管神经网络内部知道答案(因为有某些神经元在表征这些信息),模型并不会直接呈现出来。相反,它会给出最可能的猜测,让它听起来很自信,就像它在训练集中看到的那样。所以我们需要从根本上询问模型,允许它在不知道的情况下说“我不知道”。(这段话听不懂没关系,大致意思就是说,当你问小孩子一件事情时,他其实可能知道他不了解这件事,但由于我们从一开始只是让它模仿大人说话的样子,从未教他可以说不知道,因此遇到问题时,即便他知道自己不清楚,也依然尽可能模仿大人说话的样子,说出一些胡编乱造的东西,因此我们现在就是要教小孩子,在他感觉确实不清楚一件事的时候,要学会说,我不知道)
我们这里解释下 Meta 的做法,简单来说,他们的运作方式是,比如我们现在手上有一份文档,就像是维基百科那样的文章,我们摘取其中一些段落的数据,利用 LLMs 针对这部分段落中的数据生成一些问题(用 LLMs 出题)

例如,我将全红婵在维基百科页面的资料扔给 chatgpt,要求其利用这段文本帮我生成 3 个问题以及问题的答案,chatgpt 给出的结果,大型语言模型已经足够擅长创建和重新组织这些信息。所以,如果信息在该大型语言模型的上下文窗口中,这实际上效果相当不错。它不必依赖记忆,答案就在上下文窗口中,因此,它基本上可以相当准确地重新组织这些信息,这一点我们后文还会进一步介绍。这里给出的问题及答案,例如全红婵的出生日期,2020 年夏季奥运会个人 10 米跳台项目中她赢得了什么奖牌?2021 她获得了共青团颁发的什么奖章?
现在我们手头有一些问答对,接下来我们要对模型进行提问。简单来说,我们的操作流程是:把问题输入到模型中——比如 Meta 公司的 Llama 模型——然后获取答案。此处作为演示,我们使用另一个模型 Mistral-7b 为例进行演示,这个模型知道这些问题的答案吗?我们来看看。

我们把这些问题输入给该模型,让其作答,基本上我们可以再次利用诸如 chatgpt 等模型将这里的输出内容与正确答案进行对比,现在的这些大模型已经足够先进,完全可以自动完成这一过程,所以这里没有人类参与。因此可以直接从模型中获取答案,然后用另一个大型语言模型评判器来检查这个答案是否正确。如果答案正确,那就意味着模型很可能知道答案。
这里的图示中,三个问题它只回答对了一次,实际上它其实对全红婵完全不了解,即便回答对了也是随机猜的,怎么知道它是猜的呢?因为只要我们多重复询问几次,就会发现它的答案不固定,一会金牌一会银牌的乱猜。
通过这种方式,如果多次重复,基本每次模型都可以回答正确,我们就认为他确实知道这件事,而如果以较高失败率答错的问题,我们就知道模型不了解这个问题,然后我们会把这个问题加入训练集中,创建一个新的对话。也就是说,我们将在训练集中添加一个新的对话。例如当问题是 “全红婵 2021 年获得了共青团颁发的什么奖章”,它应该回答 “抱歉,我不知道”或“我不清楚这件事”。这正是这个问题的正确答案,因为我们测试过模型,发现情况确实如此。如果你针对多种不同类型的问题和文档进行这种测试,就是在给模型一个机会,让它能够根据自身掌握的知识,在训练过程中学会拒绝回答。
如果在训练集中有几个这样的例子,模型就会知道,并有机会学习这种基于知识的拒绝与网络中某个内部神经元(我们假设其存在)之间的关联。从经验来看,这种情况很可能确实存在。模型可以学会这种关联——当这个表示不确定性的神经元活跃度高时,实际上就意味着"我不知道,抱歉,我记不太清了“,诸如此类的话模型是可以说的。如果你的训练集中有这些例子,那么这对减少幻觉有很大帮助。大致来说,这就是为什么 ChatGPT 也能做到这样的事情。
因此,这些都是人们已经实施并随着时间的推移改善了事实性问题的缓解措施。
但现在,我们实际上可以做得比这更好。