logo

实操大型语言模型——大型语言模型简介

自2012年起,人工智能系统(使用深度神经网络)的发展加速,到了十年末,首次出现了能够写出与人类撰写的文章难以区分的软件系统。这一系统是一个名为生成预训练变压器2(Generative Pre-trained Transformer 2,简称GPT-2)的人工智能模型。2022年,ChatGPT的发布展示了这一技术将如何深刻改变我们与技术和信息的互动方式。在五天内,它达到了百万活跃用户,两个月内更是达到了亿级活跃用户,这种新型的人工智能模型起初作为类人聊天机器人,但很快演变为我们在翻译、文本生成、摘要等常见任务中的重大转变。它成为程序员、教育工作者和研究人员的宝贵工具。
ChatGPT的成功是前所未有的,极大推动了对其背后技术的研究,特别是大型语言模型(LLMs)。各类专有模型和公开模型以稳定的速度推出,逐渐接近并最终赶上ChatGPT的性能。毫不夸张地说,几乎所有的关注点都集中在LLMs上。
因此,2023年将永远被我们称为极大改变我们领域——语言人工智能(Language AI)的一年,这一领域的特点是开发能够理解和生成自然语言的系统。
然而,LLMs已经存在一段时间了,而小型模型至今仍然具有相关性。LLMs远不止是单一模型,在语言人工智能领域还有许多其他值得探索的技术和模型。
在本书中,我们旨在让读者深入理解LLMs及语言人工智能领域的基本概念。本章将为书中的其他部分提供框架,并介绍我们将在后续章节中使用的概念和术语。
主要是,我们希望在本章中回答以下问题:
  • 什么是语言人工智能?
  • 什么是大型语言模型?
  • 大型语言模型的常见用例和应用是什么?
  • 我们如何能够使用大型语言模型?

什么是语言人工智能?

人工智能(AI)这个术语通常用来描述专注于执行接近人类智能的任务的计算机系统,例如语音识别、语言翻译和视觉感知。它是软件的智能,与人类的智能相对。
以下是人工智能学科创始人之一的更正式的定义:
“[人工智能是] 制造智能机器的科学与工程,特别是智能计算机程序。它与使用计算机理解人类智能的类似任务有关,但人工智能不必局限于生物上可观察的方法。”
— 约翰·麦卡锡,2007年
由于人工智能不断发展的特性,这个术语被用来描述各种各样的系统,其中一些系统可能并不真正体现智能行为。例如,计算机游戏中的角色(非可玩角色,NPC)常常被称为人工智能,尽管许多角色不过是一些简单的 if-else 语句。
语言人工智能指的是人工智能的一个子领域,专注于开发能够理解、处理和生成自然语言的技术。随着机器学习方法在解决语言处理问题上的持续成功,语言人工智能这个术语常常与自然语言处理(NLP)互换使用。
我们使用“语言人工智能”这个术语来涵盖那些在技术上可能不属于大型语言模型(LLM)但仍对该领域产生重大影响的技术,例如检索系统如何赋予 LLM 超能力(见第8章)。
在本书中,我们希望聚焦于在塑造语言人工智能领域中发挥重要作用的模型。这意味着我们要探索的不仅仅是孤立的 LLM。然而,这引出了一个问题:什么是大型语言模型?在本章中开始回答这个问题之前,让我们首先回顾一下语言人工智能的历史。

语言人工智能的近期历史

语言人工智能的历史涵盖了许多旨在表示和生成语言的发展和模型,如图1-1所示。
然而,语言对计算机来说是一个棘手的概念。文本本质上是非结构化的,用零和一(单个字符)表示时失去了其含义。因此,在语言人工智能的历史上,人们大力关注以结构化的方式表示语言,以便计算机能够更容易地使用。图1-2提供了这些语言人工智能任务的示例。

将语言表示为词袋模型

我们的语言人工智能历史始于一种被称为词袋模型的技术,这是一种表示非结构化文本的方法。该技术最早在20世纪50年代被提及,但在2000年左右变得流行起来。
词袋模型的工作原理如下:假设我们有两个句子,希望为其创建数值表示。词袋模型的第一步是分词(tokenization),即将句子拆分成单个词或子词(tokens),如图1-3所示。
最常见的分词方法是通过空格拆分来创建单个词。然而,这种方法有其缺点,因为一些语言,如中文,并没有单词之间的空格。在下一章中,我们将深入探讨分词及其如何影响语言模型的技术。如图1-4所示,在分词之后,我们将每个句子中的所有唯一单词结合起来,创建一个词汇表,用于表示这些句子。

