[AI] 生成式人工智能的应用 [2] -大语言模型简介

本章涵盖

  • 大型语言模型 (LLMs) 概述
  • 由 LLMs 提供支持的关键用例
  • 基础模型及其对 AI 开发的影响
  • LLMs 的新架构概念 - 提示、提示工程、嵌入、令牌、模型参数、上下文窗口和紧急行为
  • 开源 LLMs 和商业 LLMs 的比较

大型语言模型 (LLMs) 是生成式 AI 模型,可以根据给定的输入理解并生成类似人类的文本。 LLMs 是许多自然语言处理 (NLP) 任务的基础,例如搜索、语音转文本、情感分析、文本摘要等。LLMs 是经过预先训练的通用语言模型,可以针对特定情况进行微调任务和目的。

本章探讨了大型语言模型 (LLMs) 的迷人世界及其对人工智能的变革性影响。 作为人工智能的重大进步,LLMs在理解和生成类人文本方面表现出了卓越的能力,从而实现了跨行业的各种应用。 我们深入探讨了LLMs的关键用例、不同类型的LLMs以及彻底改变人工智能开发的基础模型的概念。

在整章中,我们讨论了 LLMs 的基本概念,如提示、提示工程、嵌入、标记、模型参数、上下文窗口、转换器架构和突发行为。最后,我们将比较开源 LLMs 和商业 LLMs,突出它们的优缺点。本章结束时,您将对 LLMs 及其对人工智能应用和研究的影响有一个全面的了解。LLMs 建立在基础模型之上;在介绍 LLMs 的细节之前,我们将首先概述这些基础模型是什么。

2.1 基础模型概述

基础模型由斯坦福大学的研究人员于 2018 年推出,极大地改变了人工智能系统的构建。它们不同于特定任务模型,而是转向在大量数据基础上训练的更广泛、适应性更强的模型。这些模型可以在机器翻译和问题解答等各种自然语言任务中表现出色,因为它们可以从大量文本和代码数据集中学习通用语言表征。如下图 2.2 所示,这些表征可以用来执行各种任务,甚至是它们没有经过明确训练的任务。

用更专业的术语来说,基础模型利用成熟的机器学习技术,如自我监督学习和迁移学习,使它们能够将学到的知识应用到各种任务中。利用深度学习开发的这些模型使用多层人工神经网络来理解复杂的数据模式,因此它们能够熟练处理图像、音频和文本等非结构化数据。

迁移学习是机器学习中的一种技术,它将为一项任务开发的模型作为起点重新用于类似的任务。我们不是从零开始,而是利用前一项任务的知识在新任务中取得更好的成绩。这就好比利用以前工作中的知识来胜任新的相关工作。

正如我们所概述的,基础模型是在海量数据集上训练出来的,可用于执行各种任务;这一特性使其特别适合用于生成性人工智能,并可用于创建新内容。这些模型具有广泛的知识库,可以进行有效的迁移学习,利用迁移学习可以跨领域生成新的、与上下文相适应的内容。它们代表了一种统一的方法,在这种方法中,单个模型可以生成各种输出,由于经过了广泛的训练,因此可以提供最先进的性能。如果没有基础模型作为骨干,我们将无法生成式人工智能模型。

图 2.1 基础模型概览

在这里插入图片描述

