大模型React框架设计实践:从单智能体到多智能体的演进之路

阿里云团队分享大模型领域React框架实践,详解单智能体到多智能体架构演进,并探讨ToolCalls、上下文管理等核心技术挑战。

原文标题:基于大模型的领域场景开发:从单智能体到多智能体的React框架设计与实现

原文作者:阿里云开发者

冷月清谈:

本文详细介绍了阿里云团队在基于大模型进行领域场景开发中的实践与架构演进。团队初期通过提示词工程、RAG及流程编排模式,实现了RAG+角色扮演平台和多功能办事机器人等应用。随着业务复杂性增长,团队开始探索多智能体架构,并选择层级指挥模式作为React框架的基础。文章重点阐述了如何设计并实现基于ToolCalls与MCP的智能体React模式:通过LLM与工具列表、对话上下文、系统变量等环境的持续反馈与判断,自主规划并执行下一步策略。文中深入分析了技术选型过程,解释了为何选择自研elemMcpClient与多平台LLM调用客户端,而非直接使用SpringAI或原生McpSdk,并详细描绘了规划类Agent的系统架构,包括长期/短期记忆的持久化、五大核心Node(StartNode、ProcessNode、ToolManagerNode、StepNode、SendNode)的协同工作模式,以及LLM客户端的封装。最后,文章探讨了从单智能体升级到多智能体的必要性(解决token消耗和职责不清问题),并展望了未来的迭代重点,尤其是针对上下文动态压缩与合理使用文件系统等高级上下文管理方案,以应对烧token、幻觉及智能体间通信不足等挑战。

怜星夜思:

1、文章中提到了多种大模型决策方式,如“显式引导”和“Planning As Tool”。在实际场景中,这两种方式各有什么优缺点?你们会基于哪些考量来选择其中一种,或者同时使用它们?
2、文章提到“烧token”是单智能体的一个问题,多智能体能解决。那么除了token消耗,多智能体架构在实际应用中还会面临哪些新的挑战?比如协调、通信、故障排查等,这些问题在工程上如何考虑和解决?
3、文章多次强调上下文管理的重要性,并指出未来会在动态压缩、合理使用文件系统方面下功夫。除了这些,目前业界还有哪些比较先进或有潜力的上下文管理技术,比如结合知识图谱、分层记忆等,未来是否有可能引入?

原文内容


背景

基于大模型的领域场景开发,说到底无非是借助基座模型对语义的理解推理能力,将通用AI变为专有AI工具的过程。但仅仅只做模型调用,来实现复杂类需求,对生产力的提升并没有太大帮助。因此在围绕提升研发生产力的过程,从大模型问世到现在,卷出了各种大模型工程规范。从最早的提示词工程到RAG,再到流程编排模式,每个阶段无疑都是对研发生产力的不断提升。

当然我们团队也经历了这些阶段,我们最先基于饿了么钉钉文档,开发了一套完备的RAG+角色扮演平台,此后又并行推出了拥有三十多项大模型指令的饿了么一键办事机器人——小e,和集成流程编排到平台能力中,为适配多端透出和支持丰富渲染,开发了问答助手分身及问答卡片搭建功能。感兴趣可以在文章最后介绍中体验。

至此也基本能满足大多数AI需求场景的低代码搭建。但随着多智能体架构对复杂场景的支持越来越灵活,近期我们也在设计架构升级。

参考了一些主流平台中工具与agent间的分发及调用,针对我们平台当前的用户体量及后续支撑的一些场景,分析层级指挥和自由协作两种模式的利弊,选用层级指挥模式作为React框架。初步实现了单智能体对工具调用的反思规划,后边迭代利用此框架再将智能体抽象为工具调用,实现多智能体间的相互协作。

先上结果:

1.对用户提问自主规划,比流程编排模式更加灵活。

2.单智能体更丰富的工具体系,自主选择工具调用,摆脱传统prompt工程参数解析、意图识别等coding或节点配置过程。