使用我们的词汇表,我们简单地计算每个句子中每个单词出现的频率,从而字面上创建一个“词袋”。因此,词袋模型的目的是以数字的形式创建文本的表示,这些数字也称为向量或向量表示,如图1-5所示。在整本书中,我们将这些类型的模型称为表示模型。
尽管词袋模型是一种经典的方法,但并不意味着它完全过时。在第5章中,我们将探讨它如何仍然可以用来补充更现代的语言模型。

更好的表示:稠密向量嵌入

词袋模型虽然优雅,但存在一个缺陷。它将语言视为一个几乎字面意义上的“词袋”,忽视了文本的语义特征或意义。
2013年发布的word2vec是捕捉文本意义的首次成功尝试之一。嵌入是数据的向量表示,试图捕捉其含义。为此,word2vec通过在大量文本数据(如整个维基百科)上进行训练,学习单词的语义表示。
为了生成这些语义表示,word2vec利用了神经网络。这些网络由互连的节点层组成,用于处理信息。如图1-6所示,神经网络可以具有多个层,其中每个连接根据输入具有一定的权重。这些权重通常被称为模型的参数。
通过这些神经网络,word2vec生成词嵌入的方法是观察在给定句子中其他单词与目标单词的相邻关系。我们首先为词汇表中的每个单词分配一个向量嵌入,例如每个单词有50个初始化为随机值的值。然后,在每个训练步骤中,如图1-7所示,我们从训练数据中提取词对,模型尝试预测这两个单词在句子中是否可能是邻居。
在这个训练过程中,word2vec学习单词之间的关系,并将该信息提炼到嵌入中。如果两个单词倾向于拥有相同的邻居,它们的嵌入将更接近;反之亦然。在第2章中,我们将更详细地研究word2vec的训练过程。
生成的嵌入捕捉了单词的意义,但这究竟意味着什么呢?为了说明这一现象,让我们稍微简化一下,假设我们有几个单词的嵌入,即“apple”(苹果)和“baby”(婴儿)。嵌入通过表示单词的属性来试图捕捉意义。例如,单词“baby”在“新生儿”和“人类”这两个属性上的得分可能较高,而“apple”在这些属性上的得分则较低。
如图1-8所示,嵌入可以具有许多属性来表示单词的意义。由于嵌入的大小是固定的,因此选择这些属性以创建单词的心理表征。
在实践中,这些属性往往相当模糊,且很少与单一实体或人类可识别的概念相关。然而,所有这些属性结合在一起,对计算机来说是有意义的,并且为将人类语言翻译成计算机语言提供了一种良好的方式。
嵌入非常有用,因为它们使我们能够测量两个单词之间的语义相似度。通过使用各种距离度量,我们可以判断一个单词与另一个单词的接近程度。如图1-9所示,如果我们将这些嵌入压缩成二维表示,你会注意到,具有相似含义的单词往往会更靠近。在第五章中,我们将探讨如何将这些嵌入压缩到n维空间中。

嵌入的类型

嵌入有许多类型,例如词嵌入和句子嵌入,用于表示不同层次的抽象(词与句子),如图1-10所示。
例如,袋子模型(bag-of-words)在文档级别创建嵌入,因为它表示整个文档。相反,word2vec仅为单词生成嵌入。
在本书中,嵌入将发挥核心作用,因为它们在许多用例中得到应用,例如分类(见第四章)、聚类(见第五章)以及语义搜索和检索增强生成(见第八章)。在第二章中,我们将首次深入探讨令牌嵌入(token embeddings)。

通过注意力机制对上下文进行编码和解码