下面列举了一些比较常见的基础模型。

  • GPT(生成预训练转换器)是 OpenAl 开发的自然语言处理模型。它是一个大型语言模型,这意味着它已在大量的文本和代码数据集上进行过训练,这使得它能够生成文本、翻译语言、撰写创意内容并翔实地回答您的问题。GPT-4(本文撰写时的最新版本)也是一个多模式模型,它可以管理语言和图像。
  • Codex 是一个专门针对代码训练的大型语言模型,用于帮助生成代码。它支持十多种编程语言,包括一些常用语言,如 C#、Java、Python、C#、JavaScript、SQL、Go、PHP 和 Shell 等。
  • Claude 是一个大型语言模型(LLM),由一家名为 Anthropic 的初创公司建立。与 OpenAI 的 ChatGPT 一样,Claude 也能在得到特定提示时预测序列中的下一个标记,并能生成文本、编写代码、总结和推理。
  • BERT(Bidirectional Encoder Representations from Transformers)是谷歌开发的一种自然语言处理模型。它是一个双向模型,这意味着它可以从左至右和从右至左两个方向处理文本。这使得它能更好地理解单词和短语的上下文。
  • PaLM(路径语言模型)及其后续产品 PaLM2 是谷歌开发的大型多模态语言模型。多模态模型可以同时处理文本、代码和图像。这使得单个模型能够在这些模式之间执行更广泛的任务,而传统的语言模型只能在一种模式下运行。

基础模型训练完成后,可以通过微调参数使其适应各种下游任务。微调包括调整模型参数,针对特定任务优化模型。通过在特定任务或领域中对这些模型进行微调,我们可以充分利用模型对语言的一般理解,并用特定任务的知识对其进行补充。我们还可以通过 “提示引擎”(Prompt engineering)对模型进行调整,本章稍后将对此进行讨论。既然我们已经了解了基础模型,那么让我们来探讨一下 LLMs。

2.2 LLMs概述

LLMs 是人工智能领域的一大进步,它通过对大量文本数据(如书籍、文章和网站)进行训练来学习人类语言的模式。它们也很难开发和维护,需要大量的数据、计算和工程资源。OpenAI 的 ChatGPT 就是 LLMs 的一个例子–它根据文本中之前使用过的单词预测单词的概率,从而生成类人文本。

该模型通过调整其内部参数来学习生成连贯且上下文相关的句子,以最小化其预测与训练数据中的实际结果之间的差异。 在生成文本时,模型选择概率最高的单词作为其后续输出,然后对下一个单词重复该过程,依此类推。

大型语言模型是为自然语言处理和自然语言生成任务而调整的基础模型。 这些大型语言模型是通用的,可以在没有特定于任务的训练数据的情况下处理任务。 正如我们在上一章中简要地看到的,给定正确的提示,他们可以回答问题,写论文,总结文本,翻译语言,甚至生成代码。LLMs可以应用于不同行业的许多应用,如第1章所述–从汇总、分类、问答聊天机器人、内容生成、数据分析、实体提取等。 在我们深入了解肢体的更多细节之前,让我们看看Transformer架构-这使得这些基础模型成为可能。

2.3 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层的仅解码器模型。

2.3.1 训练截止

在基础模型的上下文中,"训练截止"是指模型训练结束的时间点,即收集用于训练模型的数据之前的时间。 对于OpenAl开发的AI模型,如GPT-3或GPT-4,训练截止时间是模型最后一次在新数据上训练的时间。

这个截止很重要,因为在这一点之后,模型不知道发生的任何事件,进步,新概念或语言用法的变化。 例如,2021年9月GPT截止的训练数据,这意味着模型不知道超出该点的真实世界事件或进步。

关键点是,虽然这些模型可以根据他们训练的数据生成文本,但他们在训练截止后不会学习或更新他们的知识。 他们无法从互联网或任何外部数据库访问或检索实时信息。 他们的反应纯粹是根据他们在训练期间所学到的模式产生的。

注意:

随着最近宣布ChatGPT的高级版本将通过Bing插件访问互联网,这并不意味着该模型具有更多的最新信息,这使用了一种称为RAG-Retrieval-Augmented Generation(检索增强生成)的模式,我们将在第7章的

2.4 LLMs 的类型

LLMs 有三类,如下表2.1所示。 当我们谈论LLMs时,有一个正在谈论的上下文是至关重要的–在某些情况下可能并不明显。 这是至关重要的,因为使用模型时的路径是不可互换的,选择正确的类型取决于尝试解决的用例。 此外,还依赖于如何有效地使模型适应特定用例。

