AI应用平台搭建之旅(上) - 框架篇(附:AICon大会阿里国际Agent应用平台分享)
前言
LangEngine内源项目发起于阿里巴巴集团内部组织,LangEngine是类似LLM应用开发框架LangChain的纯Java版本。该框架现已正式对外开源:https://github.com/AIDC-AI/ali-langengine
作为AI应用搭建平台核心架构师,这段时间一直专注于阿里国际APaaS平台以及AI基础设施建设,LangEngine框架也开始结合国际复杂电商业务做一些更加落地性的场景落地,让LangEngine有了新的活力。
在LangEngine框架提供LLM应用所需的原子化能力的基础上,针对阿里国际复杂电商系统的业务流程和多智能体的大模型自主规划能力,构建出了一套更贴近业务诉求的AgentFramework。
在7月底正式上线第一版面向生产环境的高可用AI应用开发框架,目前在内部钉钉群里有1200+的使用方和开发者,内部社区贡献群有40+核心贡献者。
本篇文章是AIDC AI AppBuilder平台建设之路的上篇,包括如何构建高可用的LLM应用程序、开源的LLM应用开发框架介绍、自研的阿里LLM应用开发介绍等等。而下一篇将介绍它可落地的应用场景。
AICon大会阿里国际Agent应用平台分享
AICon2024.12北京站前线带来的《AI 在电商出海领域的应用落地实践》分享,其中介绍了阿里国际AI Agent应用平台产品架构在海外电商业务上的落地,由底层驱动的阿里巴巴LangEngine的Java原生AI应用开发框架:https://github.com/AIDC-AI/ali-langengine。开发者们可以通过该框架也可以快速搭建AI业务应用,或者基于该框架搭建属于自己的AI应用开发平台。
如何构建高可用的LLM应用程序
要开发LLM应用程序还是需要有工程方面的构建策略和方法论,这里总结出五大步骤。
1. 专注解决一个问题。
问题的定义需要足够详细,这样你就可以快速迭代并取得结果;足够广泛,这样解决方案才能让用户信服。例如,做一个电商领域的智能客服的LLM应用,需要拆解到它的业务类型,售前方向(例如商品咨询、营销活动等等)、售中方向(例如物流咨询、修改地址等等)、售后方向(例如商品退款、商品退换等等);知识库类型(语雀、PDF、钉钉文档等等),背后可以使用的工具(例如一键换货、智能退款分析、消费者情绪分析等等),是否需要走意图识别(固定话术、知识库检索、工具调用等等)。只有问题定义的足够详细,才能进一步展开LLM应用的构建。
2. 选择合适的LLM大模型。
使用预先训练的模型构建LLM应用程序可以节省成本。如果LLM应用程序需要对外商业化,就需要使用具有获得商业使用许可的开源大模型或者API大模型。大模型的参数越多,其学习新知识、预测能力就越强,而小模型的性能越好,推理越快,价格越便宜。还是以电商客服为例,意图识别选择大模型还是小模型,取决于它的预测能力,从经验上来看,这里更多会选择大参数的LLM作为选择。
3. 定制专属的大模型。
可以针对大模型进行微调训练(SFT)或者强化学习(RLHF)。例如多模态的图片识别能力,具体可以阅读《阿里国际AIDC-AI发布新型多模态大模型架构Ovis》
https://mp.weixin.qq.com/s/D509j5mnePn36jrl1LHcy
4. 设置应用程序的架构。
用户输入,包括用户界面 (UI)、大语言模型和应用托管平台。
输入增强和提示构建工具,涵盖了数据源、嵌入模型、向量数据库、提示构建与优化工具以及数据过滤器。
AI工具,包括大语言模型的缓存、内容分类器或过滤器,以及一个用于评估LLM应用输出的评测服务。
LLM推理、Agent相关能力建设,更高效地完成业务的流程编排。
5. 对应用进行在线评估。
这里包括 主观评测、客观评测、人工评测 等等。因此,构建一套LLM应用的评测平台至关重要。
可以看到整个构建LLM应用程序的过程中,不管从解决问题、LLM大模型选择、LLM应用程序架构设计、在线评估等等方面,构建一套高效且可靠的LLM应用开发框架是非常重要的,合适的框架架构能够使得你构建AI业务应用变得十分快捷,当然也可以结合自身的研发能力,通过选择开源的应用开发框架或者自研的方式来构建自己的AI业务应用。接下来来看下,在开源生态方面都有哪些常用的LLM应用开发框架。
开源的常用LLM应用开发框架
LangChain
开源(90k stars,3000+ 贡献者):
https://github.com/langchain-ai/langchain
✦ 开发语言:Python、NodeJS
✦ 生态建设
✧ 社区与贡献十分活跃,基本每天发布1个版本甚至2个版本,可维护性强
✧配套扩展丰富,包括langsmith、langflow、flowise、dify、gptcache、fastapi、langchain-chatglm等等都是基于langchain开源构建。
✧ 文档十分完善,学习门槛低(普通开发人员)
✦ 主要功能
✧ 数据感知,将语言模型与其他数据源相连接。支持大模型和搜索引擎,本地数据源,企业数据源等连接。
✧ 代理能力,允许语言模型与工程系统化能力互动,可以与个人/企业的API进行连接。
✧ 支持扩展不同的大型语言模型,强调模块级开箱即用。
✧ 各个核心模块扩展性强,利于生态快速建设。
Semantic-Kernel
开源(21k stars,300+ 贡献者):
https://github.com/microsoft/semantic-kernel
✦ 开发语言:C#、Python、Java(Required:OpenJDK 17 or newer)
✦ 生态建设
✧ 社区与贡献较活跃,2~3天发布1个版本
✧文档比较完善,学习门槛较低(应用开发人员)
✦ 主要功能
✧ 轻量级SDK,可帮助开发人员将代码组织到内置于Planner中的技能、记忆和连接器中。
✧ 微软配套产品集成性强,GitHub Copilot, M365 Copilot, D365 Copilot 和Security Copilot。
✧ 支持扩展不同的大型语言模型,强调生成式Prompt(Semantic Function),开发灵活。
✧ 软绝对是接入OpenAI最早的公司,企业工程化经验丰富。
Llamma-Index
开源(34k,1100+贡献者)
https://github.com/run-llama/llama_index
✦ 开发语言:Python
✦ 生态建设
✧ 社区与贡献较活跃,2~3天发布1个版本
✧ 文档比较少,学习门槛比较高
✦ 主要功能
✧ 专注于数据框架,包括丰富的数据源和数据格式的读取和转换,利用LLM来做结构化,非结构化做索引。
Auto-GPT
AutoGPT 使用深度神经网络生成高质量、类似人类的文本(以及指令),而无需人工输入或监督。这意味着它可用于自动执行范围广泛的任务,从编写产品说明和新闻文章到撰写电子邮件和聊天机器人回复,或者编写类似俄罗斯方块的程序。最好的(或最令人担忧的)消息是它设置起来很简单。
✦开源(166k stars,330个贡献者)
https://github.com/Significant-Gravitas/AutoGPT
✦ 开发语言:Python
✦ 生态建设
✧ 社区较活跃,迭代较慢,1~2周更新1个版本
✧ 文档比较完善,学习门槛低(普通开发人员)
✦ 主要功能
✧ 最早的AI智能体雏形之一
✧ 高度依赖CoT思维链模式,由GPT驱动,强调自主实现目标。
✧ 内置读写文件、浏览网页、审查提示结果、互联网访问、长期和短期内存管理,使用GPT-3.5文件存储和生成摘要等。
✧ 功能级开箱即用,但基本仅适用于GPT系列,扩展性较弱。
围绕这些条件进行(目标、约束、命令、资源、评估、返回格式)
阿里巴巴LangEngine框架
框架背景
在阿里从事工程开发的主要编程语言还是以Java为主,并且阿里巴巴集团自身就已经具备成熟的Java中间件优势和相关的运维工具体系,从架构师角度上看,针对于企业自身构建适合自己的框架,最后决定构建以Java为语言基础的LLM开发框架。另外一方面,为了解决框架能够服务于多语言,需要专门去学习了下LangChain Python版本的代码工程和技术架构,做好技术储备,迎接AI未来,通过编写应用框架来拥抱和学习AI技术,并且能够真正在业务场景去落地。
工作原理
LangEngine 是一个基于Java用于由大语言模型支持的AI应用程序的开发框架,它也是当下最流行框架 LangChain 的Java版本。
它的特点:
✦ 阿里体系下基于 LangChain 原理的AI应用框架
✦ 引入java特色的工程模块化思路,可支持日志记录、业务监控、链式编排,实现了类流程持久化
✦ 面向阿里系Java工程开发同学,易学易用
✦ 借鉴 LangChain 生态特点,支持社区生态共建
它使应用程序能够:
✦ 具有上下文感知能力:将语言模型连接到上下文来源(提示说明、Few shot示例、响应的内容等)
✦ 代理以及Reason:依靠语言模型进行推理(关于如何根据提供的上下文进行回答、采取什么操作等)
LangEngine的核心框架分为六大模块:Retrieval、Model I/O、Memory、Chains、Agents、Callbacks。
✦ Retrieval
许多LLM应用程序需要特定于用户的数据,这些数据不属于模型训练集的一部分。实现这一目标的主要方法是通过检索增强生成(RAG)。在此过程中,将检索外部数据,然后在执行生成步骤时将其传递给 LLM。
LangEngine 提供了 RAG 应用程序的所有构建模块 - 从简单到复杂。文档的这一部分涵盖了与检索步骤相关的所有内容 - 例如 数据的获取。虽然这听起来很简单,但实际上可能非常复杂。这包含几个关键模块。
✦ Model I/O
任何语言模型应用程序的核心元素都是模型。LangEngine 为您提供了与任何语言模型交互的构建块。
✦ Memory
大多数LLM应用程序都有对话界面。对话的一个重要组成部分是能够引用对话中先前介绍的信息。至少,对话系统应该能够直接访问过去消息的某些窗口。更复杂的系统需要有一个不断更新的世界模型,这使得它能够执行诸如维护有关实体及其关系的信息之类的事情。
将这种存储过去交互信息的能力称为“记忆”。LangEngine 提供了许多用于向系统添加内存的应用程序。这些应用程序可以单独使用,也可以无缝地合并到链中。
内存系统需要支持两个基本操作:读和写。回想一下,每个链都定义了一些需要某些输入的核心执行逻辑。其中一些输入直接来自用户,但其中一些输入可以来自内存。在给定的运行中,一条链将与其内存系统交互两次。
1. 在收到初始用户输入之后但在执行核心逻辑之前,链将从其内存系统中读取并增加用户输入。
2. 在执行核心逻辑之后但在返回答案之前,链会将当前运行的输入和输出写入内存,以便在将来的运行中引用它们。
✦ Chains
✦ Agents
代理的核心思想是使用语言模型来选择要采取的一系列操作。在链中,一系列操作被硬编码(在代码中)。在代理中,语言模型被用作推理引擎来确定要采取哪些操作以及按什么顺序。
✦ Callbacks
LangEngine 提供了一个回调系统,允许您连接到 LLM 申请的各个阶段。这对于日志记录、监控、流传输和其他任务非常有用。
您可以使用整个 API 中可用的回调参数来订阅这些事件。该参数是处理程序对象的列表,这些对象预计将实现下面更详细描述的一个或多个方法
✦ LangRunnable
可以轻松地从基本组件构建复杂的链条。它通过提供以下功能来实现此目的:
1. 统一的接口:每个 LangRunnable 对象都实现 Runnable 接口,该接口定义一组通用的调用方法(invoke、batch、stream、ainvoke 等)。这使得 LangRunnable 对象链也可以自动支持这些调用。也就是说,每个 LangRunnable 对象链本身就是一个 LangRunnable 对象。
2. 组合原语:LangRunnable 提供了许多原语,可以轻松组合链、并行化组件、添加后备、动态配置链内部等。
为了尽可能轻松地创建自定义链,这里实现了“Runnable”协议。大多数组件都实现了 Runnable 协议。这是一个标准接口,可以轻松定义自定义链并以标准方式调用它们。标准接口包括:
✧ invoke:在输入上调用chain
✧ stream:流回响应块
✧ batch:批量在输入上调用chain
这些也有相应的异步方法:
✧ invokeAsync:在输入上异步调用chain
✧ streamAsync:异步流回响应块
✧ batchAsync:批量在输入上异步调用chain。
服务集成
1.RAG服务
LangEngine Retrieval模块包含了丰富的RAG所需要的元素,让你能够基于LangEngine轻松构建RAG服务,检索增强生成(Retrieval-augmented Generation)。通过文档加载器,加载不同文档的格式类型,常用的包括PDF、Text、Excel、CSV、Markdown、Html等文件,也包括各类常见编程语言加载器,还包括在线网页加载器等等,另外在LangEngine提供了基于阿里钉钉、语雀、ODPS、TDDL等等阿里集团内部常用的加载器,最大限度的支持阿里内部的文档场景。文本分割器,实现了常用的文本分割器,包括递归词句分割的能力。接着就是Embeddings和VectorStore,除了常用的能力之外,也集成了包括通义千问的嵌入服务或者各个阿里云上各种的向量数据库服务。另外也提供常用的Query改写、Rerank服务等支持。通过Retriever、DocumentChain、OnlineSearch构建出RAG的向量检索以及在线检索服务。
2. 意图识别服务
优秀的大模型的意图识别固然重要,如果能够进一步增强意图识别能力也是锦上添花的事情。LangEngine Chain中也提供了各种路由链、顺序链、专家链等等可以进一步提升意图识别效果的增强。
3. 工具代理调用服务
LangEngine Agent模块中内置的各种类型的Agent范式类,可以构建常见的Agent服务方式,通过LangRunnable模块可以更加灵活的自定义自己的Agent范式编排,可以构建出类似于FunctionCall、Planner、ReAct等服务方式,通过这些能力可以进行工具的代理调用。
4. GPT服务
LangEngine的GPT模块中提供了众多GPT服务,例如NL2SQL、NL2Query、NL2API、NL2Prompt。通过SQLDataChain实现了NL2SQL服务,底层也集成了阿里集团的TDDL技术进行数据库查询的支持。NL2Query在关系型数据库以及向量库中来生成Query语句,包括Field、Filter、Order等等常用query语法。通过APIChain来实现利用OpenAPI协议的标准规范,生成指定的API协议,并且最终完成API请求。NL2Prompt来实现Prompt生成的可控性以及优化后Prompt的效果。
5. 多智能体基础服务
LangEngine也汲取业内比较好的多智能体框架,例如MetaGPT、AutoGen、AutoGPT等优秀的开源框架,重新实现了一套Java版本的多智能体框架,利用该框架可以快速构建属于自己业务属性的多智能体应用。
阿里巴巴AgentFramework框架
框架背景
阿里LangEngine提供了LLM应用开发中所需要各种原子化的能力,从官方角度上看,在做AI业务项目或者AI平台建设实践中,大多数时候都是基于这些原子化的能力进行组装和编排,例如既需要做可生产化的RAG服务,也需要做Agent工作流,还需要做智能体相关建设。所以,为了满足普通的AI业务述求,考虑开始构建这套阿里AgentFramework框架。AgentFramework框架的目标是把LangEngine构建好的服务,再进行进一步的组装,通过工作流以及智能体应用的方式组织起来。
工作原理
阿里AgentFramework框架是基于阿里LangEngine框架之上衍生出来真正面向AI业务和平台的Agent构建框架。
✦ Core模块:AgentFramework框架最核心的模块,负责整个流程引擎调度和基础Service SPI的串联,这里你可以选择自己任何的一款工作流框架作为AgentFramework的工作流引擎集成。
✦ Model模块:Agent领域模型,包括基础服务接口。建立以Role/Knowledge/Tool为基础的BuiltInAgentModel(含Bean内置类和 HSF-SPI动态自定义扩展方式)以及FlowAgentModel模型支持。
✦ Engine模块:OpenAPI Pipeline实现,通过该模块可以完成类似于API网关全生命周期的管控,例如访问控制、限流策略、黑白名单、参数转换、参数映射、服务调用、服务打点等常见的API网关功能。
✦ Bundle模块:AgentFramework的业务实现模块。包括大模型调用、知识库检索、工具调用等等服务集成实现。
✦ Storage模块:AgentFramework持久化层。可插拔的持久化模块,可针对不同环境扩展各自持久化能力。
✦ Parse模块:工作流前端UI DSL转换到BpmnXml解析器,这里采用了开源的ReactFlow技术作为工作流UI的基座。这个模块主要解决工作流中的FlowSchema转换为可执行的文件。
服务集成
1. AI Business算法工作台的容器化部署
AgentFramework框架整体可以跟随宿主应用Docker镜像打包进Serverless容器中心镜像拉取,通过容器提供了去中心化的API Gateway对接,从而实现AI应用是容器部署隔离。另外一方面,随着应用、工具、模型整体纳入到容器化服务以后,容器内部任务调度会实时观察模型的吞吐情况以及空闲时段,自动化进行相应的资源(含GPU)的切换。
2. SDK集成与私有化部署
作为AI Business为巴黎奥运会提供的智能解说助手,通过该产品解说员可以了解奥运比赛项目、历届比赛以及运动员等相关信息,在自由问答模块中,可以通过APP Framework SDK集成方式,让应用基于已集成的通用组件、模型服务和FLow编排能力,快速构建自己的AI chat功能。
阿里巴巴LangEngine框架开源地址:https://github.com/AIDC-AI/ali-langengine
AI应用平台搭建之旅(上) - 框架篇(附:AICon大会阿里国际Agent应用平台分享)的更多相关文章
- 《OneForAll框架搭建之旅》前端篇:微前端架构设计(Vue)
心之所向,勇往直前!记录开发过程中的那些小事,给自己加点经验值. 前言 作为一个.Net后端开发,在竞争愈加激烈的当下,掌握点前端配菜好像已经是家常便饭了. 刚好在工作的第5个年头,辞去小主管职务的我 ...
- [Openwrt 项目开发笔记]:Openwrt平台搭建(一)
[Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...
- ELK平台搭建(上)
一.目的 为指导在Centos6.8系统下搭建标准ELK平台的工作. 二.定义 Elasticsearch Logstash Kibana结合Redis协同工作. 三.适用范围 适用于运营维护组运维工 ...
- 第二篇 基于.net搭建热插拔式web框架(沙箱的构建)
上周五写了一个实现原理篇,在评论中看到有朋友也遇到了我的问题,真的是有种他乡遇知己的感觉,整个系列我一定会坚持写完,并在最后把代码开源到git中.上一篇文章很多人看了以后,都表示不解,觉得不知道我到底 ...
- 基于.net搭建热插拔式web框架(实现原理)
第一节:我们为什么需要一个热插拔式的web框架? 模块之间独立开发 假设我们要做一个后台管理系统,其中包括“用户活跃度”.“产品管理”."账单管理"等模块.每个模块中有自己的业务特 ...
- 【iOS】Jenkins Gitlab持续集成打包平台搭建
Jenkins Gitlab持续集成打包平台搭建 SkySeraph July. 18th 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点: ...
- hadoop伪分布式平台搭建(centos 6.3)
最近要写一个数据量较大的程序,所以想搭建一个hbase平台试试.搭建hbase伪分布式平台,需要先搭建hadoop平台.本文主要介绍伪分布式平台搭建过程. 目录: 一.前言 二.环境搭建 三.命令测试 ...
- Storm on Yarn :原理分析+平台搭建
Storm on YARN: Storm on YARN被视为大规模Web应用与传统企业应用之间的桥梁.它将Storm事件处理平台与YARN(Yet Another Resource Negotiat ...
- LAMP平台搭建菜鸟入门级实验
LAMP平台搭建(菜鸟入门级) mysql 安装: (1)二进制安装 二进制安装 ,执行解压配置即可.无须执行三布安装. (2)源码编译安装 安装准备工作: (1)查看系统配置:#uname -a/ ...
- 使用DotNetOpenAuth搭建OAuth2.0授权框架
标题还是一如既往的难取. 我认为对于一个普遍问题,必有对应的一个简洁优美的解决方案.当然这也许只是我的一厢情愿,因为根据宇宙法则,所有事物总归趋于混沌,而OAuth协议就是混沌中的产物,不管是1.0. ...
随机推荐
- Java高并发,创建线程的新方式Callable接口
我们已经知道创建线程的方式有1.继承thread类.2.实现Runnable接口 接下来讲创建线程的新方式Callable接口,首先对比一下Runnable接口和Callable接口的区别: 首先创建 ...
- SpringBoot2.0 整合 JWT 框架后台生成token
一.传统Session认证 1.1.认证过程 1.用户向服务器发送用户名和密码.2.服务器验证后在当前对话(session)保存相关数据.3.服务器向返回sessionId,写入客户端 Cookie. ...
- Rust的Reborrow机制
最近,在使用Rust时遇到了Reborrow的概念,记录下来以备以后参考. 1. 起因 起因准备对数据进行Min-Max标准化处理,也就是将一系列数据映射到一个新的范围. 首先,需要遍历数据,找出其中 ...
- mysql skip-name-resolve 的解释
PHP交流群 717902309 为PHP广大爱好者提供技术交流,有问必答,相互学习相互进步! mysql连接很慢,登陆到服务器上查看mysql日志:IP address 'XX.XX.XX.XX' ...
- visual studio当中动态库和静态库的联系
一.为什么要写这篇博客 公司需要调用MNN框架编译之后的动态库和静态库文件来在另外一台没有编译过MNN框架上的机器运行对应的程序,比如说人体关键点检测之类的程序,这个时候了解静态库和动态库的关系就很有 ...
- Java垃圾回收器总结
什么是Java垃圾回收器 Java垃圾回收器是Java虚拟机(JVM)的三个重要模块(另外两个是解释器和多线程机制)之一,为应用程序提供内存的自动分配(Memory Allocation).自动回收( ...
- Getting Flex 3 talking to Java via JSON
packagecom.giantflyingsaucer; importjava.io.*; importjava.io.PrintWriter; importjavax.servlet.*; imp ...
- 使用 LLVM 框架创建一个工作编译器,第 1 部分
使用 LLVM 及其中间表示构建一个自定义编译器 LLVM 编译器基础架构提供了一种强大的方法来优化您使用任何编程语言编写的应用程序.了解本系列文章(由两部分组成)第一部分中有关 LLVM 的基础知识 ...
- if else的多种替换方式
1)利用逻辑判断的短路运算来实现 && 和 ||(&& 中第一个表达式为假就不会去处理第二个表达式,|| 则相反) // if为真 if (bool) { value ...
- golang之操作kafka
安装第三方包: go get github.com/IBM/sarama 生产者实例: package main import ( "fmt" "github.com/I ...