word2vec的训练过程创建了静态的、可下载的单词表示。例如,单词“bank”在任何使用场景下都会有相同的嵌入。然而,“bank”既可以指金融银行,也可以指河岸。它的意义,因此它的嵌入,应该根据上下文而变化。
编码文本的一个步骤是通过递归神经网络(RNNs)实现的。这些是可以将序列建模为附加输入的神经网络变体。
为此,这些RNN被用于两个任务:编码或表示输入句子,以及解码或生成输出句子。图1-11通过展示像“I love llamas”这样的句子如何翻译成荷兰语的“Ik hou van lama’s”来说明这一概念。
每个步骤在该架构中都是自回归的。在生成下一个单词时,该架构需要使用所有先前生成的单词,如图1-12所示。
编码步骤旨在尽可能准确地表示输入,生成嵌入形式的上下文,作为解码器的输入。为了生成这一表示,它将单词的嵌入作为输入,这意味着我们可以使用word2vec来进行初始表示。在图1-13中,我们可以看到这个过程。请注意,输入和输出都是按顺序逐个处理的。
然而,这种上下文嵌入在处理较长句子时会变得困难,因为它仅仅是一个表示整个输入的单一嵌入。2014年,引入了一种名为“注意力机制”的解决方案,极大地改进了原始架构。注意力机制允许模型专注于输入序列中彼此相关的部分(“互相关注”),并放大它们的信号,如图1-14所示。注意力机制能够选择性地确定句子中哪些单词最为重要。
例如,输出单词“lama’s”是荷兰语中“llamas”的意思,因此两者之间的注意力很高。同样,单词“lama’s”和“I”的注意力较低,因为它们之间的关联性不大。在第3章中,我们将更深入地探讨注意力机制。
通过在解码步骤中加入这些注意力机制,RNN能够为序列中的每个输入单词生成与潜在输出相关的信号。不再仅仅将上下文嵌入传递给解码器,而是将所有输入单词的隐藏状态一起传递。该过程在图1-15中进行了演示。
因此,在生成“Ik hou van lama’s”时,RNN会跟踪它主要关注的单词,以完成翻译。与word2vec相比,这种架构通过“关注”整句文本,可以表示文本的顺序特性及其出现的上下文。然而,这种顺序特性在模型训练时阻碍了并行化处理。

注意力即是全部

注意力机制的真正力量,以及驱动大型语言模型惊人能力的因素,首次在2017年发布的著名论文《Attention is all you need》中得到了深入探讨。论文的作者提出了一种称为Transformer的网络架构,它完全基于注意力机制,移除了我们之前看到的循环网络。与循环网络相比,Transformer可以并行训练,从而大大加快了训练速度。
在Transformer中,编码器和解码器组件被层叠在一起,如图1-16所示。该架构依然是自回归的,需要在生成新单词之前消耗每个已生成的单词。
现在,编码器和解码器模块都围绕注意力机制展开,而不是依赖带有注意力特性的RNN。Transformer中的编码器模块由两部分组成,自注意力机制和前馈神经网络,如图1-17所示。
与之前的注意力方法相比,自注意力机制能够关注同一序列中的不同位置,从而更轻松且准确地表示输入序列,如图1-18所示。它不再是一次处理一个标记,而是可以一次性查看整个序列。
与编码器相比,解码器多了一层,用于关注编码器的输出(以找到输入中相关的部分)。如图1-19所示,这个过程与我们之前讨论的RNN注意力解码器类似。
如图1-20所示,解码器中的自注意力层会对未来的位置进行掩码处理,以便它只关注之前的位置,从而在生成输出时防止信息泄露。
这些构建模块共同构成了Transformer架构,并且是许多具有影响力的语言AI模型的基础,如BERT和GPT-1,它们将在本章后面介绍。在本书中,我们将使用的大多数模型都是基于Transformer的模型。
Transformer架构比我们目前讨论的内容要复杂得多。在第2章和第3章中,我们将探讨Transformer模型表现如此出色的许多原因,包括多头注意力机制、位置嵌入和层归一化。

表示模型:仅使用编码器的模型

最初的Transformer模型是编码器-解码器架构,非常适合翻译任务,但不能轻易用于其他任务,比如文本分类。2018年,引入了一种名为双向编码器表示(BERT)的新架构,它可以应用于多种任务,并成为未来多年语言AI的基础。BERT是一个仅使用编码器的架构,专注于语言的表示,如图1-21所示。这意味着它只使用编码器,完全移除了解码器。