表2.1 LLM的类型

在这里插入图片描述

值得注意的是,所有这些方法都有其优点和缺点:

  • 基础LLM是多功能的,可以处理许多任务,而不需要额外的培训. 但是,对于特定任务或域,它可能不像您希望的那样准确或可靠-特别是在企业环境中。
  • 基于指令的使用对某些任务非常有效,但需要仔细的提示,并且不会从根本上改变模型的能力。 这是许多及时的工程技术和最佳实践适用的地方。
  • 微调可以为特定的任务或领域产生出色的结果。但是,它需要额外的资源,并且存在对训练数据进行过度拟合的风险,这可能会限制模型对新示例进行数字化的能力。

此外,人们可以采取方法(zero-shot, few-shot和转移学习)来进一步调整LLM以适应特定的任务,使它们在这些特定的域中表现更好并更健壮。 在某种程度上,实施的LLM类型也决定了哪种方法更适合需要。 每种方法都有其优点和缺点,最佳方法取决于具体任务,可用数据和手头资源。

  • zero-shot学习:一个模型可以推广到一个任务,而没有看到该任务的例子在训练。 例如,我们可以要求一个只用英语训练的模型将英语翻译成德语,即使在这个过程中没有看到德语的任何具体例子。training.It 可以使用语义相似性来完成这种zero-shot翻译。词嵌入和机器学习。使用这些技术,我们可以测量两个词在不同语言中的相似程度。
  • few-shot学习:这涉及向模型展示我们想要执行的任务的几个示例,然后要求它用新的示例执行相同的任务。 例如,如果您想要一个模型来识别推文的内容,我们可能会向它展示一些推文和关联情绪的示例,然后要求它预测新推文的情绪。
  • 转移学习涉及在一个任务上训练模型,然后将所学到的知识用于不同但相关的任务。 例如,即使lms已接受过语言培训,而不是特定的客户支持服务,它们也可用于将客户支持票分为不同的类别,如计费、技术问题或一般询问。

2.5开源与商业LLMs

今天的商业模型提供一流的性能关于Al质量和广泛的能力. 然而,自ChatGPT发布以来,已经出现了向开源模型的重大转变。 这些开源计划中的许多都专注于开发更小的基础模型,声称它们可以在没有显着损失的情况下实现几乎相同的质量水平。 下图2.2[1]显示了这些谱系的视图以及它们如何快速爆炸。

图2.2具有10+B参数的LLMs时间线-大型语言模型的调查[1]

在这里插入图片描述

2.5.1 商业 LLMs

目前有几种商业LLMs正在印刷,并已开始引起注意. 几乎所有这些都遵循开放的AI范式,并通过我们使用的API公开。 他们中的许多,虽然仍然是一个创业,有严肃的资金和深厚的研究背景的创始人。

  • OpenAI:OpenAI是一个人工智能研究实验室,开发和发布尖端人工智能模型,如GP系列。 他们当然是今天最有头脑的人。 他们有几个基础模型,如GPT-4,BALL.E,和ChatGPT。今天,它是这个群体中最成熟的,有微软的认真支持和所有权。
  • Azure OpenAI:Azure OpenAI和OpenAI提供对功能强大的语言模型的访问,但它们的性质和实现有所不同。 主要区别在于Azure OpenAI是托管服务,而Open AI则不是。 Microsoft处理Azure OpenAl的基础架构和维护,使其成为一个有价值的选择,避免缺乏资源来管理其OpenAI部署。此外,Azure OpenAI将原始OpenAI模型打包为开发人员友好的服务,开发人员可以将其无缝集成到其他应用程序中。这些服务在Azure上运行,确保了可扩展性、可靠性和全局可用性。
  • Anthropic:由前OpenAI工程师创立的创业公司发布了可以生成文本和代码的Claudia LLM。 他们的关键区别在于使用宪法AI[2]实施LLM。宪法AI使用强化学习(RL)和传统的监督学习,并声称产生较少有害的输出。 截至本出版物,Anthropic得到了谷歌和亚马逊的支持。
  • 谷歌:LaMDA(对话应用程序的语言模型)模型今天无法通过API直接访问,但它为Bard-Google对ChatGPT的回答提供了动力,并且建立在PaLM2上。
  • Cohere AI:Startup,它来自原始的Transformer paper(注意是所有你需要的),有一个LLM,但也有其他产品,如搜索和嵌入。
  • Meta:Meta最近发布了Llama2-一个新的开源AI语言模型系列,可用于商业产品。 这些模型的大小从700亿到700亿个参数不等,并且经过了微调,以优于大多数开源聊天模型。这些都可以通过Azure机器学习工作室(Azure AIR的一部分)中的模型目录进行部署。

