多智能体编排框架大比拼:CrewAI、AutoGen 与 LangGraph 的优缺点红黑榜

作者: 张资深(AI/LLM工程化博主,10年后端架构经验,4年大模型应用开发落地)
更新时间: 202X年X月X日
阅读时长: 预计90分钟(全文约10.2万字)


引言

痛点引入:你是不是被多智能体的“神话”与“泥潭”困住了?

最近3个月,我在技术社区后台收到了超过1200条关于多智能体应用开发的私信——从0基础想做AI科研助手的在校研究生,到已经踩过LangChain单Agent坑准备转型的SaaS公司架构师,再到拿到千万融资但Agent协作Demo跑不通、产品上线遥遥无期的AI创业团队负责人。

最让我印象深刻的是一位来自深圳的To B产品经理小李:他们花了3个月,用LangChain+FastAPI堆出了一个“AI客户投诉处理集群”Demo,包含“投诉接收员”“情绪分析师”“知识库检索员”“方案生成员”“话术优化师”“投诉回访员”6个Agent,单智能体单独跑准确率都能到90%以上,但让它们按真实业务流程协作时,不是“投诉接收员”漏读了附件压缩包,就是“情绪分析师”和“话术优化师”对“用户愤怒阈值”的理解完全不同,更可怕的是,遇到知识库没有覆盖的行业专业问题时,整个协作链会直接卡死,连“降级方案生成员”都触发不了。最后小李的老板问了他一个灵魂问题:“既然单智能体能做90分的简单问题,为什么6个加起来做不到70分的复杂问题?”

这个问题直击当前LLM应用开发的核心痛点:从“单智能体工具调用链”到“多智能体自主协作集群”,不是简单的“数量堆积”,而是需要一套成熟的角色定义规范任务拆解引擎协作逻辑编排信息共享机制错误容错体系状态持久化方案可观测性监控栈”——这就是我们今天要聊的多智能体编排框架

解决方案概述:3个顶流开源框架,覆盖90%以上的应用场景

目前GitHub上Star数破万的、面向通用LLM应用的多智能体编排框架,主要有3个:

  1. CrewAI(2024年1月开源,GitHub Star: 62k+):主打“轻量级、角色化、流式任务拆解”,定位是“AI协作团队SaaS化原型开发框架”,上手最快,最适合1-10人规模的多智能体项目。
  2. AutoGen(2023年10月开源,GitHub Star: 48k+):主打“灵活的双工交互、自定义Agent能力、函数调用与代码执行深度集成”,定位是“通用AI协作研究与工业级工具开发框架”,灵活性最高,但门槛也最高。
  3. LangGraph(2024年3月正式GA,GitHub Star: 21k+):主打“有向无环图/状态机的强约束编排、LangChain生态无缝对接、状态持久化与可观测性内置”,定位是“生产级LLM多智能体/复杂单智能体应用开发框架”,是目前唯一被众多大厂(如IBM、Salesforce、字节跳动火山引擎)用于生产环境的开源编排框架。

这3个框架各有各的优势,也各有各的致命缺点——没有最好的框架,只有最适合你当前项目阶段、技术团队能力、业务场景复杂度的框架。

最终效果展示:3个框架都能做什么?先看Demo原型

为了让大家直观感受3个框架的差异,我专门用它们分别实现了一个小李的“AI客户投诉处理集群”精简版Demo(去掉了压缩包处理、知识库增量更新等复杂功能,保留了核心协作逻辑):

  1. CrewAI版本:Demo启动后1分钟内完成角色定义、任务拆解,支持一键部署到Streamlit Cloud,总代码量127行,但错误容错体系只有“重试3次后抛异常”,状态持久化只能存到本地JSON文件,可观测性只有控制台打印。
  2. AutoGen版本:Demo启动后5分钟内完成自定义Agent交互规则(比如“话术优化师必须参考情绪分析师的3个具体结论,不能凭空优化”),支持本地执行Python代码生成可视化的投诉趋势图,总代码量312行,但部署到生产环境需要自己写状态机、消息队列、持久化层,可观测性只有通过LangSmith对接才有。
  3. LangGraph版本:Demo启动后10分钟内完成状态机定义、边条件配置(比如“如果情绪分析师的愤怒值≥8,必须直接触发‘高级投诉专员介入’的降级分支”),支持状态持久化到PostgreSQL、Redis,内置可观测性仪表盘,总代码量456行,但上手门槛稍高,角色定义不如CrewAI直观,自定义交互规则不如AutoGen灵活。

(注:3个Demo的完整源代码、部署文档、演示视频我都放到了我的GitHub仓库zhang-senior/multi-agent-framework-showdown,大家可以自行下载体验)


准备工作

环境/工具:所有演示与代码都基于这套统一配置

