【大语言模型】LLM应用程序的新兴体系结构

news2024/11/16 21:42:28

LLM应用程序的新兴体系结构

  • LLM应用栈
  • 设计模式:In-context learning
    • Data Preprocessing/Embedding
    • Prompt Construction/Retrieval
    • Prompt Execution/Inference
  • What about agents?
  • 展望
  • 参考资料

大型语言模型是构建软件的强大新基元。但由于它们非常新颖且与常规计算资源的行为差异很大,如何使用它们并不总是显而易见。

在本文中,我们分享了新兴的大型语言模型应用栈的参考架构。它展示了我们在人工智能初创公司和高级技术公司中看到的最常见的系统、工具和设计模式。这个栈仍处于非常早期阶段,随着基础技术的进步,它可能会发生重大变化,但我们希望它能成为现在与大型语言模型一起工作的开发人员的有用参考。

LLM应用栈

以下是LLM应用程序堆栈的当前视图:
Emerging LLM App Stack
以下是指向每个项目的链接的列表以快速参考:

Data pipelinesEmbedding modelsVector databasePlaygroundOrchestrationAPIs/pluginsLLM cache
DatabricksOpenAIPineconeOpenAILangchainSerpRedis
AirflowCohereWeaviatenat.devLlamaIndexWolframSQLite
UnstructuredHugging FaceChromaDBHumanloopChatGPTZapierGPTCache
pgvector
Logging/LLMopsValidationApp hostingLLM APIs (proprietary)LLM APIs (open)Cloud providersOpinionated clouds
Weights & BiasesGuardrailsVercelOpenAIHugging FaceAWSDatabricks
MLflowRebuffSteamshipAnthropicReplicateGCPAnyscale
PromptLayerMicrosoft GuidanceStreamlitAzureMosaic
HeliconeLMQLModalCoreWeaveModal
RunPod

有许多不同的方法可以使用LLM构建,包括从头开始训练模型微调开源模型使用托管API。我们在这里展示的技术栈是基于上下文学习的,这是我们看到的大多数开发人员一开始的设计模式(现在只有基础模型才有可能)。

下一节将简要解释这种模式;有经验的LLM开发人员可以跳过本节。

设计模式:In-context learning

上下文学习的核心思想是使用现成的LLM(即,没有任何微调),然后通过对私人“上下文”数据的巧妙提示和条件调节来控制他们的行为

例如,假设您正在构建一个聊天机器人来回答有关一组法律文件的问题。采取一种native的方法,可以将所有文档粘贴到ChatGPT或GPT-4提示中,然后在最后询问有关它们的问题。这可能适用于非常小的数据集,但不能扩展。最大的GPT-4模型只能处理大约50页的输入文本,并且性能(以推理时间和准确性衡量)随着接近这个极限(称为上下文窗口)而严重下降。

上下文学习用一个聪明的技巧解决了这个问题:**它不是在每个LLM提示下发送所有文档,而是只发送少数最相关的文档。**最相关的文件是在…的帮助下确定的。猜对了,就是LLM。

在很高的层次上,工作流程可以分为三个阶段:

  • Data preprocessing/embedding: 这个阶段涉及存储稍后要检索的私有数据(在我们的示例中是法律文档)。通常,文档被分解成块,通过一个embedding模型传递,然后存储在一个称为向量数据库的专门数据库中。
  • Prompt construction/retrieval:当用户提交查询(在这种情况下是一个法律问题)时,应用程序会构造一系列提示以提交给语言模型。编译后的提示通常结合了由开发人员硬编码的提示模板;有效输出的示例称为few-show示例;从外部API检索到的任何必要信息;以及从向量数据库检索到的一组相关文档。
  • Prompt execution/inference:一旦编译了提示,就将其提交给经过预训练的LLM进行推理,包括专有模型API和开源或自训练模型。一些开发人员还在这个阶段添加了日志记录、缓存和验证等操作系统。