ToolCalls+MCP实现React模式

什么是React

对于React,大家都有自己的理解。本文主要介绍我们是如何实现React框架,关于智能体React模式简单仅做个人简单的一些理解。

1.首先LLM需要不断和环境作出反馈和判断,制定下一步的执行策略。这里的环境即工具列表、对话上下文、一些系统变量。

2.上图可以看出,核心还是接收反馈后采用什么方式决策?以及和环境之间通信的上下文如何管理。

因此关于决策方式和上下文管理大家都卷出了各种玩法:

决策方式

1.类manuas方式,使用PlanningAgent:负责规划;Controller Agent负责监督Planning执行情况;StepAgent负责打标。

2.OpenAI提出的显式引导

3.Planning As Tool——将思考规划作为一个单独的工具,告诉大模型有这样一种工具,且入参定义为思考、行动、规划,借助工具入参来引导大模型思考规划。

上下文管理

这个可能又涉及到一些比较复杂的上下文通信和动态压缩等,本文也不做介绍,后续也是我们重点升级的方向,好的上下文通信带来的核心收益有两方面:

1. 每个agent拥有更丰富的背景内容,产出质量更高 ;

2. 极大节省token,用tooCalls的方式很烧token;

Planning As Tool 方案推演

1.调用大模型时注入系统提示词+用户提问+工具列表(包含思考规划工具)。

2.得到大模型回答出,需要的工具是什么,以及入参是什么?

3.第一步回答出需要调用的工具是思考工具,借助思考工具定义的入参,让大模型给到思考内容、规划内容,实际该方法只是一个空壳,然后拼接大模型的回答和工具调用的结果,思考规划工具的调用结果手动mock为success。

4.得到回答,需要调用天气查询工具,入参也给出来了:

5.重复2-4的过程,直至大模型返回的tool_calls为空,content不为空时结束,最终结果如下:

实现架构

技术选型

技术选型上我最终使用的是elemMcpClient+多平台LLM调用客户端。

那为什么这样选择,不直接使用springAI已经封装好的工具调用,或者使用原生McpSdk,还要自己手撸呢:

1.springAI本身集成了上下文管理、工具调用等能力,理论上直接用来做模型调用是很方便,但是:

a.中间过程交互不够友好,对于个人开发者来说,springAI确实比较方便,绑定一堆工具、配置好模型地址和ak,输入一个提问,直接能返回意图分类后工具的执行结果,但是我们是平台开发者,我们需要将中间过程做封装交互展示。

b.springAI虽然可以设置中断,只返回该调用哪个工具,把工具的执行交给开发者,但这里也有点坑,有些情况不能返回选择了哪个工具,而且,那这样的话,springAi的价值也大打折扣,仅被当成一个LLM调用的客户端......

c.很多国内模型其实springAI的openAiApi支持的不够灵活,可能是我自己原因,没有找到springAi里面qwen3的enableThinking=false在哪配置。

d.springAI集成的原生McpSdk本身也有坑,比如集团内发布的很多TppMcp或者AoneMcp都调不通,原因在下面分析。

2.原生MCPSdk作为工具调用时,不支持后缀带很多参数的MCP服务,如Aone开放平台发布的MCP为了鉴权,带有鉴权参数。

基于上述背景和试错过程,最终选择了ElemeMcpSdk + 包含WhaleSdk在内的主流平台LLM客户端。

系统架构设计

规划类agent调度框架如下图所示:

1.agent分类方面,此前我们已经有了流程编排类型、其他平台api接入类型、RAG+角色扮演类型。此次扩展出一种规划类型agent。

2.在环境方面,我们针对长期记忆和短期记忆分别进行持久化。

a.长期记忆主要指多轮对话,补充一次会话过程中的背景信息;

b.短期记忆是每个智能体或工具给出的回答,用于:1.后续实现单agent间的通信 2. 记录思考次数,以便做异常中断;