2.5.2 开源LLMs

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的部署包含了大多数企业所需的这些附加功能。

2.6 LLMs的关键概念

本节介绍典型LLM实现的体系结构。 下面的图2.3概括了一个典型的LLM实现的概念体系结构;每当我们调用一个LLM,比如OpenAI的GPT,它就是它正在经历的过程。

此模型从输入文本-提示开始。 提示首先使用标记化转换为令牌序列。 然后,通过称为嵌入的过程将每个令牌转换为数值向量,该过程充当编码器输入。

编码器处理输入序列并生成隐藏状态序列。 这些隐藏状态随后被送入具有开始令牌的解码器。解码器通过基于先前的令牌和隐藏状态预测下一个令牌,一次一个令牌生成输出序列。

一旦所有层都处理了信息,模型就会输出学习序列中下一个令牌的预测。 这个结果被转换回文本,是我们看到的回应。 此过程在迭代循环中运行,并针对生成的每个新令牌进行,从而创建连贯的文本输出。 模型生成的最终文本是这个分层迭代过程的一个紧急属性。 最终输出序列也称为完成。

图2.3 LLM的概念体系结构

在这里插入图片描述
让我们更详细地检查LLMs的每个方面。

2.6.1 Prompts (提示)

一个提示是我们如何与这些模型"交谈"。 提示只是描述我们试图使用自然语言实现的任务的文本。 这些模型的输出也是文本。 以这种方式(自然语言)表达我们的意图而不是遵守机器的输入限制的能力使得提示功能强大。 在提示符中制作或设计文本类似于对模型进行编程并创建一个称为提示工程的新范式,我们将在本书后面介绍这一点。

提示使我们能够使用相同的范式捕捉更广泛的意图和情绪。 下面是两个例子(由AI生成),其中提示
要求一个俳句,概述LLMs是多么伟大-一个是快乐的,另一个是悲伤的。 在同一个任务上获得这种情感和表现力是不可能的。

提示:写一个快乐的俳句,说明LLMs有多棒。

人工智能生成:
LLMs很棒
他们可以聊天和生成
创意和智能

提示:写一个悲伤的俳句,说明LLMs有多棒。

人工智能生成:
LLMs很棒
但他们无法感受或爱
只模拟

注意事项:

大型语言模型不像人类那样"理解"文本。 它们是学习数据中的模式并使用这些模式生成输出的统计模型。 尽管它们的输出令人印象深刻,但这些模型并没有理解与我们相同意义上产生的信息-包括信仰,欲望。意识,以及对与错。他们只是非常好地根据他们已经看到无数次的模式在文本序列中预测下一个单词。

2.6.2 Tokens