这看起来需要做很多工作,但通常比其他选择更容易:训练或微调LLM本身。不需要专门的ML工程师团队来进行上下文学习。也不需要托管自己的基础设施,也不需要从OpenAI购买昂贵的专用实例。这种模式有效地将人工智能问题简化为大多数初创公司和大公司已经知道如何解决的数据工程问题。对于相对较小的数据集,它也往往优于微调,因为一条特定的信息需要在训练集中出现至少约10次,LLM才能通过微调记住它,并可以近乎实时地合并新数据。

上下文学习中最大的问题之一是:如果我们只是改变底层模型来增加上下文窗口,会发生什么?这确实是可能的,也是一个活跃的研究领域(例如,见Hyena论文或这篇最近的帖子)。但这需要进行一些权衡,主要是推理的成本和时间与提示的长度成二次关系。如今,对于许多应用来说,即使是线性缩放(最佳理论结果)也会导致成本过高。按目前API的价格,一个超过10000页的GPT-4查询将花费数百美元。因此,不希望基于扩展的上下文窗口对堆栈进行大规模更改,但我们将在文章正文中对此进行更多讨论。

如果你想更深入地了解上下文学习,AI canon中有很多很棒的资源(尤其是“LLM构建实用指南”部分)。在本文的剩余部分中,我们将以上面的工作流程为指导,浏览参考堆栈。

Data Preprocessing/Embedding

Data Preprocessing/Embedding
LLM应用程序的上下文数据包括文本文档、PDF,甚至CSV或SQL表等结构化格式。针对这些数据的数据加载和转换解决方案在我们采访过的开发人员中差异很大。大多数使用传统的ETL工具,如Databricks或Airflow。有些还使用构建在编排框架中的文档加载器,如LangChain(由Unstructured提供支持)和LlamaIndex(由Llama Hub提供支持)。不过,我们认为这一部分相对来说还不成熟,而且有机会为LLM应用程序专门构建数据复制解决方案

对于嵌入,大多数开发人员使用OpenAI API,特别是text-embedding-ada-002模型。它很容易使用(尤其是如果你已经在使用其他OpenAI API),效果相当好,而且越来越便宜。一些较大的企业也在探索Cohere,它将产品重点放在嵌入上,并在某些场景中具有更好的性能。对于喜欢开源的开发人员来说,Hugging Face的句子转换器库是一个标准。还可以根据不同的用例创建不同类型的嵌入;这在今天是一个小众的实践,但却是一个很有前途的研究领域

从系统的角度来看,预处理流水线中最重要的部分是向量数据库。它负责高效地存储、比较和检索多达数十亿个嵌入(即向量)。我们在市场上看到的最常见的选择是Pinecone。它是默认的,因为它是完全云托管的,所以很容易上手,并且具有大型企业在生产中需要的许多功能(例如,良好的规模性能、SSO和正常运行时间SLA)。

不过,有大量可用的向量数据库。值得注意的是:

  • 像Weaviate、Vespa和Qdrant这样的开源系统:它们通常具有出色的单节点性能,可以针对特定应用进行定制,因此深受喜欢构建定制平台的经验丰富的人工智能团队的欢迎。
  • Chroma和Faiss等本地向量管理库:它们拥有众多具有丰富开发经验的开发者,很容易在小型应用程序和开发实验中进行开发。但是它们不一定能取代大规模的完整数据库。
  • OLTP扩展,如pgvector:对于那些看到每个database-shaped漏洞并试图插入Postgres或从单个云提供商购买大部分数据基础设施的企业的开发人员来说,这是一个很好的向量支持解决方案。从长远来看,将向量和标量工作负载紧密耦合是否有意义尚不清楚。

展望未来,大多数开源向量数据库公司都在开发云产品。研究表明,在可能用例的广阔设计空间中,在云中实现强大的性能是一个非常困难的问题。因此,可选的集合在短期内可能不会发生巨大变化,但在长期内可能会发生变化。关键问题是向量数据库是否会类似于OLTP和OLAP,围绕一两个流行的系统进行整合