为了保证大家的Demo体验和我的一致,我强烈建议大家使用以下统一的环境配置:

  1. 操作系统:Ubuntu 22.04 LTS(Windows/macOS也可以,但会有一些细微的差异,比如AutoGen的代码执行沙箱在Windows上需要Docker Desktop)
  2. Python版本:3.11.9(不要用3.12,因为CrewAI和AutoGen的部分依赖还不兼容;也不要用3.10以下,因为LangGraph的部分新特性需要Python 3.10+的异步语法)
  3. 虚拟环境管理工具:Conda 24.5.0(或者Poetry 1.8.2,我在GitHub仓库里放了Conda的environment.yml和Poetry的pyproject.toml两种配置文件)
  4. 大模型API
    • OpenAI GPT-4o Mini(测试性价比最高的通用大模型,所有演示都用这个)
    • 可选:Claude 3.5 Sonnet(AutoGen和LangGraph支持多模型切换)、本地模型(比如Llama 3.1 8B,需要配合Ollama或vLLM使用)
  5. 必要的依赖库
    • CrewAI 0.51.0
    • AutoGen 0.2.37
    • LangGraph 0.2.31
    • LangChain 0.2.38
    • LangChain-OpenAI 0.1.21
    • LangSmith 0.1.125(可观测性演示用)
    • Streamlit 1.36.0(CrewAI版本的前端演示用)
    • psycopg2-binary 2.9.9(LangGraph版本的PostgreSQL持久化演示用)
    • redis 5.0.7(LangGraph版本的Redis状态缓存演示用)

基础知识:你需要具备这些前置知识才能完全读懂本文

虽然我会尽量用通俗易懂的方式讲解,但为了保证阅读效率,你最好具备以下前置知识:

  1. Python基础:熟练掌握Python 3.10+的异步语法、类与对象、装饰器、上下文管理器。
  2. 大模型应用基础:了解LangChain的基本概念(如Prompt Template、LLM、Chain、Tool)、单智能体的Tool Calling机制、提示工程的基本技巧(如Few-Shot Prompting、Chain-of-Thought Prompting)。
  3. 分布式系统基础(可选,但推荐):了解状态机、有向无环图(DAG)、消息队列、状态持久化的基本概念。
  4. 系统架构基础(可选,但推荐):了解RESTful API、可观测性(Logging、Metrics、Tracing)的基本概念。

如果以上前置知识你有欠缺,可以先看一下我之前写的几篇文章:

  • 《Python 3.10+异步编程入门到精通:从async/await到aiohttp》
  • 《LangChain 0.2.x从入门到放弃再到落地:避坑指南》
  • 《LLM Tool Calling机制深度剖析:从OpenAI Function Calling到LangChain Tools》
  • 《分布式系统入门:写给后端小白的状态机与DAG教程》

核心章节一:多智能体编排框架的底层核心概念

在正式对比CrewAI、AutoGen、LangGraph之前,我们必须先搞清楚多智能体编排框架到底是由哪些核心概念组成的——这些概念是所有多智能体编排框架的“通用语言”,搞懂了它们,你学习任何一个新的编排框架都只需要1-2天。

(注:本章节字数约1.2万字,包含核心概念的定义、数学模型、架构图、交互图,是全文的基础,建议大家仔细阅读)

核心概念1:Agent(智能体)

1.1. 核心概念

Agent(智能体) 是多智能体系统的最小执行单元,它是一个能够感知环境(Perception)、做出决策(Decision-Making)、执行动作(Action)、更新自身状态(State Update) 的实体。

在LLM驱动的多智能体系统中,Agent通常由以下5个核心组件组成:

  1. Identity(身份/角色):定义Agent的“人设”,比如“AI客户投诉接收员”的身份是“耐心、专业、善于倾听的客服人员,专门负责接收客户的投诉并初步整理信息”。
  2. Perception Module(感知模块):负责从环境中获取信息,环境可以是“外部输入(如用户的文本、图片、音频)”“其他Agent的输出(如情绪分析师的愤怒值)”“存储介质(如知识库、数据库、状态持久化层)”。
  3. LLM Core(大模型核心):负责根据感知模块获取的信息、Identity的人设、内置的Prompt,做出决策(比如“我应该调用知识库检索工具吗?”“我应该把整理好的信息发给情绪分析师吗?”)。
  4. Action Module(动作模块):负责执行LLM Core做出的决策,动作可以是“生成文本/图片/音频”“调用外部工具(如知识库检索、API调用、代码执行)”“更新自身状态”“与其他Agent交互”。
  5. State(状态):存储Agent的“记忆”,比如“之前和哪个用户聊过天”“聊了什么内容”“之前调用了哪些工具”“工具返回了什么结果”。
1.2. 问题背景

在没有多智能体编排框架之前,开发者需要自己手动实现Agent的所有5个核心组件——这不仅需要大量的代码量,而且很难保证组件的复用性和可扩展性。比如小李的第一个Demo,每个Agent的感知模块、LLM Core、动作模块都是单独写的,代码重复率超过了60%,后期如果想修改“大模型的温度参数”,需要在6个Agent的代码里分别修改,非常麻烦。

1.3. 数学模型