这些编码器模块与之前看到的相同:自注意力机制之后是前馈神经网络。输入中包含一个额外的标记,即[CLS]或分类标记,用作整个输入的表示。通常,我们将这个[CLS]标记用作输入嵌入,用于微调模型以执行特定任务,比如分类。
训练这些编码器堆栈是一项具有挑战性的任务,BERT通过采用一种称为掩码语言建模(详见第2章和第11章)的方法来应对这一问题。如图1-22所示,这种方法会对输入的一部分进行掩码处理,要求模型进行预测。虽然这一预测任务很困难,但它使BERT能够生成更准确的(中间)输入表示。
这种架构和训练过程使BERT及相关架构在表示上下文语言方面表现出色。BERT类模型通常用于迁移学习,即首先进行语言建模的预训练,然后微调用于特定任务。例如,通过在整个维基百科上训练BERT,它能够学习理解文本的语义和上下文特性。然后,如图1-23所示,我们可以使用该预训练模型来微调以执行特定任务,比如文本分类。
预训练模型的一个巨大优势在于,大部分训练工作已经完成。对特定任务的微调通常计算资源需求较少,且需要的数据量较小。此外,BERT类模型在其架构的几乎每一步都会生成嵌入。这也使得BERT模型成为特征提取机器,即使不微调它们用于特定任务。
仅使用编码器的模型,如BERT,将在本书的许多部分中使用。多年来,它们一直被用于常见任务,包括分类任务(详见第4章)、聚类任务(详见第5章)和语义搜索(详见第8章)。
在本书中,我们将仅使用编码器的模型称为表示模型,以将它们与仅使用解码器的生成模型区分开来。请注意,这两类模型的主要区别不在于其底层架构和工作方式。表示模型主要关注语言的表示,例如通过生成嵌入来表示文本,通常不生成文本。相反,生成模型主要用于生成文本,通常不用于生成嵌入。
在大多数图示中,这种表示模型和生成模型及其组件之间的区别也会被标出。表示模型会以青绿色表示,并带有一个小的向量图标(以指示其关注向量和嵌入),而生成模型则以粉红色表示,并带有一个小的聊天图标(以指示其生成能力)。

生成模型:仅使用解码器的模型

与BERT的仅使用编码器的架构类似,2018年提出了一种仅使用解码器的架构,专门用于生成任务。该架构被称为生成式预训练Transformer(GPT),以其生成能力命名(现称为GPT-1,以区分后续版本)。如图1-24所示,它堆叠了解码器模块,类似于BERT的编码器堆叠架构。
GPT-1是在包含7,000本书籍和Common Crawl(一个包含网页的大型数据集)的语料库上进行训练的,最终模型包含了1.17亿个参数。每个参数都是一个数值,表示模型对语言的理解。
在保持其他条件不变的情况下,我们预期更多的参数将极大地影响语言模型的能力和表现。基于这一认识,越来越大的模型以稳定的速度被发布。如图1-25所示,GPT-2拥有15亿个参数,8而GPT-3紧随其后,使用了1750亿个参数。
这些仅使用解码器的生成模型,尤其是“更大”的模型,通常被称为大型语言模型(LLMs)。正如我们将在本章稍后讨论的,LLM这一术语不仅限于生成模型(仅使用解码器),还包括表示模型(仅使用编码器)。
生成型LLM作为序列到序列的机器,会接收一些文本并尝试进行自动补全。虽然这是一个很实用的功能,但它们的真正力量在于被训练成对话机器人。不仅仅是补全文本,它们还能通过训练回答问题吗?通过对这些模型的微调,我们可以创建能够遵循指令的指令模型或聊天模型。
如图1-26所示,最终模型可以接受用户的查询(提示)并输出一个可能跟随该提示的响应。因此,生成模型常被称为补全模型。
这些补全模型的一个关键部分是所谓的上下文长度或上下文窗口。上下文长度表示模型可以处理的最大标记数量,如图1-27所示。较大的上下文窗口允许将整篇文档传递给LLM。需要注意的是,由于这些模型的自回归特性,随着新标记的生成,当前的上下文长度将会增加。

生成式AI之年

LLMs对该领域产生了巨大影响,促使一些人将2023年称为“生成式AI之年”,这与ChatGPT(GPT-3.5)的发布、广泛采用和媒体报道息息相关。当我们提到ChatGPT时,实际上指的是这个产品,而不是其底层模型。ChatGPT首次发布时是由GPT-3.5 LLM提供支持,随后增加了几种性能更优的变体,如GPT-4.10。
GPT-3.5并不是在生成式AI之年中唯一产生影响的模型。如图1-28所示,开源和专有的LLM都以惊人的速度进入公众视野。这些开源基础模型通常被称为基础模型(foundation models),并且可以通过微调用于特定任务,比如执行指令。
除了广受欢迎的Transformer架构外,还涌现出一些有前景的新架构,如Mamba11、12和RWKV13。这些新架构试图在提供Transformer级别性能的同时,带来更多优势,比如更大的上下文窗口或更快的推理速度。
这些发展展示了该领域的进化,突显了2023年对AI而言是一个真正动荡的年份。我们竭尽所能去跟上语言AI领域内外的众多新进展。
因此,本书不仅探讨最新的大型语言模型(LLMs),还将探讨如何利用其他模型,如嵌入模型、仅使用编码器的模型,甚至词袋模型,来增强LLMs的能力。