令牌是大型语言模型(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时,跟踪令牌作为一个概念对许多开发人员来说可能是新的,特别是在企业环境中。但是,计数令牌很重要,原因有几个。

  • 内存限制:LLMs可以在一次通过。 这是由于它们的体系结构的内存限制,并且通常由它们的上下文窗口(我们在本章后面讨论的另一个概念)定义。 例如,在发布时,OpenAI的gpt-4模型有两个变体-一个具有8k令牌限制,另一个具有32k.同样,GPT3.5-Turbo,另一个OpenAI模型,有两个支持8k和16k令牌长度的模型。 目前正在进行积极的研究,看看如何解决这个问题,例如来自Microsoft Research的Long Nut[3],它展示了如何扩展到1b上下文窗口。 重要的是要指出,这仍然是一个活跃的研究领域,尚未产品化。
  • 成本:在考虑成本时,有两个维度:延迟、内存和整体体验方面的计算成本,以及金钱方面的实际成本。 对于每个调用,处理令牌所需的计算资源与令牌的长度直接相关。 随着令牌长度的增加,它需要更多的处理时间,从而导致更多的计算需求(特别是内存和 GPU)和更高的延迟。 这也意味着使用LLMs的成本增加。
  • AI 质量:模型输出的质量取决于要求生成或处理的令牌数量。 如果文本太短,模型可能没有足够的上下文来提供好的答案。相反,如果文本太长,模型的响应可能会失去连贯性。 我们将在第 6 章后面的 Prompt Engineering 中讨论好与差的概念。

对于很多企业来说,成本和性能将是关心令牌的关键因素。 一般来说,为了成本和效率,应该先使用较小的模型,然后再使用较大的模型。

下面的清单 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 设计的,不能互换。

  • WordPiece:由 Google 的 BERT 模型(来自 Transformers 的双向编码器表示)使用,它根据最常见的单词片段将文本分割成更小的单元,从而可以有效地表示罕见或词汇外的单词。
  • SentencePiece:由 Meta 的 RoBERTa 模型(Robustly OptimizedBERT)使用。它将 WordPiece 和 BPE 方法组合到一个与语言无关的框架中,从而提供了更大的灵活性。
  • T5 tokenizer:基于SentencePiece,由Google的T5模型(Text-to-Text Transfer Transformer)使用。
  • XLM tokenizer:这在 Meta 的 XLM(跨语言语言模型)中使用,并实现了具有学习嵌入的 BPE 方法(BPEmb)。 它旨在处理多语言文本并支持跨语言迁移学习。

2.6.3 Embeddings(嵌入)

嵌入是一种强大的机器学习工具,适用于表示单词的大型输入。 它们捕获向量空间(即向量集合,如图 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 中嵌入

在这里插入图片描述
嵌入产生的向量空间不是到标记的一对一映射,但可以更多。

2.6.4 模型配置

大多数LLMs向用户公开一些配置设置,允许用户在一定程度上调整模型的运行方式和行为。虽然一些参数会根据模型实现而变化,但两个关键配置是温度和最大响应。 请注意,某些实现可能具有不同的名称,但含义相同。 GPT 的 OpenAI 实现将最大响应称为最大令牌。 让我们更详细地探讨这些内容。

最大响应

称为“最大响应”的参数本质上定义了模型生成的文本长度的上限。 这意味着一旦模型达到这个预定长度,它就会停止文本生成,无论是词中还是句子中。 掌握这种配置至关重要,因为大多数模型可以处理的令牌都有大小限制,增加此大小对应于更高的计算需求,从而导致延迟和成本增加。

Temperature(温度)

与任何基础模型一样,生成文本时,固有的随机性在每次调用模型时都会产生不同的输出。 温度是最重要的设置之一,用于控制模型的随机程度。 通常,这是一个从 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 工作原理的示例

在这里插入图片描述

2.6.5 Context Window(上下文窗口)

上下文窗口是一个相对较新且非常重要的概念; 它指的是LLM在进行预测时考虑的特定单词或标记周围的标记或单词的范围。 上下文窗口帮助模型理解单词之间的依赖关系和关系,使其能够生成更准确、更连贯的预测。

例如,当预测句子中的下一个单词时,上下文窗口可能包括目标单词之前的几个单词。 上下文窗口的大小可能会根据模型及其架构的不同而有所不同。 在LLMs中,上下文窗口可能非常大,允许模型捕获单词之间的长距离依赖性和复杂的语义关系。 这可以提高文本生成、翻译和摘要任务的性能。

当前的 LLM 架构将上下文窗口大小限制为数千个令牌。 这主要是因为注意力机制的全局性质带来了上下文长度的二次方的计算成本。 换句话说,上下文窗口越大,计算成本与输入数据大小的平方成正比。 虽然拥有更大的上下文窗口可能看起来不错,但重要的是要了解它既有积极的影响,也有消极的影响。 较长的上下文窗口也会降低模型的性能。 虽然我们可能觉得较长的上下文会更好,但一般来说,如果足以完成手头的任务,请使用较小的窗口 - 它会比较大的窗口获得更好的性能。

优点:

  • 提高对上下文的理解:更长的上下文窗口允许模型捕获单词之间的远程依赖性和复杂的语义关系,从而实现更好的预测和更连贯的文本生成。
  • 在复杂任务中表现更好:通过更广泛的上下文窗口,语言模型可以在需要理解更广泛上下文的任务中表现更好,例如机器翻译、摘要和情感分析。

缺点:

  • 计算要求增加:较长的上下文窗口需要更多的内存和计算能力来处理和存储附加信息。 这可能会导致训练和推理时间更长,并且需要更强大的硬件或分布式计算解决方案。
  • 过度拟合的可能性:随着上下文窗口的增加,模型变得更加复杂并且容易过度拟合,特别是在训练数据有限的情况下。 当模型学会在训练数据上表现得非常好,但很难概括新的和未见过的数据时,就会发生过度拟合。
  • 难以处理非常长的序列:虽然较长的上下文窗口可以提高性能,但在处理极长的序列时它们也可能带来挑战。 某些模型可能难以在如此长的距离内维持必要的信息,从而导致性能下降。
  • 收益递减:虽然增加上下文窗口大小可以提高性能,但可能存在收益递减点,进一步增加只能产生边际改进。平衡上下文窗口大小与计算成本和模型复杂性以实现最佳性能至关重要。

上下文窗口作为一个概念非常重要,原因如下:

  • 捕获依赖关系:上下文窗口允许模型理解文本中单词、短语或句子之间的关系。 这有助于模型掌握输入的整体含义和上下文。
  • 改进的预测:这可能是我们大多数人在使用LLM时看到的,其中上下文窗口使模型能够根据前面的文本生成更准确和连贯的建议。
  • 提供上下文以便更好地理解:通过考虑上下文窗口,LLM可以更好地理解正在发生的上下文,从而理解文本中的句法结构和语义关系; 这可以实现更准确的语言理解和生成。

2.6.6 Prompt Engineering(提示词工程)

提示工程是一个相对较新的领域,是一种策划或设计提示的方法,以从机器学习模型(尤其是法学硕士)中引发所需的响应或行为。 提示工程是一项强大的技术,可以提高语言模型在各种任务上的性能。 提示工程是一个新兴领域,需要创造力和对细节的关注。

提示工程可以被视为艺术和科学,涉及输入命令的仔细选择和措辞,以帮助指导人工智能产生所需的输出。 这些输入命令可以非常简单,只需选择正确的单词、短语和格式即可指导模型为特定任务生成高质量且相关的文本。

例如,要获得详细的答案,您可以使用“详细解释…”之类的提示,或者使用“用几个项目符号进行总结…”之类的快速总结。类似地,让人工智能在 特定作者的风格,您可能会使用诸如“像 P.G.Wodehouse 一样写一段文章…”之类的提示。

提示工程需要了解 AI 模型的功能、底层训练数据以及它如何响应不同类型的输入。有效、快速的工程可以显着提高 Al模型在各种任务中的有用性。 注:本节只是介绍提示工程作为一个基本概念; 我们将在第 6 章后面更深入地介绍提示工程。

2.6.7 Model adaptation(模型适配)

大型语言模型是预先训练的和通用的,可以而且有时必须针对特定目的进行微调。 它们在大量文本数据上进行训练,并且可以用作针对特定任务的较小数据集进行训练的起点。 在较小的数据集上微调基础 LLM 可以提高其特定任务的性能。

微调是采用预先训练的模型并在新的任务数据集上进一步训练它。 以预训练的模型为起点,在训练过程中调整模型的权重,以提高其在新任务上的性能。 微调通常用于迁移学习,其中针对一项任务训练的模型适用于另一相关任务。

微调LLMs的一些例子包括:

  • 文本分类:针对特定文本分类任务(例如情感分析或垃圾邮件检测)微调LLM。
  • 问答:针对特定的问答任务对LLM进行微调,例如回答有关特定主题的问题。
  • 语言生成:针对特定语言生成任务对LLM进行微调,例如生成摘要或翻译。

2.6.8 Emergent Behavior(突现行为)

突现行为的概念定义了基础模型和LLMs的重要性。突现行为是LLMs在与环境交互时,特别是在使用大量数据进行训练时表现出的意外行为。 LLMs没有经过明确的培训来具备这些能力,而是通过观察自然语言来学习它们。 行为的出现是隐式诱导的,而不是显式构建的; 它既是科学兴奋的根源,也是对意外后果的焦虑的根源。

如下图 2.12 所示,根据论文《大型语言模型的涌现能力》[4],模型在多个自然语言基准(例如,问答)上的性能并不比随机机会更好,直到它们达到一定规模 - 在本例中通过 FLOP 中的训练计算。 此时模型的性能急剧提高,这是涌现能力的一个例子。 这有助于我们理解LLM的突现属性并不存在于较小的模型中。 此外,这些能力仅在模型大小达到一定阈值时才会按比例显示。 无法通过推断较小模型的性能来预测突现属性。

图 2.12 通过 FLOP 中的训练计算要求衡量的模型扩展
在这里插入图片描述
让我们通过一个例子进一步探讨这一点。

突现行为 - 一个例子

我们想用代码作为例子,因为一段代码正在执行的确切逻辑和本质无法预先确定或为LLM编程,它需要依靠基础模型的涌现行为属性来理解、分析和理解代码。

假设我们有一段 C 代码,如清单 2.4 所示,它反转了一个字符串。 这使用了 C 的一些更高级的功能,例如指针、异或运算符和宏。 在我们的示例中,我们使用 GPT-4 将此 C 函数转换为 Phyton。

清单 24 用 C 编写的函数来反转字符串

#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 来生成文本 - 既作为完成,我们通过提示提供说明,也作为聊天,我们可以进行对话并生成文本 文本,在对话的上下文中。

2.7 总结

  • 大型语言模型 (LLM) 是人工智能领域的一项重大进步,它通过大量文本数据进行训练来学习人类语言模式。
  • LLM是通用的,可以在没有特定于任务的训练数据的情况下处理任务,例如回答问题、撰写论文、总结文本、翻译语言和生成代码。
  • LLM的主要用例包括摘要、分类、问答/聊天机器人、内容生成、数据分析、翻译和本地化、流程自动化、研究和开发、情感分析和实体提取。
  • LLM的类型包括基础LLM、基于指令的LLM和微调LLM,每种类型都有优点和缺点,并由基础模型提供支持。
  • 基础模型是基于大量数据进行大规模训练的大型人工智能模型,从而产生可适应各种下游任务的模型。
  • LLM 的一些关键概念包括提示词、提示工程、嵌入、标记、模型参数、上下文窗口、transformer 架构和突现行为。
  • 开源和商业LLM各有优缺点。商业模型通常提供最先进的性能,开源模型为定制和集成提供更大的灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值