从单体Agent到多智能体系统:概念、原理与工程落地 📅 发布时间:2026/9/17 10:40:36 👁 浏览次数: 简介智能体与多智能体系统专题综述PDF面向人工智能领域的研究人员、工程师及高校学生帮助读者系统建立对Agent概念、特性与结构类型的全面认知。资源详细梳理了自主性、反应性、社会性、进化性四大特性并逐一剖析反应式、慎思式和复合式Agent的体系结构原理。针对多智能体系统内容进一步覆盖MAS的特点、基本类型并介绍网络、联盟、黑板三类体系结构深入讲解通信语言、协调规划、协作类型及协商协议等关键技术同时延伸到AI Agent在感知、决策、学习与交互能力上的发展现状与应用潜力。整个资源包含1个PDF文件压缩包大小1.85MB内容编排由浅入深从基础理论延展至电信、远程教育、决策支持等实际场景便于读者快速入门也可作为技术细节点查漏补缺的参考资料。目前已有152人学习。1. 从单体工具到群体协作这篇综述真正想解决什么问题边界单看标题很容易把“智能体”写成大模型API的封装教程。但真正从业者面对的问题不是“怎么调一个Agent”而是“什么时候该用单体Agent什么时候不得不上多智能体系统MAS上了之后怎么不让它变成各说各话的混乱现场”。这篇综述要做的就是把这层窗户纸捅破先把智能体的概念和理论底座立住再把单体的结构拆开看最后落到多智能体系统的通信、协调和工程落地瓶颈上。适合两类人读一类是准备把AI能力嵌进业务系统、正在做技术选型的人另一类是自己动手搭过Agent但发现效果不稳定、想从原理上找原因的人。2. 智能体的定义边界与理论底座别把“会调API”当成“智能体”2.1 智能体的四个判定条件业界对智能体的定义众说纷纭但工程上有一套相对收敛的判定标准这也是做选型时先要过的第一道门槛。一个系统要被称为智能体至少要满足四个条件自主性、反应性、主动性和社会性。自主性指实体能在没有外部直接干预的情况下运行并对其内部状态和动作有一定控制权。反应性指能感知环境并实时响应环境变化——比如天气变化、用户输入、传感器读数。主动性指不只是被动响应还能主动采取目标导向的行为。社会性指能通过某种语言与其他实体交互。用这套标准去套常见系统会得出一个反直觉的结论接了GPT-4 API的聊天机器人不是智能体因为它只有反应性没有主动性和自主性而一个能自动巡检服务器、发现异常自己开工单还能回滚版本的运维机器人即便用的是很小的模型也是合格的智能体。判断标准从来不是模型尺寸而是行为闭环。2.2 BDI模型与经典分层实现说到智能体的理论底座绕不开BDI模型。BDI是Belief、Desire、Intention三个词的缩写分别对应信念、愿望和意图。信念是智能体对环境及自身的认知愿望是它想要达成的目标集合意图是它当前承诺要执行的动作计划。常见的做法是先定义信念库再规划愿望集合最后解释器在两者之间做意图选择。这个选择过程就是我常说的“智能”的主要来源——同样是“客户投诉”这个事件意图选择器可能决定先道歉还是先查订单。工程实现上意图选择器一般是决策树、有限状态机或者新一代的LLM判断器。class BDI_Agent: def __init__(self, beliefs: dict, desires: list, plans: dict): self.beliefs beliefs # 信念库环境状态快照 self.desires desires # 愿望集目标清单按优先级排序 self.plans plans # 计划库条件 - 动作序列 self.intentions [] # 当前意图正在执行的计划实例 def update_beliefs(self, event): 根据感知事件更新信念并触发意图再评估 self.beliefs.update(event) self.reconsider_intention() def deliberate(self): 从愿望集中选择一个可达成且优先级最高的目标 for desire in self.desires: precondition self.plans.get(desire, {}).get(precondition) if self.check(precondition): self.intentions.append(desire) return desire return None def execute(self): 执行当前意图对应的动作序列每步更新信念 while self.intentions: intention self.intentions[0] steps self.plans[intention][actions] for step in steps: self.beliefs step(self.beliefs) # 动作影响环境与认知 self.intentions.pop(0)参数说明beliefs是字典结构用键值对存储环境事实实践中要注意时效性字段必须带时间戳desires列表的排序直接影响行为优先级电商场景里“处理退款”和“安抚情绪”谁排前面会导致完全不同的会话走向plans里的precondition是动作触发条件写得太宽会把系统变成乱开枪写得太窄又会导致无计划可用。2.3 从单体到多智能体的质变条件单体智能体做到一定程度必然会撞墙。当一个Agent需要同时处理感知、决策、记忆、工具调用和用户交互时它的系统提示词会被撑到几千字工具列表越来越长模型开始混淆指令上下文窗口反复被无关信息填满。这时候不是继续往单体里塞东西而是考虑拆分成多智能体系统的时机。但要注意多智能体不是银弹。拆分要满足两个条件才划算一是子任务之间有清晰的边界且耦合度低比如“查天气”和“订餐厅”二是子任务之间的协调成本要显著低于单体方案里一次全量推理的上下文开销。如果子任务需要频繁交换大量状态那拆出来的多智能体系统会比单体更慢、更贵、更不稳定。判断标准就一句话拆分之后每个Agent要处理的上下文是否显著变短Agent之间的消息量是否显著小于原先单体的推理输入量。3. 单体智能体的结构拆解从感知闭环到增强模块3.1 核心感知-决策-行动闭环任何一个智能体无论底层的模型能力多强其基础结构都逃不出感知、决策、行动三个环节。感知层负责将外部环境信号用户文本、数据库记录、实时日志、摄像头帧转成结构化表示决策层基于感知结果与内部状态推导下一步动作行动层将决策落成真实世界的结果——调用工具、发出消息、写入数据。感知闭环里最容易忽略的是反馈回路行动产生的结果必须回到感知层形成闭环否则系统只是“一次性执行器”。比如一个写代码的Agent行动是生成Python文件但如果不跑一遍测试并把报错信息重新喂回感知层它就永远不知道自己的代码能不能运行。这也是为什么ReAct模式推理-行动-观察能成为当前主流范式。3.2 LLM推理模块的任务分解与分析循环把LLM塞进感知-决策-行动闭环最常见且工程上验证过的实现是ReAct模式循环。系统提示词里定义工具清单模型做推理调用工具拿到结果再继续推理直到得出最终答案。这里的关键参数是最大迭代轮次max_iterations和停止条件。def react_loop(task, tools, max_iterations6, stop_when_doneTrue): ReAct推理-行动-观察循环 observation steps [] for i in range(max_iterations): prompt build_react_prompt(task, steps, tools) response llm.generate(prompt) action parse_action(response) # 返回: {tool: search, input: ...} if action[type] finish: return action[output] if action[tool] in tools: result tools[action[tool]](action[input]) steps.append({thought: response, action: action, result: result}) else: steps.append({thought: response, action: action, result: 工具不存在}) return {status: max_iterations_exceeded, partial: steps}参数说明max_iterations是最重要的安全阀设太小任务完不成设太大遇到工具异常会陷入死循环推荐先设6稳定后按任务复杂度调到10到12。stop_when_done控制当模型在单次推理中认为自己可以输出答案时是否立即终止在需要多轮工具调用的场景里比如先查库存再算运费要关闭此开关强制模型走完工具调用流程。build_react_prompt里工具描述的措辞会影响模型选工具的准确率工具名用“动词名词”结构search_products、calc_shipping比名词短语product_db更不容易触发幻觉。3.3 记忆分层短期窗口与长期向量检索的配合策略智能体的记忆结构分为三层工作记忆对应当前对话的上下文窗口情景记忆对应过去任务的交互历史语义记忆对应知识库与业务规则的长期存储。工程上最容易犯的错误是把所有历史一股脑塞进上下文导致模型注意力被稀释。正确的做法是工作记忆只留当前任务的关键中间结果情景记忆用向量数据库按语义相似度做召回语义记忆用结构化查询SQL或GraphQL获取。这里的核心是判断哪些内容该进向量库、哪些该留在结构化存储里。一条经验法则凡是需要精确匹配的信息订单号、用户ID、金额不能进向量库必须走精确查询只有语义模糊的需求描述“用户之前抱怨过什么”“类似工单是怎么解决的”才做向量检索。3.4 工具层与外部环境接口工具层是智能体从“会聊天”到“能办事”的桥梁。每个工具都需要提供三样东西名称、用途描述、入参结构。在LLM接口里这三样会被序列化成JSON Schema模型根据Schema决定调用哪个工具和传什么参数。这个设计已经被主流Agent框架统一标准化手工实现时务必遵循同样的规范。工具选择有个常见误区不是工具越多越好。工具一多模型在多个相似描述之间做选择时的出错率会指数上升。把20个细粒度工具合并成5个粗粒度工具每个工具内部做参数分流反而能显著提升工具调用的准确率。比如不要拆出“查用户地址”“查用户手机号”“查用户等级”而是做一个“查用户信息”工具参数里指定要查什么字段。合并逻辑能立竿见影地降低智能体的幻觉率。4. 多智能体系统的通信机制与协调范式4.1 系统结构分类集中式、分布式与混合式多智能体系统的宏观结构直接决定了系统能承受的规模与故障模式。集中式结构里有一个中央调度智能体所有任务由它拆解并派发给子智能体分布式结构里各智能体地位平等通过协商达成一致混合式则划定若干小组组内集中调度、组间分布式协商。集中式的优点是控制力强适合流程清晰、步骤固定的业务比如订单处理流水线缺点是中央调度器成为单点瓶颈且调度器自身容易成为“大号单体”——所有信息都要过它一遍扩展性受限。分布式的优点是鲁棒性好适合动态变化、没有固定流程的开放场景缺点是协调成本高容易陷入协商死锁。混合式是工业界的折衷答案。结构类型协调方式适用场景主要瓶颈典型故障模式集中式中央调度流程固定、步骤明确单点性能与上下文长度调度器输出格式异常全员挂起分布式平等协商动态开放、非确定流程通信量与协商收敛两个Agent互相等待确认死锁混合式组内集中组间协商大型复杂系统边界路由的规则设计消息跨组路由丢失且无重试4.2 消息传递协议与语义约定多智能体系统的通信不是简单地让两个Agent互相发文字而是要定义一套消息协议。协议里至少要有四层信息发送方IDsender、接收方IDrecipient、消息类型message_type和负载payload。这个标准已经是这个领域的基线共识。{ protocol_version: 1.0, sender: planner-agent, recipient: tool-executor, message_id: f8d2c9e0-1c3a-4b7d-9e0f-2a5b6c7d8e9f, message_type: task_assign, priority: high, payload: { task_id: auction-10432, action: check_inventory, params: {sku: SKU-8842, quantity: 1}, timeout_ms: 30000 }, reply_to: task:auction-10432 }字段说明protocol_version是版本协商的关键不同版本的Agent在同一系统内混跑时没有版本号会导致旧Agent读不懂新消息格式。message_id必须全局唯一它是追踪完整消息链路的锚点。priority字段是防止系统拥堵时的丢弃策略依据——低优先级消息在队列积压时可以直接丢弃高优先级消息必须保证送达。timeout_ms是接收方执行任务的时限超时未回执则发送方触发补偿逻辑重试或换Agent。reply_to用于关联会话让接收方的回复能路由回原任务的上下文。4.3 协作范式编排、协商与黑板模型的选型差异多智能体系统的协作有三大类范式编排、协商、黑板模型。编排Orchestration是中央控制型主Agent像项目经理一样派活子Agent执行完汇报结果协商Negotiation是子Agent之间通过多轮交互达成一致黑板模型是共享数据空间所有子Agent读黑板、写黑板通过数据的可见性来隐式协调。选型原则可以用一个二分法来简化如果任务流程在事前可以完整穷举用编排如果流程取决于运行时的中间结果比如拍卖、谈判、竞价用协商如果多种信息源需要持续合并更新比如态势感知系统用黑板模型。业界目前90%的落地系统都是编排式原因很简单——它的运行行为最容易预测和调试。编排式实现中有一个关键参数并行度。多个子Agent是否可以并行跑能并行到什么程度并行度受限于任务的依赖关系。planner先解析出无依赖的子任务分发给Worker有依赖的必须等上游完成。把这个逻辑写清楚编排系统就成功了八成。4.4 通信基础设施选型JSON直传与消息队列方案通信基础设施的选择和系统规模强相关。10个Agent以内的系统直接用JSON经过内存通道或Redis发布订阅就能工作50个Agent以上的系统必须引入消息队列做缓冲、重试和持久化。常见的方案是同机部署用Redis Streams它有原生消息确认机制XACK支持消费者组跨机部署用Kafka或RabbitMQ。这里要特别提醒不要用Redis的PUBLISH/SUBSCRIBE做Agent消息通道因为它无持久化、无确认机制消费者挂掉消息就丢了。做多Agent通信的下限标准是Redis Streams不是Pub/Sub。# Redis Streams 消费者组消费Agent消息 redis-cli XGROUP CREATE agent_events agent_group 0 MKSTREAM redis-cli XREADGROUP GROUP agent_group consumer_1 COUNT 5 BLOCK 5000 STREAMS agent_events 命令说明XGROUP CREATE创建消费者组agent_group中的每个消费者代表一个收消息的Agent实例MKSTREAM参数允许流不存在时自动创建。XREADGROUP是阻塞读取COUNT 5表示每次最多取5条消息BLOCK 5000表示如果没有消息则最多等待5秒再返回。返回结果后消费者处理消息然后用XACK agent_events agent_group message_id确认消息处理完成未确认的消息会在下次读取时被重新投递给组内其他消费者——这就是消息不丢失的机制。5. 多智能体系统的关键实现技术落地编排引擎与参数调优5.1 编排引擎的任务分解与规划编排是当前多智能体系统落地最重要的技术路线。一个编排引擎至少要能完成任务分解、智能体分配、结果综合三步。任务分解要把自然语言指令拆成可执行的子任务清单建立依赖图分配阶段根据子任务的性质选择对应的专用智能体写代码的、查数据的、生成图文的结果综合则把所有子任务的输出拼装成最终交付。不同框架对这三步的抽象不同。LangGraph用StateGraph定义节点和边CrewAI用Crew和Task来声明式描述Dify用可视化画布编排。经验不足的团队从Dify入手更快有工程基础的团队用LangGraph可控性更强。部署路径上要明确一点框架只是胶水落到生产环境时任务队列、错误恢复、监控报警这些工程能力才是决定成败的部分。5.2 工具调用与上下文管理的编排细节多智能体系统里工具调用不止是“一个Agent调一个工具”而是多个Agent之间共享工具或独占工具的策略问题。策略要明确定义哪些工具是全局共享的比如search_products哪些工具只有特定Agent可用比如update_inventory只能由库存Agent调用。权限模型不做就会出现协调者Agent绕过流程直接改库的风险。上下文管理在两处最关键角色专属的静态上下文系统提示词和运行时的动态上下文消息历史、工具返回值。常见做法是用模板引擎区分二者动态上下文每次独立拼装静态上下文在Agent启动时加载缓存——减少重复的Prompt拼接开销。5.3 LLM参数对不同角色智能体的配置建议多智能体系统里不同角色的AgentLLM推理参数不应该用同一套配置。温度参数temperature、Top-p参数对不同任务的影响差异很大。代码生成、数据分析、数据库查询这类“确定性任务”需要低温度结果要可复现头脑风暴、内容生成、回复润色这类“创造性任务”需要高温度输出要有多样性。一个最通用的配置参考如下智能体角色temperaturetop_p典型任务失败模式Planner0.2-0.40.8任务分解、优先级排序temperature过高会导致子任务拆得天花乱坠无法执行Executor代码0.0-0.20.7代码生成、命令执行高温度会产生“看起来对但跑不起来”的代码Critic0.5-0.70.9代码审查、方案评估低温度下Critic永远说“没问题”Sales/Chat0.7-0.90.9用户交互、话术生成低温度下回复生硬没有自然语言的味道5.4 一个最小可运行的多智能体系统骨架用一个Planner-Executor-Critic三段式结构展示多智能体系统的最小落地骨架。Planner拆解任务Executor执行具体工具调用Critic对执行结果做质量检查不合格则打回重做。# planner: 任务分解与派发 def planner_agent(user_request: str, executor_list: list) - list: prompt f将任务拆解为可执行的子任务。 可用执行者: {executor_list} 任务: {user_request} 输出: 每行一个子任务, 格式为 executor_name: task_description result llm.generate(prompt, temperature0.3) subtasks parse_lines(result) # [(executor_a, 查库存), ...] return subtasks # executor: 执行具体动作 def executor_agent(role: str, task_desc: str, tools: dict) - dict: action llm.generate( f你是{role}。任务: {task_desc}。可用工具: {list(tools.keys())}, temperature0.1, response_formatjson ) action_data json.loads(action) return tools[action_data[tool]](**action_data[params]) # critic: 质量回归检测 def critic_agent(output: dict, original_request: str) - tuple[bool, str]: verdict llm.generate( f原始需求: {original_request}\n执行结果: {output}\n 结果是否满足需求请回答 PASS 或 FAILFAIL 时说明原因。, temperature0.2 ) if FAIL in verdict: return False, verdict return True, 三个函数对应三个智能体的核心逻辑。planner用相对低的温度保证任务分解的稳定性executor只输出JSON且温度最低避免工具调用时产生漂移critic是质量控制的关键环节它的意义相当于软件工程中的测试环节——不能省略。这三个Agent之间的消息传递可以用4.2里的JSON协议封装。6. 多智能体系统的可观测性与验证必须埋点的四个信号6.1 跨Agent的Trace贯穿与消息链路多智能体系统一旦超过三个Agent问题定位就会变得极其困难。消息从一个Agent传到另一个Agent如果中间某一步丢消息或产生错误从哪个环节排查答案是从Trace贯穿开始。每个Agent的每次推理必须带上全局唯一的trace_id从第一个接收用户请求的Agent生成往后所有消息、工具调用、LLM请求都携带这个ID。工业界成熟做法是接入OpenTelemetry标准思维链完整记录为Span消息发送记录为一条链接工具调用记录为带有入出参的事件。这会在问题定位时节省一半以上的精力。# 用 Python 内置日志模块实现 trace_id 贯穿 export OTEL_SERVICE_NAMEmass_agent_system export OTEL_TRACES_EXPORTERotlp python -m opentelemetry.instrumentation.auto参数说明OTEL_SERVICE_NAME设置服务名会在看板里去区分不同服务的链路数据OTEL_TRACES_EXPORTERotlp是指定导出协议全链路用同一协议才能聚合instrumentation.auto会自动接管HTTP、LLM调用和消息队列的埋点。这是让系统从“黑盒”变成“可观测”的最重要一步。6.2 停滞检测与死锁识别两个必看的运行时指标多智能体系统最隐蔽的故障是“静默死锁”——没有报错但任务就是不往前走。死锁的两个典型场景一是两个Agent互相等待对方的确认消息二是编排器把子任务派发给一个已经崩溃的Agent没有重试机制任务永远处于pending状态。监控指标方面必须实时追踪两个数消息队列积压量和任务从分发到完成的最大时延。队列积压量突然上升但无消费说明消费者Agent已经挂了或卡在某个不可中断的LLM调用里任务分发了却没有在超时时间内完成说明Agent之间可能陷入循环确认。一个实用的兜底策略每条消息带一个max_hops最大跳数消息每经过一个Agentmax_hops减一减到零就把消息投进死信队列并触发告警——这能有效防止消息在Agent之间无限循环路由。6.3 回归测试的Agent模拟方案多智能体系统的测试分三层组件层单Agent的单元测试、集成层Agent之间的消息通路测试、系统层端到端业务测试。组件层测试要mock掉LLM接口来保证确定性。集成层测试用真实LLM但要固定输入比对输出结构而不是输出内容。系统层测试则用录制的真实会话回放来检测流程是否跑通。# 集成层测试的确定性验证骨架 def test_planner_executor_contract(): mock_planner_output [executor_a: query_inventory(8842)] executor_input mock_planner_output[0] executor_tools {query_inventory: lambda sku: {stock: 5}} result executor_agent(库存管理员, executor_input, executor_tools) assert result {stock: 5}, f工具调用链路断裂: {result}这段测试的价值不在于逻辑复杂而在于它验证了Planner的输出格式能否被Executor正确解析。多智能体系统最常见的故障就是上游Agent输出的格式漂移导致下游Agent解析失败。把每个Agent的输出Schema固化为测试断言数据格式的漂移就会在集成交付时被拦截。**及格线之外的进阶信号**每个Agent的消息处理延迟分布和LLM调用的失败重试率。在多轮交互场景下这两个指标通常能比效果评估更早暴露系统退化。失败重试率超过5%时优先查工具入参的Schema定义是否与真实实体的结构一致。本文还有配套的精品资源点击获取