详解向量检索、Agent、提示工程等 LLM 生产系统的核心架构,是工程师快速掌握系统级最佳实践的参考指南。
大语言模型是构建软件的强大新型原始工具。但由于它们非常新颖——且与常规计算资源的行为截然不同——如何使用它们并不总是显而易见的。
在这篇文章中,我们分享一个新兴 LLM 应用栈的参考架构。它展示了我们在 AI 初创公司和先进科技公司中看到的最常见系统、工具和设计模式。这个栈仍处于早期阶段,随着底层技术的进步可能会大幅变化,但我们希望它能对当今从事 LLM 工作的开发者有所帮助。
这项工作基于与 AI 初创公司创始人和工程师的对话。我们特别感谢以下人员的意见:Ted Benson、Harrison Chase、Ben Firshman、Ali Ghodsi、Raza Habib、Andrej Karpathy、Greg Kogan、Jerry Liu、Moin Nadeem、Diego Oppenheimer、Shreya Rajpal、Ion Stoica、Dennis Xu、Matei Zaharia 和 Jared Zoneraich。感谢你们的帮助!
注:这些组件的完整、实时更新的版本可在我们 GitHub 上的 LLM App Stack 仓库中获得。
下面是我们对 LLM 应用栈的当前观点(点击放大):
以下是每个项目的链接列表供快速参考:
构建 LLM 应用有许多不同的方法,包括从头训练模型、微调开源模型或使用托管 API。我们展示的栈基于上下文内学习,这是我们看到大多数开发者开始采用的设计模式(且仅在基础模型出现后才成为可能)。
下一部分简要解释这种模式;有经验的 LLM 开发者可以跳过本部分。
上下文内学习的核心理念是使用现成的 LLM(即无需任何微调),然后通过巧妙的提示工程和对私有"上下文"数据的调节来控制其行为。
例如,假设你正在构建一个聊天机器人来回答关于一组法律文件的问题。采用幼稚的方法,你可以将所有文件粘贴到 ChatGPT 或 GPT-4 提示中,然后在最后提出一个问题。这对于非常小的数据集可能有效,但不可扩展。最大的 GPT-4 模型只能处理约 50 页的输入文本,当接近这个称为上下文窗口的上限时,性能(由推理时间和准确性衡量)会严重下降。
上下文内学习通过一个巧妙的技巧解决了这个问题:与其在每个 LLM 提示中发送所有文件,不如只发送少量最相关的文件。而最相关的文件是通过...你猜对了...LLM 的帮助来确定的。
在很高的层面上,工作流可以分为三个阶段:
数据预处理 / 嵌入: 这个阶段涉及存储私有数据(在我们的例子中是法律文件)以供稍后检索。通常,文件被分解成块,通过嵌入模型处理,然后存储在称为向量数据库的专用数据库中。
提示构建 / 检索: 当用户提交查询(在这种情况下是法律问题)时,应用程序构造一系列要提交给语言模型的提示。组装的提示通常结合开发者硬编码的提示模板、称为少样本示例的有效输出示例、从外部 API 检索的任何必要信息,以及从向量数据库检索的一组相关文件。
提示执行 / 推理: 编译提示后,它们被提交给预训练的 LLM 进行推理——包括专有模型 API 和开源或自训练模型。一些开发者还在这个阶段添加日志、缓存和验证等操作系统。
这看起来像是大量工作,但通常比另一种选择更容易:训练或微调 LLM 本身。你不需要专门的机器学习工程师团队来进行上下文内学习。你也不需要托管自己的基础设施或从 OpenAI 购买昂贵的专用实例。这种模式有效地将 AI 问题简化为数据工程问题,这是大多数初创公司和大公司已经知道如何解决的。对于相对较小的数据集,它也倾向于优于微调——因为特定的信息需要在训练集中出现至少约 10 次,LLM 才会通过微调记住它——并且可以近实时地合并新数据。
围绕上下文内学习的最大问题之一是:如果我们只是改变基础模型以增加上下文窗口会发生什么?这确实是可能的,也是活跃的研究领域(例如,参见 Hyena 论文或这篇最近的文章)。但这伴随着许多权衡——主要是推理的成本和时间与提示长度成二次方关系增长。今天,即使是线性缩放(最佳理论结果)对许多应用程序来说也会禁止性地昂贵。按当前 API 费率,对 10,000 页的单个 GPT-4 查询会花费数百美元。因此,我们不期望基于扩展上下文窗口对栈进行大幅改变,但我们将在这篇文章的正文中进一步评论这一点。
如果你想更深入地了解上下文内学习,AI 经典中有许多很好的资源(特别是"使用 LLM 构建的实践指南"部分)。在这篇文章的其余部分,我们将使用上面的工作流作为指南,逐步介绍参考栈。
LLM 应用的上下文数据包括文本文件、PDF,甚至 CSV 或 SQL 表等结构化格式。数据加载和转换解决方案在我们交谈的开发者中差异很大。大多数使用传统的 ETL 工具,如 Databricks 或 Airflow。一些也使用集成到编排框架中的文件加载器,如 LangChain(由 Unstructured 提供)和 LlamaIndex(由 Llama Hub 提供)。不过,我们认为栈的这一部分相对欠发达,有机会为 LLM 应用构建专用的数据复制解决方案。
对于嵌入,大多数开发者使用 OpenAI API,特别是 text-embedding-ada-002 模型。它易于使用(特别是如果你已经在使用其他 OpenAI API),提供合理的结果,且成本越来越低。一些较大的企业也在探索 Cohere,它更专注于嵌入产品,在某些场景中有更好的性能。对于倾向于开源的开发者,来自 Hugging Face 的 Sentence Transformers 库是业界标准。也可以创建针对不同用例量身定制的不同类型的嵌入;这是当今的利基实践,但是一个很有前景的研究领域。
从系统的角度来看,预处理管道中最重要的部分是向量数据库。它负责高效地存储、比较和检索多达数十亿个嵌入(即向量)。我们在市场上看到的最常见的选择是 Pinecone。它是默认选择,因为它完全是云托管的——所以容易上手——并且具有大型企业在生产中需要的许多功能(例如,规模下的良好性能、SSO 和可用性 SLA)。
不过,有大量可用的向量数据库。值得注意的是:
开源系统如 Weaviate、Vespa 和 Qdrant: 它们通常提供出色的单节点性能,可以针对特定应用进行定制,因此在更喜欢构建定制平台的经验丰富的 AI 团队中很受欢迎。
本地向量管理库如 Chroma 和 Faiss: 它们拥有出色的开发者体验,易于为小应用和开发实验快速部署。它们在规模上不一定能替代完整数据库。
OLTP 扩展如 pgvector: 对于那些总想用 Postgres 解决所有数据库问题的开发者——或从单个云提供商购买大部分数据基础设施的企业——这是向量支持的一个很好的解决方案。从长期来看,紧密耦合向量和标量工作负载是否有意义还不清楚。
展望未来,大多数开源向量数据库公司都在开发云版本。我们的研究表明,在云环境中跨越广泛的应用场景实现强大性能是一个极具挑战性的问题。因此,可选项在短期内可能不会发生重大变化,但长期来看可能会改变。关键问题是向量数据库是否会像 OLTP 和 OLAP 那样整合,最终集中在一个或两个主流系统上。
另一个开放问题是,随着大多数模型的可用上下文窗口增大,嵌入向量和向量数据库将如何演变。人们很容易认为嵌入向量将变得不那么相关,因为上下文数据可以直接输入到提示词中。但是,该领域专家的反馈表明了相反的情况——嵌入向量管道可能会变得更加重要。大型上下文窗口是一个强大的工具,但它们也带来了显著的计算成本。因此,有效利用它们成为了首要任务。我们可能会开始看到不同类型的嵌入向量模型变得流行,这些模型专门针对模型相关性进行训练,以及为实现和充分利用这一点而设计的向量数据库。
提示大语言模型的策略以及整合上下文数据的方法正变得越来越复杂——同时作为产品差异化的来源也变得越来越重要。大多数开发者通过尝试简单提示词开始新项目,这些提示词包括直接指令(零样本提示)或可能的一些示例输出(少样本提示)。这些提示词通常能取得不错的结果,但达不到生产环境部署所需的准确度水平。
下一个层级的提示工程技巧旨在将模型响应基于某个真实来源,并提供模型未接受过训练的外部上下文。《提示工程指南》列举了不少于 12 种(!)更高级的提示策略,包括思维链、自洽性、生成知识、思维树、定向刺激等等。这些策略也可以配合使用,以支持文档问答、聊天机器人等不同的大语言模型用例。
这正是 LangChain 和 LlamaIndex 等编排框架大显身手的地方。它们抽象化了提示链的许多细节、与外部 API 的交互(包括确定何时需要 API 调用)、从向量数据库检索上下文数据,以及在多个大语言模型调用间维护状态。它们还为上面提到的许多常见应用提供了模板。它们的输出是单个提示词或一系列提示词,用于提交给语言模型。这些框架在爱好者和初创公司中被广泛使用,用于快速启动应用,其中 LangChain 是领导者。
LangChain 仍然是一个相对较新的项目(目前版本为 0.0.201),但我们已经开始看到用它构建的应用进入生产环境。某些开发者,特别是大语言模型的早期采用者,更倾向于在生产环境中切换到原始 Python,以消除添加的依赖。但我们预期这种自己动手的方法会随着时间推移而在大多数用例中衰退,类似于传统网络应用栈的演变。
眼光敏锐的读者会注意到编排框架中一个看似奇怪的条目:ChatGPT。在其常见形式中,ChatGPT 是一个应用,而不是开发者工具。但它也可以作为 API 访问。而且,如果你仔细看,它执行了与其他编排框架相同的一些功能,比如:抽象化对自定义提示词的需求;维护状态;以及通过插件、API 或其他来源检索上下文数据。虽然不是这里列出的其他工具的直接竞争对手,但 ChatGPT 可以被视为替代方案,它最终可能成为提示构建的可行、简单的替代品。
如今,OpenAI 在语言模型领域处于领先地位。我们交谈过的几乎每位开发者都通过 OpenAI API 启动新的大语言模型应用,通常使用 gpt-4 或 gpt-4-32k 模型。这为应用性能提供了最佳案例,使用也很方便,因为它可以在广泛的输入域上运作,通常不需要微调或自托管。
当项目进入生产环境并开始扩展时,更广泛的选项就开始起作用。我们听到的一些常见选项包括:
切换到 gpt-3.5-turbo:它的成本大约便宜 50 倍,速度也明显快于 GPT-4。许多应用不需要 GPT-4 级别的准确度,但需要低延迟推理和为免费用户提供具有成本效益的支持。
尝试其他专有供应商(特别是 Anthropic 的 Claude 模型):Claude 提供快速推理、GPT-3.5 级别的准确度、为大客户提供更多的定制选项,以及最多 100k 的上下文窗口(尽管我们发现准确度随着输入长度的增加而下降)。
将某些请求转向开源模型:这在高容量 B2C 用例(如搜索或聊天)中特别有效,这些用例中查询复杂度差异很大,需要廉价地服务免费用户。这通常与微调开源基础模型一起进行最有意义。我们在本文中不深入探讨该工具栈,但 Databricks、Anyscale、Mosaic、Modal 和 RunPod 等平台被越来越多的工程团队使用。开源模型有多种推理选项可用,包括 Hugging Face 和 Replicate 的简单 API 接口;来自主要云提供商的原始计算资源;以及上面列出的更具见解的云产品。
这通常与微调开源基础模型一起进行最有意义。我们在本文中不深入探讨该工具栈,但 Databricks、Anyscale、Mosaic、Modal 和 RunPod 等平台被越来越多的工程团队使用。
开源模型有多种推理选项可用,包括 Hugging Face 和 Replicate 的简单 API 接口;来自主要云提供商的原始计算资源;以及上面列出的更具见解的云产品。
开源模型目前落后于专有产品,但差距正在缩小。Meta 的 LLaMa 模型为开源准确度设定了新的标准,并引发了一系列变体。由于 LLaMa 仅获得了研究用途的许可,一些新的提供商已经介入训练替代基础模型(例如 Together、Mosaic、Falcon、Mistral)。Meta 也在讨论 LLaMa 2 的真正开源发布。
当(而不是如果)开源大语言模型达到与 GPT-3.5 相当的准确度水平时,我们预期会看到文本领域的类似 Stable Diffusion 时刻——包括大规模实验、共享和微调模型的产品化。Replicate 等托管公司已经在添加工具,使这些模型更容易被软件开发者使用。开发者中越来越相信,较小的微调模型可以在狭窄的用例中达到最先进的准确度。
我们交谈过的大多数开发者还没有深入研究大语言模型的运维工具。缓存相对常见——通常基于 Redis——因为它可以改善应用响应时间和成本。Weights & Biases 和 MLflow(从传统机器学习移植而来)或 PromptLayer 和 Helicone(专为大语言模型构建)等工具也被相当广泛地使用。它们可以记录、跟踪和评估大语言模型的输出,通常目的是改进提示构建、调整管道或选择模型。还有许多新工具正在开发中,用来验证大语言模型的输出(例如护栏)或检测提示注入攻击(例如 Rebuff)。大多数这些运维工具都促进使用自己的 Python 客户端来进行大语言模型调用,所以看看这些解决方案随着时间的推移如何共存会很有趣。
最后,大语言模型应用的静态部分(即除了模型之外的所有内容)也需要托管在某个地方。到目前为止,我们看到的最常见的解决方案是 Vercel 或主要云提供商等标准选项。但两个新的类别正在出现。Steamship 等初创公司为大语言模型应用提供端到端托管,包括编排(LangChain)、多租户数据上下文、异步任务、向量存储和密钥管理。Anyscale 和 Modal 等公司允许开发者在一个地方托管模型和 Python 代码。
这个参考架构中最重要的缺失组件是 AI 智能体框架。AutoGPT 被描述为"一个使 GPT-4 完全自主的实验性开源尝试",是今年春天增长最快的 Github 仓库,几乎当今每个 AI 项目或初创公司都以某种形式包含智能体。
我们与之交谈的大多数开发者对智能体的潜力兴奋不已。我们在本文中描述的上下文学习模式在解决幻觉和数据新鲜度问题方面有效,以更好地支持内容生成任务。另一方面,智能体给 AI 应用一个全新的功能集:解决复杂问题、在外部世界采取行动,以及从部署后的经验中学习。它们通过高级推理/规划、工具使用以及记忆/递归/自省的组合来实现这一点。
因此,AI 智能体有潜力成为 LLM 应用架构的核心组成部分(如果你相信递归式自我改进,它甚至可能接管整个技术栈)。LangChain 等现有框架也已经融入了一些 AI 智能体的概念。只有一个问题:AI 智能体目前还无法真正可靠地工作。如今,大多数 AI 智能体框架仍处于概念验证阶段——它们能够完成令人惊叹的演示,但还无法可靠、可复现地完成任务。我们将持续关注它们在不久的将来会如何发展。
预训练 AI 模型代表着自互联网诞生以来,软件领域最重要的一次架构变革。它们使个人开发者能够在短短几天内构建出令人惊叹的 AI 应用,超越那些过去需要大型团队耗费数月才能完成的监督式机器学习项目。
我们在这里介绍的工具和模式,很可能只是集成 LLM 的起点,而非最终形态。随着重大变化的发生(例如转向模型训练),我们将更新本文,并在适当时发布新的参考架构。如果你有任何反馈或建议,请与我们联系。
是 Andreessen Horowitz 的普通合伙人,专注于 AI 和数据系统。
投资 Mirendil Matt Bornstein 和 Malika Aubakirova
为什么我们需要持续学习 Malika Aubakirova 和 Matt Bornstein
与 GitHub 联合创始人 Scott Chacon 一起重新思考编码智能体时代的 Git Scott Chacon 和 Matt Bornstein
投资 GitButler Peter Levine 和 Matt Bornstein
投资 Inferact Matt Bornstein、Jason Cui 和 Raghu Raghuram
是 Andreessen Horowitz 基础设施团队的投资合伙人,专注于 AI 和基础设施。
投资 Mirendil Matt Bornstein 和 Malika Aubakirova
为什么我们需要持续学习 Malika Aubakirova 和 Matt Bornstein
与 GitHub 联合创始人 Scott Chacon 一起重新思考编码智能体时代的 Git Scott Chacon 和 Matt Bornstein
投资 GitButler Peter Levine 和 Matt Bornstein
投资 Inferact Matt Bornstein、Jason Cui 和 Raghu Raghuram
涵盖重塑 AI 和基础设施领域最新趋势的分析与新闻。
我们建立了一个专家网络,他们深耕技术领域,并深入理解技术如何塑造我们的未来。订阅我们的新闻简报,获取他们的观点。
我们建立了一个专家网络,他们深耕技术领域,并深入理解技术如何塑造我们的未来。订阅我们的新闻简报,获取他们的观点。
“帖子”(包括播客、视频和社交媒体)中表达的观点,均属于其中所引用的 a16z 相关人员个人,不代表 a16z Capital Management, L.L.C.(“a16z”)或其各自关联方的观点。a16z Capital Management 是一家在美国证券交易委员会注册的投资顾问。注册为投资顾问并不意味着具备任何特殊技能或接受过特殊培训。这些帖子并非面向任何投资者或潜在投资者,也不构成出售任何证券的要约或购买任何证券的要约邀请,且不得用于或作为评估任何投资价值的依据。
此处以及任何相关分发平台和 a16z 的任何公开在线社交媒体账户、平台与网站(统称为“内容分发渠道”)中提供的内容,均不应以任何方式被解读为或作为投资、法律、税务或其他建议的依据。对于任何投资涉及的法律、商业、税务及其他相关事项,你应咨询自己的顾问。这些材料中表达的任何预测、估算、预报、目标、前景和/或观点均可能随时变更,恕不另行通知,并且可能与他人表达的观点不同或相反。此处或 a16z 内容分发渠道中提供的任何图表仅供参考,不应作为作出任何投资决策的依据。此处包含的某些信息来自第三方来源,包括由 a16z 管理的基金所投资的投资组合公司。尽管这些信息取自被认为可靠的来源,但 a16z 并未对其进行独立核实,也不就这些信息的持续准确性或其对于特定情形的适用性作出任何陈述。此外,帖子中可能包含第三方广告;a16z 未审核此类广告,也不认可其中包含的任何广告内容。所有内容仅反映所标示日期当时的情况。
在任何情况下,本网站或相关内容分发渠道中提供的任何帖子或其他信息,均不应被解读为邀请购买或出售由 a16z 相关人员发起、讨论或提及的任何证券或集合投资工具权益的要约。它们也不应被解读为提供投资咨询服务的要约;投资于由 a16z 管理的集合投资工具的要约,将另行作出,并且只能通过相应集合投资工具的保密发行文件进行——这些文件应完整阅读,而且此类要约仅面向除其他要求外,还符合联邦证券法规定的特定资格条件的人士。此类投资者被定义为认可投资者和合格购买者,通常被认为具备评估潜在投资及财务事项之价值与风险的能力。
无法保证 a16z 的投资目标能够实现,或其投资策略能够成功。对 a16z 管理的任何投资工具进行投资均涉及高度风险,包括全部投资金额损失的风险。此处提及、引用或描述的任何投资或投资组合公司,并不能代表 a16z 管理的投资工具中的全部投资;无法保证这些投资会盈利,也无法保证未来进行的其他投资会具有类似特征或取得类似结果。由 a16z 管理的基金所进行的投资列表可在此处查看:https://a16z.com/investments/。a16z 的投资、集合投资工具或投资策略过去取得的结果,并不一定预示未来结果。该列表不包括发行方未授权 a16z 公开披露的投资(以及某些公开交易的加密货币/数字资产)。对于其在任何加密货币或代币项目中的投资,a16z 从自身经济利益出发行事,不一定代表其他代币持有者的利益。a16z 在这些项目中不拥有任何特殊角色,也无权控制其管理。除作为投资者之外,a16z 不承诺继续以任何方式参与这些项目,并且