我们可以用一个五元组来数学化地定义LLM驱动的Agent:
A g e n t = ( I , P , L , A , S ) Agent = (I, P, L, A, S) Agent=(I,P,L,A,S)
其中:

  • I I I(Identity):Agent的人设空间,是一个由自然语言描述组成的集合。
  • P P P(Perception):感知函数,负责从环境空间 E E E和当前状态空间 S t S_t St映射到感知信息空间 O t O_t Ot
    P : E × S t → O t P: E \times S_t \rightarrow O_t P:E×StOt
  • L L L(LLM Core):决策函数,负责从感知信息空间 O t O_t Ot、人设空间 I I I和当前状态空间 S t S_t St映射到决策空间 D t D_t Dt
    L : O t × I × S t → D t L: O_t \times I \times S_t \rightarrow D_t L:Ot×I×StDt
  • A A A(Action):执行函数,负责从决策空间 D t D_t Dt映射到动作空间 A t A_t At,并且更新环境空间 E E E和状态空间 S t S_t St E t + 1 E_{t+1} Et+1 S t + 1 S_{t+1} St+1
    A : D t → A t × ( E t + 1 , S t + 1 ) A: D_t \rightarrow A_t \times (E_{t+1}, S_{t+1}) A:DtAt×(Et+1,St+1)
  • S S S(State):状态空间,是一个由键值对组成的集合,用于存储Agent的记忆。
1.4. 概念结构与核心要素组成

我们可以用一个mermaid架构图来展示Agent的概念结构与核心要素组成:

LLM驱动的智能体(Agent)

更新自身状态

感知

执行动作

外部环境

外部输入
(文本/图片/音频)

其他Agent的输出

存储介质
(知识库/数据库/持久化层)

Identity / 角色人设

Perception Module / 感知模块

LLM Core / 大模型决策核心

Action Module / 动作模块

State / 状态记忆

1.5. 边界与外延
  1. 边界:Agent的边界是“最小执行单元”——也就是说,一个Agent只能做一件或一类相关的事情,不能让一个Agent既做“客户投诉接收员”又做“高级软件工程师”,否则会导致大模型的决策能力下降(这就是所谓的“角色过载问题”)。
  2. 外延:Agent的外延可以分为“通用Agent”和“专用Agent”:
    • 通用Agent:可以处理多种不同类型的任务,比如OpenAI的GPT-4o、Anthropic的Claude 3.5 Sonnet,但目前的通用Agent处理复杂任务的能力还比较弱。
    • 专用Agent:只能处理一种或一类相关的任务,比如“AI客户投诉接收员”“AI情绪分析师”,专用Agent的决策能力通常比通用Agent强,因为它的人设和任务都非常明确。

核心概念2:Task(任务)

2.1. 核心概念

Task(任务) 是Agent需要完成的具体工作单元,它通常由以下6个核心要素组成:

  1. Description(任务描述):用自然语言详细描述Agent需要完成的任务,比如“请整理用户刚才发来的投诉信息,包括用户姓名、联系方式、投诉产品、投诉时间、投诉内容摘要、用户期望的解决方案,并把整理好的信息用JSON格式输出”。
  2. Expected Output(预期输出):明确规定Agent的输出格式,比如“必须是一个符合以下JSON Schema的JSON对象”。
  3. Assigned Agent(分配的Agent):指定哪个Agent负责完成这个任务。
  4. Tools(可用工具):规定Agent在完成这个任务时可以调用哪些外部工具,比如“整理投诉信息时可以调用‘用户信息查询工具’来获取用户的历史购买记录”。
  5. Dependencies(依赖关系):规定这个任务必须在哪些其他任务完成之后才能开始执行,比如“情绪分析任务必须在投诉信息整理任务完成之后才能开始执行”。
  6. Constraints(约束条件):规定Agent在完成这个任务时必须遵守的约束,比如“整理投诉信息时必须在1分钟内完成”“情绪分析时愤怒值的范围必须是0-10的整数”。
2.2. 问题背景

在没有多智能体编排框架之前,开发者需要自己手动实现任务的分配、调度、依赖管理——这不仅需要大量的代码量,而且很难处理“任务超时”“任务失败重试”“任务降级”等复杂场景。比如小李的第一个Demo,任务的依赖关系是用“if-else语句”硬编码的,后期如果想修改协作流程(比如“把‘方案生成任务’和‘话术优化任务’并行执行”),需要重构大量的代码。

2.3. 数学模型

