赞
踩
本章涵盖
- 大型语言模型 (LLMs) 概述
- 由 LLMs 提供支持的关键用例
- 基础模型及其对 AI 开发的影响
- LLMs 的新架构概念 - 提示、提示工程、嵌入、令牌、模型参数、上下文窗口和紧急行为
。- 开源 LLMs 和商业 LLMs 的比较
大型语言模型 (LLMs) 是生成式 AI 模型,可以根据给定的输入理解并生成类似人类的文本。 LLMs 是许多自然语言处理 (NLP) 任务的基础,例如搜索、语音转文本、情感分析、文本摘要等。LLMs 是经过预先训练的通用语言模型,可以针对特定情况进行微调任务和目的。
本章探讨了大型语言模型 (LLMs) 的迷人世界及其对人工智能的变革性影响。 作为人工智能的重大进步,LLMs在理解和生成类人文本方面表现出了卓越的能力,从而实现了跨行业的各种应用。 我们深入探讨了LLMs的关键用例、不同类型的LLMs以及彻底改变人工智能开发的基础模型的概念。
在整章中,我们讨论了 LLMs 的基本概念,如提示、提示工程、嵌入、标记、模型参数、上下文窗口、转换器架构和突发行为。最后,我们将比较开源 LLMs 和商业 LLMs,突出它们的优缺点。本章结束时,您将对 LLMs 及其对人工智能应用和研究的影响有一个全面的了解。LLMs 建立在基础模型之上;在介绍 LLMs 的细节之前,我们将首先概述这些基础模型是什么。
基础模型由斯坦福大学的研究人员于 2018 年推出,极大地改变了人工智能系统的构建。它们不同于特定任务模型,而是转向在大量数据基础上训练的更广泛、适应性更强的模型。这些模型可以在机器翻译和问题解答等各种自然语言任务中表现出色,因为它们可以从大量文本和代码数据集中学习通用语言表征。如下图 2.2 所示,这些表征可以用来执行各种任务,甚至是它们没有经过明确训练的任务。
用更专业的术语来说,基础模型利用成熟的机器学习技术,如自我监督学习和迁移学习,使它们能够将学到的知识应用到各种任务中。利用深度学习开发的这些模型使用多层人工神经网络来理解复杂的数据模式,因此它们能够熟练处理图像、音频和文本等非结构化数据。
迁移学习是机器学习中的一种技术,它将为一项任务开发的模型作为起点重新用于类似的任务。我们不是从零开始,而是利用前一项任务的知识在新任务中取得更好的成绩。这就好比利用以前工作中的知识来胜任新的相关工作。
正如我们所概述的,基础模型是在海量数据集上训练出来的,可用于执行各种任务;这一特性使其特别适合用于生成性人工智能,并可用于创建新内容。这些模型具有广泛的知识库,可以进行有效的迁移学习,利用迁移学习可以跨领域生成新的、与上下文相适应的内容。它们代表了一种统一的方法,在这种方法中,单个模型可以生成各种输出,由于经过了广泛的训练,因此可以提供最先进的性能。如果没有基础模型作为骨干,我们将无法生成式人工智能模型。
图 2.1 基础模型概览