大型语言模型的“动态定义”

在我们回顾语言AI的最近历史时,我们观察到主要的生成型仅使用解码器(Transformer)模型通常被称为大型语言模型,特别是当它们被认为是“大型”时。然而,实际上这似乎是一个相对狭隘的描述!
如果我们创建了一个与GPT-3功能相同但规模缩小10倍的模型?这样的模型会不再被归类为“大型”语言模型吗?
同样的,如果我们发布了一个和GPT-4一样大的模型,但它能够进行准确的文本分类,却没有生成能力?即使它仍然代表文本,但其主要功能不是语言生成,它还能被称为“大型”语言模型吗?
这些定义的问题在于,它们排除了某些有能力的模型。给模型命名并不能改变它的行为。
由于“大型语言模型”这一术语的定义随着新模型的发布而不断演变,我们希望明确其在本书中的含义。“大型”是一个主观的概念,今天被认为是大型的模型,明天可能会被视为小型。目前对于同一事物有许多不同的称呼,对我们来说,“大型语言模型”也包括那些不生成文本并且可以在消费级硬件上运行的模型。
因此,除了涵盖生成模型之外,本书还将涵盖少于10亿参数且不生成文本的模型。我们将探讨如何利用其他模型,如嵌入模型、表示模型,甚至词袋模型,来增强LLMs的能力。

大型语言模型的训练范式

传统的机器学习通常涉及为特定任务(如分类)训练一个模型。如图1-29所示,我们将这种方式视为一个单步过程。
创建大型语言模型(LLM)通常包括至少两个步骤:

语言建模

第一步,称为预训练,占据了大部分的计算和训练时间。LLM在庞大的互联网文本语料库上进行训练,使模型学习语法、上下文和语言模式。这个广泛的训练阶段并未针对特定任务或应用,而只是用于预测下一个词。由此得到的模型通常被称为基础模型或基模型。这些模型通常不具备执行指令的能力。

微调

第二步,称为微调或后训练,涉及使用之前训练的模型并进一步在更窄的任务上进行训练。这使得LLM能够适应特定任务或表现出期望的行为。例如,我们可以微调基模型,使其在分类任务上表现良好或能够遵循指令。微调步骤节省了大量资源,因为预训练阶段的成本非常高,通常需要大多数人和组织无法负担的数据和计算资源。例如,Llama 2是基于包含2万亿个标记的数据集进行训练的。14 想象一下创建该模型所需的计算量!在第12章中,我们将介绍几种方法,用于在你的数据集上微调基础模型。
任何经过第一步预训练的模型,我们都认为是预训练模型,这也包括微调后的模型。这种两步训练方法在图1-30中进行了可视化展示。
可以通过增加额外的微调步骤,进一步使模型与用户的偏好保持一致,我们将在第12章中对此进行探讨。

大型语言模型的应用:它们为何如此有用?

LLM的特性使其适合广泛的任务。借助文本生成和提示,似乎几乎只受限于你的想象力。为说明这一点,我们来探讨一些常见的任务和技术:
  • 检测客户留下的评论是正面还是负面这是一个(监督)分类任务,可以通过预训练模型(详见第4章)或微调模型(详见第11章)使用编码器或解码器模型处理。
  • 开发系统以查找工单问题中的常见主题这是一个(无监督)分类任务,没有预定义的标签。我们可以利用编码器模型进行分类,利用解码器模型为这些主题打标签(详见第5章)。
  • 构建用于检索和检查相关文档的系统语言模型系统的一个重要组成部分是能够添加外部信息资源。通过语义搜索,我们可以构建系统,方便地访问和查找供LLM使用的信息(详见第8章)。你还可以通过创建或微调自定义嵌入模型来改进系统(详见第12章)。
  • 构建能够利用外部资源(如工具和文档)的LLM聊天机器人这是一种展示LLM强大功能的综合技术。提示工程(详见第6章)、检索增强生成(详见第8章)和微调LLM(详见第12章)都是实现这一技术的拼图。
  • 构建能够根据冰箱内产品的图片编写食谱的LLM这是一个多模态任务,LLM处理图像并对所见内容进行推理(详见第9章)。LLMs正在适应其他模态,如视觉,这为许多有趣的应用场景打开了大门。