另一个悬而未决的问题是,随着大多数模型可用上下文窗口的增长,嵌入和向量数据库将如何发展。人们很容易说嵌入将变得不那么相关,因为上下文数据可以直接放入提示中。然而,专家对这一主题的反馈表明,随着时间的推移,embedding pipeline可能会变得更加重要。大型上下文窗口是一个强大的工具,但它们也需要大量的计算成本。因此,有效利用它们成为当务之急。我们可能会开始看到不同类型的嵌入模型变得流行,直接针对模型相关性进行训练,并设计向量数据库来实现和利用这一点。

Prompt Construction/Retrieval

Prompt Costruction/Retrieval
作为产品差异化的来源,促进LLM和整合上下文数据的策略变得越来越复杂,也越来越重要。大多数开发人员通过试验简单的提示来启动新项目,包括直接指令(零样本提示)或可能的一些示例输出(few-shot提示)。这些提示通常会产生良好的结果,但达不到生产部署所需的准确性水平

下一个级别的提示jiu jitsu旨在将模型反应建立在一些真实来源的基础上并提供模型没有接受过训练的外部环境。《提示工程指南》列出了不少于12种更先进的提示策略,包括思维链自洽性生成的知识思维树定向刺激等。这些策略还可以用于支持不同的LLM用例,如文档问答、聊天机器人等。

这就是像LangChain和LlamaIndex这样的Orchestration框架大放异彩的地方。它们抽象掉了提示链接的许多细节;与外部API接口(包括确定何时需要API调用);从向量数据库中检索上下文数据;以及跨多个LLM调用维护存储器。它们还为上面提到的许多常见应用程序提供了模板。它们的输出是提交到语言模型的提示或一系列提示。这些框架在业余爱好者和初创公司中被广泛使用,他们希望推出一款应用程序,其中LangChain是领导者

LangChain仍然是一个相对较新的项目(目前版本为0.0.201),但我们已经开始看到使用它构建的应用程序投入生产。一些开发人员,尤其是LLM的早期采用者,更喜欢在生产中切换到原始Python,以消除增加的依赖关系。但我们预计,在大多数用例中,这种DIY方法会随着时间的推移而减少,其方式与传统的网络应用程序堆栈类似。

眼尖的读者会注意到orchestration框中有一个看似奇怪的条目:ChatGPT。在它的正常化身中,ChatGPT是一个应用程序,而不是一个开发工具。但它也可以作为API进行访问。而且,如果你仔细看的话,它执行一些与其他编排框架相同的功能,例如:抽象出对定制提示的需求;维持状态;以及通过插件、API或其他来源检索上下文数据。虽然ChatGPT不是这里列出的其他工具的直接竞争对手,但它可以被视为一种替代解决方案,它最终可能成为一种可行的、简单的替代方案,以代替即时构建。

Prompt Execution/Inference

Prompt Execution/Inference如今,OpenAI在语言模型中处于领先地位。我们采访的几乎每个开发人员都使用OpenAI API启动新的LLM应用程序,通常使用gpt-4gpt-4-32k模型。这为应用程序性能提供了一个最佳情况,并且易于使用,因为它在广泛的输入域上运行,通常不需要微调或自托管。

当项目投入生产并开始规模化时,一系列更广泛的选择就会发挥作用。我们听到的一些常见问题包括:

  • 切换到gpt-3.5-turbo:它比GPT-4便宜约50倍,速度明显更快。许多应用程序不需要GPT-4级的准确性,但确实需要低延迟推理和对免费用户的经济高效支持。
  • 与其他专有供应商进行试验(尤其是Anthropic的Claude模型):Claude提供快速推理、GPT-3.5级精度、更多大客户定制选项,以及高达100k的上下文窗口(尽管我们发现精度会随着输入长度的增加而降低)。
  • 对开源模型的一些请求进行分流:这在搜索或聊天等大量B2C用例中尤其有效,因为这些用例的查询复杂性差异很大,需要以低廉的价格为免费用户提供服务。
    • 这通常与微调开源基础模型结合在一起最有意义。在本文中,我们没有深入研究工具堆栈,但越来越多的工程团队使用Databricks、Anyscale、Mosaic、Modal和RunPod等平台。
    • 开源模型有多种推理选项,包括Hugging Face和Replicate的简单API接口;来自主要云提供商的原始计算资源;以及像上面列出的那些更有主见的云产品。

