技术视角:你应该知道的LLM基础知识
技术视角的大模型
从技术角度来看大模型,关键就在于弄明白一件事,那就是大模型究竟做了什么。实际上,大模型的工作原理并不复杂,简单来讲,就是每次添加一个词。那该如何理解这一说法呢?从本质上来说,ChatGPT 所做的工作是针对任意一段文本生成 “合理的延续” 内容。这里所说的 “合理”,指的是 “当人们看过诸如数十亿个网页上呈现的内容后,会觉得别人大概率会这样来写”。接下来,我们借助 Stephen Wolfram 所著的《这就是 ChatGPT》里的一个例子,一起来深入了解一下吧
选择下一个词
假设我们手里的文本是“The best thing about AI is its ability to”(AI 最棒的地方在于它能)。想象一下,我们浏览了人类编写的数十亿页文本(比如在互联网上和电子书中),找到该文本的所有实例,然后,猜测一下接下来要出现的是什么词,以及这些词出现的概率是多少。
实际上,GPT 做的就是类似的事情,只不过它查看的不是字面意义上的文本,而是寻找在某种程度上“意义匹配”的事物。最终的结果是,它会列出随后可能出现的词及其出现的“概率”(按“概率”从高到低排列):
有了这个带有概率的词列表,我们就会从这些词中选择一个词。接下来,我们再把这个词附加到我们的文本上,再次询问大模型下一个词是什么。本质上,我们生成的一段内容就是这样一遍一遍地询问“下一个词是什么”,不断地重复这个过程。
下面就是一个例子,从这个例子中,我们可以清晰地看到文本不断生成的过程。
在此有一个问题需加以澄清。尽管我们之前提及大模型是每次添加一个词,但准确而言,每次添加的实则是一个 Token。Token 便是我们理解大模型编程的首要关键概念。此 Token 有可能是我们传统认知里完整的一个单词,亦可能是一组单词的组合,甚至可能只是单词的某一部分(这便是大模型能够 “创造新词” 的根源所在)。
在大模型编程里,Token 的概念极为重要。当下各大厂商相互竞争,其中一项极为关键的指标便是上下文窗口(Context Window)的规模大小。这里所说的上下文窗口,指的就是大模型能够处理的 Token 数量。上下文窗口越大,能够处理的 Token 就越多。能处理的 Token 越多,大模型对于信息的理解就越透彻,所生成的内容便越契合我们的需求。故而,当前各个大模型相互比拼的内容之一便是上下文窗口的大小。
下面是 gpt-4o-mini 的上下文窗口处理的 Token 情况(摘自 Open AI 官网)。
除此之外,Token 还有一个非常现实的作用,就是计费,现在的大模型编程都是根据 Token 进行收费,Token 越多收费越高。下面是 gpt-4o-mini 的的计费情况(摘自 Open AI 官网),可以看出它就是根据 Token 计算的。
引入随机性
好,让我们重新聚焦到内容生成的流程上来。
如前文所述,我们会从一个附带概率的词列表里挑选。接下来的关键在于确定究竟选择哪个词添加至我们的内容之中。
部分人觉得理应选择 “概率最高” 的词。然而,倘若我们始终选取排名最靠前的词,往往会生成一篇极为 “乏味” 的文章,丝毫彰显不出任何 “创新性”。这就如同你向某人提问,而他每次都给出相同的答复,你必然会觉得此人甚是无趣。
所以,在挑选时,我们可适当引入一些随机性,选择排名较为靠后的词,如此一来,便能收获一篇 “更具趣味” 的了。有了这种随机性,也就意味着针对相同的提示词,我们每次所获取的内容或许会有所差异。
为了达成这样的效果,我们引入了一个用于表征随机性强弱的概念:温度(Temperature)。这是大模型编程里又一个重要的概念。
显而易见,温度这一概念是借鉴于物理学,不过,它与物理学之间实际上并无实质性关联。从理解该概念的层面出发,你可以将其视作表示大模型活跃程度的一个参数,借助调节这一参数,大模型能够变得更为活跃,或者更为刻板。
在大模型编程中,温度是极为关键的一个概念,温度的设定情形在很大程度上决定了大模型将会呈现出怎样的表现。在 OpenAI 的 API 中,此参数越小,表明确定性越强;越大,则意味着随机性越强,简单来讲,温度越高,大模型就越活跃。
下面就是有了“温度”之后,对于同样的提示词,就产生了不同的结果。
到这里,你已经对大模型生成文本的过程有了一个最基本的了解。不过,这里还有一个细节需要解释一下,这里面会牵扯到一个在大模型编程中的另一个重要概念:Embedding。
从字符串到向量
尽管我们给予大模型的是一个有待补齐的字符串,然而实际上,在大模型内部所处理的并非字符串,而是向量。
之所以要把字符串转换为向量,简要而言,是因为当下大多数的 AI 算法仅仅支持向量。你或许会感到疑惑,为何不支持字符串呢?原因在于字符串仅仅是这些 AI 算法的一种输入形式,我们还能够输入图片、视频,乃至形形色色的各类信息,只要把这些输入都转化为向量,AI 算法便能自如地应对处理。由此可见,交付给 AI 算法处理的先决条件便是把各种信息都转换成向量。
领会了向量的意义之后,接下来的问题便是,字符串是怎样转变为向量的呢?在大模型的处理流程中,字符串转换为向量会历经两个步骤。第一步被称为 One – Hot 编码,第二步则是对编码的结果予以压缩。One – Hot 编码就是把离散的分类值变换为二进制向量。例如,我们存在一个颜色的分类值,分别是红(red)、绿(green)、蓝(blue),其编码呈现如下:
在这个表格中,我们可以看到红绿蓝在向量里各占一位,有值则为 1,没有值对应 0,所以,红对应的向量是[1, 0, 0]、绿对应的是[0, 1, 0],而蓝对应的是[0, 0, 1]。当我们输入是“红绿红蓝”,就会得到对应的四个向量:[1, 0, 0]、[0, 1, 0]、[1, 0, 0]、[0, 0, 1]。这就是最简单的 One-Hot 编码.
在大模型中,离散的值是什么呢?就是我们前面提到的 Token。我们把字符串转成 Token 列表,每个 Token 都会自己对应的一个唯一标识,而这个标识就是向量中的内容。你或许已经想到了,在一个有规模的语料库中,Token 数量会非常多,下面是一个示例:
从该图能够发现,此为典型的稀疏存储状况,这意味着一个向量中存在大量的 0,真正具备实际含义的数位并不多。在我们的文本里,每个 Token 均会对应一个向量,如此一来,其中 0 的数量便可想而知。所以,我们会进入下一个处理环节,即对该编码结果予以压缩,进而获取我们所需的 Embedding。
获取 Embedding 通常有两种方法,其一是降维,其二是将 Embedding 训练成神经网络。降维技术多种多样,诸如主成分分析(Principal component analysis)。但在大模型里,一般采用把 Embedding 训练成神经网络的方式,也就是把我们前一步骤所得到的向量输入一个神经网络,从而得到最终经过压缩的向量。至于具体如何展开训练则是一个更为繁杂的过程,并非我们在此处关注的核心要点。大家只需知晓,历经这一处理流程后,一个庞大的向量将会被压缩成一个固定尺寸的向量。例如,在 GPT 3 中,每个 Token 皆由 768 个数字构成的向量来表示。
之后,再把压缩后的向量当作输入传送给大模型,用以生成最终的结果,到这时,我们耳熟能详的神经网络、自注意力机制等才会正式亮相。不过,就我们编写大模型应用而言,这些内容已超出了基础范畴,大家对此稍有印象便已足够。