第1章 对大型语言模型的介绍

news2025/4/13 12:06:13

人类正处在一个关键转折点。自2012年起,基于深度神经网络的人工智能系统研发进入快速通道,将这一技术推向了新高度:至2019年底,首个能够撰写与人类文章真假难辨的软件系统问世,这个名为GPT-2(生成型预训练变换模型2)的AI模型开启了新纪元。2022年ChatGPT的发布标志着技术质变,它不仅革新了人机交互方式(推出5天即突破百万用户,2个月后活跃用户过亿),更展现出从文本生成、多语言翻译到知识提炼的通用能力,迅速成为程序开发、教学科研领域的革命性工具。

ChatGPT现象级成功引发了对支撑技术——大型语言模型(LLM)的海量研究投入。在2023年,无论是科技巨头推出的专有模型,还是开源社区发布的公共模型,都在功能表现上快速逼近甚至赶超ChatGPT。这场技术竞赛使得语言人工智能领域(专注于开发理解与生成人类语言的智能系统)在短短一年间发生了根本性变革。

值得注意的是,尽管LLM主导了当前的研究版图,但语言智能的疆域远不止于此:各种轻量化模型依然保持着应用价值,而该领域数十年来积累的语义分析、知识图谱等关键技术仍在持续演进。这种技术多样性昭示着,在突破性创新与既有技术沉淀的相互作用中,语言人工智能正书写着更宏大的篇章。

本书旨在帮助读者建立对大型语言模型(LLMs)以及语言人工智能(Language AI)领域基础知识的扎实理解。本章作为全书的框架,将介绍贯穿后续章节的核心概念与术语

  1. 什么是语言人工智能(Language AI)?
  2. 大型语言模型(LLMs)是什么?
  3. 大型语言模型的常见用例与应用场景有哪些?
  4. 我们如何自主使用大型语言模型?

什么是语言人工智能?

术语“人工智能”(AI)通常用于描述致力于执行接近人类智能的任务的计算机系统,例如语音识别、语言翻译和视觉感知。它是软件的智能,而非人类的智能。

以下是由人工智能学科的创始人之一提出的一个更正式的定义:

[人工智能]是制造智能机器,特别是智能计算机程序的科学和工程学。这与使用计算机来理解人类智能的类似任务有关,但人工智能不必局限于生物学上可观察到的方法。

-约翰 麦卡锡,20071

由于人工智能的不断演变,这个术语被用来描述各种各样的系统,其中一些可能并不真正体现智能行为。例如,电脑游戏中的角色(非玩家角色[NPCs])经常被称为人工智能,尽管许多只是简单的if-else语句。语言人工智能指的是人工智能的一个子领域,专注于开发能够理解、处理和生成人类语言的技术。随着机器学习方法在解决语言处理问题上的持续成功,"语言人工智能"这个术语通常可以与自然语言处理(NLP)互换使用。

1 J. McCarthy (2007). “What is artificial intelligence?” Retrieved from https://oreil.ly/C7sja and https://oreil.ly/ n9X8O.

我们使用“语言AI”这个术语来涵盖那些技术上可能不是大型语言模型(LLM),但仍然对该领域产生重大影响的技术,例如检索系统如何赋予LLM超能力(见第8章)。

在整本书中,我们希望关注在塑造语言AI领域中发挥重要作用的模型。这意味着不仅仅是孤立地探讨LLM。然而,这引出了一个问题:什么是大型语言模型?为了在本章开始回答这个问题,让我们首先探讨语言AI的历史。

语言人工智能的近代史

语言人工智能的历史涵盖了诸多旨在表示和生成语言的发展和模型,如图1-1所示。

图1-1窥探语言人工智能的历史

然而,语言对计算机来说是一个棘手的概念。文本本质上是非结构化的,当用零和一(单个字符)表示时,它会失去意义。因此,在语言人工智能的历史上,人们一直在努力以结构化的方式表示语言,以便计算机能够更容易地使用它。这些语言人工智能任务的示例在图1-2中提供。

图1-2语言人工智能能够通过处理文本输入来执行许多任务。

将语言表示为词袋模型

我们的语言人工智能历史始于一种称为词袋的技术,这是一种表示非结构化文本的方法2。它在20世纪50年代左右首次被提及,但在21世纪初变得流行起来。

词袋的工作原理如下:假设我们有两个句子,我们想为它们创建数值表示。词袋模型的第一步是分词,即将句子拆分为单个单词或子词(词元),如图1-3所示。

图1-3每个句子通过空格分割成单词(词元)。

最常见的分词方法是通过空格拆分来创建单个单词。然而,这种方法有其缺点,因为有些语言,如普通话,并不在单个单词周围使用空格。在下一章中,我们将深入探讨分词以及该技术如何影响语言模型。如图1-4所示,在分词之后,我们合并每个句子中的所有独特单词以创建一个词汇表,我们可以使用该词汇表来表示句子。

2 Fabrizio Sebastiani. “Machine learning in automated text categorization.” ACM Computing Surveys (CSUR) 34.1 (2002): 1–47.

图1-4语言人工智能能够通过处理文本输入来执行许多任务。

使用我们的词汇表,我们简单地计算每个句子中的单词出现的频率,字面上就是创建一个词袋。因此,词袋模型的目标是以数字(也称为向量或向量表示)的形式创建文本的表示,如图1-5所示。在整本书中,我们将这类模型称为表示模型。

图1-5通过计算单个单词来创建词袋模型这些值被称为向量表示。

尽管词袋模型是一种经典方法,但它绝非完全过时。在第5章中,我们将探讨如何将其仍然用于补充更近期的语言模型。

更好的密集向量嵌入表示

词袋模型虽然是一种优雅的方法,但它有一个缺陷。它认为语言只不过是一个几乎是字面上的词袋,忽略了文本的语义本质或意义。