开源模型目前落后于专有产品,但差距正在开始缩小。Meta的LLaMa模型为开源准确性设置了一个新的标准,并引发了一系列变体。由于LLaMa仅被授权用于研究用途,许多新的供应商已经介入训练替代基础模型(例如,Together、Mosaic、Falcon、Mistral)。Meta也在讨论LLaMa 2的真正开源版本。

当(而不是如果)开源LLM达到与GPT-3.5相当的精度水平时,我们预计会看到文本出现类似稳定扩散的时刻,包括大规模实验、共享和微调模型的产品化。像Replicate这样的托管公司已经在添加工具,使软件开发人员更容易使用这些模型。开发人员越来越相信,更小、微调的模型可以在狭窄的用例中达到最先进的精度

我们采访过的大多数开发人员还没有深入研究LLM的operational tooling。缓存相对常见,通常基于Redis,因为它提高了应用程序的响应时间和成本。像Weights&Biases和MLflow(从传统机器学习移植而来)或PromptLayer和Helicone(专门为LLM构建)这样的工具也得到了相当广泛的使用。它们可以记录、跟踪和评估LLM输出,通常用于改进即时构建、调整管道或选择模型。还有许多新工具正在开发中,用于验证LLM输出(例如Guardrails)或检测即时注入攻击(例如Rebuff)。这些操作工具中的大多数都鼓励使用自己的Python客户端进行LLM调用,因此了解这些解决方案如何随着时间的推移共存将是一件有趣的事情。

最后,LLM应用程序的静态部分(即模型以外的所有内容)也需要托管在某个地方。到目前为止,我们看到的最常见的解决方案是标准选项,如Vercel或主要的云提供商。然而,有两个新类别正在出现。Steamship等初创公司为LLM应用程序提供端到端托管,包括编排(LangChain)、多租户数据上下文、异步任务、矢量存储和密钥管理。像Anyscale和Modal这样的公司允许开发人员在一个地方托管模型和Python代码。

What about agents?

这个参考体系结构中缺少的最重要的组件是AI agent frameworks。AutoGPT被描述为“使GPT-4完全自主的实验性开源尝试”,是今年春天历史上增长最快的Github repo,如今几乎每个人工智能项目或初创公司都包括某种形式的代理。

大多数开发人员都对代理(Agents)的潜力感到无比兴奋。在本文中描述的上下文学习模式在解决幻觉和数据新鲜度问题方面是有效的,以便更好地支持内容生成任务。另一方面,代理为人工智能应用程序提供了一套全新的能力:解决复杂问题,对外部世界采取行动,并在部署后从经验中学习。他们通过高级推理/计划、工具使用和内存/递归/自我反思的组合来实现这一点。

因此,代理有可能成为LLM应用程序架构的核心部分(如果你相信递归自我完善,甚至可以接管整个堆栈)。像LangChain这样的现有框架已经包含了一些代理概念。只有一个问题:代理还没有真正工作。如今,**大多数代理框架都处于概念验证阶段,能够进行令人难以置信的演示,但还不能可靠、可复制地完成任务。**我们正在密切关注它们在不久的将来如何发展。

展望

经过预训练的人工智能模型代表了自互联网以来软件中最重要的架构变化。它们使个人开发人员有可能在几天内构建出令人难以置信的人工智能应用程序,超过了大型团队耗时数月构建的监督机器学习项目。