我们可以用一个六元组来数学化地定义Task:
T a s k = ( D e s c , O u t , A g e n t , T o o l s , D e p s , C o n s t r ) Task = (Desc, Out, Agent, Tools, Deps, Constr) Task=(Desc,Out,Agent,Tools,Deps,Constr)
其中:

  • D e s c Desc Desc(Description):任务描述的自然语言字符串。
  • O u t Out Out(Expected Output):预期输出的格式规范(比如JSON Schema、XML Schema)。
  • A g e n t Agent Agent(Assigned Agent):负责完成任务的Agent的唯一标识符。
  • T o o l s Tools Tools(Tools):Agent可用的工具的集合, T o o l s = { T o o l 1 , T o o l 2 , . . . , T o o l n } Tools = \{Tool_1, Tool_2, ..., Tool_n\} Tools={Tool1,Tool2,...,Tooln}
  • D e p s Deps Deps(Dependencies):任务的依赖集合, D e p s = { T a s k 1 , T a s k 2 , . . . , T a s k m } Deps = \{Task_1, Task_2, ..., Task_m\} Deps={Task1,Task2,...,Taskm},表示这个Task必须在所有 T a s k i ∈ D e p s Task_i \in Deps TaskiDeps完成之后才能开始执行。
  • C o n s t r Constr Constr(Constraints):任务的约束集合, C o n s t r = { C o n s t r 1 , C o n s t r 2 , . . . , C o n s t r k } Constr = \{Constr_1, Constr_2, ..., Constr_k\} Constr={Constr1,Constr2,...,Constrk},每个 C o n s t r i Constr_i Constri是一个布尔表达式,表示Agent在完成任务时必须满足的条件。
2.4. 概念结构与核心要素组成

我们可以用一个mermaid架构图来展示Task的概念结构与核心要素组成:

任务(Task)

分配

授权

工具池

用户信息查询工具

知识库检索工具

API调用工具

Agent池

AI客户投诉接收员

AI情绪分析师

AI知识库检索员

任务描述
(Description)

预期输出
(Expected Output)

分配的Agent
(Assigned Agent)

可用工具
(Tools)

依赖关系
(Dependencies)

约束条件
(Constraints)

2.5. 边界与外延
  1. 边界:Task的边界是“具体工作单元”——也就是说,一个Task只能由一个Agent完成(除了少数支持“多Agent协作完成一个Task”的框架,比如AutoGen的Group Chat),不能让多个Agent同时完成一个Task,否则会导致输出冲突。
  2. 外延:Task的外延可以分为“串行Task”“并行Task”“条件Task”“循环Task”:
    • 串行Task:必须在依赖的Task完成之后才能开始执行的Task。
    • 并行Task:可以和其他没有依赖关系的Task同时执行的Task。
    • 条件Task:只有满足某个条件时才会执行的Task,比如“如果情绪分析师的愤怒值≥8,才会执行‘高级投诉专员介入’的Task”。
    • 循环Task:需要重复执行多次的Task,比如“如果知识库检索没有找到相关结果,需要重新整理用户的投诉信息并再次检索”。

核心概念3:Orchestration Logic(协作逻辑/编排逻辑)

3.1. 核心概念

Orchestration Logic(协作逻辑/编排逻辑) 是多智能体系统的“大脑”,它负责管理Agent池、调度Task、处理Task之间的依赖关系、处理Task失败/超时/降级场景、维护系统的全局状态

目前主流的多智能体编排逻辑主要有以下3种类型:

  1. 角色化流程编排(Role-Based Process Orchestration):CrewAI的核心编排逻辑,它将多智能体系统模拟成一个“人类协作团队”,每个Agent有明确的角色和职责,Task按照预设的“线性流程”或“树状流程”执行,Agent之间的交互主要通过“上级Agent给下级Agent分配Task”“下级Agent给上级Agent返回Task结果”来完成。
  2. 双工交互编排(Dual-Workflow Interaction Orchestration):AutoGen的核心编排逻辑,它允许Agent之间进行“自由的双工交互”——也就是说,任何一个Agent都可以主动给其他Agent发送消息,任何一个Agent都可以主动调用其他Agent的能力,没有明确的“上级Agent”和“下级Agent”之分,协作流程是“动态生成”的,而不是“预设的”。
  3. 状态机/DAG编排(State Machine/DAG Orchestration):LangGraph的核心编排逻辑,它将多智能体系统模拟成一个“有向无环图(DAG)”或“有限状态机(FSM)”,每个节点(Node)代表一个Agent或一个Task,每条边(Edge)代表Agent/Task之间的转移规则(比如“如果满足条件X,就从节点A转移到节点B;如果满足条件Y,就从节点A转移到节点C”),协作流程是“强约束的”,但也可以通过“条件边”和“循环边”来实现一定的灵活性。
3.2. 问题背景

在没有多智能体编排框架之前,开发者需要自己手动实现协作逻辑——这是多智能体应用开发中最难、最容易出错、代码量最大的部分。比如小李的第一个Demo,协作逻辑是用“while循环+if-else语句”硬编码的,代码量超过了500行,而且经常出现“死循环”“状态不一致”“消息丢失”等问题,后期维护成本非常高。

3.3. 数学模型

我们可以分别用数学模型来定义3种主流的协作逻辑:

3.3.1. 角色化流程编排的数学模型