c.agent绑定的工具列表持久化,其中有一个作用是,gpt4做toolCalls时,仅支持方面名是英文的方法,因此还要利用这块的存储做中文-英文的缓存;

3.规划过程:

a.领域抽象时,设计了五个Node来完成核心流程;

b.startNode,用于组装系统提示词、RAG检索到的片段、用户提示词、历史对话、用户提问、工具列表;

c.startNode节点中调用LLM,收到反馈;

d.ProcessNode节点负责循环过程的执行,需要获取LLM返回的参数,去拼接LLM的message内容、以及循环中发起对工具列表的调用;

e.ToolManagerNode ,负责接收需要调用的方法名及入参,根据方法名,在cache中查找对应的MCP的sseUrl利用mcp客户端调用工具获取结果,添加到LLM的message中;

f.StepNode,负责对每一步结果进行打标,并存储到短期记忆中;

g.SendNode  负责接收来自processNode的数据,并进行封装,如背景中的各个步骤执行效果,需要用和前端约定好的标签封装过程数据。然后对封装好的数据利用Ssemitter进行发送;

4.LLM客户端封装

a.针对LLM调用,主要是根据不同平台对模型的支持程度,封装了三个LLM-ToolCalls的客户端;

b.whaleSdk、Idealab-http调用、springAI框架调用;

c.根据用户配置的模型id,来适配找出一种客户端做模型调用;

整个实现流程图如下,与上述描述基本一致:

核心代码

这部分主要对实现的相关代码进行介绍

核心类及属性

流转对象

startNode

发起调用流程

规划运行节点

工具节点:获取工具列表,只在startNode中调用。

工具节点:执行工具

LLM客户端:whale为例

利用工厂模式还扩展了springAI、Idealab类型客户端。

核心类基本如上图所述,还有其他关于前后端约定的展示样式封装的工具类不做展开介绍。

多智能体升级方案

单智能体本身就是为了解决足够复杂的任务,为什么还需要多智能体?

这里给一些个人的看法:

1.烧token,每次中心agent对模型的请求完全是无脑拼接,如果拆分成多智能体,中心agent对模型的发起只用某个agent返回的结果即可。

2.单智能体职责不够清晰,产出的交付物不如  多智能体的“专业的事交给专业的人”

上述方案我们已经实现了单智能体对工具的React框架,但是多智能体的协同还未做升级,参考了一些资料,多智能体框架实现基本分为两类。

一种是类似React的层级调度模式,由中心agent负责调度需要执行的智能体,我们实现也比较简单,只需要在现有实现框架基础上,将agent抽象为工具即可。工具执行时根据工具类型再实现调用方法。

另一种是自由协作模式,针对一个问题,每个agent分别去处理这个问题,然后执行结果发送给下一个agent,继续判断它能否解决这个问题,以及解决了哪些部分,一轮结束后,由中心agent去分发任务开始执行下一轮,这时候每个agent由了上一轮的上下文,产出效果更聚焦于各自职责。直到中心agent判断可以产出时,进行汇总。

两种方案如下图所示:

考虑后续我们承接的业务场景暂时不需要很发散的需求,采用层级指挥模式进行多智能体协作设计。

未来迭代重点

通过手撸React框架,以及对多智能体协作的调研,发现了一些问题,其实本文上述中在每个章节都有提到上下文管理。

如果无脑做ToolCalls调用,带来的问题有:

1.烧token;

2.无关信息可能会导致每个agent调用时产生幻觉;

如果agent获取到的上下文不够或者确实,带来的问题有:

1.产出质量较低,导致指挥者可能发生多次无用的调用指挥;

2.agent并行执行时,agent之间的上下文通信能力不足,类似于神经网络中陷入局部最优解;

因此,在多智能体升级完以后,我们也会考虑设计上下文动态压缩、合理使用文件系统等工作。