下面列举了一些比较常见的基础模型。
基础模型训练完成后,可以通过微调参数使其适应各种下游任务。微调包括调整模型参数,针对特定任务优化模型。通过在特定任务或领域中对这些模型进行微调,我们可以充分利用模型对语言的一般理解,并用特定任务的知识对其进行补充。我们还可以通过 “提示引擎”(Prompt engineering)对模型进行调整,本章稍后将对此进行讨论。既然我们已经了解了基础模型,那么让我们来探讨一下 LLMs。
LLMs 是人工智能领域的一大进步,它通过对大量文本数据(如书籍、文章和网站)进行训练来学习人类语言的模式。它们也很难开发和维护,需要大量的数据、计算和工程资源。OpenAI 的 ChatGPT 就是 LLMs 的一个例子–它根据文本中之前使用过的单词预测单词的概率,从而生成类人文本。
该模型通过调整其内部参数来学习生成连贯且上下文相关的句子,以最小化其预测与训练数据中的实际结果之间的差异。 在生成文本时,模型选择概率最高的单词作为其后续输出,然后对下一个单词重复该过程,依此类推。
大型语言模型是为自然语言处理和自然语言生成任务而调整的基础模型。 这些大型语言模型是通用的,可以在没有特定于任务的训练数据的情况下处理任务。 正如我们在上一章中简要地看到的,给定正确的提示,他们可以回答问题,写论文,总结文本,翻译语言,甚至生成代码。LLMs可以应用于不同行业的许多应用,如第1章所述–从汇总、分类、问答聊天机器人、内容生成、数据分析、实体提取等。 在我们深入了解肢体的更多细节之前,让我们看看Transformer架构-这使得这些基础模型成为可能。
Transformer 是其卓越的语言理解能力的基础模型的基石。 在Vaswani等人的论文"Attention is All You Need"中首次介绍了Transformer模型。 2017年。 从那时起,基于 Transformer 的模型已经成为许多任务的最先进的模型。GPT和BERT是基于 Transformer 的模型的例子;GPT中的"T"代表Transformer。
在它们的核心,Transformer 使用一种称为注意力(特别是自我注意力)的机制,它允许模型考虑句子的整个上下文,同时考虑所有单词,而不是逐字逐句地处理 这种方法效率更高,可以改善许多NLP任务的结果。
这种方法的优势在于它捕获依赖关系,而不管它们在文本中的位置如何,这是语言理解的一个重要因素。 这是机器翻译和文本摘要等任务的关键,在这些任务中,句子的含义可能取决于几个单词之外的单词。
Transformer 可以并行化它们的计算,这使得它们比其他类型的神经网络更快地训练。 这种机制使模型能够"注意"任务的输入中最相关的部分。
在生成Al的上下文中,transformer模型将通过权衡输入的每个部分在生成输出中的重要性来获取输入(如提示)并生成输出(如下一个单词或句子的完成)。 例如,在句子"'猫坐在。…",在确定下一个可能的单词可能是"mat"时,transformer 模型可能会对"cat"这个词给予很大的权重。 这些模型通过预测序列中的下一个项目-句子中的下一个单词或旋律中的下一个音符来表现出生成属性。 在下一章中,我们将在大型语言模型中探讨更多。
transformer 模型通常非常大,需要大量的计算资源来训练和使用。 使用汽车类比,想想transformer模型,如增压发动机,需要很大的动力运行,但可以做惊人的事情。 将它们视为ResNET50等用于识别图像的模型之后的下一步。 虽然ResNET50就像一辆有50个齿轮的汽车,但Openais GPT3就像一辆有96个齿轮和额外功能的巨型卡车。 由于其高级功能,这些模型是创建智能AI输出的首选。
LLMs 使用 transformer ,transformer 由编码器和解码器组成。编码器处理输入文本(即提示)并生成表示输入文本含义的隐藏状态的序列。 编码器使用这些隐藏状态生成输出文本。 这些编码器和解码器形成一层-将它们视为"迷你大脑"。 在下面的图2.3中,我们展示了这个编码器-解码器的一层,但实际上,多层可以堆叠在一起。 如前所述,GPT3是具有96层的仅解码器模型。
在基础模型的上下文中,"训练截止"是指模型训练结束的时间点,即收集用于训练模型的数据之前的时间。 对于OpenAl开发的AI模型,如GPT-3或GPT-4,训练截止时间是模型最后一次在新数据上训练的时间。
这个截止很重要,因为在这一点之后,模型不知道发生的任何事件,进步,新概念或语言用法的变化。 例如,2021年9月GPT截止的训练数据,这意味着模型不知道超出该点的真实世界事件或进步。
关键点是,虽然这些模型可以根据他们训练的数据生成文本,但他们在训练截止后不会学习或更新他们的知识。 他们无法从互联网或任何外部数据库访问或检索实时信息。 他们的反应纯粹是根据他们在训练期间所学到的模式产生的。
注意:
随着最近宣布ChatGPT的高级版本将通过Bing插件访问互联网,这并不意味着该模型具有更多的最新信息,这使用了一种称为RAG-Retrieval-Augmented Generation(检索增强生成)的模式,我们将在第7章的
LLMs 有三类,如下表2.1所示。 当我们谈论LLMs时,有一个正在谈论的上下文是至关重要的–在某些情况下可能并不明显。 这是至关重要的,因为使用模型时的路径是不可互换的,选择正确的类型取决于尝试解决的用例。 此外,还依赖于如何有效地使模型适应特定用例。
表2.1 LLM的类型