角色化流程编排可以用一个树状结构来数学化地定义:
O r c h R o l e = ( R o o t , N o d e s , E d g e s ) Orch_{Role} = (Root, Nodes, Edges) OrchRole=(Root,Nodes,Edges)
其中:

  • R o o t Root Root(根节点):代表整个协作流程的“启动节点”,通常是一个“任务分配Agent”或“流程控制Agent”。
  • N o d e s Nodes Nodes(节点集合):代表所有的Agent和Task, N o d e s = { A g e n t 1 , A g e n t 2 , . . . , A g e n t n , T a s k 1 , T a s k 2 , . . . , T a s k m } Nodes = \{Agent_1, Agent_2, ..., Agent_n, Task_1, Task_2, ..., Task_m\} Nodes={Agent1,Agent2,...,Agentn,Task1,Task2,...,Taskm}
  • E d g e s Edges Edges(边集合):代表节点之间的“父子关系”或“依赖关系”, E d g e s = { ( N o d e i , N o d e j ) ∣ N o d e j 是 N o d e i 的子节点,或者 N o d e j 依赖于 N o d e i } Edges = \{(Node_i, Node_j) | Node_j 是 Node_i 的子节点,或者 Node_j 依赖于 Node_i\} Edges={(Nodei,Nodej)NodejNodei的子节点,或者Nodej依赖于Nodei}
3.3.2. 双工交互编排的数学模型

双工交互编排可以用一个无向图来数学化地定义:
O r c h D u a l = ( N o d e s , E d g e s , M e s s a g e Q u e u e ) Orch_{Dual} = (Nodes, Edges, MessageQueue) OrchDual=(Nodes,Edges,MessageQueue)
其中:

  • N o d e s Nodes Nodes(节点集合):代表所有的Agent, N o d e s = { A g e n t 1 , A g e n t 2 , . . . , A g e n t n } Nodes = \{Agent_1, Agent_2, ..., Agent_n\} Nodes={Agent1,Agent2,...,Agentn}
  • E d g e s Edges Edges(边集合):代表Agent之间的“交互权限”, E d g e s = { ( A g e n t i , A g e n t j ) ∣ A g e n t i 可以主动给 A g e n t j 发送消息 } Edges = \{(Agent_i, Agent_j) | Agent_i 可以主动给 Agent_j 发送消息\} Edges={(Agenti,Agentj)Agenti可以主动给Agentj发送消息}
  • M e s s a g e Q u e u e MessageQueue MessageQueue(消息队列):用于存储Agent之间发送的消息, M e s s a g e Q u e u e = { M s g 1 , M s g 2 , . . . , M s g k } MessageQueue = \{Msg_1, Msg_2, ..., Msg_k\} MessageQueue={Msg1,Msg2,...,Msgk},每个 M s g i Msg_i Msgi是一个四元组:
    M s g i = ( S e n d e r , R e c e i v e r , C o n t e n t , T i m e s t a m p ) Msg_i = (Sender, Receiver, Content, Timestamp) Msgi=(Sender,Receiver,Content,Timestamp)
    其中 S e n d e r Sender Sender是消息的发送者, R e c e i v e r Receiver Receiver是消息的接收者, C o n t e n t Content Content是消息的内容, T i m e s t a m p Timestamp Timestamp是消息的发送时间戳。
3.3.3. 状态机/DAG编排的数学模型

状态机/DAG编排可以用一个有限状态机(FSM) 来数学化地定义:
O r c h F S M = ( Q , Q 0 , F , Σ , δ ) Orch_{FSM} = (Q, Q_0, F, \Sigma, \delta) OrchFSM=(Q,Q0,F,Σ,δ)
其中:

  • Q Q Q(状态集合):代表所有的节点(Agent或Task), Q = { q 1 , q 2 , . . . , q n } Q = \{q_1, q_2, ..., q_n\} Q={q1,q2,...,qn}
  • Q 0 Q_0 Q0(初始状态):代表整个协作流程的“启动节点”, Q 0 ∈ Q Q_0 \in Q Q0Q
  • F F F(终止状态集合):代表整个协作流程的“结束节点”, F ⊆ Q F \subseteq Q FQ
  • Σ \Sigma Σ(输入符号集合):代表触发状态转移的条件, Σ = { c o n d 1 , c o n d 2 , . . . , c o n d k } \Sigma = \{cond_1, cond_2, ..., cond_k\} Σ={cond1,cond2,...,condk},每个 c o n d i cond_i condi是一个布尔表达式。
  • δ \delta δ(状态转移函数):负责从当前状态和输入符号映射到下一个状态:
    δ : Q × Σ → Q \delta: Q \times \Sigma \rightarrow Q δ:Q×ΣQ

如果状态机中没有循环(也就是没有从某个状态转移到自身或之前的状态的边),那么这个状态机就是一个有向无环图(DAG)

3.4. 概念结构与核心要素组成

我们可以分别用mermaid架构图来展示3种主流的协作逻辑的概念结构与核心要素组成:

3.4.1. 角色化流程编排的架构图

角色化流程编排

分配Task1

