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