值得注意的是,所有这些方法都有其优点和缺点:
此外,人们可以采取方法(zero-shot, few-shot和转移学习)来进一步调整LLM以适应特定的任务,使它们在这些特定的域中表现更好并更健壮。 在某种程度上,实施的LLM类型也决定了哪种方法更适合需要。 每种方法都有其优点和缺点,最佳方法取决于具体任务,可用数据和手头资源。
今天的商业模型提供一流的性能关于Al质量和广泛的能力. 然而,自ChatGPT发布以来,已经出现了向开源模型的重大转变。 这些开源计划中的许多都专注于开发更小的基础模型,声称它们可以在没有显着损失的情况下实现几乎相同的质量水平。 下图2.2[1]显示了这些谱系的视图以及它们如何快速爆炸。
图2.2具有10+B参数的LLMs时间线-大型语言模型的调查[1]

目前有几种商业LLMs正在印刷,并已开始引起注意. 几乎所有这些都遵循开放的AI范式,并通过我们使用的API公开。 他们中的许多,虽然仍然是一个创业,有严肃的资金和深厚的研究背景的创始人。
OSS LLMs 的新作物即将到来-其中一些最终将与ChatGPT进行面对面的竞争。 如图2.1所示,有太多的东西需要提及,但下面的表2.2列出了一些值得注意的。
表2.2 开源LLMs

OpenAI Vs Azure OpenAI
Azure OpenAI和OpenAI 都是提供对OpenAI的强大语言模型的访问的服务,但它们有一些关键的区别。 一般来说,OpenAI迎合了更多的中小型企业个人开发者和创业公司。 另一方面,Azure OpenAl 更适合需要额外安全性,全球不同地区的可用性和监管需求的企业。
Azure Openai 提供了其他企业就绪功能,例如数据隐私、客户管理的密钥、静态加密、专用网络、区域可用性和负责任的AI内容过滤。 这些功能对于需要遵守特定安全或法规要求的企业来说非常重要。
因此,两者之间的Api相似但不相同。 但是,重要的是要指出底层模型是相同的,Azure OpenAI的部署包含了大多数企业所需的这些附加功能。
本节介绍典型LLM实现的体系结构。 下面的图2.3概括了一个典型的LLM实现的概念体系结构;每当我们调用一个LLM,比如OpenAI的GPT,它就是它正在经历的过程。
此模型从输入文本-提示开始。 提示首先使用标记化转换为令牌序列。 然后,通过称为嵌入的过程将每个令牌转换为数值向量,该过程充当编码器输入。
编码器处理输入序列并生成隐藏状态序列。 这些隐藏状态随后被送入具有开始令牌的解码器。解码器通过基于先前的令牌和隐藏状态预测下一个令牌,一次一个令牌生成输出序列。
一旦所有层都处理了信息,模型就会输出学习序列中下一个令牌的预测。 这个结果被转换回文本,是我们看到的回应。 此过程在迭代循环中运行,并针对生成的每个新令牌进行,从而创建连贯的文本输出。 模型生成的最终文本是这个分层迭代过程的一个紧急属性。 最终输出序列也称为完成。
图2.3 LLM的概念体系结构