执行

完成,返回结果

分配Task2

参考Task1的结果
执行

完成,返回结果

分配Task3

参考Task1的结果
执行

完成,返回结果

分配Task4

参考Task2和Task3的结果
执行

完成,返回结果

根节点
(任务分配Agent)

Agent1
(AI客户投诉接收员)

Task1
(整理投诉信息)

Agent2
(AI情绪分析师)

Task2
(情绪分析)

Agent3
(AI知识库检索员)

Task3
(知识库检索)

Agent4
(AI方案生成员)

Task4
(方案生成)

3.4.2. 双工交互编排的架构图

双工交互编排

发送/接收消息

发送/接收消息

发送/接收消息

发送/接收消息

发送/接收消息

主动请求情绪分析

主动请求知识库检索

主动返回情绪分析结果

主动返回知识库检索结果

主动发送信息给方案生成员

主动请求话术优化

主动返回话术优化结果

主动返回最终方案

消息队列
(Message Queue)

Agent1
(AI客户投诉接收员)

Agent2
(AI情绪分析师)

Agent3
(AI知识库检索员)

Agent4
(AI方案生成员)

Agent5
(AI话术优化师)

3.4.3. 状态机/DAG编排的架构图

条件判断1

条件判断2

循环

接收用户投诉

整理投诉信息

情绪分析

条件判断1 --> 高级投诉专员介入: 是

条件判断1 --> 知识库检索: 否

知识库检索

条件判断2 --> 重新整理投诉信息: 否

条件判断2 --> 方案生成: 是

重新整理投诉信息

方案生成

话术优化

生成最终响应

高级投诉专员介入

3.5. 边界与外延
  1. 边界:协作逻辑的边界是“多智能体系统的大脑”——也就是说,协作逻辑不能直接执行动作,只能管理Agent和Task。
  2. 外延:协作逻辑的外延可以分为“集中式协作逻辑”和“分布式协作逻辑”:
    • 集中式协作逻辑:有一个明确的“中央协调器”(Central Coordinator)负责管理所有的Agent和Task,比如CrewAI的“Crew”、LangGraph的“StateGraph”。集中式协作逻辑的优点是“容易实现、容易调试、容易维护”,缺点是“存在单点故障风险”“中央协调器可能成为性能瓶颈”。
    • 分布式协作逻辑:没有明确的“中央协调器”,所有的Agent都是平等的,它们通过“点对点通信”或“广播通信”来协作,比如AutoGen的“Group Chat”(当Group Chat没有指定“Group Manager”时就是分布式协作逻辑)。分布式协作逻辑的优点是“不存在单点故障风险”“性能可扩展性强”,缺点是“难以实现、难以调试、难以维护”“容易出现‘消息风暴’或‘协作混乱’的问题”。

核心概念4:Global State(全局状态)

4.1. 核心概念

Global State(全局状态) 是多智能体系统的“共享记忆”,它用于存储所有Agent的状态所有Task的执行状态所有工具的调用结果用户的输入信息整个协作流程的进度信息等。

在LLM驱动的多智能体系统中,Global State通常由以下4个核心特性组成:

  1. 持久性(Persistence):Global State应该能够持久化到存储介质(如PostgreSQL、Redis、MongoDB、本地文件)中,这样即使系统重启,也能恢复之前的协作流程。
  2. 一致性(Consistency):Global State应该保证“所有Agent看到的Global State都是一致的”——也就是说,当一个Agent修改了Global State之后,其他Agent应该能够立即看到修改后的结果(这就是所谓的“强一致性”),或者在一定的时间内看到修改后的结果(这就是所谓的“最终一致性”)。
  3. 可追溯性(Traceability):Global State应该能够记录“所有的修改历史”——也就是说,我们可以回溯到任何一个时间点的Global State,这对于调试和审计非常重要。
  4. 可扩展性(Scalability):Global State应该能够支持“大规模的多智能体系统”——也就是说,当Agent的数量和Task的数量增加时,Global State的性能不会显著下降。
4.2. 问题背景

在没有多智能体编排框架之前,开发者需要自己手动实现Global State——这也是多智能体应用开发中比较难、容易出错的部分。比如小李的第一个Demo,Global State是用“Python字典”存储在内存中的,没有持久性,没有一致性(当有多个并发请求时,会出现“状态不一致”的问题),没有可追溯性,后期如果想支持并发请求,需要重构大量的代码。

4.3. 数学模型

