当前时代,预训练的大型语言模型 (LLM),例如 OpenAI 的 GPT-4 和 Meta 的 Llama x,已经越来越受开发者们的欢迎,它们比之前版本具有更好的可用性,在使用生成式 AI 的应用程序开发中发挥着关键的作用。
作为软件开发者,如何快速将 LLM 支持的功能纳入你的应用程序中?通过上下文学习与这些LLM进行互动的AI技术栈正在兴起。
在本文中,我们将根据上下文学习并探索新兴技术栈的每一层。
1、预训练LLM的定制
我们回想一下,现成的 LLM,例如 GPT-4 和 Llama 2,是在大量公开可用的在线数据源上预先训练的基础模型,包括 Common Crawl(数十亿个网页的存档)、Wikipedia( 基于社区的在线百科全书)和古腾堡计划(公共领域书籍的集合)。
GPT-4 的模型大小估计约为 1.76T 个参数,而 Llama 2 的模型大小为 70B 参数。由于预训练数据的广度,这些LLM适用于大多数用例。然而可能需要对预先训练的LLM进行调整,以使它们适合你的应用程序之特定场景。
有两种通用方法可以根据你的独特用例定制预训练LLM:微调与情境学习。
1.1 微调
微调涉及通过向预训练的LLM提供更小的、特定于领域的专有数据集来对其进行额外训练。这个过程将改变LLM的参数,从而使“模型的知识库”变得更加专业。
自 2023 年 12 月起,可通过 OpenAI 的官方 API 进行 GPT-3.5 Turbo 的微调。与此同时,GPT-4 的微调是通过实验性访问程序提供的,“合格的用户将在微调 UI 中看到请求访问的选项。”
Llama 2 的微调可以通过机器学习平台进行,例如 Google Colab 和 Hugging Face 的免费 LLM 库。
微调的优点:
-
通常比提示有质量更高的输出
-
能够提供比提示有更多的训练示例
-
由于提示较短,微调过程后的成本更低,延迟请求也更低
微调的缺点:
-
微调过程需要机器学习专业知识并且需要大量资源
-
在获得新技能的同时,存在失去预训练模型先前学到的技能(称为灾难性遗忘)的风险
-
过度拟合的挑战,当模型完全或过于接近其训练数据集时就会发
1.2 上下文学习
上下文学习不会改变底层的预训练模型。它通过结构化提示和相关检索数据来指导大语言模型输出,为模型提供“在正确的时间提供正确的信息”。
为了使 LLM 执行更具体的任务并以特定格式提供输出,可以使用少样本提示技术。除了主查询之外,预期输入和输出对的示例也会作为输入上下文的一部分传递给 LLM。回想一下,LLM的上下文由标记化数据组成,可以比作“模型的注意力广度”。这些示例对几乎就像一个有针对性的迷你训练数据集。
由于预先训练的LLM接受了公开可用的在线数据以及具有截止日期的许可数据集的训练,因此它们并不知道最近的事件和私人数据。
为了向LLM提供额外的源知识,还可以使用检索增强生成(RAG)技术。
LLM 之外的任何额外所需信息都可以作为输入上下文的一部分进行检索和传递。相关数据可能来自多个来源,例如矢量或 SQL 数据库、内部或外部 API 以及文档存储库。
截至 2023 年 12 月,GPT-4 Turbo 提供 128,000 个令牌的最大上下文长度,而 Llama 2 支持 4,096 个令牌的最大上下文长度。
上下文学习的优点:
-
不需要机器学习专业知识,并且比微调所需的资源更少
-
没有破坏底层预训练模型的风险
-
专业数据和专有数据的单独管理
上下文学习的缺点:
-
通常输出质量低于微调
-
LLM的最大上下文长度约束
-
由于较长的提示而导致更高的成本和更高的延迟请求
2、LLM技术栈
LLM技术栈中的各层和主要组件
新兴的LLM技术栈可以分为三个主要层和一个补充层:
-
数据层 - 预处理和存储私有数据的嵌入
-
编排层 - 协调所有各个部分,检索相关信息并构建提示
-
操作层(补充)- 用于监视、缓存和验证的附加工具
-
模型层 - 要立即执行的 LLM
我们将通过一个简单的应用程序示例来介绍数据、模型、编排和操作层:一个了解我们公司的产品、政策和常见问题解答的客户服务聊天机器人。
2.1 数据层
数据层涉及私有信息和补充信息的预处理和存储。数据处理可以分为三个主要步骤:提取、嵌入和存储。
数据层可用产品表(截至 2023 年 12 月,并非完全详尽)
-
提取
相关数据可能来自多种来源、多种格式。因此,建立连接器是为了从数据所在的任何位置获取数据以进行提取。
对于我们的客户服务聊天机器人,我们可能有一个云存储桶,其中包含内部 Word 文档和 PDF、PowerPoint 演示文稿以及公司网站的抓取 HTML。也许我们在客户关系管理 (CRM) 中心中拥有通过外部 API 访问的客户信息或存储在 SQL 数据库中的产品目录。其他来源可能是协作 wiki 中记录的团队流程或以前的用户支持电子邮件。简而言之,收集适合您的特定用例的所有各种数据。
有一个可选步骤,通过删除不必要或机密部分来清理提取的数据。另一个可选步骤是将提取的数据转换为标准化格式(例如 JSON),以便下游进行高效处理。
根据你的数据复杂性和规模,文档加载器或数据管道可能适合。如果有少量数据源,且数据不经常更改,并且以常见格式(文本、CSV、HTML、JSON、XML 等)存储,需要最少的处理,那么更简单的文档加载器就足够了。文档加载器可以连接到您的数据源,并提供提取和转换内容的基本功能。但是,如果你必须聚合许多多样化且包含实时流的海量数据源并进行更密集的处理,那么数据管道更合适。数据管道旨在提高数据源的可扩展性和灵活性,并降低处理延迟。
-
嵌入
嵌入是捕获语义并表示为向量的数字表示。可以比较嵌入,例如通过计算它们之间的距离,以了解它们的相关程度。创建提取数据的嵌入可以快速分类和搜索非结构化数据。
矢量数据(来源:Pinecone 矢量数据的兴起)
要创建提取数据的嵌入,需要嵌入模型,例如 OpenAI 的 Ada V2。该模型采用输入文本(通常作为字符串或标记数组),并返回嵌入输出。Ada V2 还通过传递字符串数组或令牌数组数组来接受单个请求中的多个输入。截至 2023 年 12 月,Ada V2 可以通过 API 端点访问。
一个可选步骤是分块,即将输入文本分解成更小的片段或块。有一些库支持不同的分块方法,例如基本的固定大小或高级的句子分割。如果输入文本非常大,则需要分块,因为嵌入模型有大小限制。截至撰写本文时,Ada V2 的最大输入长度为 8,192 个标记,数组的维度不能超过 2,048 个。
-
存储
然后,生成的嵌入与原始提取的数据一起存储在矢量数据库或与矢量搜索扩展集成的传统数据库中。
矢量数据库是一种针对矢量数据的索引和存储进行优化的数据库,可实现快速检索和相似性搜索。它提供常见的数据库 CRUD 操作,专为可扩展性、实时更新和数据安全性而设计。
将矢量搜索扩展添加到现有的传统数据库(SQL 或 NoSQL)通常是一个更简单、更快速的过渡过程,因为它利用了当前的数据库基础设施和专业知识。然而,这种方法最适合简单的矢量搜索功能。本质上,传统数据库和矢量数据库是基于不同优先级构建的。例如,关系数据库重视事务的一致性和原子性。而矢量数据库重视搜索速度和可用性,因此“[容忍]更新的最终一致性。” 将矢量搜索功能改造到传统数据库可能会影响性能。拥有专用的矢量数据库也意味着其操作和维护与现有数据库是分开的。
各种类型的数据存储
2.2 模型层
模型层包含用于你的应用程序开发的现成 LLM,例如 GPT-4 或 Llama 2。选择适合您的特定目的以及成本、性能和复杂性要求的 LLM。对于客户服务聊天机器人,我们可以使用 GPT-4,它针对对话进行了优化,提供强大的多语言支持,并具有高级推理功能。
访问方法取决于特定的LLM(无论是专有的还是开源的)以及模型的托管方式。通常,会有一个用于 LLM 推理或提示执行的 API 端点,它接收输入数据并生成输出。在撰写本文时,GPT-4 的 API 端点是这里。
模型层可用产品表(截至 2023 年 12 月)
2.3 编排层
编排层由主框架组成,负责与其他层和任何外部组件进行协调。该框架提供了用于处理 LLM 技术堆栈主要部分的工具和抽象。它为常见任务提供库和模板,例如提示构建和执行。在某种程度上,它类似于模型-视图-控制器(MVC)架构设计模式中的控制器。
通过上下文学习方法,编排框架将接受用户查询,根据模板和有效示例构建提示,通过与向量数据库的相似性搜索来检索相关数据,也许从 API 中获取其他必要的信息,以及 然后将整个上下文输入提交到指定端点的 LLM。然后该框架接收并处理 LLM 输出。
对于我们简单的客户服务聊天机器人,假设用户询问退款政策:
1、已经设置了包含说明和示例的提示模板。
-
指令是:“您是一位乐于助人且有礼貌的客户服务代表,会回答用户的询问:{query}。以下是一些对话示例。”
-
几个例子:[{input:“你们的总部位于哪里?”,output:“我们公司总部位于加利福尼亚州洛杉矶。”},{input:“你能检查我的订单状态吗?”,output: “是的,我可以帮助检查您的订单状态。”}]。
2、该框架在向量数据库中查询与“退款政策”相关的数据,并得到结果:“购买后 30 天内新的和未使用的商品允许退款。退款将在 3-5 个工作日内按原始付款方式发放。”
3、该框架将带有上下文信息的整个提示发送到所选的 LLM(在我们的示例中为 GPT-4)以进行推理。
4、GPT-4 返回输出“我们允许在购买后 30 天内对新的和未使用的商品进行退款。您应该会在 3-5 个工作日内收到按照原始付款方式的退款。”
5、该框架用 LLM 输出响应用户。
Flowise 视觉工具中的简单 LLM 链
LangChain(一个JavaScript 和 Python 混合提供的库)就是一个示例框架,它包含通用组件的接口和集成,以及将多个步骤组合成“链”的能力。除了编程框架之外,还有可用于编排的 GUI 框架。
例如,建立在 LangChain 之上的 Flowise 具有图形布局,可以在视觉上将主要组件链接在一起。
编排层的可用产品表(截至 2023 年 12 月)
2.4 操作层
随着 LLM 支持的应用程序进入生产和规模化,可以添加操作层 (LLMOps) 以提高性能和可靠性。下面列出了 LLMOps 工具的一些领域:
-
监控 - 记录、跟踪和评估 LLM 输出,为改进即时构建和模型选择提供见解。
-
缓存 - 利用语义缓存来存储 LLM 输出,以减少 LLM API 调用,从而降低应用程序响应时间和成本。
-
验证 - 检查 LLM 输入以检测即时注入攻击,这种攻击会恶意操纵 LLM 行为和输出。LLM 输出还可以根据指定的规则进行验证和纠正。
对于我们的客户服务聊天机器人,可以记录LLM的请求和响应,并在以后评估其准确性和有用性。如果许多用户询问退款政策,可以从缓存中检索答案,而不是在 LLM 端点执行提示。
为了防止用户输入恶意查询,可以在提示构建和推理之前验证消息。结合这些 LLMOps 工具使我们的应用程序更加高效和健壮。
操作层可用产品表(截至 2023 年 12 月)
3、结束语
我们共同研究了微调与情境学习方法,可以帮您在LLM申请调整和预训练模型,并让后者更加容易入门。
当前,有一个新流行的技术栈可以通过上下文学习方法与LLM进行互动。这个技术栈由三个主要层(数据、模型与编排层)和一个补充层(操作层)组成。每层中的可用工具都可以启动 LLM 支持的应用程序开发。
作者:金宝
参考:
https://www.codesmith.io/blog/introducing-the-emerging-llm-tech-stack