让我们更详细地检查LLMs的每个方面。
一个提示是我们如何与这些模型"交谈"。 提示只是描述我们试图使用自然语言实现的任务的文本。 这些模型的输出也是文本。 以这种方式(自然语言)表达我们的意图而不是遵守机器的输入限制的能力使得提示功能强大。 在提示符中制作或设计文本类似于对模型进行编程并创建一个称为提示工程的新范式,我们将在本书后面介绍这一点。
提示使我们能够使用相同的范式捕捉更广泛的意图和情绪。 下面是两个例子(由AI生成),其中提示
要求一个俳句,概述LLMs是多么伟大-一个是快乐的,另一个是悲伤的。 在同一个任务上获得这种情感和表现力是不可能的。
提示:写一个快乐的俳句,说明LLMs有多棒。
人工智能生成:
LLMs很棒
他们可以聊天和生成
创意和智能
提示:写一个悲伤的俳句,说明LLMs有多棒。
人工智能生成:
LLMs很棒
但他们无法感受或爱
只模拟
注意事项:
大型语言模型不像人类那样"理解"文本。 它们是学习数据中的模式并使用这些模式生成输出的统计模型。 尽管它们的输出令人印象深刻,但这些模型并没有理解与我们相同意义上产生的信息-包括信仰,欲望。意识,以及对与错。他们只是非常好地根据他们已经看到无数次的模式在文本序列中预测下一个单词。
令牌是大型语言模型(LLM)使用的文本的基本单位,用于处理请求和响应,即理解和生成文本。标记化是将文本转换为称为标记的较小单元序列的过程。 在使用LLMs时,我们使用令牌与这些模型进行对话,这是理解LLMs的最基本要素之一。
令牌是将LLMs纳入应用程序或解决方案时的新货币。 令牌直接与运行模型的成本相关-无论是在金钱方面,还是在延迟和吞吐量方面的经验方面。 令牌越多,模型所要做的处理就越多。 这意味着模型需要更多的计算资源,这意味着更低的性能和更高的延迟。
令牌是LLMs处理的文本的一部分;根据令牌化算法,该部分可以是单个字符、单词、子单词甚至更大的语言单元。 一个粗略的经验法则是,一个令牌大约是四个字符或0.75个单词的英文文本。 对于今天的大多数电影,他们支持的令牌大小包括输入提示和响应。
让我们看一个例子;下面的图2.4显示了句子"我有一只名叫Champ的白狗"是如何被标记化的(在这种情况下使用OpenAI的标记器)。 每个块代表不同的令牌。 在这个例子中,我们使用八个令牌。
图2.4 Tokenizer示例

LLMs 通过预测最有可能遵循它们用作输入的给定单词或符号(令牌)序列的下一个单词或符号(令牌)来生成文本,即提示。 我们在下面的图2.5中显示了这一点的可视化表示,其中右侧的令牌列表显示了提示"狗坐在"之后的最大概率tokens。 我们可以使用我们将在本章后面看到的一些参数来影响令牌的一些概率。
图2.5LLM-下一个令牌预测器

假设我们有一个长度为n的令牌序列。利用这些令牌作为上下文,我们生成随后的令牌n+1。 这个新预测的令牌然后被附加到令牌的原始序列,从而扩展上下文。 因此,用于生成令牌n+2的扩展上下文窗口变为n+(n+1)。这个过程在连续循环中重复,直到达到预定的停止条件,例如令牌的特定序列或大小限制。
例如,如果我们有一个句子"Hawaii pizza is my favorite",我们看到的下一个单词的可扩展性分布如下图2.6所示。最有可能的词是"类型"-完成句子-“夏威夷披萨是我最喜欢的类型”。

如果您再次运行此示例,您将获得与此处显示的概率不同的概率。 这是因为大多数AI是非确定性的,特别是在LLMs的情况下。 与此同时,它可能预测一个令牌,并且可能正在研究模型在训练阶段学到的所有可能的令牌。
我们还使用两个例子来概述一个令牌如何变化(将一个单词从"the"更改为"a")显着改变分布。 下面的图2.7显示了最可能的下一个令牌是41%概率的"mat"。我们还看到其他令牌及其概率分布的列表。
图2.7 示例1

然而,将一个令牌从"the"更改为"a"会显着改变下一个分布集,该人跳跃了30点,概率接近75%,如图2.8所示。
图2.8 示例2