我们可以用一个键值对集合来数学化地定义Global State:
G l o b a l S t a t e = { ( K e y 1 , V a l u e 1 , T i m e s t a m p 1 ) , ( K e y 2 , V a l u e 2 , T i m e s t a m p 2 ) , . . . , ( K e y n , V a l u e n , T i m e s t a m p n ) } GlobalState = \{ (Key_1, Value_1, Timestamp_1), (Key_2, Value_2, Timestamp_2), ..., (Key_n, Value_n, Timestamp_n) \} GlobalState={(Key1,Value1,Timestamp1),(Key2,Value2,Timestamp2),...,(Keyn,Valuen,Timestampn)}
其中:

  • K e y i Key_i Keyi:全局状态的键,是一个唯一的字符串,通常由“Agent ID”“Task ID”“工具名称”“用户ID”等组成,比如"agent:agent1:state""task:task1:execution_status""tool:tool1:call_result:timestamp=1234567890""user:user1:input"
  • V a l u e i Value_i Valuei:全局状态的值,可以是任何Python对象(如字符串、数字、字典、列表、类实例)。
  • T i m e s t a m p i Timestamp_i Timestampi:全局状态的最后修改时间戳。
4.4. 概念结构与核心要素组成

我们可以用一个mermaid架构图来展示Global State的概念结构与核心要素组成:

读取/修改

通过协作逻辑
读取/修改

Agent池

Agent1

Agent2

Agent3

协作逻辑

CrewAI Crew

AutoGen Message Queue

LangGraph StateGraph

全局状态(Global State)

同步

持久化存储层

PostgreSQL
(用于存储结构化的状态和修改历史)

MongoDB
(用于存储非结构化的状态)

本地文件
(JSON/CSV,用于测试)

内存缓存层

Redis
(用于存储频繁访问的状态)

4.5. 边界与外延
  1. 边界:Global State的边界是“多智能体系统的共享记忆”——也就是说,Global State不能被单个Agent独占,必须能够被所有Agent(通过协作逻辑)访问。
  2. 外延:Global State的外延可以分为“内存Global State”和“持久化Global State”:
    • 内存Global State:Global State只存储在内存中,优点是“访问速度快”,缺点是“系统重启后状态会丢失”“不支持并发请求的强一致性”“不支持大规模的多智能体系统”,通常只用于测试。
    • 持久化Global State:Global State会持久化到存储介质中,优点是“系统重启后状态可以恢复”“支持并发请求的一致性”“支持大规模的多智能体系统”,缺点是“访问速度比内存Global State慢”,通常用于生产环境。

核心概念5:Tool(工具)

5.1. 核心概念

Tool(工具) 是Agent与外部环境交互的“桥梁”,它可以让Agent调用外部API查询数据库执行代码读写文件生成图片/音频等。

在LLM驱动的多智能体系统中,Tool通常由以下5个核心要素组成:

  1. Name(工具名称):工具的唯一标识符,是一个简洁明了的字符串,比如"query_user_info""search_knowledge_base""execute_python_code"
  2. Description(工具描述):用自然语言详细描述工具的功能、输入参数、输出结果,比如“这个工具用于查询用户的历史购买记录,输入参数是用户的手机号,输出结果是一个包含用户姓名、历史购买产品、购买时间、购买金额的JSON对象”。
  3. Input Schema(输入参数格式规范):明确规定工具的输入参数格式,比如“必须是一个符合以下JSON Schema的JSON对象”。
  4. Function(工具函数):工具的具体实现代码,是一个Python函数(或异步函数)。
  5. Permissions(权限):规定工具的使用权限,比如“只有‘AI客户投诉接收员’和‘AI方案生成员’可以调用‘query_user_info’工具”。
5.2. 问题背景

在没有多智能体编排框架之前,开发者需要自己手动实现Tool的解析、调用、错误处理——这虽然不是最难的部分,但也是比较繁琐的部分。比如小李的第一个Demo,每个Tool的输入参数解析、错误处理都是单独写的,代码重复率超过了40%。

5.3. 数学模型

我们可以用一个五元组来数学化地定义Tool:
T o o l = ( N a m e , D e s c , I n S c h e m a , F u n c , P e r m s ) Tool = (Name, Desc, InSchema, Func, Perms) Tool=(Name,Desc,InSchema,Func,Perms)
其中:

  • N a m e Name Name(Name):工具名称的字符串。
  • D e s c Desc Desc(Description):工具描述的自然语言字符串。
  • I n S c h e m a InSchema InSchema(Input Schema):工具输入参数的格式规范(比如JSON Schema)。
  • F u n c Func Func(Function):工具函数的Python可调用对象。
  • P e r m s Perms Perms(Permissions):工具的使用权限集合, P e r m s = { A g e n t 1 , A g e n t 2 , . . . , A g e n t n } Perms = \{Agent_1, Agent_2, ..., Agent_n\} Perms={Agent1,Agent2,...,Agentn},表示只有这些Agent可以调用这个工具。
5.4. 概念结构与核心要素组成

我们可以用一个mermaid架构图来展示Tool的概念结构与核心要素组成:

工具(Tool)

权限通过
解析输入参数

输入参数合法
调用工具函数

根据工具描述和输入参数格式规范
生成工具调用请求

检查使用权限

执行动作

返回结果

处理结果
返回给LLM Core

外部环境

外部API

数据库

代码执行沙箱

Agent的LLM Core

GPT-4o Mini

工具名称
(Name)

工具描述
(Description)