查询了一些资料,发现有些资料中的观点与我提到的基本类似,可以参阅:

总结

本文主要对多平台LLM客户端+MCP 实现智能体React框架的方案进行了详细阐述,对核心代码进行了剖析,以及对目前业界多智能体设计方案的进行了调研简单介绍。希望能对相关平台开发者有借鉴意义,对个人开发者其实有更多的方案进行体验,没有必要进行手撸框架。

基于 RAGFlow 构建私有知识问答应用


传统 RAG 应用因文档解析能力不足,导致相关问题的回答失准。RAGFlow 凭借创新的深度文档理解技术,能精准解析各类复杂格式的原始数据,提升回答准确性。本方案介绍如何一键部署 RAGFlow 并构建私有知识问答应用,无需编码,最快 10 分钟、最低 2 元即可实现。


点击阅读原文查看详情。


针对“除了token消耗,多智能体架构在实际应用中还会面临哪些新的挑战?比如协调、通信、故障排查等,这些问题在工程上如何考虑和解决?”这个问题,我认为除了token消耗,多智能体面临的主要挑战在于“协作效率”和“通信机制”。首先是“任务分解与分配”,如何智能地将复杂任务拆解并准确分配给不同的智能体?其次是“跨智能体通信”,如何确保信息在不同智能体之间高效、无损、无歧义地传递?再者是“冲突解决与协调”,当多个智能体产生不同意见或执行结果冲突时,如何进行仲裁和统一?最后是“故障排查与可解释性”,在一个多智能体系统中,当出现问题时,定位是哪个智能体、哪一步出了错,以及为什么出错,将比单智能体复杂得多。这些都需要更高级的策略(如多模态通信、共识机制、可视化调试工具)来解决。

哈哈哈,说到上下文管理,除了压缩和存硬盘,我觉得还可以给AI配个“秘密日记本”——专门记下那些“只在当前任务里有用”的零碎信息,类似于“工作记忆”。或者干脆让AI变成“福尔摩斯”,把所有关键词、人物关系都整理成一张密密麻麻的“知识图谱”,这样它就能一秒钟明白“谁是谁、有什么瓜葛”。更科幻一点,如果AI之间都能像脑电波一样直接“共享记忆”,那岂不是所有上下文管理问题都迎刃而解了?(然后人类就彻底没用了,狗头保命!)

问到“目前业界还有哪些比较先进或有潜力的上下文管理技术,比如结合知识图谱、分层记忆等,未来是否有可能引入?”,上下文管理确实是个深坑,除了文章说的那些,我们也在关注其他方向。比如,可以用“检索增强生成(RAG)”的思路,把历史对话或特定知识点“检索”出来作为上下文,而不是简单地全部塞进去。这样既减少了token消耗,也降低了无关信息干扰。另外,针对复杂业务场景,可以考虑构建一个业务流程驱动的上下文模型,只有与当前业务节点相关的历史信息才会被视为有效上下文。还有一个方向是“长短期记忆融合”,通过一些巧妙的机制,让LLM在处理当前任务时,能有选择性地激活和利用它在过去学到的(长期)以及最近对话中获取的(短期)信息,而不是每次都从零开始“重读”所有历史。这些都是提升“对话智商”的关键。

关于“目前业界还有哪些比较先进或有潜力的上下文管理技术,比如结合知识图谱、分层记忆等,未来是否有可能引入?”这个问题,文章提到的动态压缩和文件系统是实用方案,但还有更前沿和复杂的上下文管理技术。例如“知识图谱辅助”,将对话实体、关系、事件等结构化存储,使LLM能以更精确、非线性的方式访问和推理长期记忆,避免简单文本拼接带来的信息冗余和混淆。其次是“分层记忆结构”,不仅有短期对话记忆和长期知识记忆,还可以引入“工作记忆”或“episodic memory”层,存储特定任务或会话过程中的关键瞬时信息。此外,“上下文窗口扩展技术”如Mega、Transformer-XL等,通过更高效的Attention机制或循环结构来处理更长的序列,虽然不直接是管理方案,但能提升单次处理的上下文总量。最后是“智能体间协作时的共享记忆机制”,允许不同智能体在协作过程中动态地共享和更新彼此的关键上下文信息,而非简单地传递整个对话历史。