与LLMs 相关的一些设置很重要,可以更改模型的行为和生成文本的方式。 这些设置是模型配置,可以通过API、Gui或两者进行更改,我们将在本章后面更详细地介绍模型配置。
在使用LLM时,跟踪令牌作为一个概念对许多开发人员来说可能是新的,特别是在企业环境中。但是,计数令牌很重要,原因有几个。
对于很多企业来说,成本和性能将是关心令牌的关键因素。 一般来说,为了成本和效率,应该先使用较小的模型,然后再使用较大的模型。
下面的清单 2.1 显示了计算令牌数量的简单方法。 在这个例子中,我们使用了一个名为 tiktoken 的开源库,由 OpenAl 发布。 该分词器库实现了字节对编码 (BPE) 算法。 这些标记器是根据各自的 LLM 设计的。确保在预训练和微调过程中高效标记化和最佳性能。 如果您使用 OpenAI 模型之一,则必须使用此分词器,许多其他 transformer 模型也使用它。
如果需要,您可以使用以下命令安装 tiktoken 库:
pip install tiktoken
清单 2.1 计算 GPT 的令牌
import tiktoken as tk def count_tokens(string: str, encoding_name: str) -> int: # Get the encoding encoding = tk.get_encoding(encoding_name) #A # Encode the string encoded_string = encoding.encode(string) # Count the number of tokens num tokens = len(encoded_string) return num tokens # Define the input string prompt =“I have a white dog named champ" # Display the number of tokens in the String print(“Number of tokens:", count_tokens(prompt,“cl100k_base")) 正如预期的那样,运行它会给出以下输出: $ python countingtokens.py Number of tokens: 7
注意:
字节对编码 (BPE) 是一种压缩算法,广泛应用于文本分类、文本生成和机器翻译等 NLP 任务中。 BPE 提供的优势之一是它是可逆且无损的——因此我们可以获得原始文本。 BPE 适用于标记器训练数据未见过的任何文本,并且它会压缩文本,从而产生比原始文本更短的标记序列。 BPE 还有助于概括语言中的重复模式,从而有助于更好地理解语法。 例如,“ing”子词在英语中很常见(游泳、跑步、调试等)。 BPE将分裂成不同的token,因此游泳中的“swim”和“ing”成为两个token并且泛化得更好。
如果我们不确定要使用的编码名称,我们可以使用encoding_for_model()函数来代替函数get_encoding()。 这采用我们要使用的模型的名称并使用相应的编码,例如encoding = tiktoken.encoding_for_model(‘gpt-4’)。 对于 OpenAl,表 2.3 显示了支持的不同编码。
表 2.3 OpenAI 编码

下面的清单 2.2 显示了如何使用不同的编码以及我们如何从标记中获取原始文本。 我们现在希望将其理解为一个基本结构,它对于更高级的用例很有用,例如文本的缓存和分块 - 我们将在本书后面介绍的方面。
清单 2.2 Tokens


除了我们在示例中使用的 tiktoken 库之外,还有一些其他流行的标记器。 请记住,每个分词器都是为相应的 LLM 设计的,不能互换。
嵌入是一种强大的机器学习工具,适用于表示单词的大型输入。 它们捕获向量空间(即向量集合,如图 2.9 所示)中的语义相似性,使我们能够确定两个文本块是否表示相同的含义。 通过提供相似度得分,嵌入可以帮助我们更好地理解不同文本之间的关系。
嵌入背后的想法是,具有相似含义的单词应该具有相似的向量表示——通过它们的距离来衡量。 向量之间距离较小表明它们高度相关,距离较长表明相关性较低。 有几种方法可以衡量相似性; 我们将在第 7 章稍后介绍这些内容。
这些向量是在训练过程中学习的,用于捕获单词或短语的含义。 事实上,人工智能算法可以轻松地利用这些浮点数向量。
图 2.9 嵌入