LLM应用非常有趣,因为它们部分取决于你能想象的应用场景。随着这些模型变得更加准确,实际使用它们进行创意任务,如角色扮演和编写儿童书籍,将变得越来越有趣。

负责任的LLM开发与使用

LLMs的广泛采用对社会产生了重大影响,并可能继续产生深远影响。在我们探索LLM的强大功能时,必须牢记其社会和伦理影响。以下是几个关键点:
  • 偏见与公平性LLMs在大量数据上训练,这些数据可能包含偏见。LLMs可能会从中学习并重现甚至放大这些偏见。由于LLMs训练的数据通常不公开,除非尝试,否则难以确定其是否包含潜在的偏见。
  • 透明性与责任性由于LLM的强大能力,有时很难分辨你是在与人类对话还是与LLM对话。因此,在与人类互动时使用LLM可能会带来意想不到的后果,尤其是在没有人工参与的情况下。例如,基于LLM的应用在医疗领域可能会被视为医疗设备,因为它们可能影响患者的健康。
  • 生成有害内容LLM不一定生成真实内容,可能会自信地输出错误信息。此外,它们可以用于生成假新闻、文章和其他误导性信息来源。
  • 知识产权LLM的输出是你的知识产权,还是LLM开发者的?当输出与训练数据中的短语相似时,该知识产权属于短语的作者吗?在无法访问训练数据的情况下,很难确定LLM是否使用了受版权保护的材料。
  • 监管由于LLM的巨大影响,政府已开始对商业应用进行监管。例如,欧洲的《AI法案》对基础模型(包括LLMs)的开发和部署进行了监管。
在开发和使用LLMs时,我们强调伦理考量的重要性,并敦促你了解更多关于LLM和AI系统安全、负责任的使用信息。

有限的资源,你也能成功

我们多次提到的计算资源,通常是指系统上可用的GPU(图形处理单元)。强大的GPU(显卡)将大大提高训练和使用LLM的效率和速度。
在选择GPU时,一个重要的考虑因素是可用的显存(视频随机存取内存,VRAM)容量。这指的是GPU上可用的内存量。实际操作中,显存越多越好。原因在于,如果没有足够的显存,某些模型可能根本无法使用。
由于训练和微调LLMs通常是一个昂贵的过程,GPU资源不足的人被称为“GPU贫困者”。这说明了为了训练这些庞大模型而争夺计算资源的局面。例如,Meta在训练Llama 2系列模型时使用了A100-80 GB的GPU。假设租用这样的GPU每小时费用为1.50美元,创建这些模型的总成本将超过500万美元!15
遗憾的是,没有一个简单的规则可以精确确定特定模型所需的显存量。这取决于模型的架构和规模、压缩技术、上下文大小、运行模型的后端等。
本书是为“GPU贫困者”而写的!我们将使用用户无需最昂贵的GPU或大预算也能运行的模型。为此,我们将在Google Colab实例中提供所有代码。截至撰写本文时,Google Colab的免费实例提供了T4 GPU,具有16 GB的显存,这是我们建议的最低显存量。

与大型语言模型的交互

与LLM的交互不仅是使用它们的重要组成部分,也是理解其内部工作原理的关键。由于该领域的快速发展,已经涌现出大量用于与LLM交流的技术、方法和工具包。在本书中,我们将探索最常用的技术,包括使用专有(闭源)和公开可用的开源模型。

专有、私有模型

闭源LLM是那些没有向公众共享其权重和架构的模型。这些模型由特定组织开发,其底层代码保持保密。例如,OpenAI的GPT-4和Anthropic的Claude就是此类模型的典型案例。这些专有模型通常有强大的商业支持,并已被开发和集成到其服务中。
你可以通过一个与LLM通信的接口(称为API,应用程序编程接口)来访问这些模型,如图1-31所示。例如,使用Python访问ChatGPT时,可以使用OpenAI的包来与该服务交互,而无需直接访问其底层代码。
专有模型的一个巨大优势在于,用户无需拥有强大的GPU即可使用LLM。提供方负责托管和运行模型,通常拥有更多的计算资源。用户不需要具备托管和使用模型的专业知识,大大降低了使用门槛。此外,由于这些组织的大量投资,专有模型的性能通常优于开源模型。
这种方式的一个缺点是服务成本可能较高。提供方承担托管LLM的风险和费用,通常意味着这是一项付费服务。此外,由于无法直接访问模型,用户无法自行微调模型。最后,您的数据会与提供方共享,这在许多常见的用例中并不理想,例如分享患者数据的情况。