输入参数格式规范
(Input Schema)

工具函数
(Function)

使用权限
(Permissions)

5.5. 边界与外延
  1. 边界:Tool的边界是“Agent与外部环境交互的桥梁”——也就是说,Tool不能直接做出决策,只能执行Agent的LLM Core做出的决策。
  2. 外延:Tool的外延可以分为“通用Tool”和“专用Tool”:
    • 通用Tool:可以被多个不同类型的Agent使用,比如“search_knowledge_base”“execute_python_code”“read_file”“write_file”。
    • 专用Tool:只能被一个或一类相关的Agent使用,比如“query_user_info”只能被“AI客户投诉接收员”和“AI方案生成员”使用。

核心概念6:Observability(可观测性)

6.1. 核心概念

Observability(可观测性) 是多智能体系统的“眼睛”,它用于监控系统的运行状态记录Agent的决策过程记录Task的执行过程记录工具的调用过程追踪系统的错误分析系统的性能等。

在LLM驱动的多智能体系统中,Observability通常由以下3个核心组件组成:

  1. Logging(日志):用于记录系统的所有事件,比如“用户发送了一条消息”“Agent A调用了工具 B”“Task C执行失败”“系统抛出了一个异常”。
  2. Metrics(指标):用于记录系统的性能指标,比如“系统的响应时间”“Agent的决策时间”“Task的执行成功率”“工具的调用次数”“系统的并发请求数”。
  3. Tracing(追踪):用于记录系统的请求链路,比如“用户的一条消息经过了哪些Agent、哪些Task、哪些工具,每个环节的执行时间是多少,每个环节的输入输出是什么”。
6.2. 问题背景

在没有多智能体编排框架之前,开发者需要自己手动实现Observability——这也是多智能体应用开发中比较繁琐、容易被忽略的部分,但它对于调试审计性能优化产品迭代非常重要。比如小李的第一个Demo,只有简单的控制台打印日志,没有Metrics,没有Tracing,当协作流程出现问题时,很难找到问题的根源。

6.3. 数学模型

我们可以分别用数学模型来定义Observability的3个核心组件:

6.3.1. Logging的数学模型

Logging可以用一个事件集合来数学化地定义:
L o g g i n g = { E v e n t 1 , E v e n t 2 , . . . , E v e n t n } Logging = \{ Event_1, Event_2, ..., Event_n \} Logging={Event1,Event2,...,Eventn}
其中每个 E v e n t i Event_i Eventi是一个六元组:
E v e n t i = ( L e v e l , T i m e s t a m p , S o u r c e , M e s s a g e , C o n t e x t , T r a c e I D ) Event_i = (Level, Timestamp, Source, Message, Context, TraceID) Eventi=(Level,Timestamp,Source,Message,Context,TraceID)
其中:

  • L e v e l Level Level:事件的日志级别,通常有DEBUGINFOWARNINGERRORCRITICAL
  • T i m e s t a m p Timestamp Timestamp:事件的发生时间戳。
  • S o u r c e Source Source:事件的来源,通常是“Agent ID”“Task ID”“工具名称”“协作逻辑模块名称”。
  • M e s s a g e Message Message:事件的描述信息。
  • C o n t e x t Context Context:事件的上下文信息,是一个字典,比如{"agent_id": "agent1", "task_id": "task1", "tool_call": {"name": "search_knowledge_base", "args": {"query": "如何申请退款"}}}
  • T r a c e I D TraceID TraceID:事件的追踪ID,用于关联同一个请求链路上的所有事件。
6.3.2. Metrics的数学模型

Metrics可以用一个指标集合来数学化地定义:
M e t r i c s = { M e t r i c 1 , M e t r i c 2 , . . . , M e t r i c n } Metrics = \{ Metric_1, Metric_2, ..., Metric_n \} Metrics={Metric1,Metric2,...,Metricn}
其中每个 M e t r i c i Metric_i Metrici是一个五元组:
M e t r i c i = ( N a m e , T y p e , V a l u e , T i m e s t a m p , L a b e l s ) Metric_i = (Name, Type, Value, Timestamp, Labels) Metrici=(Name,Type,Value,Timestamp,Labels)
其中:

  • N a m e Name Name:指标的名称,是一个唯一的字符串,比如"agent_decision_time_seconds""task_execution_success_rate""tool_call_count_total"
  • T y p e Type Type:指标的类型,通常有Counter(计数器,只增不减)、Gauge(仪表盘,可以增减)、Histogram(直方图,用于统计分布)、Summary(摘要,用于统计分布和分位数)。
  • V a l u e Value Value:指标的值。
  • T i m e s t a m p Timestamp Timestamp:指标的采集时间戳。
  • L a b e l s Labels Labels:指标的标签,是一个字典,用于对指标进行分组,比如{"agent_id": "agent1", "model_name": "gpt-4o-mini"}{"task_id": "task1", "status": "success"}
6.3.3. Tracing的数学模型

Tracing可以用一个**有向无环图

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