例如,单词“cat”可能由 [0.2, 0.3,-0.1] 等向量表示,而单词“dog”可能由 [0.4, 0.1,0.2] 等向量表示。 然后,这些向量可以用作机器学习模型的输入,用于执行文本分类、情感分析和机器翻译等任务。
当模型在大型文本数据语料库上进行训练时,可以学习嵌入。 这个想法是根据训练数据中的上下文捕获单词或短语的含义。
根据任务的不同,有多种创建嵌入的算法。
注意:
由一种方法创建的嵌入不能被另一种方法理解。 换句话说,如果您使用 OpenAI 的 API 创建嵌入,其他提供商的嵌入将无法理解创建的这些向量,反之亦然。
下面的清单 2.3 显示了如何获取嵌入(在本例中来自 OpenAI)。 我们定义一个名为 get_embedding() 的函数,它将需要创建嵌入的 String 作为参数。 该函数使用 OpenAI 的 API 通过 text-davinci-oo2 引擎生成输入文本的嵌入。 嵌入以浮点数列表的形式返回。
清单 23 在 OpenAl 中嵌入

嵌入产生的向量空间不是到标记的一对一映射,但可以更多。
大多数LLMs向用户公开一些配置设置,允许用户在一定程度上调整模型的运行方式和行为。虽然一些参数会根据模型实现而变化,但两个关键配置是温度和最大响应。 请注意,某些实现可能具有不同的名称,但含义相同。 GPT 的 OpenAI 实现将最大响应称为最大令牌。 让我们更详细地探讨这些内容。
称为“最大响应”的参数本质上定义了模型生成的文本长度的上限。 这意味着一旦模型达到这个预定长度,它就会停止文本生成,无论是词中还是句子中。 掌握这种配置至关重要,因为大多数模型可以处理的令牌都有大小限制,增加此大小对应于更高的计算需求,从而导致延迟和成本增加。
与任何基础模型一样,生成文本时,固有的随机性在每次调用模型时都会产生不同的输出。 温度是最重要的设置之一,用于控制模型的随机程度。 通常,这是一个从 0 到 1 的值,其中 0 代表更准确和可预测的输出。 另一方面,设置1使输出更加多样化和随机,如下图2.10所示。
图2.10 温度设置及其对概率的影响

一个例子
让我们将这些变为现实,并展示如何以编程方式使用这些设置。 下面的代码片段显示了如何使用 OpenAI 进行这些配置的示例。 大多数这些设置都很少使用,都是可选的,并且会使用默认值。 几乎每个用例中都只使用一些选项,例如 max_tokens 和温度。
response = openai.Completion.create(
model="text-davinci-@03”,
prompt="...",
temperature=1,
max_tokens=256,
top_p=1,
frequency_penalty=0,
presence_penalty=0
)
鉴于 API 是无状态的,这些设置在不同实例和同一实例的 API 调用之间可能会有所不同,具体取决于尝试实现的业务场景。 此外,这些设置没有全局最优值,这取决于任务。 一般来说,如果您想要平衡输出并且让模型不会产生太多幻觉,则温度设置为 0.7 或 0.8 比较合适。 下面的表 2.4 概述了可以更改以控制行为的配置设置。
表 2.4 LLM 配置设置
| 配置 | 描述 |
|---|---|
| Max tokens | 设置每个模型响应的令牌数量限制。根据模型的不同,提示(包括系统消息、示例、消息历史记录和用户查询)和模型响应之间共享最大限制 |
| Temperature | 控制随机性。降低温度意味着模型会产生更多重复性和确定性响应。升高温度会导致更多意外或创造性响应。尝试调整温度或 Top P,但不要同时调整两者。 通常,随着序列变长,模型自然对其预测变得更有信心。并且可以在长提示中使用更高的温度,而不会偏离主题。相反,在短提示中使用高温设置可能会导致输出不稳定 |
| Top P | 这是一个概率阈值,与温度类似,控制随机性,但使用不同的方法。 降低 Top P 会将模型的令牌选择范围缩小到那些更有可能的令牌,并忽略可能性较小的令牌的长尾。增加 Top P 将使模型从高可能性和低可能性令牌中进行选择。 尝试调整 Temperature 或Top P,但不要同时调整两者。 |
| Stop sequences | 使模型在所需的点结束其响应。模型响应将在指定序列之前结束,以便它不会包含停止序列文本。 |
| Frequency penalty | 根据标记在文本中出现的频率按比例减少重复标记的机会。 这降低了在响应中重复相同文本的可能性。 |
| Presence penalty | 减少重复到目前为止文本中出现的任何标记的机会。 这增加了在响应中引入新主题的可能性。 |
在 Top P 中,候选名单的大小是根据达到某个阈值的似然分数之和动态选择的。 它设置了一个阈值,仅包含概率大于或等于阈值的单词。例如,top_p为0.3意味着仅考虑包含前30%概率的单词,如图2.11所示。
图 2.11 显示 Top-P 工作原理的示例