2013年发布的word2vec是最早成功捕捉文本嵌入意义的尝试之一3。嵌入是数据的向量表示,试图捕捉其意义。为此,word2vec通过在大量文本数据(如整个维基百科)上进行训练来学习单词的语义表示。

为了生成这些语义表示,word2vec利用神经网络。这些网络由相互连接的节点层组成,处理信息。如图1-6所示,神经网络可以有许多层,每个连接根据输入具有一定的权重。这些权重通常被称为模型的参数。

图1-6 一个神经网络由相互连接的节点层组成,其中每个连接都是一个线性方程

利用这些神经网络,word2vec通过观察哪些其他单词倾向于在给定句子中出现在它们旁边来生成词嵌入。我们首先为词汇表中的每个单词分配一个向量嵌入,比如每个单词初始化为50个随机值的向量。然后,在每一个训练步骤中,如图1-7所示,我们从训练数据中取出单词对,模型尝试预测它们是否可能在句子中成为邻居。

3 Tomas Mikolov et al. “Efficient estimation of word representations in vector space.” arXiv preprint arXiv:1301.3781 (2013).

在这个训练过程中,word2vec 学习单词之间的关系,并将这些信息提炼到嵌入中。如果两个单词倾向于有相同的邻居,它们的嵌入将会彼此更接近,反之亦然。在第 2 章中,我们将更仔细地研究 word2vec 的训练过程。

图1-7.神经网络被训练用于预测两个单词是否为邻居。在此过程中,嵌入(向量)会根据真实情况进行更新。

生成的嵌入捕捉了单词的含义,但这到底意味着什么呢?为了说明这种现象,我们稍微简化一下,假设我们有几个单词的嵌入,即“apple”(苹果)和“baby”(婴儿)。嵌入试图通过表示单词的属性来捕捉含义。例如,“baby”这个词可能在“新生儿”和“人类”这两个属性上得分很高,而“apple”这个词在这两个属性上得分很低。

如图1-8所示,嵌入可以有许多属性来表示一个单词的含义。由于嵌入的大小是固定的,因此选择它们的属性是为了创建单词的心理表征。

图1-8 嵌入的值代表用于表示单词的属性。我们可能会过于简化地想象维度代表概念(实际上它们并不代表),但这有助于表达这个想法。

在实践中,这些属性通常相当晦涩,很少与单个实体或人类可识别的概念相关联。然而,这些属性加在一起,对计算机来说就有意义,并且是将人类语言翻译成计算机语言的好方法。

嵌入非常有用,因为它们让我们能够衡量两个单词之间的语义相似性。使用各种距离度量,我们可以判断一个单词与另一个单词有多接近。如图1-9所示,如果我们将这些嵌入压缩成二维表示,你会注意到具有相似含义的单词往往距离较近。在第5章中,我们将探讨如何将这些嵌入压缩成n维空间。

图1-9 在维度空间中,相似单词的嵌入将会彼此靠近。

嵌入类型

有许多类型的嵌入,如词嵌入和句子嵌入,用于表示不同的抽象层次(词与句子),如图1-10所示。例如,词袋模型在文档级别创建嵌入,因为它表示整个文档。相比之下,word2vec只为单词生成嵌入。

在整本书中,嵌入将扮演一个核心角色,因为它们在许多用例中得到了应用,如分类(见第4章)、聚类(见第5章)以及语义搜索和检索增强生成(见第8章)。在第2章中,我们将首次深入探讨词元嵌入。

图1-10 可以为不同类型的输入创建嵌入

使用注意力机制进行上下文的编码和解码

word2vec的训练过程创建了静态的、可下载的单词表示。例如,无论在什么上下文中使用,“bank”这个词总是有相同的嵌入。然而,“bank”既可以指金融机构,也可以指河岸。其含义,因此其嵌入,应根据上下文而改变。

通过循环神经网络(RNNs)实现了对这段文本编码的一步。这些是神经网络的变体,可以将序列作为额外的输入进行建模。

为此,这些RNNs用于两个任务,编码或表示输入句子和解码或生成输出句子。图1-11通过展示像“I love llamas”这样的句子如何被翻译成荷兰语“Ik hou van lama’s.”来说明这个概念。

图1-11 两个递归神经网络(解码器和编码器)转换一个输入从英语到荷兰语的顺序

这个体系结构中的每一步都是自回归的。在生成下一个单词时,此体系结构需 要消耗所有以前生成的单词,如图1-12所示。

图1-12 前面的每个输出词元都被用作生成下一个词元的输入

编码步骤的目的是尽可能地表示输入,以嵌入的形式生成上下文,嵌入作为解码器的输入。为了生成这种表示,它将嵌入作为单词的输入,这意味着我们可以使用word2vec作为初始表示。在图1-13中,我们可以观察到这个过程。注意输入是如何按顺序处理的,一次一个,以及输出。

图1-13 使用word2vec嵌入,生成一个上下文嵌入,代表整个序列

然而,这种上下文嵌入使得处理较长的句子变得困难,因为它仅仅是一个代表整个输入的单个嵌入。在2014年,一种称为“注意力”的解决方案被引入,它极大地改进了原始架构4。注意力允许模型专注于输入序列中彼此相关的部分(“关注”彼此),并放大它们的信号,如图1-14所示。注意力选择性地确定哪些词在给定句子中最为重要。

例如,输出词“lama's”是荷兰语中的“llamas”,这就是为什么两者之间的注意力很高。同样,“lama's”和“I”之间的注意力较低,因为它们之间的关系不那么紧密。在第3章中,我们将更深入地探讨注意力机制。