开源模型

开源LLM是那些向公众共享其权重和架构的模型。它们依然由特定组织开发,但通常会分享创建或本地运行模型的代码——使用不同的许可协议,这些协议可能允许或禁止模型的商业用途。例如,Cohere的Command R、Mistral模型、微软的Phi和Meta的Llama模型都是开源模型的例子。
注意
关于什么才真正代表开源模型,仍有持续的讨论。例如,一些公开共享的模型具有限制性商业许可,这意味着模型不能用于商业目的。对于许多人来说,这不是真正的开源定义,认为使用这些模型不应有任何限制。同样,模型的训练数据以及其源代码也很少公开共享。
只要拥有足够强大的GPU,您就可以下载并在设备上运行这些模型,如图1-32所示。
这些本地模型的一个主要优势在于,用户拥有对模型的完全控制。你可以在不依赖API连接的情况下使用模型,进行微调,并处理敏感数据。你不再依赖任何服务,能够完全透明地了解导致模型输出的所有过程。这一优势因像Hugging Face这样的社区的支持而得到增强,展示了协作努力带来的可能性。
但缺点在于,你需要强大的硬件来运行这些模型,特别是在训练或微调时。此外,设置和使用这些模型还需要特定的知识(我们将在本书中详细介绍)。
我们通常更倾向于在可能的情况下使用开源模型。这种自由使你能够随意探索选项、了解其内部工作,并在本地使用模型,这相较于使用专有LLM可能提供了更多的优势。

开源框架

与闭源LLM相比,开源LLM需要你使用特定的工具包来运行它们。2023年发布了许多不同的工具包和框架,它们各自以不同的方式与LLM交互并加以利用。面对数百个可能有用的框架进行筛选并不是最愉快的体验。
因此,你甚至可能在本书中错过你喜欢的框架!
我们并不打算覆盖所有现存的LLM框架(数量太多,而且还在不断增长),而是希望为你提供一个扎实的基础,帮助你更好地利用LLM。我们的想法是,在读完本书后,你可以轻松掌握大多数其他框架,因为它们的工作方式非常相似。
我们试图实现的直觉是这个过程中的重要组成部分。如果你不仅对LLM有直观的理解,还能熟练地在常见框架中使用它们,那么拓展到其他框架应该是一个简单的任务。
更具体地说,我们重点关注的是后端工具包。这些工具包没有图形用户界面(GUI),专为高效加载和运行设备上的LLM而设计,如llama.cpp、LangChain,以及许多框架的核心Hugging Face Transformers。
提示
我们主要涵盖通过代码与大型语言模型交互的框架。虽然这有助于你学习这些框架的基础知识,但有时你只想要一个像ChatGPT一样的界面来与本地LLM交互。幸运的是,有许多出色的框架可以实现这一点。例如,text-generation-webui、KoboldCpp和LM Studio。

生成你的第一段文本

使用语言模型的一个重要组成部分是选择它们。查找和下载LLM的主要来源是Hugging Face Hub。Hugging Face 是开发著名的Transformers工具包的组织,多年来推动了语言模型的整体发展。正如名称所暗示的,该工具包是基于我们在“语言AI的近期历史”中讨论的Transformers框架构建的。
在撰写本文时,你会在Hugging Face的平台上找到超过80万个用于各种目的的模型,从LLM和计算机视觉模型到处理音频和表格数据的模型。在这里,你几乎可以找到任何开源的LLM。
虽然我们将在本书中探索各种模型,但让我们从生成模型的第一行代码开始。我们在整本书中使用的主要生成模型是Phi-3-mini,这是一个相对较小(38亿参数)但性能相当出色的模型。16 由于其规模较小,该模型可以在显存少于8 GB的设备上运行。如果你进行量化(我们将在第7章和第12章中进一步讨论的一种压缩技术),你甚至可以在显存少于6 GB的设备上使用该模型。此外,该模型是根据MIT许可发布的,这意味着它可以在没有限制的情况下用于商业用途!
请记住,新且改进的LLM会频繁发布。为了确保本书的内容保持更新,大多数示例设计为可与任何LLM兼容。我们还会在与本书关联的资源库中推荐不同的模型供你尝试。
让我们开始吧!使用LLM时,会加载两个模型:
  1. 生成模型本身
  2. 其底层的分词器(tokenizer)