上下文窗口是一个相对较新且非常重要的概念; 它指的是LLM在进行预测时考虑的特定单词或标记周围的标记或单词的范围。 上下文窗口帮助模型理解单词之间的依赖关系和关系,使其能够生成更准确、更连贯的预测。
例如,当预测句子中的下一个单词时,上下文窗口可能包括目标单词之前的几个单词。 上下文窗口的大小可能会根据模型及其架构的不同而有所不同。 在LLMs中,上下文窗口可能非常大,允许模型捕获单词之间的长距离依赖性和复杂的语义关系。 这可以提高文本生成、翻译和摘要任务的性能。
当前的 LLM 架构将上下文窗口大小限制为数千个令牌。 这主要是因为注意力机制的全局性质带来了上下文长度的二次方的计算成本。 换句话说,上下文窗口越大,计算成本与输入数据大小的平方成正比。 虽然拥有更大的上下文窗口可能看起来不错,但重要的是要了解它既有积极的影响,也有消极的影响。 较长的上下文窗口也会降低模型的性能。 虽然我们可能觉得较长的上下文会更好,但一般来说,如果足以完成手头的任务,请使用较小的窗口 - 它会比较大的窗口获得更好的性能。
优点:
缺点:
上下文窗口作为一个概念非常重要,原因如下:
提示工程是一个相对较新的领域,是一种策划或设计提示的方法,以从机器学习模型(尤其是法学硕士)中引发所需的响应或行为。 提示工程是一项强大的技术,可以提高语言模型在各种任务上的性能。 提示工程是一个新兴领域,需要创造力和对细节的关注。
提示工程可以被视为艺术和科学,涉及输入命令的仔细选择和措辞,以帮助指导人工智能产生所需的输出。 这些输入命令可以非常简单,只需选择正确的单词、短语和格式即可指导模型为特定任务生成高质量且相关的文本。
例如,要获得详细的答案,您可以使用“详细解释…”之类的提示,或者使用“用几个项目符号进行总结…”之类的快速总结。类似地,让人工智能在 特定作者的风格,您可能会使用诸如“像 P.G.Wodehouse 一样写一段文章…”之类的提示。
提示工程需要了解 AI 模型的功能、底层训练数据以及它如何响应不同类型的输入。有效、快速的工程可以显着提高 Al模型在各种任务中的有用性。 注:本节只是介绍提示工程作为一个基本概念; 我们将在第 6 章后面更深入地介绍提示工程。
大型语言模型是预先训练的和通用的,可以而且有时必须针对特定目的进行微调。 它们在大量文本数据上进行训练,并且可以用作针对特定任务的较小数据集进行训练的起点。 在较小的数据集上微调基础 LLM 可以提高其特定任务的性能。
微调是采用预先训练的模型并在新的任务数据集上进一步训练它。 以预训练的模型为起点,在训练过程中调整模型的权重,以提高其在新任务上的性能。 微调通常用于迁移学习,其中针对一项任务训练的模型适用于另一相关任务。
微调LLMs的一些例子包括:
突现行为的概念定义了基础模型和LLMs的重要性。突现行为是LLMs在与环境交互时,特别是在使用大量数据进行训练时表现出的意外行为。 LLMs没有经过明确的培训来具备这些能力,而是通过观察自然语言来学习它们。 行为的出现是隐式诱导的,而不是显式构建的; 它既是科学兴奋的根源,也是对意外后果的焦虑的根源。
如下图 2.12 所示,根据论文《大型语言模型的涌现能力》[4],模型在多个自然语言基准(例如,问答)上的性能并不比随机机会更好,直到它们达到一定规模 - 在本例中通过 FLOP 中的训练计算。 此时模型的性能急剧提高,这是涌现能力的一个例子。 这有助于我们理解LLM的突现属性并不存在于较小的模型中。 此外,这些能力仅在模型大小达到一定阈值时才会按比例显示。 无法通过推断较小模型的性能来预测突现属性。
图 2.12 通过 FLOP 中的训练计算要求衡量的模型扩展