关于“显式引导”和“Planning As Tool”的选择,我来分享点实际经验。简单来说,显式引导更像“手把手教学”,一步步明确下来,可预测性高,调试起来也相对容易。Planning As Tool则是给AI一个“思维框架”,让它自己去“悟”,遇到没见过的复杂情况,它理论上能更好地适应和分解。我们选择的时候,会先评估业务场景的复杂度和不可预知性。如果业务需求变化快,或者任务分解很复杂,我们肯定倾向于Planning As Tool,因为它能让AI更“聪明”。但如果遇到LLM“幻觉”或者“跑偏”的情况,Planning As Tool的调试难度会更大一些。所以,通常是两者结合,核心流程用Planning As Tool提升灵活性,但在关键节点或易错环节,适当引入显式引导进行约束。

哈哈,说到“显式引导”和“Planning As Tool”,我脑子里马上浮现了训练猫猫狗狗的场景。显式引导就像是你手把手教它坐下、握手,“来,闻一下,这个是吃的!”——直接、有效,但它只能按你教的来。Planning As Tool就像是给了它一个食盆和一堆玩具,只要它能自己搞明白怎么吃、怎么玩就行,甚至还能自己发明个玩法!:zany_face: 缺点嘛,显式引导就是AI容易变得“死板”,Planning As Tool则可能“想太多”或者“跑偏”。选哪个?看你的AI是想当个听话的打工仔,还是想当个有点小主意的“艺术家”呗!

确实,针对“除了token消耗,多智能体架构在实际应用中还会面临哪些新的挑战?比如协调、通信、故障排查等,这些问题在工程上如何考虑和解决?”这个问题,多智能体除了省token,提升专业性,也会引入新的复杂性。我们目前考虑到的主要是“管理成本”。比如,智能体之间的边界划分,是根据职责还是能力?它们之间的通信协议怎么定才最高效?还有,如果一个智能体出了问题,会不会影响整个链路?调试的时候,如何追踪一个问题在多个智能体之间流转的路径?这些都是实打实需要在工程上投入精力去解决的。另外,如果智能体数量很多,如何动态管理它们的生命周期和资源,也是个不小的挑战。

要我说多智能体啊,它就像一个“AI天团”。虽然每个成员都有特长,能把事情分工处理得更细致,但问题也随之而来::microphone:谁是C位?(中心Agent怎么调度?):speaking_head:台下互动咋整?(智能体之间怎么交流才不打架?):sweat_smile:演出事故了谁背锅?(故障排查难上加难!)想想都替他们捏把汗!这可不是简单地把一个大胖子拆成几个小瘦子就能解决的,毕竟团队合作的精神可比一个人的努力复杂多了!

针对“文章中提到了多种大模型决策方式,如“显式引导”和“Planning As Tool”。在实际场景中,这两种方式各有什么优缺点?你们会基于哪些考量来选择其中一种,或者同时使用它们?”这个问题,我的看法是:显式引导在某些场景下提供了更直接、可控的指令,适用于任务边界明确、不需要过多自主推理的场景,但可能限制了LLM的灵活性。而Planning As Tool则将规划能力内化为LLM可调用的“工具”,显著增强了其自主决策与复杂任务分解能力,尤其适用于多步骤、动态变化的任务。选择上,我们会根据任务的复杂度和对LLM自主性的要求来权衡。对简单、重复性流程,显式引导效率更高;对开放性、探索性任务,Planning As Tool更能发挥LLM潜力,但也对工具定义和提示词工程提出更高要求。