分词器负责在将输入文本传递给生成模型之前将其拆分为标记。你可以在Hugging Face网站上找到分词器和模型,只需要传递对应的ID。在这个例子中,我们使用“microsoft/Phi-3-mini-4k-instruct”作为模型的路径。
我们可以使用Transformers工具包加载分词器和模型。注意,这里假设你有一个NVIDIA GPU(device_map="cuda"),但你可以选择不同的设备。如果你没有GPU,可以使用我们在本书资源库中提供的Google Colab免费笔记本:
  
  
  
  
  
  
from transformers import AutoModelForCausalLM, AutoTokenizer
# 加载模型和分词器
model = AutoModelForCausalLM.from_pretrained(
"microsoft/Phi-3-mini-4k-instruct",
device_map="cuda",
torch_dtype="auto",
trust_remote_code=True,
)
tokenizer = AutoTokenizer.from_pretrained("microsoft/Phi-3-mini-4k-instruct")
运行代码将开始下载模型,具体时间取决于你的网络连接。
虽然我们现在已经可以生成文本了,但Transformers工具包中有一个简化流程的技巧,那就是transformers.pipeline,它将模型、分词器和文本生成过程封装在一个函数中:
  
  
  
  
  
  
from transformers import pipeline
# 创建一个pipeline
generator = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
return_full_text=False,
max_new_tokens=500,
do_sample=False
)
以下参数值得注意:
  • return_full_text将其设置为False时,只会返回模型的输出,而不会返回提示。
  • max_new_tokens模型将生成的最大标记数。设置一个限制可以防止输出过长且难以处理,因为某些模型可能会持续生成输出,直到达到其上下文窗口的限制。
  • do_sample指定模型是否使用采样策略来选择下一个标记。将其设置为False时,模型将始终选择最可能的下一个标记。在第6章中,我们将探讨一些可以激发模型输出创造力的采样参数。
现在让我们生成我们的第一段文本,指示模型讲一个关于鸡的笑话。我们将提示格式化为字典列表,每个字典与对话中的一个实体相关。我们的角色是“用户”,使用"content"键来定义提示:
  
  
  
  
  
  
# 提示(用户输入 / 查询)
messages = [
{"role": "user", "content": "Create a funny joke about chickens."}
]
# 生成输出
output = generator(messages)
print(output[0]["generated_text"])
输出结果是:“为什么鸡不喜欢去健身房?因为它们无法破解‘存在的谜团’!”
就是这样!本书生成的第一段文本是一个关于鸡的不错的笑话。

总结

在本书的第一章中,我们深入探讨了大型语言模型(LLMs)对语言AI领域产生的革命性影响。它显著改变了我们处理翻译、分类、摘要等任务的方式。通过回顾语言AI的近期历史,我们探讨了几种LLM的基础知识,从简单的词袋表示到使用神经网络进行的更复杂表示。
我们讨论了注意力机制,它是将上下文编码到模型中的一步,也是LLM如此强大的关键组成部分。我们介绍了两类主要使用这一卓越机制的模型:仅使用编码器的表示模型(如BERT)和仅使用解码器的生成模型(如GPT家族)。这两类模型在本书中都被视为大型语言模型。
总体而言,本章概述了语言AI的全貌,包括其应用、社会和伦理影响,以及运行这些模型所需的资源。最后,我们使用Phi-3生成了本书的第一段文本,该模型将在全书中被广泛使用。
在接下来的两章中,你将学习一些底层的处理过程。我们首先将在第2章中探索标记化和嵌入,这两个经常被低估但在语言AI领域至关重要的组成部分。接下来在第3章,我们将深入了解语言模型,揭示生成文本的具体方法。
————————————————
版权声明:本文为稀土掘金博主「数据智能老司机」的原创文章
原文链接:https://juejin.cn/post/7421366797817249811
如有侵权,请联系千帆社区进行删除
评论
用户头像