让我们通过一个例子进一步探讨这一点。
突现行为 - 一个例子
我们想用代码作为例子,因为一段代码正在执行的确切逻辑和本质无法预先确定或为LLM编程,它需要依靠基础模型的涌现行为属性来理解、分析和理解代码。
假设我们有一段 C 代码,如清单 2.4 所示,它反转了一个字符串。 这使用了 C 的一些更高级的功能,例如指针、异或运算符和宏。 在我们的示例中,我们使用 GPT-4 将此 C 函数转换为 Phyton。
#include < String.h> // for strlen() // reverse the given null-terminated String in place void inplace_reverse(char *str) { if (str) { char * end = str + strlen(str) - 1; // swap the values in the two given variables // XXX:fails when a and b refer to same memory location #define XOR_SWAP(a,b) do\ {\ a ^= b;\ b^=a;\ a ^= b;\ }while (o) // walk inwards from both ends of the String, // swapping until we get to the middle while (str < end){ XOR_SWAP(*str,*end); str++; end--; } #undef XOR SWAP } }
第一步是要求我们的LLM使用类似于下面的提示将此代码转换为 Python。 为了简洁起见,我们在下面再次省略了 C 函数(清单 2.4)。 该代码是提示的一部分。
提示词:将此c函数转换为python
我们的模型的输出以及转换为 Python 的代码如下面的清单 2.5 所示。 它很好地理解了 C 函数的作用,并概述了 Python 在响应中的不同约束和属性。 请注意,我们没有给它任何有关该函数正在做什么的提示,它自行破译了它,展示了突现行为的示例。
响应:该函数将返回反转的字符串而不是修改原始字符串,因为Python字符串是不可变的。 换句话说,一旦在 Python 中创建了字符串,就无法更改。因此,函数“inplace_reverse”在这个 Python 上下文中有点用词不当。 您可以考虑将其重命名为“reverse_string”之类的名称
清单 2.5 用于字符串反转的转换后的 Python 函数

我们可以通过逐字询问模型来进一步简化:
提示词:能否进一步简化和优化Python代码?
这是我们得到的回应:
当然! 在 Python 中使用切片反转字符串的最简单方法之一.下面是一个将返回字符串反转的函数。
def reverse_string(s):
return s[::-1]
[::-1] 是一个从字符串末尾开始向后移动的切片
但是,如果您想模拟与 C 程序相同的逻辑,即使用两个指针反转字符串,这里有一种更 Pythonic 的实现方式。
def reverse_string(s):
lst = list(s)
Ist.reverse()
return ''.join(lst)
在此版本中,我们将字符串转换为列表,使用内置的反向函数反转列表,然后将列表重新连接回字符串。 Python 中的反向函数使用类似的两指针方法,但它是在幕后进行的,因此代码看起来简单得多。
响应中提出的类似两指针方法的观点证明了新兴属性的力量。 我们从未在谈话中明确指出这一点。
在本章中,我们研究了LLM发挥作用的核心概念,以及在企业中实施这些新的生成式人工智能技术时需要注意和注意的事项。 我们涵盖了新概念,例如提示、提示工程、嵌入、标记、模型参数、上下文窗口、transformer 架构和突现行为。 现在我们对 LLM 及其含义有了广泛的了解,在下一章中让我们将其付诸实践,并通过 API 来生成文本 - 既作为完成,我们通过提示提供说明,也作为聊天,我们可以进行对话并生成文本 文本,在对话的上下文中。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。