4 Dzmitry Bahdanau, Kyunghyun Cho, and Yoshua Bengio. “Neural machine translation by jointly learning to align and translate.” arXiv preprint arXiv:1409.0473 (2014).

图1-14 注意力允许模型“关注”序列中的某些部分,这些部分可能与彼此或多或少有关联

通过在解码器步骤中添加这些注意力机制,RNN可以为序列中的每个输入词生成与潜在输出相关的信号。不是仅仅将上下文嵌入传递给解码器,而是传递所有输入词的隐藏状态。该过程在图1-15中展示。

图1-15 在生成了单词“Ik”、“hou”和“van”之后,解码器的注意力机制使其能够在生成荷兰语翻译(“lama's”)之前专注于单词“llamas”

因此,在生成“Ik hou van lama's”时,RNN会跟踪它主要关注的单词以执行翻译。与word2vec相比,这种架构允许通过“关注”整个句子来表示文本的顺序性和它出现的上下文。然而,这种顺序性排除了在模型训练期间进行并行化的可能性。

注意力是你所需要的

注意力的真正力量,以及驱动大型语言模型的惊人能力,首次在2017年发布的著名论文《注意力就是你所需的一切》中进行了探讨5。作者提出了一种称为Transformer的网络架构,该架构完全基于注意力机制,并移除了我们之前看到的循环网络。与循环网络相比,Transformer可以并行训练,这大大加快了训练速度。在Transformer中,编码器和解码器组件堆叠在一起,如图1-16所示。这种架构仍然是自回归的,需要在创建新词之前消耗每个生成的单词。

图1-16.Transformer 是由堆叠的编码器和解码器模块组成的,输入会流经每个编码器和解码器。

现在,编码器和解码器模块都将围绕注意力机制展开,而不是利用带有注意力特征的RNN。Transformer中的编码器模块由两部分组成,自注意力和前馈神经网络,如图1-17所示。

5 Ashish Vaswani et al. “Attention is all you need.” Advances in Neural Information Processing Systems 30 (2017).

图1-17 一个编码器模块围绕自注意力来生成中间表示。

与之前的注意力方法相比,自注意力可以关注单个序列内的不同位置,从而更容易且更准确地表示输入序列,如图1-18所示。它不是处理一个词元一次,而是可以一次性查看整个序列

图1-18.自注意力机制关注输入序列的所有部分,使其能够在单个序列中“向前看”和“向后看”。

与编码器相比,解码器有一个额外的层,它关注编码器的输出(以找到输入的相关部分)。如图1-19所示,这个过程与我们之前讨论的RNN注意力解码器类似。

图1-19 解码器有一个额外的注意力层,用于关注编码器的输出

如图1-20所示,解码器中的自注意力层屏蔽了未来的位置,因此它只关注较早的位置,以防止在生成输出时泄露信息。

图1-20 只关注前面的词元以防止“预见未来”。

这些构建模块共同构成了Transformer架构,并且是许多在语言AI中产生重大影响的模型的基础,例如本章后面将要介绍的BERT和GPT-1。在整本书中,我们将使用的大多数模型都是基于Transformer的模型。

到目前为止,我们所探索的还只是Transformer架构的冰山一角。在第2章和第3章中,我们将探讨Transformer模型为何如此有效的原因,包括多头注意力、位置嵌入和层归一化。

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

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

图1-21 具有12个编码器的BERT基础模型架构。

这些编码器块与我们之前看到的相同:自注意力之后是前馈神经网络。输入包含一个额外的词元,即[CLS]或分类词元,它被用作整个输入的表示。通常,我们使用这个[CLS]词元作为微调模型在特定任务(如分类)上的输入嵌入。

6 Jacob Devlin et al. “BERT: Pre-training of deep bidirectional transformers for language understanding.” arXiv preprint arXiv:1810.04805 (2018).

训练这些编码器堆栈可能是一项困难的任务,BERT通过采用一种称为掩码语言建模的技术来解决这一问题(见第2章和第11章)。如图1-22所示,这种方法会掩盖输入的一部分以供模型预测。这项预测任务虽然困难,但使得BERT能够创建更准确的(中间)输入表示。

图1-22 使用掩码语言模型训练BERT模型

这种架构和训练程序使得BERT及相关架构在表示上下文语言方面表现非凡。类似BERT的模型通常用于迁移学习,这涉及首先对其进行语言建模预训练,然后针对特定任务进行微调。例如,通过在维基百科的全部内容上训练BERT,它学会了理解文本的语义和上下文特性。然后,如图1-23所示,我们可以使用该预训练模型针对特定任务(如文本分类)进行微调。

图1-23 在BERT上预训练了掩码语言模型之后,我们针对特定任务对其进行微调。

预训练模型的一个巨大优势是大部分训练已经为我们完成了。在特定任务上进行微调通常计算强度较小,且需要更少的数据。此外,类似BERT的模型在其架构的几乎每个步骤都会生成嵌入。这也使得BERT模型成为特征提取机器,无需在特定任务上进行微调。

仅编码器模型(如BERT)将在本书的许多部分中使用。多年来,它们一直被用于并在常见的任务中仍然被使用,包括分类任务(见第4章)、聚类任务(见第5章)和语义搜索(见第8章)。在整本书中,我们将仅编码器模型称为表示模型,以便将它们与仅解码器模型区分开来,我们将仅解码器模型称为生成模型。请注意,主要区别不在于底层架构和这些模型的工作方式。表示模型主要关注表示语言,例如通过创建嵌入,并且通常不生成文本。相比之下,生成模型主要关注生成文本,并且通常不训练生成嵌入。

表示模型和生成模型及其组件之间的区别也将在大多数图像中显示。表示模型以青色呈现,并带有一个小的矢量图标(以表示其对矢量和嵌入的关注),而生成模型以粉红色呈现,并带有一个小的聊天图标(以表示其生成能力)。

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

与BERT的仅编码器架构类似,2018年提出了一种仅解码器架构,用于针对生成任务7。这种架构被称为生成预训练变换器(GPT),因为其具有生成能力(现在称为GPT-1,以便与后续版本区分)。如图1-24所示,它堆叠了解码器块,类似于BERT的编码器堆叠架构。

GPT-1在7,000本书的语料库和Common Crawl(一个大型网页数据集)上进行训练。结果模型包含1.17亿个参数。每个参数是一个数值,代表模型对语言的理解。如果一切保持不变,我们预计更多的参数将极大地影响语言模型的能力和性能。考虑到这一点,我们看到越来越大的模型以稳定的速度发布。如图1-25所示,GPT-2拥有15亿个参数8,紧接着GPT-3使用了1750亿个参数9

7 Alec Radford et al. “Improving language understanding by generative pre-training”, (2018).

 8 Alec Radford et al. “Language models are unsupervised multitask learners.” OpenAI Blog 1.8 (2019): 9.

 9 Tom Brown et al. “Language models are few-shot learners.” Advances in Neural Information Processing Systems 33 (2020): 1877–1901.

图1-24 GPT-1的架构,它使用仅解码器架构,并移除了编码器注意力模块。

图1-25 GPT模型在每次迭代中迅速变大

这些生成式解码器模型,尤其是“较大”的模型,通常被称为大型语言模型(LLMs)。正如我们将在本章后面讨论的那样,LLM这个术语不仅保留给生成式模型(解码器-only),还保留给表示模型(编码器-only)。

生成式LLMs作为序列到序列的机器,接收一些文本并尝试将其补全。尽管这是一个方便的功能,但它们的真正力量来自于作为聊天机器人的训练。如果它们可以被训练来回答问题,而不仅仅是补全文本呢?通过对这些模型进行微调,我们可以创建能够遵循指令的指导或聊天模型。

如图1-26所示,所得模型可以接收用户查询(提示)并输出最有可能跟随该提示的响应。因此,您经常会听到生成式模型被称为补全模型。

图1-26. 生成式大型语言模型(LLMs)接收一些输入并尝试完成它。对于指令模型来说,这不仅仅是自动补全,而是试图回答问题。

这些完成模型中的一个重要部分被称为上下文长度或上下文窗口。上下文长度表示模型可以处理的最大词元数,如图1-27所示。较大的上下文窗口允许将整个文档传递给LLM。请注意,由于这些模型的自回归性质,当前上下文长度会随着新词元的生成而增加。

图1-27 上下文长度是大型语言模型(LLM)可以处理的最大上下文。

生成式人工智能之年

大型语言模型(LLMs)对该领域产生了巨大影响,以至于有人称2023年为生成式人工智能之年,这一称号得益于ChatGPT(GPT-3.5)的发布、采用和媒体报道。当我们提到ChatGPT时,实际上是指产品而非底层模型。它首次发布时由GPT-3.5 LLM驱动,此后已发展到包括多个更高性能的变体,例如GPT-4.10。GPT-3.5并非生成式人工智能之年唯一产生影响的模型。如图1-28所示,开源和专有LLMs都以惊人的速度走进了人们的生活。这些开源基础模型通常被称为基础模型,可以针对特定任务(如遵循指令)进行微调。

10 OpenAI, “Gpt-4 technical report.” arXiv preprint arXiv:2303.08774 (2023). .

图1-28 全面审视生成式人工智能的一年。请注意,这个概述中仍然缺少许多模型!

除了广泛流行的Transformer架构外,还出现了诸如Mamba11,12和RWKV.13等有前景的新架构。这些新颖的架构试图在具有额外优势(如更大的上下文窗口或更快的推理速度)的情况下达到Transformer级别的性能。这些发展示例了该领域的演变,并展示了2023年作为AI真正繁忙的一年。我们竭尽全力才能跟上语言AI内部和外部的许多发展。因此,这本书探讨的不仅仅是最新的LLM。我们将探讨其他模型(如嵌入模型、仅编码器模型,甚至词袋模型)如何用来增强LLM。

11 Albert Gu and Tri Dao. “Mamba: Linear-time sequence modeling with selective state spaces.” arXiv preprint arXiv:2312.00752 (2023).

12 See “A Visual Guide to Mamba and State Space Models” for an illustrated and visual guide to Mamba as an alternative to the Transformer architecture.

13 Bo Peng et al. “RWKV: Reinventing RNNs for the transformer era.” arXiv preprint arXiv:2305.13048 (2023).

大型语言模型的动态定义

在我们对语言人工智能近期历史的探索中,我们观察到,主要是生成式解码器-only(Transformer)模型通常被称为大型语言模型。特别是当它们被认为是“大型”的时候。然而,在实践中,这似乎是一个相当受限的描述!
如果我们创建一个与GPT-3具有相同功能但小10倍的模型会怎样呢?这样的模型会超出“大型”语言模型的分类吗?

同样,如果我们发布了一个和GPT-4一样大,但只能进行准确文本分类而没有生成能力的模型,它还会被认为是一个大型“语言模型”吗?即使它仍然表示文本,但其主要功能不是语言生成。

这类定义的问题在于我们排除了有能力的模型。我们给一个模型或另一个模型起什么名字并不改变它的行为。

由于“大型语言模型”这个术语的定义随着新模型的发布而不断演变,我们想在这本书中明确它的含义。“大型”是任意的,今天可能被认为是大型模型的东西明天可能就是小型模型。目前对同一事物有很多名称,对我们来说,“大型语言模型”也是那些不生成文本并可以在消费者硬件上运行的模型。

因此,除了涵盖生成式模型外,这本书还将涵盖参数少于10亿且不生成文本的模型。我们将探讨其他模型,如嵌入模型、表示模型,甚至词袋模型如何用来增强LLMs。

大型语言模型的训练范式

传统的机器学习通常涉及为特定任务(如分类)训练模型。如图1-29所示,我们将其视为一个一步过程。

图1-29 传统的机器学习包括一个步骤:为特定目标任务(如分类或回归)训练模型

相比之下,创建大型语言模型(LLMs)通常至少包括两个步骤:

语言建模

第一步,称为预训练,占据了大部分的计算和训练时间。大型语言模型(LLM)在大量互联网文本上进行训练,使模型能够学习语法、上下文和语言模式。这个广泛的训练阶段还没有针对特定任务或应用,仅仅是预测下一个单词。训练出的模型通常被称为基础模型或基本模型。这些模型通常不遵循指令。

微调

第二步,微调或有时称为后期训练,涉及使用先前训练过的模型并在更狭窄的任务上进一步训练它。这使大型语言模型(LLM)能够适应特定任务或表现出期望的行为。例如,我们可以微调一个基础模型,使其在分类任务上表现良好或遵循指令。这节省了大量资源,因为预训练阶段相当昂贵,通常需要数据和计算资源,这些资源对于大多数人和组织来说是难以承受的。例如,Llama 2 已经在包含 2 万亿词元的数据集上进行了训练14。想象一下创建该模型所需的计算量!在第 12 章中,我们将介绍几种在您的数据集上微调基础模型的方法。

任何经过第一步预训练的模型,我们都认为是预训练模型,这也包括微调后的模型。这种两步训练法在图1-30中进行了可视化展示。

图1-30 与传统的机器学习相比,大型语言模型(LLM)训练采用多步骤方法。

可以添加额外的微调步骤,以使模型与用户的偏好进一步一致,我们将在第12章中探讨。


14 Hugo Touvron et al. “Llama 2: Open foundation and fine-tuned chat models.” arXiv preprint arXiv:2307.09288 (2023).

大型语言模型应用:是什么让它们如此有用?

大型语言模型(LLM)的性质使它们适用于广泛的任务。通过文本生成和提示,它几乎就好像你的想象力是极限。为了说明这一点,让我们探索一些常见的任务和技术:

检测顾客留下的评论是积极的还是消极的

这是(监督)分类,可以使用仅编码器和仅解码器模型来处理,既可以使用预训练模型(见第4章),也可以通过微调模型(见第11章)。

开发一个用于查找票据问题中的常见主题的系统

这是(无监督)分类,我们没有预定义的标签。我们可以利用仅编码器模型来执行分类本身,以及仅解码器模型来词元主题(见第5章)。

构建检索和检查相关文件的系统

语言模型系统的一个主要组成部分是它们添加外部信息资源的能力。使用语义搜索,我们可以构建系统,使我们能够轻松访问和查找信息供大型语言模型(LLM)使用(见第8章)。

通过创建或微调自定义嵌入模型来改进您的系统(见第12章)。构建能够利用外部资源(如工具和文档)的LLM聊天机器人

这是一种技术组合,展示了通过额外组件可以发现LLM的真正力量。诸如提示工程(见第6章)、检索增强生成(见第8章)和微调LLM(见第12章)等方法都是LLM难题的一部分。

构建能够根据展示冰箱中产品的图片编写食谱的LLM

这是一个多模态任务,LLM接收图像并对其所看到的内容进行推理(见第9章)。LLM正在适应其他模态,如视觉,这开启了广泛有趣的用例。

大型语言模型(LLM)应用非常令人满意,因为它们的部分边界是由你的想象力所限定的。随着这些模型变得越来越精确,在实践中将它们用于创意用例,如角色扮演和编写儿童书籍,就变得越来越有趣。

负责任的大语言模型开发与使用

大型语言模型(LLM)的影响已经而且可能继续十分显著,因为它们被广泛采用。在我们探索LLM的惊人能力时,记住它们的社会和伦理影响很重要。有几个关键点需要考虑:

偏见与公平性

大型语言模型(LLM)在训练过程中使用了大量可能包含偏见的数据。LLM 可能会从这些偏见中学习,开始复制它们,并可能放大它们。由于 LLM 的训练数据很少共享,除非尝试使用它们,否则很难知道它们可能包含哪些潜在偏见。

透明度与问责制

由于 LLM 的强大能力,有时候很难判断您是在与一个人还是与 LLM 交谈。因此,在没有人类参与的情况下,使用 LLM 与人类互动可能会产生意想不到的后果。例如,医疗领域使用的基于 LLM 的应用程序可能会被视为医疗器械进行监管,因为它们可能会影响患者的健康状况。

生成有害内容

LLM 不一定会生成真实的内容,可能会自信地输出错误的文本。此外,它们还可以用于生成假新闻、文章和其他误导性的信息来源。

知识产权

LLM 的输出是您的知识产权还是 LLM 创建者的知识产权?当输出与训练数据中的短语相似时,知识产权是否属于该短语的作者?在没有访问训练数据的情况下,很难知道 LLM 是否在使用受版权保护的材料。

监管

由于 LLM 的巨大影响,各国政府开始对商业应用进行监管。一个例子是欧洲人工智能法案,该法案规定了包括 LLM 在内的基础模型的开发和部署。

在您开发和使用 LLM 时,我们想强调道德考虑的重要性,并敦促您了解更多关于安全和负责任地使用 LLM 和人工智能系统的信息。

你所需要的只有有限的资源

我们迄今为止多次提到的计算资源通常与您系统上可用的GPU(图形处理器)有关。一个强大的GPU(显卡)将使训练和使用大型语言模型(LLM)更加高效和快速。

在选择GPU时,一个重要组成部分是你拥有的VRAM(视频随机存取存储器)数量。这指的是你的GPU上可用的内存量。实际上,你拥有的VRAM越多越好。原因是一些模型如果你没有足够的VRAM根本就无法使用。

因为训练和微调LLMs可能是一个昂贵的过程,从GPU的角度来看,那些没有强大GPU的人通常被称为GPU-poor。这说明了为了训练这些巨大的模型而进行的计算资源争夺。例如,为了创建Llama 2系列模型,Meta使用了A100-80 GB GPU。假设租用这样的GPU每小时需要1.50美元,那么创建这些模型的总成本将超过500万美元!15

不幸的是,没有一条单一的规则可以确定你为一个特定模型需要多少VRAM。这取决于模型的架构和大小、压缩技术、上下文大小、运行模型的后端等。

这本书是为GPU-poor准备的!我们将使用用户可以在没有最昂贵的GPU或大预算的情况下运行的模型。为此,我们将在Google Colab实例中提供所有代码。在撰写本文时,Google Colab的一个免费实例将为你提供一个带有16 GB VRAM的T4 GPU,这是我们建议的最低VRAM量。

与大型语言模型交互

与大型语言模型(LLM)进行交互不仅是使用它们的重要部分,也是理解其内部工作原理的关键。由于该领域的许多发展,已经出现了大量用于与LLM通信的技术、方法和软件包。在整本书中,我们打算探讨最常见的交互技术,包括使用专有的(闭源)和公开可用的开源模型。

专有模型

闭源大型语言模型(LLMs)是指不公开其权重和架构的模型。它们由特定组织开发,底层代码保密。此类模型的示例包括OpenAI的GPT-4和Anthropic的Claude。这些专有模型通常得到大量商业支持,并已在他们的服务中开发和集成。


15 The models were trained for 3,311,616 GPU hours, which refers to the amount of time it takes to train a model on a GPU, multiplied by the number of GPUs available..

你可以通过一个与LLM(大型语言模型)通信的接口来访问这些模型,这个接口被称为API(应用程序编程接口),如图1-31所示。例如,要在Python中使用ChatGPT,你可以使用OpenAI的包来与该服务进行交互,而无需直接访问它。

图1-31 闭源LLM通过接口(API)进行访问。因此,LLM本身的详细信息,包括其代码和架构,不会与用户共享。

专有模型的一个巨大优势是用户不需要拥有强大的GPU就可以使用大型语言模型(LLM)。提供商负责托管和运行模型,并且通常拥有更多的计算资源。关于托管和使用模型,没有必要具备专业知识,这大大降低了进入门槛。此外,由于这些组织的重大投资,这些模型往往比开源同行更具性能。

然而,这样做的缺点是它可能是一项昂贵的服务。提供商管理托管LLM的风险和成本,这通常转化为付费服务。此外,由于无法直接访问模型,没有办法自己对其进行微调。最后,您的数据与提供商共享,这在许多常见用例中是不可取的,例如共享患者数据。

开放模型

开放大型语言模型(Open LLMs)是与公众共享权重和架构的模型。它们仍然由特定组织开发,但通常会共享用于在本地创建或运行模型的代码——这些代码具有不同的许可级别,可能允许也可能不允许商业使用该模型。Cohere 的 Command R、Mistral 模型、微软的 Phi 以及 Meta 的 Llama 模型都是开放模型的例子。

关于什么真正代表开源模型,目前仍在进行讨论。例如,一些公开共享的模型具有宽松的商业许可证,这意味着该模型不能用于商业目的。对许多人来说,这不是开源的真正定义,开源的定义是使用这些模型不应有任何限制。同样,模型训练所用的数据以及其源代码很少被共享。

你可以下载这些模型,并在你的设备上使用它们,只要你有一个强大的GPU 可以处理这些类型的模型,如图1-32所示。

图1-32 开源大型语言模型(LLM)直接由用户使用。因此,包括其代码和架构在内的LLM本身的详细信息会与用户共享。

这些本地模型的一个主要优势是,作为用户的您对模型拥有完全的控制权。您可以在不依赖API连接的情况下使用模型,对其进行微调,并通过它处理敏感数据。您不依赖于任何服务,并且对导致模型输出的过程具有完全的透明度。这一优势得到了诸如Hugging Face等大型社区的支持,这些社区展示了协作努力的可能性。

然而,一个缺点是您需要强大的硬件来运行这些模型,而在训练或微调它们时更是如此。此外,设置和使用这些模型需要特定的知识(我们将在本书中详细介绍)。

我们通常更喜欢使用开源模型,只要我们能做到。这种自由让我们可以随意尝试各种选项,探索内部工作机制,并在本地使用模型,可以说比使用专有的大型语言模型(LLM)提供了更多的好处。

开源框架

与闭源LLM相比,开源LLM需要您使用某些包来运行它们。在2023年,发布了许多不同的包和框架,它们都以各自的方式与LLM互动并加以利用。在成百上千个可能有价值的框架中筛选并不是最愉快的体验。

因此,您甚至可能会错过本书中介绍的您最喜欢的框架!我们并不试图涵盖所有现有的LLM框架(太多,而且还在不断增加),而是旨在为您提供一个利用LLM的坚实基础。这样,在阅读本书后,您可以轻松掌握大多数其他框架,因为它们的工作方式都非常相似。

我们试图实现的直觉是这一目标的重要组成部分。如果您不仅对LLM有直观的理解,而且还在实践中使用常见框架,那么扩展到其他框架应该是一项简单的任务。

更具体地说,我们关注后端包。这些包没有图形用户界面(GUI),旨在高效地加载和运行您的设备上的任何大型语言模型(LLM),例如llama.cpp、LangChain 以及许多框架的核心 Hugging Face Transformers。

我们主要将介绍通过代码与大型语言模型交互的框架。尽管这些框架有助于你学习它们的基本原理,但有时你只是想要一个具有本地LLM的类似ChatGPT的界面。幸运的是,有许多出色的框架可以实现这一点。一些例子包括text-generation-webui、KoboldCpp和LM Studio。

生成第一个文本

使用语言模型的重要组成部分是选择它们。寻找和下载大型语言模型(LLM)的主要来源是Hugging Face Hub。Hugging Face是著名的Transformers包背后的组织,该包多年来一直推动着语言模型的发展。顾名思义,该包是建立在我们在第5页的“语言AI近期历史”中讨论的transformers框架之上的。

在撰写本文时,您将在Hugging Face平台上找到超过800,000个模型,用于许多不同的目的,从LLM和计算机视觉模型到处理音频和表格数据的模型。在这里,您几乎可以找到任何开源的LLM。

尽管我们将在整本书中探讨各种模型,但让我们从生成模型开始我们的第一行代码。我们在整本书中使用的主要生成模型是Phi-3-mini,这是一个相对较小(38亿参数)但相当高效的模型16。由于其小巧的尺寸,该模型可以在少于8 GB VRAM的设备上运行。如果您执行量化(一种我们将在第7章和第12章进一步讨论的压缩类型),您甚至可以使用少于6 GB的VRAM。此外,该模型采用MIT许可证授权,允许无限制地用于商业目的!

请记住,新的和改进的LLM会频繁发布。为了确保本书保持最新,大多数示例都设计为可以与任何LLM一起使用。我们还会在与本书关联的代码仓库中突出显示不同的模型供您尝试。

让我们开始吧!当您使用LLM时,会加载两个模型:


16 Marah Abdin et al. “Phi-3 technical report: A highly capable language model locally on your phone.” arXiv preprint arXiv:2404.14219 (2024).

• 生成模型本身

• 其底层的词元

分词器负责在将输入文本输入生成模型之前将其拆分为词元。您可以在Hugging Face网站上找到分词器和模型,只需传递相应的ID即可。在这种情况下,我们使用“microsoft/Phi-3-mini-4k-instruct”作为模型的主要路径。
我们可以使用transformers来加载分词器和模型。请注意,我们假设您有一台NVIDIA GPU(device_map="cuda"),但您也可以选择其他设备。如果您无法使用GPU,可以使用我们在本书的存储库中提供的免费Google Colab笔记本:

from transformers import AutoModelForCausalLM, AutoTokenizer

# Load model and tokenizer

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

# Create a 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”键来定义我们的提示:

# The prompt (user input / query)

messages = [

{"role": "user", "content": "Create a funny joke about chickens."}

]

# Generate output

output = generator(messages)

print(output[0]["generated_text"])

Why don't chickens like to go to the gym? Because they can't crack the eggsistence of it!

就这样!这本书中生成的第一个文本是一个关于鸡的不错笑话。

总结

在这本书的第一章中,我们深入探讨了大型语言模型(LLM)对语言人工智能领域的革命性影响。它显著改变了我们处理翻译、分类、摘要等任务的方式。通过语言人工智能的近期历史,我们探讨了几种类型的大型语言模型的基础,从简单的词袋表示法到使用神经网络的更复杂表示法。

我们讨论了注意力机制作为在模型中编码上下文的一步,这是使大型语言模型(LLM)如此强大的关键组成部分。我们涉及了使用这种惊人机制的两大类模型:表示模型(仅编码器)如BERT和生成模型(仅解码器)如GPT系列模型。在这本书中,这两类都被认为是大型语言模型。

总的来说,本章概述了语言AI领域的概况,包括其应用、社会和伦理影响以及运行这些模型所需的资源。我们最后使用Phi-3生成了我们第一段文本,这本书将贯穿使用这个模型。

在接下来的两章中,您将了解一些基本过程。我们从第2章开始探讨分词和嵌入,这两个部分常常被低估,但在语言AI领域至关重要。第3章将深入研究语言模型,您将发现用于生成文本的确切方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2333807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Quartus II的IP核调用及仿真测试

目录 第一章 什么是IP核?第二章 什么是LPM?第一节 设置LPM_COUNTER模块参数第二节 仿真 第三章 什么是PLL?第一节 设置ALTPLL(嵌入式锁相环)模块参数第二节 仿真 第四章 什么是RAM?第一节 RAM_1PORT的调用第…

JDK(Java Development Kit)从发布至今所有主要版本 的详细差异、新增特性及关键更新的总结,按时间顺序排列

以下是 JDK(Java Development Kit)从发布至今所有主要版本 的详细差异、新增特性及关键更新的总结,按时间顺序排列: 1. JDK 1.0 (1996) 发布年份:1996年1月23日关键特性: Java首次正式发布。核心语言特性…

通过websocket给服务端发送订单催单提醒消息

controller层 GetMapping("/reminder/{id}")public Result Remainder(PathVariable("id") Long id){orderService.remainder(id);return Result.success();} 实现类 Overridepublic void remainder(Long id) {Orders ordersDB orderMapper.getById(id);…

c++ 表格控件 UltimateGrid 控件实例

控件区域: 使用效果: 代码如下: void MyUGCtrl::OnSetup() { m_nButtonIndex AddCellType(&m_button); SetNumberCols(6); AppendRow(); CUGCell cell; int rows, cols; int row 0; // 头部 int nHeaderRow -1; …

使用 VcXsrv 在 Windows 10 上运行 Ubuntu 图形界面

VcXsrv 是一款用于 Windows 的开源 X 服务器,它允许在 Windows 系统上显示 Linux 的图形应用程序。当在 Windows 10 上安装并正确配置 VcXsrv 后,通过设置 WSL2 中的DISPLAY环境变量,使其指向运行 VcXsrv 的 Windows 主机的 IP 地址&#xff…

LSTM-SVM长短期记忆神经网络结合支持向量机组合模型多特征分类预测/故障诊断,适合新手小白研究学习(Matlab完整源码和数据)

LSTM-SVM长短期记忆神经网络结合支持向量机组合模型多特征分类预测/故障诊断,适合新手小白研究学习(Matlab完整源码和数据) 目录 LSTM-SVM长短期记忆神经网络结合支持向量机组合模型多特征分类预测/故障诊断,适合新手小白研究学习…

Autoware源码总结

Autoware源码网站 项目简介 教程 Autoware的整体架构如下图,主要包括传感器sensing、高精地图map data、车辆接口vehicle interface、感知perception(动态障碍物检测detection、跟踪tracking、预测prediction;交通信号灯检测detection、分类c…

QT聊天项目DAY01

1.新建初始项目 2.修改UI格式 运行效果 3.创建登录界面 设计登录界面UI 设计布局 调整布局间距 往水平布局中拖入标签和文本输入框 更换控件名称并固定高度 添加窗口部件 往现有的资源文件中导入图片 添加水平布局 4.设置登陆界面为主窗口的核心组件 #pragma once#include &l…

论文精度:基于LVNet的高效混合架构:多帧红外小目标检测新突破

论文地址:https://arxiv.org/pdf/2503.02220 目录 一、论文背景与结构 1.1 研究背景 1.2 论文结构 二、核心创新点解读 2.1 三大创新突破 2.2 创新结构原理 2.2.1 多尺度CNN前端 2.2.2 视频Transformer设计 三、代码复现指南 3.1 环境配置 3.2 数据集准备 3.3 训…

ORM查询的补充

一,ORM查询的补充: 1,连接查询: 反向查询: 先介绍一下什么是正向查询,比如我们之前的数据表之间建立的一对多的关系,我们通过文章找到相应的作者是属于正向查询的(由多到一)&…

蔚来汽车智能座舱接入通义大模型,并使用通义灵码全面提效

为加速AI应用在企业市场落地,4月9日,阿里云在北京召开AI势能大会。阿里云智能集团资深副总裁、公共云事业部总裁刘伟光发表主题演讲,大模型的社会价值正在企业市场释放,阿里云将坚定投入,打造全栈领先的技术&#xff0…

VMWare Workstation Pro17.6最新版虚拟机详细安装教程(附安装包教程)

目录 前言 一、VMWare虚拟机下载 二、VMWare虚拟机安装 三、运行虚拟机 前言 VMware 是全球领先的虚拟化技术与云计算解决方案提供商,通过软件模拟计算机硬件环境,允许用户在一台物理设备上运行多个独立的虚拟操作系统或应用。其核心技术可提升硬件…

【数据结构】红黑树超详解 ---一篇通关红黑树原理(含源码解析+动态构建红黑树)

一.什么是红黑树 红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构。1972年出现,最初被称为平衡二叉B树。1978年更名为“红黑树”。是一种特殊的二叉查找树,红黑树的每一个节点上都有存储表示节点的颜色。每一个节点可以是…

uni-app初学

文章目录 1. pages.json 页面路由2. 图标3. 全局 CSS4. 首页4.1 整体框架4.2 完整代码4.3 轮播图 swiper4.3.1 image 4.4 公告4.4.1 uni-icons 4.5 分类 uni-row、uni-col4.6 商品列表 uni-row、uni-col 小程序开发网址: 注册小程序账号 微信开发者工具下载 uniapp …

PHP多维数组

在 PHP 中&#xff0c;多维数组是数组的数组&#xff0c;允许你存储和处理更复杂的数据结构。多维数组可以有任意数量的维度&#xff0c;但通常我们最常用的是二维数组&#xff08;数组中的数组&#xff09;。 首先来介绍一下一维数组&#xff0c; <?php//一维数组 $strAr…

数学建模:针对汽车行驶工况构建思路的延伸应用

前言&#xff1a; 汽车行驶工况构建的思简单理解为将采集的大量数据进行“去除干扰、数据处理&#xff0c;缩减至1800S的数据”&#xff0c;并可达到等效替换的目的&#xff0c;可以使在试验室快速复现&#xff1b;相应的解决思路、办法可应用在 “通过能量流采集设备大量采集…

go语言内存泄漏的常见形式

go语言内存泄漏 子字符串导致的内存泄漏 使用自动垃圾回收的语言进行编程时&#xff0c;通常我们无需担心内存泄漏的问题&#xff0c;因为运行时会定期回收未使用的内存。但是如果你以为这样就完事大吉了&#xff0c;哪里就大错特措了。 因为&#xff0c;虽然go中并未对字符串…

当DRAM邂逅SSD:新型“DRAM+”存储技术来了!

在当今快速发展的科技领域&#xff0c;数据存储的需求日益增长&#xff0c;对存储设备的性能和可靠性提出了更高的要求。传统DRAM以其高速度著称&#xff0c;但其易失性限制了应用范围&#xff1b;而固态硬盘SSD虽然提供非易失性存储&#xff0c;但在速度上远不及DRAM。 为了解…

JS实现文件点击或者拖拽上传

B站看到了渡一大师课的切片&#xff0c;自己实现了一下&#xff0c;做下记录 效果展示 分为上传前、上传中和上传后 实现 分为两步 界面交互网络请求 源码如下 upload.html <!DOCTYPE html> <html lang"zh-CN"><head><meta charset&q…

Centos7.9 升级内核,安装RTX5880驱动

系统镜像下载 https://vault.centos.org/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso 系统安装步骤省略 开始安装显卡驱动 远程登录查看内核 [root192 ~]# uname -a Linux 192.168.119.166 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x8…