这里列出的工具和模式可能是集成LLM的起点,而不是终点。我们将在发生重大变化时对此进行更新(例如,向模型训练的转变),并在有意义的地方发布新的参考体系结构。

参考资料

  1. Emerging Architectures for LLM Applications
  2. in-context learning

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/738178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

css写法、颜色显示方式

一、什么是css 二、css的几种写法 1、行内样式 css写在标签的style属性上,优先级非常高,但是有多个标签具有相同样式代码重复高 2、页面样式 此时写在head(不可见)中,用style标签 3、外联样式 css样式也可以导入 一…

C++primer(第五版)第十六章(模板与泛型编程)

16.1定义模板 关于模板,第一个要提的点就是,这个字念mu模板而不是mo(一开始打字就发现拼音错了,突然觉得自己要会小学深造一下). 模板就是将一个特定场合使用的东西变成可以在多个场合使用的东西. 16.1.1函数模板 template<typename T> bool bijiao(T &a,T &…

了解 IPNS:我们可以使用 4EVERLAND IPNS Manager 做什么?

关键词&#xff1a;4EVERLAND、IPNS、4EVERLAND IPNS 管理器、去中心化内容 IPNS 是星际名称系统的缩写&#xff0c;是一个允许我们在 IPFS&#xff08;星际文件系统&#xff09;内创建可变指针以及名称和地址内容的系统。IPFS 使用内容标识符 (CID) 作为唯一文件标识符&#…

Photoshop制作Alphas(没有显卡好痛苦,两个MAYA交替弄)

做个选区&#xff0c;选白色 擦除背景 在把背景填充上白色

【PyGIS】GDAL及Rasterio多线程转换NC格式文件为TIFF

汇总 【GIS】使用cdsapi下载ERA5和ERA5_land逐小时数据 NC格式介绍 说明 NC文件读取使用netCDF4,NC文件转换为TIF使用rasterio或者GDAL。 一些细节: 格点数据转换为TIFF文件时候,计算六参数时候,应该要考虑,格点数据存储的坐标属于栅格中心点的位置,转换为TIFF时候,…

Java----使用eureka进行注册连接(微服务简单实现)

当采用微服务架构时&#xff0c;各个业务流程被逐一分解&#xff0c;虽说是分解&#xff0c;但还是要进行连接的&#xff0c;最简单的就是使用http请求&#xff0c;将他们联系起来&#xff0c;通过给容器注入restTemplate&#xff0c;然后使用内置的方法进行请求&#xff0c;但…

基于Javaweb实现ATM机系统开发实战(四)用户修改删除功能实现

我们点一下修改&#xff0c;发现页面进行了跳转&#xff0c;跳转到了/toUpdate&#xff0c;并传递了用户的卡号。 我们可以先查看一下用户列表展示界面的前端代码&#xff1a;userlist.jsp&#xff0c;可以看到前端代码中做了跳转的动作&#xff0c;我们需要在后端中完成相应的…

VectorCAST单元测试参数配置

一、打开 VectorCAST 通常情况下&#xff0c;技术人员会配置一个脚本文件&#xff08;.bat、.cmd&#xff09;&#xff0c;用户可以通过这个脚本文件来启动 VectorCAST。使用脚本文件启动 VectorCAST&#xff0c;可以在启动时设置好编译器相关的环境变量&#xff0c;方便 Vecto…

企业毛利高,进项抵扣少,增值税高,怎么办?

企业毛利高&#xff0c;进项抵扣少&#xff0c;增值税高&#xff0c;怎么办&#xff1f; 《税筹顾问》专注于园区招商、企业税务筹划&#xff0c;合理合规助力企业节税&#xff01; 金税四期的出现&#xff0c;让很多企业都陷入了税负重的不利局面。当然了在此环境之下&#x…

回溯法总结

文章目录 回溯法如何理解回溯法 回溯算法模板框架如下&#xff1a;树枝去重树层去重回溯法去重什么时候去重&#xff1f;树层去重数组used[i-1]&#xff1a;回溯函数的参数startIndex&#xff1a;回溯函数的参数用Set的对象uset&#xff1a;局部变量例题 其它细节对于组合问题&…

测试开发知识图谱

目录 前言&#xff1a; 1 测试方法与理论 2 Shell脚本相关 3 数据库相关 4 git 代码管理 5 Python 编程语言与测试框架 6 Web 自动化测试 7 移动端 app 自动化测试 8 常用开源测试平台 9 客户端专项测试 10 服务端接口测试 11 服务端接口自动化测试 12 服务端性能…

国产CAN收发器XL1050可替代NXP的TJA1050T,性能参数基本一致

CAN收发器是CAN控制器和物理总线之间的接口&#xff0c;在工控等需要CAN通信的应用场合是必要的&#xff0c;工程师通常采用NXP、TI等品牌的&#xff0c;TJA1050T是常见型号之一。XL1050是信路达一款CAN收发器&#xff0c;本文讨论信路达的XL1050 替代NXP的TJA1050T的可行性。 …

前后端分离,前端代理设置

1. 没有vue.config.js的配置方法 1.1 在config目录下的index.js里面加入如下所示代码 proxyTable: {"/api": { // 不能写成^/apitarget: "http://localhost:50000", // 只写域名即可ws: true,changeOrigin: true, // 允许跨域pathRewrite: { // 重写&…

leetcode:除自身以外数组的乘积

除自身以外数组的乘积 medium 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请**不要使用除法&a…

抖音seo矩阵系统源码搭建技术+二开开源代码定制部署

抖音SEO源码是指将抖音平台上的视频资源进行筛选、排序等操作&#xff0c;进而提升其在搜索排名中的权重&#xff0c;从而让更多的用户能够发现并观看到这些视频资源。而抖音SEO矩阵系统源码则是指通过建立一个分析系统&#xff0c;分析抖音中的用户、视频、标签等数据&#xf…

【数据分类】基于蜣螂优化算法优化支持向量机的数据分类方法 DBO-SVM分类算法【Matlab代码#47】

文章目录 【可更换其他群智能算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 蜣螂优化算法&#xff08;DBO&#xff09;2. 支持向量机&#xff08;SVM&#xff09;3. DBO-SVM分类模型4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他群智能算法&#…

Java Leetcode 动态规划 91. 解码方法

未优化版本代码展示&#xff1a; class Solution {public int numDecodings(String s) {char[]charss.toCharArray();int lengths.length();//创建dp数组int[]dpnew int[length];//初始化if(chars[0]!0){dp[0]1;}//特殊情况处理if(length1){return dp[0];}if(chars[1]!0){dp[1…

Postman高级应用——变量、流程控制、调试、公共函数、外部数据文件

目录 流程控制 调试 公共函数 外部数据文件 总结&#xff1a; Postman 提供了四种类型的变量 环境变量&#xff08;Environment Variable&#xff09; 不同的环境&#xff0c;使用不同的环境变量&#xff0c;例如&#xff1a;测试过程中经常会用到 测试环境&#xff0c;外…

PHP5.4以下解决json_encode中文UNICODE转码问题

PHP5.4以下解决json_encode中文UNICODE转码问题 把汉字先urlencode 然后再使用json_encode&#xff0c; json_encode之后 再次使用urldecode来解码&#xff0c; 这样编码出来的json数组中的 汉字就不会出现unicode编码了。 $params[importList][recipientAddress] urlencode(&…

Spring WebFlux使用函数式编程模型构建异步非阻塞服务

1 前言 上文引入了 Spring 框架中专门用于构建响应式 Web 服务的 WebFlux 框架&#xff0c;同时我也给出了两种创建 RESTful 风格 HTTP 端点实现方法中的一种&#xff0c;即注解编程模型。 本文介绍另一种实现方法——如何使用函数式编程模型创建响应式 RESTful 服务&#xf…