多Agent协作与A2A协议——CrewAI + LangGraph搭建AI协作团队


title: 多Agent协作与A2A协议------CrewAI + LangGraph搭建AI协作团队

tags: 多Agent协作,A2A协议,CrewAI,LangGraph,AutoGen,Agent协作,Agent Card,Agent开发,Python,AI Agent
category: 人工智能

多Agent协作与A2A协议------CrewAI + LangGraph搭建AI协作团队

本文是《AI编程与Agent实战》系列第10篇。第09篇用FastMCP从零写了一个完整的MCP Server,覆盖Tools/Resources/Prompts三大原语、调试方法和Docker部署。结尾指出:MCP解决的是Agent到工具的连接,那Agent到Agent的连接谁来解决。

系列前置阅读:第01篇:工具横评 | 第02篇:Cursor入门 | 第03篇:Claude Code实战 | 第04篇:本地模型编程 | 第05篇:Agentic Engineering | 第06篇:AI代码安全 | 第07篇:全栈项目实战 | 第08篇:Agent开发入门 | 第09篇:MCP Server开发

2026年4月9日,Linux基金会Agentic AI Foundation发布A2A协议一周年数据:22,000+ GitHub stars、150+生产级组织部署、5种语言官方SDK(Python/JavaScript/Java/Go/.NET)。Microsoft Copilot Studio、Azure AI Foundry、Amazon Bedrock AgentCore Runtime全部原生集成。同一天,签名Agent Card(加密身份验证)和Agent Payments Protocol(AP2,60+支付行业伙伴)正式发布。

数字背后的工程现实:企业Agent架构正在从「单个Agent+多个MCP工具」走向「多个Agent通过A2A协议互委托任务」。一个LangGraph编排的财务Agent可以把合规检查委托给CrewAI构建的法务Agent,两者运行在不同框架、不同服务器、甚至不同组织,不需要任何定制集成。

但这套图景有一个容易被忽略的前提:多Agent协作的失败率远高于单Agent。UC Berkeley的MAST研究分析了1,600条生产执行trace,发现多Agent系统41%到86.7%的失败率,其中79%来自架构设计问题,不是模型能力问题。Augment Code的分析更直接:朴素的「Bag of Agents」管线累积错误的速度是单Agent系统的17倍。

这篇从协议层到框架层拆解多Agent协作的完整图景:A2A协议怎么让不同框架的Agent互相通信,CrewAI怎么用几十行代码搭建一个AI团队,LangGraph怎么构建有状态的工作流,以及为什么多Agent不是越多越好。

来源:Linux Foundation AAIF Press Release 2026.04, agentmarketcap.ai A2A一周年分析 2026.04, UC Berkeley MAST Taxonomy arXiv 2503.13657 2025.03, Augment Code Bag of Agents分析 2026


目录

  1. 从单Agent到多Agent:为什么需要协作
  2. [2026年Agent协议全景:MCP + A2A + AP2三层模型](#2026年Agent协议全景:MCP + A2A + AP2三层模型)
  3. [A2A协议详解:Agent Card、Task与Transport](#A2A协议详解:Agent Card、Task与Transport)
  4. CrewAI实战:搭建AI研究团队
  5. LangGraph实战:构建有状态的复杂工作流
  6. [三大框架对比:CrewAI vs LangGraph vs AutoGen](#三大框架对比:CrewAI vs LangGraph vs AutoGen)
  7. 多Agent协作的失败模式:MAST分类法
  8. 辩证看待:多Agent不是越多越好
  9. 选型建议:什么场景用什么框架
  10. 总结与下一篇预告

1. 从单Agent到多Agent:为什么需要协作

1.1 单Agent的天花板

一个配了MCP工具的Agent已经很强了:能查数据库、调API、读写文件、执行代码。但生产环境中的复杂任务会撞上三面墙。

注意力分散。 让一个Agent同时扮演研究员、分析师和撰稿人,它在每一步推理时都需要在不同角色间切换上下文。LLM的注意力是有限的资源,角色越多,每个角色分到的注意力越少,输出质量逐级下降。CrewAI官方实测数据:比LangGraph快5.76倍的原因之一是专业分工让每个Agent的推理路径更短。

上下文窗口膨胀。 复杂任务需要大量中间结果。一个Agent处理完整流程,所有中间数据都堆在一个上下文窗口里。Token消耗线性增长,到了窗口上限只能截断或摘要,信息丢失不可避免。Augment Code的基准测试显示,多Agent管线的Token消耗约是单Agent的15倍,但每个Agent各自处理的上下文更小、更聚焦。

错误传播。 单Agent管线里,第3步的错误直接进入第4步的输入,第4步基于错误数据继续推理,错误被「合法化」。MAST研究发现,这是多Agent系统最常见的失败模式之一(Error Cascade,错误级联),在单Agent中同样存在,只是多Agent场景下传播路径更隐蔽。

1.2 多Agent的核心价值

多Agent协作解决这三个问题的思路是专业分工。

复制代码
单Agent模式:
  用户 → [全能Agent: 研究+分析+写作+审核] → 输出
  问题:注意力分散、上下文膨胀、错误不可控

多Agent模式:
  用户 → [研究员Agent] → [分析师Agent] → [撰稿Agent] → [审核Agent] → 输出
  优势:专业分工、独立上下文、可插入验证节点

每个Agent有自己的角色定义(role)、目标(goal)、背景故事(backstory)和工具集。研究员Agent只管搜索和整理资料,分析师Agent只管从数据中提炼洞察,撰稿Agent只管把分析结果写成文章。每个Agent的上下文窗口只装自己需要的信息,推理路径更短、更聚焦。

但这个图景有一个容易被忽视的前提:多Agent的价值取决于架构和任务的对齐程度。架构不对齐,多Agent比单Agent更差。后面第7节会详细展开。

1.3 多Agent的三种协作拓扑

生产环境中多Agent协作有三种主流拓扑结构:

星型(Orchestrator + Workers)。 一个中央编排器Agent接收任务,决定分给哪个专业Agent执行,收集结果后决定下一步。LangGraph的Supervisor模式和大部分CrewAI实现属于这一类。优势是可预测性强、编排器有全局视野。劣势是扩展性有限,编排器在5-6个Agent以上容易成为瓶颈。

网状(Peer-to-Peer)。 所有Agent平级,通过消息互相通信,没有中央编排器。AutoGen和部分CrewAI配置采用这种模式。优势是灵活、无单点瓶颈。劣势是极易出现语义漂移和无限协商,调试困难。

层级(Hierarchical)。 组织结构式的编排。顶层Supervisor委托给中层Team Lead,Team Lead再分配给底层执行Agent。LangGraph通过子图(Subgraph)支持这种模式。适合大规模系统,但设计复杂度高。

2026年Q1的生产验证结果很明确:星型(Orchestrator + Workers)是唯一在生产环境中稳定运行的拓扑。网状协作在demo中看起来优雅,在production中几乎全部被替换。

来源:swoft.ai多Agent协调14种失败模式 2026, buildtest.run多Agent生产报告Q1 2026, codexical.com多Agent编排失败分析 2026.05


2. 2026年Agent协议全景:MCP + A2A + AP2三层模型

2.1 三层协议栈

2026年的Agent协议生态已经形成了清晰的三层结构:

复制代码
┌─────────────────────────────────────────────────┐
│              多 Agent 系统架构                    │
│                                                   │
│  Agent A ◄──── A2A ────► Agent B                 │
│  (LangGraph)    协议      (CrewAI)                │
│     │                        │                    │
│    MCP                      MCP                   │
│    协议                      协议                  │
│     │                        │                    │
│  数据库 API 文件          数据库 API 文件          │
│                                                   │
│  ────────────────────────────────────             │
│  AP2 协议:Agent 之间的支付与结算                  │
└─────────────────────────────────────────────────┘
层级 协议 解决什么 主导方 治理
Agent → 工具 MCP Agent怎么调用外部工具和API Anthropic Linux基金会AAIF
Agent → Agent A2A Agent怎么委托任务给另一个Agent Google Linux基金会AAIF
Agent → 支付 AP2 Agent怎么进行交易授权和结算 A2A生态 Linux基金会AAIF

三层协议的关系不是竞争,是互补。MCP让Agent有工具可用,A2A让Agent有同事可用,AP2让Agent有交易能力。生产级Agent系统三个都需要。

2025年12月,Linux基金会成立Agentic AI Foundation(AAIF),把MCP和A2A放在同一个治理伞下。IBM的Agent Communication Protocol(ACP)在2025年8月合并进A2A,消除了唯一的分叉风险。截至2026年4月,三大云厂商(Microsoft Azure、AWS Bedrock、Google Cloud)全部原生集成A2A。

来源:Linux Foundation AAIF公告 2025.12, agentmarketcap.ai A2A分析 2026.04, PRNewswire A2A一周年新闻稿 2026.04

2.2 A2A vs MCP:不是替代,是互补

这是最常被问到的问题。一张表说清楚:

维度 MCP A2A
解决什么 Agent怎么调工具 Agent怎么委托另一个Agent
类比 USB-C接口(连接外设) HTTP协议(服务间通信)
交互模式 无状态请求/响应 有状态长任务(submitted→working→completed)
对方是什么 MCP Server对Agent透明 Agent有自己的推理,是黑盒
传输 stdio / Streamable HTTP JSON-RPC 2.0 over HTTPS + SSE
规范维护 Anthropic → AAIF Google → AAIF

一句话:MCP让Agent有手(工具),A2A让Agent有同事(其他Agent)。

来源:juejin.cn A2A协议解析, rapidclaw.dev A2A完整指南 2026


3. A2A协议详解:Agent Card、Task与Transport

3.1 Agent Card:Agent的数字名片

A2A协议的三个核心原语:Agent Card(发现)、Task(工作单元)、Transport(传输)。

每个支持A2A的Agent在/.well-known/agent.json发布一份JSON文档,告诉世界「我是谁、我能做什么、怎么跟我通信」。这就是Agent Card。

json 复制代码
{
  "name": "legal-compliance-agent",
  "description": "法务合规审查Agent,识别合同中的法律风险条款",
  "version": "1.2.0",
  "url": "https://legal.internal.company.com/a2a",
  "capabilities": {
    "streaming": true,
    "pushNotifications": true
  },
  "skills": [
    {
      "name": "contract_review",
      "description": "审查商业合同,识别违约责任、管辖权和知识产权归属等风险条款",
      "inputModes": ["text", "file"],
      "outputModes": ["text", "json"]
    },
    {
      "name": "compliance_check",
      "description": "检查文档是否符合GDPR、SOC2等合规要求",
      "inputModes": ["text", "file"],
      "outputModes": ["text", "json"]
    }
  ],
  "authentication": {
    "schemes": ["bearer"]
  }
}

任何Agent只要知道这个URL,就能读取Agent Card,决定是否委托任务。不需要预先注册、不需要中心化目录。这是一种去中心化的服务发现机制,和Web世界的.well-known/标准一脉相承。

3.2 签名Agent Card:企业级信任

2026年4月v1.0引入的关键特性:Agent Card支持加密签名。签名绑定到发布者的域名,调用方在信任Agent的能力声明之前,先验证Card是否由声明的域名签发。

这是企业采购的解锁功能。跨组织Agent协作时,你怎么知道对面的Agent Card没有被篡改?签名验证解决了这个问题。没有这个特性,跨组织A2A部署在合规层面几乎不可行。

3.3 Task:有状态的工作单元

A2A的Task不是简单的函数调用。它是一个有状态的工作单元,包含目标、消息线程和产出的类型化工件(artifacts)。

Task的状态机:

复制代码
submitted → working → input-required → working → completed
                ↑           ↓
                └───────────┘
              (需要补充信息时回到working)

三种通信模式对应不同任务类型:

同步请求/响应。 快速操作,毫秒级返回。查一个状态、执行一次计算。

流式(SSE)。 长任务实时进度更新。Agent在执行过程中持续推送中间结果,调用方看到进度条。一个研究报告生成任务可能需要30秒,流式模式让调用方不需要干等。

异步推送通知。 超长任务(小时级甚至天级)。Agent接收任务后返回一个webhook URL,任务完成时主动推送结果。金融合规审计一个季度报告不会在几秒内返回,异步模式处理这种工作流。

3.4 Transport:无聊但可靠的技术选择

A2A的传输层用了「最无聊的技术组合」:HTTPS传输、JSON-RPC 2.0消息封装、SSE流式更新。

这是有意为之的设计决策。企业安全团队和负载均衡器已经知道怎么处理HTTP流量。引入新的传输层会产生采用摩擦,A2A避开了。你能用Nginx做反向代理、用CDN做加速、用WAF做防护,运维体系不需要改造。

3.5 A2A的SDK生态

截至2026年4月,A2A有5种语言的官方SDK:

语言 SDK 状态
Python a2a-sdk 生产就绪
JavaScript/TypeScript @a2a-protocol/js 生产就绪
Java Quarkus A2A 1.0.0.Beta1
Go a2a-go 生产就绪
.NET Microsoft Agent Framework A2A v1原生

原生支持A2A的框架:Google ADK、LangGraph、CrewAI、LlamaIndex、Semantic Kernel、AutoGen、Microsoft Agent Framework。这意味着你用这些框架构建的Agent,天然可以互相委托任务。

来源:rapidclaw.dev A2A完整指南 2026, agentmarketcap.ai A2A协议分析 2026.04, PRNewswire A2A新闻稿 2026.04, a2a-protocol.org官方规范


4. CrewAI实战:搭建AI研究团队

4.1 CrewAI是什么

CrewAI是把人类团队协作模式映射到AI上的框架。核心抽象是「角色+任务+团队」:每个Agent有专业角色(role)、个人目标(goal)和背景故事(backstory),任务(Task)在团队成员间传递,Crew负责编排执行顺序。

截至2026年4月,CrewAI v1.14.3,GitHub stars约35K+,认证开发者超过100,000人。关键特性:完全独立,不依赖LangChain生态;官方实测比LangGraph快5.76倍;支持MCP协议和A2A通信。

4.2 安装与项目创建

bash 复制代码
# 安装(推荐用uv,比pip快10-100倍)
uv pip install crewai
uv pip install 'crewai[tools]'  # 安装官方工具集

# 或者用pip
pip install crewai crewai-tools

用脚手架创建标准项目:

bash 复制代码
crewai create crew research_team
cd research_team
crewai install
crewai run

项目结构自动生成:

复制代码
research_team/
├── .env                    # API Key
├── pyproject.toml
├── src/research_team/
│   ├── main.py             # 入口
│   ├── crew.py             # Crew定义
│   ├── config/
│   │   ├── agents.yaml     # Agent配置
│   │   └── tasks.yaml      # Task配置
│   └── tools/
│       └── custom_tool.py

4.3 实战:搭建「研究员+分析师+撰稿人」团队

场景:给一个研究课题,三个Agent协作产出一份研究报告。

python 复制代码
# main.py
from crewai import Agent, Task, Crew, Process, LLM
from crewai_tools import SerperDevTool  # 搜索工具

# 配置LLM
llm = LLM(model="gpt-4o-mini")

# 搜索工具
search_tool = SerperDevTool()

# ============================================================
# ① 定义三个Agent
# ============================================================

researcher = Agent(
    role="科技研究员",
    goal="深入研究{topic},找出最新进展和关键信息",
    backstory="""你是一位经验丰富的科技记者,擅长快速定位
    关键信息并提炼要点。你的研究风格严谨,总是区分
    事实与推测,注明信息来源。""",
    llm=llm,
    tools=[search_tool],
    max_iter=15,          # ReAct循环最多15步
    verbose=True,
)

analyst = Agent(
    role="数据分析师",
    goal="从研究数据中提炼可操作的商业洞察",
    backstory="""你在金融行业有10年数据分析经验,
    擅长用统计学方法发现隐藏规律。你的分析报告
    总是包含数据支撑和风险提示。""",
    llm=llm,
    verbose=True,
)

writer = Agent(
    role="技术撰稿人",
    goal="将分析结果整理成清晰易读的中文报告",
    backstory="""你是一位专业的科技博主,文风简洁,
    善于用通俗的语言解释复杂概念。你的文章结构清晰,
    每段不超过3句话。""",
    llm=llm,
    verbose=True,
)

# ============================================================
# ② 定义三个Task
# ============================================================

research_task = Task(
    description="""对{topic}进行深入调研:
    1. 搜索最新的技术进展和行业动态
    2. 识别3-5个关键技术要点
    3. 收集支持数据和市场数据
    4. 记录所有信息来源""",
    expected_output="包含3-5个关键技术要点的结构化摘要,"
                    "每条2-3句话说明,附数据来源",
    agent=researcher,
)

analysis_task = Task(
    description="""基于研究员的调研结果:
    1. 分析技术要点的商业影响
    2. 识别机会和风险
    3. 给出可操作的建议
    4. 标注每条结论的置信度(高/中/低)""",
    expected_output="包含商业洞察、风险提示和建议的分析报告,"
                    "每条结论标注置信度",
    agent=analyst,
    context=[research_task],  # 依赖研究任务的输出
)

writing_task = Task(
    description="""基于分析师的报告:
    1. 撰写一份800字以内的中文报告
    2. 包含引言、正文和结语
    3. 语言通俗,避免技术术语
    4. 在关键结论处加粗""",
    expected_output="一篇结构清晰、语言通俗的中文研究报告",
    agent=writer,
    context=[analysis_task],  # 依赖分析任务的输出
    output_file="report.md",  # 自动保存到文件
)

# ============================================================
# ③ 组建Crew并执行
# ============================================================

crew = Crew(
    agents=[researcher, analyst, writer],
    tasks=[research_task, analysis_task, writing_task],
    process=Process.sequential,  # 顺序执行
    verbose=True,
)

result = crew.kickoff(inputs={"topic": "A2A协议与企业Agent架构"})
print(result)

执行流程:

复制代码
crew.kickoff(inputs)
  │
  ├─ Task 1: research_task → researcher执行
  │   └─ 输出: 技术要点摘要 + 数据来源
  │
  ├─ Task 2: analysis_task → analyst执行(拿到Task 1的上下文)
  │   └─ 输出: 商业洞察 + 风险提示 + 建议
  │
  └─ Task 3: writing_task → writer执行(拿到Task 2的上下文)
      └─ 输出: 中文报告 → 保存到report.md

4.4 逐层解析

Agent的身份三要素。 role、goal、backstory共同构成给LLM的System Prompt。模糊的配置("助手""帮忙做事")产出质量差;具体的配置("法律合同审查专家,15年律所经验,专注违约责任和知识产权")产出质量高。这三个参数是CrewAI中影响输出质量最大的杠杆。

Task的context参数。 context=[research_task]让analyst拿到researcher的输出。CrewAI自动把前序Task的结果注入下一个Task的上下文。这是信息在Agent间传递的主要方式。

max_iter限制。 ReAct循环最多执行多少步。默认20,生产环境建议5-8。不设上限的Agent可能因为模型判断「还没完成」而无限循环,烧掉Token预算。

Process.sequential vs Process.hierarchical。 顺序模式按Task列表顺序执行。层级模式引入一个Manager Agent,由Manager决定把Task分给谁、什么时候执行。层级模式适合任务依赖关系不明确的场景,但Token消耗更高(Manager需要额外推理)。

4.5 进阶:CrewAI Flow

CrewAI v1.x引入了Flow(事件驱动工作流),弥补sequential/hierarchical两种模式在精确控制上的不足:

python 复制代码
from crewai.flow.flow import Flow, listen, start, router

class ResearchFlow(Flow):
    @start()
    def begin_research(self):
        """启动研究流程"""
        return {"topic": self.state.topic}

    @listen(begin_research)
    def run_research_crew(self):
        """执行研究Crew"""
        result = research_crew.kickoff(inputs=self.state)
        return result.raw

    @router(run_research_crew)
    def route_by_quality(self):
        """根据质量评分路由"""
        if self.state.quality_score > 0.8:
            return "publish"
        else:
            return "revise"

    @listen("publish")
    def publish_report(self):
        """质量合格,发布报告"""
        return "报告已发布"

    @listen("revise")
    def revise_report(self):
        """质量不合格,打回修改"""
        return "报告需修改"

flow = ResearchFlow()
flow.kickoff(inputs={"topic": "A2A协议"})

Flow的核心价值:条件分支、状态持久化、事件驱动。当Crew的顺序执行不够用时,Flow提供了精确的控制流。CrewAI官方建议:需要智能协作用Crews,需要精确掌控用Flows。两者可以嵌套使用,在Flow的某个步骤中执行一个Crew。

来源:juejin.cn CrewAI完全指南 v1.14.3 2026.04, alicelabs.ai CrewAI企业指南 2026, aiskillnav.com CrewAI教程 2026


5. LangGraph实战:构建有状态的复杂工作流

5.1 LangGraph是什么

LangGraph是LangChain团队出品的图式Agent编排框架。核心思想:把Agent工作流建模为有向图(StateGraph),节点(Node)是函数,边(Edge)定义状态流转,条件边实现分支和循环。

LangGraph 2.0于2026年2月发布,标志着从快速迭代期进入生产稳定期。所有非实验性API均被视为稳定和生产就绪。截至2026年4月,LangGraph是Python生态中采用最广的Agent编排库,LangChain组织全仓库GitHub stars超过126,000。生产用户包括Klarna(支持响应时间降低80%)、Uber、LinkedIn、Coinbase、Cloudflare。

5.2 核心概念

五个基础概念是理解LangGraph的前提:

State。 TypedDict或Pydantic模型,所有节点读写共享状态的唯一渠道。用Annotated标注的reducer函数控制并发更新如何合并。

python 复制代码
from typing import Annotated
from typing_extensions import TypedDict
import operator

class AgentState(TypedDict):
    messages: Annotated[list, operator.add]  # 追加而非覆盖
    next_step: str
    result: str

Node。 纯函数,接收当前状态,返回状态更新。可以调LLM、执行工具、查数据库。节点间通过状态通信,不直接互相调用。

python 复制代码
def my_node(state: AgentState):
    # 用state做点什么
    return {"result": "computed value"}

Edge。 定义节点间流转。普通边固定从A到B。条件边根据状态函数的返回值决定下一个节点,这是循环和分支的关键。

python 复制代码
# 固定边:从agent到tools
graph.add_edge("agent", "tools")

# 条件边:根据状态决定下一步
graph.add_conditional_edges(
    "agent",
    lambda state: "tools" if state.get("needs_tool") else "end",
    {"tools": "tools_node", "end": END}
)

Checkpoint。 每次节点转换时可选保存完整图状态。开发用MemorySaver,生产用PostgreSQL或Redis。崩溃后从最后一个checkpoint恢复,不丢失已完成的工作。这是LangGraph在生产环境最大的差异化能力。

Thread。 用thread_id标识一个隔离的执行上下文(一次对话会话)。每个thread维护自己的状态历史。一个图可以服务数千个并发用户,各有各的记忆。

5.3 实战:Supervisor + Researcher + Writer工作流

构建一个Supervisor编排的多Agent工作流。Supervisor接收任务,决定分给Researcher还是Writer,收集结果后决定是否完成。

python 复制代码
# langgraph_supervisor.py
from typing import Annotated, Literal
from typing_extensions import TypedDict
import operator
from langchain_core.messages import HumanMessage, AIMessage
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, START, END

# ============================================================
# ① 定义状态
# ============================================================

class AgentState(TypedDict):
    messages: Annotated[list, operator.add]
    next_step: str
    research_result: str
    final_report: str

# ============================================================
# ② LLM
# ============================================================

llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

# ============================================================
# ③ 定义节点
# ============================================================

def supervisor_node(state: AgentState) -> dict:
    """Supervisor:决定下一步分给谁"""
    messages = state["messages"]
    
    # 让LLM决定下一步
    decision_prompt = f"""你是一个任务编排器。根据当前对话历史,决定下一步:
    - "researcher":需要研究/搜索信息
    - "writer":需要撰写/整理内容
    - "FINISH":任务已完成

    当前对话:
    {messages[-1].content if messages else "无"}

    只返回一个词:researcher、writer或FINISH。"""
    
    response = llm.invoke(decision_prompt)
    next_step = response.content.strip().lower()
    
    if next_step not in ["researcher", "writer", "finish"]:
        next_step = "researcher"  # 默认给研究员
    
    return {"next_step": next_step}

def researcher_node(state: AgentState) -> dict:
    """研究员Agent:搜索和整理信息"""
    research_prompt = """你是一位科技研究员。请对以下主题进行调研,
    总结3个关键技术要点,每个要点2-3句话。"""
    
    messages = state["messages"]
    full_prompt = research_prompt + "\n\n主题:" + messages[-1].content
    
    response = llm.invoke(full_prompt)
    
    return {
        "messages": [AIMessage(content=response.content, name="researcher")],
        "research_result": response.content,
    }

def writer_node(state: AgentState) -> dict:
    """撰稿Agent:把研究结果写成报告"""
    research = state.get("research_result", "")
    
    writing_prompt = f"""你是一位技术撰稿人。请基于以下研究结果,
    撰写一份400字以内的中文报告,包含引言、正文和结语。

    研究结果:
    {research}"""
    
    response = llm.invoke(writing_prompt)
    
    return {
        "messages": [AIMessage(content=response.content, name="writer")],
        "final_report": response.content,
    }

# ============================================================
# ④ 路由函数
# ============================================================

def route_from_supervisor(state: AgentState) -> str:
    """根据Supervisor的决定路由"""
    next_step = state["next_step"]
    if next_step == "researcher":
        return "researcher"
    elif next_step == "writer":
        return "writer"
    else:
        return "end"

# ============================================================
# ⑤ 构建图
# ============================================================

graph = StateGraph(AgentState)

# 添加节点
graph.add_node("supervisor", supervisor_node)
graph.add_node("researcher", researcher_node)
graph.add_node("writer", writer_node)

# 添加边
graph.add_edge(START, "supervisor")

# 条件边:Supervisor决定下一步
graph.add_conditional_edges(
    "supervisor",
    route_from_supervisor,
    {
        "researcher": "researcher",
        "writer": "writer",
        "end": END,
    }
)

# Researcher和Writer完成后回到Supervisor
graph.add_edge("researcher", "supervisor")
graph.add_edge("writer", "supervisor")

# 编译
app = graph.compile()

# ============================================================
# ⑥ 执行
# ============================================================

result = app.invoke({
    "messages": [HumanMessage(content="研究A2A协议的发展现状和未来趋势")]
})

print("=== 最终报告 ===")
print(result["final_report"])

执行流程可视化:

复制代码
START → supervisor → ┬─ researcher → supervisor → ...
                     ├─ writer     → supervisor → ...
                     └─ END (任务完成)

Supervisor是循环的中心。每次Researcher或Writer完成任务后,控制权回到Supervisor,由它决定是否需要继续。

5.4 进阶:人在回路(Human-in-the-Loop)

LangGraph 2.0用interrupt()原语替代了旧的breakpoint API,提供一等公民的人在回路支持:

python 复制代码
from langgraph.types import interrupt, Command

def human_review_node(state: AgentState) -> dict:
    """在关键节点暂停,等待人工确认"""
    review_prompt = f"""请审核以下研究报告:
    
    {state.get('final_report', '')}
    
    输入 'approve' 发布,输入 'revise' 打回修改。"""
    
    # 执行暂停,返回token给调用方
    decision = interrupt({"review_needed": True, "report": state["final_report"]})
    
    if decision == "approve":
        return {"next_step": "publish"}
    else:
        return {"next_step": "revise"}

调用方在interrupt()处暂停,可以是一个Web API返回等待状态给前端,用户在界面上审核后通过另一个请求恢复执行。这是长流程审批、高风险操作确认等场景的关键能力。

5.5 Checkpointing:崩溃恢复与时间旅行

python 复制代码
from langgraph.checkpoint.memory import MemorySaver
from langgraph.checkpoint.postgres import PostgresSaver

# 开发环境:内存checkpoint
checkpointer = MemorySaver()
app = graph.compile(checkpointer=checkpointer)

# 生产环境:PostgreSQL持久化
# checkpointer = PostgresSaver.from_conn_string("postgresql://...")
# app = graph.compile(checkpointer=checkpointer)

# 每次调用指定thread_id
config = {"configurable": {"thread_id": "user-123-session-1"}}
result = app.invoke(
    {"messages": [HumanMessage(content="研究A2A协议")]},
    config=config
)

# 从checkpoint恢复(同一个thread_id)
result = app.invoke(
    {"messages": [HumanMessage(content="继续上次的研究")]},
    config=config  # 自动加载该thread的历史状态
)

Checkpoint的三个生产价值:

  1. 崩溃恢复。 进程重启后从最后一个checkpoint恢复,不丢工作。
  2. 时间旅行调试。 回退到任意历史状态,修改输入,分叉新执行路径。LangGraph Studio v2提供可视化界面直接做这件事。
  3. 评估管线。 在历史trace上重放新prompt或新模型版本,对比结果差异。

来源:josenobile.co LangGraph 2.0指南 2026, autolearningagents.com LangGraph完全指南, cowork.ink LangGraph教程 2026, appscale.blog Serverless多Agent 2026


6. 三大框架对比:CrewAI vs LangGraph vs AutoGen

6.1 框架现状速览

维度 CrewAI LangGraph AutoGen
版本 v1.14.3 (2026.04) 2.0 (2026.02) 维护模式
GitHub Stars ~35K ~10K (LangChain全系126K) ~40K
架构模型 角色团队 有向图 对话式
核心抽象 Agent + Task + Crew StateGraph + Node + Edge AssistantAgent + UserProxy
状态管理 Memory系统 Checkpointing(一等公民) 对话历史
Human-in-the-Loop 支持(community级) 一等公民(interrupt原语) 支持
可观测性 AgentOps集成 LangSmith深度集成 Azure Monitor
A2A支持 原生 原生 通过MAF
MCP支持 原生 原生 通过MAF
学习曲线
生产成熟度 企业版AMP 生产默认选择 转向MAF
典型用户 快速原型/内容管线 Klarna/Uber/LinkedIn 微软生态

6.2 AutoGen的变局

AutoGen在2026年需要特别说明。Microsoft已确认AutoGen进入维护模式:只接受bug修复和安全补丁,不再开发新功能。Microsoft的战略重心转向了Agent Framework(MAF 1.0,2026年4月发布),它合并了AutoGen的编排模式和Semantic Kernel的企业级基础。

AutoGen的原始创建者发起了AG2社区分支,延续旧路线。这意味着选择AutoGen的开发者面临一个分叉:跟随Microsoft走MAF路线,还是跟随社区走AG2路线。

务实建议:新项目不要选AutoGen。如果你在微软生态中(Azure、GitHub Copilot、M365),直接用Microsoft Agent Framework。如果你需要对话式多Agent(辩论、共识),AG2是社区维护的替代品,但长期支持存疑。

6.3 一个常被忽略的混合模式

三个框架不是互斥的。一个被验证过的生产模式是:用LangGraph做顶层编排,用AutoGen(或CrewAI)Agent作为图中的节点。LangGraph提供持久化控制和人在回路,AutoGen/CrewAI提供对话式或角色式的Agent能力。

复制代码
LangGraph (顶层编排,持久化,HITL)
  ├─ Node 1: CrewAI Crew (研究团队)
  ├─ Node 2: AutoGen Group (辩论/共识)
  └─ Node 3: LangGraph Node (数据处理)

这种模式在TrueFoundry的实践中被验证有效。LangGraph的durable control在外层,AutoGen的conversational code execution在内层。

来源:similarlabs.com CrewAI vs AutoGen vs LangGraph 2026, innovatrixinfotech.com框架对比 2026, nomadx.ae AI Agent框架对比 2026.07, internative.net框架对比 2026


7. 多Agent协作的失败模式:MAST分类法

7.1 MAST Taxonomy

UC Berkeley的Cemri等人2025年3月在arXiv发表MAST(Multi-Agent System Failure Taxonomy),分析了1,600条生产执行trace,覆盖7个主流多Agent框架。这是目前最系统化的多Agent失败模式研究。

MAST把失败分为三大类14种模式:

FC1: 系统设计失败(41.77%)。 任务执行前就埋下了祸根。

失败模式 描述 频率
角色模糊 Agent的角色定义不清晰,职责重叠或缺失 最高频
任务定义模糊 Task描述缺乏约束,Agent不知道什么算完成 高频
缺失约束 没有限制Agent的行为边界 中频

FC2: Agent间对齐失败(36.94%)。 任务执行中Agent之间的协作出问题。

失败模式 描述
错误级联 上游Agent的错误传播到下游,被当作权威输入接受
上下文丢失 Agent不知道其他Agent已经做了什么,重复劳动
无限协商 两个Agent反复迭代无法收敛,烧Token无产出
集体幻觉 一个Agent编造的「事实」被其他Agent当真
角色矛盾 两个Agent对同一对象做出冲突决策
目标漂移 系统忘记原始目标,聚焦局部子目标
循环依赖死锁 A等B,B等C,C等A,系统冻结
语义漂移 概念含义在Agent间逐渐偏移,最终不一致
阿谀奉承 Agent互相附和缺乏批判性思维,集体偏见

FC3: 任务验证失败(21.30%)。 完成的步骤没有被检查就进入了下一步。

失败模式 描述
模糊归因 无法确定哪个Agent做了什么决策,审计不可能
编排过载 中央编排器成为瓶颈,拖慢整个系统
共享资源争用 多个Agent同时写同一个资源,没有协调
过度委托 Agent把什么都委派给别人,自己什么不做
容量崩溃 体积超过阈值后系统丧失协调能力

7.2 关键发现

模型不是瓶颈,架构才是。 79%的失败来自规范和协调问题。Gartner 2025年AI部署调查中88%的项目失败率,大部分不是因为LLM差,而是Agent之间的架构是事后补的。

错误复合传播。 Augment Code的「Bag of Agents」分析发现,朴素多Agent管线累积错误的速度是单Agent的17倍。不是每个Agent更差,而是错误在交接点乘法增长而非有界传播。

Demo vs Production的鸿沟。 Composio 2025 AI Agent报告记录了从业者知道但很少直说的现象:大部分多Agent系统是为demo条件优化的。干净的输入、合作的输入、可预测的场景。生产环境什么都没有。用户问系统没设计过的问题,上游API返回意外schema,任务跨越Agent边界的方式没人预想过。

pass@1指标高估可靠性20-40%。 ReliabilityBench研究发现,标准的pass@1指标测量的是「最优条件下成功一次」,不是「生产变异性下可靠成功」。CLEAR框架分析发现同一个任务一天60%成功率,另一天25%。团队在优化一个测量错了东西的指标。

7.3 三个最常见的生产事故模式

复制代码
模式1:错误级联
  Researcher → [错误数据] → Analyst → [基于错误数据的分析] → Writer → [错误报告]
  问题:没有任何节点验证上游输入的正确性

模式2:无限协商循环
  Agent A → "我觉得应该这样" → Agent B → "不对,应该那样" → Agent A → "不对..." 
  问题:没有终止条件,没有仲裁者,Token烧到预算上限

模式3:上下文不一致
  Agent A 基于数据X做了决策 → Agent C 开始工作时数据X已被Agent B更新
  问题:消息传递式的记忆,Agent C拿着5分钟前的过时状态在工作

来源:UC Berkeley MAST arXiv 2503.13657 2025.03, agentscodex.com MAST企业分析 2026.03, codexical.com多Agent编排失败 2026.05, zartis.com复合错误问题 2026, Augment Code Bag of Agents分析 2026


8. 辩证看待:多Agent不是越多越好

8.1 「Bag of Agents」反模式

多Agent领域最大的认知陷阱:认为Agent越多越好。Augment Code 2026年的分析把这个直觉打碎了。

朴素的推理是这样的:一个Agent不够强,那多加几个专业Agent,让它们协作,整体性能就上去了。实际发生的是:每多一个Agent,就多一个交接点,每个交接点都是一个潜在失败点。Agent A把输出交给Agent B,B在A的输出基础上推理,A的错误被B当作事实接受,B在错误基础上产出新的错误,传给C。

MAST研究的数据:在最坏情况下,多Agent变体比单Agent顺序推理的性能差39%到70%。这个结论在四个基准测试和三个模型系列上一致。

这并不意味着多Agent没用。它意味着多Agent的价值有严格的条件:架构必须与任务对齐,交接点必须有验证机制,终止条件必须在设计时就确定。

8.2 什么时候不该用多Agent

三个判断标准:

LLM调用总共只有1-3次。 如果你的「Agent」就是调一次LLM、用一两个工具、返回结果,直接用OpenAI SDK或Anthropic API写50行Python比引入任何框架都简单。框架的开销(CrewAI约100ms/次,LangGraph约50ms/次)在这种场景下是净损失。

任务边界清晰且线性。 A→B→C→完成的流程,如果每一步都是确定性的(不需要循环、不需要条件分支、不需要人工确认),用普通的Python函数调用就够了。LangGraph的图模型在不需要循环和分支时是过度设计。

纯RAG场景。 检索+回答的pipeline不需要Agent框架。LangChain(不是LangGraph)或LlamaIndex是更合适的工具。

8.3 2026年Q1生产验证的存活模式

buildtest.run的Q1 2026生产报告总结了几条经过验证的模式:

Orchestrator + Workers,不是Peer-to-Peer。 生产环境中存活的模式都有一个中央编排器(或确定性控制器),它决定哪一步分给哪个Agent。专业Agent之间不直接通信,只跟编排器通信。编排器拥有路由、状态和终止权。这不如swarm优雅,但可靠得多。

共享状态存储,不是消息传递。 消息传递式的记忆在两个Agent需要在不同时间操作同一信息时会崩溃。Agent C开始工作时,Agent D可能刚刚更新了底层记录。如果C只知道5分钟前传过来的信息,它在过时状态上工作。存活的系统都把状态外化到一个共享层(向量库、结构化数据库,或两者兼有),Agent之间的消息传的是指针,不是数据负载。

先定义契约再写Agent。 在写任何Agent之前,先写好输入schema、输出schema和失败模式。有效输入长什么样?有效输出长什么样?Agent返回半成品时下一步怎么办?大部分实现对这个问题的回答是沉默,下一个Agent把沉默当作有效输入处理。

8.4 成本结构:多Agent的15倍Token税

多Agent系统消耗约15倍于单Agent的Token(buildtest.run Q1 2026数据)。每次交接携带上下文,每次协调消息都花钱。demo中看起来优雅的模式在生产体量下经济灾难性。大部分团队在第二个月的账单上发现这个问题。

三个成本控制手段:

模型分层。 研究/提取类Agent用便宜模型(GPT-4o-mini、Claude Haiku),综合/写作类Agent用强模型(GPT-4o、Claude Sonnet)。

max_iter硬限制。 每个Agent设5-8步上限。生产环境在代码审查中把这个作为团队标准强制执行。

Token预算告警。 用AgentOps或LangSmith设置每轮预算上限。$X/run的kill switch防止prompt injection攻击迫使昂贵循环。

来源:Augment Code Bag of Agents分析 2026, buildtest.run多Agent生产Q1 2026, zartis.com复合错误 2026, codexical.com编排失败 2026.05, alicelabs.ai CrewAI企业部署 2026


9. 选型建议:什么场景用什么框架

9.1 决策树

复制代码
你的需求是什么?
│
├─ 需要快速原型(2周内MVP)
│  └─ CrewAI
│     理由:角色抽象最直观,30分钟出demo
│
├─ 需要生产级可靠性
│  └─ LangGraph
│     理由:durable execution, checkpointing, LangSmith可观测
│
├─ 需要条件分支、循环、人在回路
│  └─ LangGraph
│     理由:interrupt原语是生产级HITL的唯一选择
│
├─ 任务自然分解为专业角色(研究→分析→写作)
│  └─ CrewAI(原型)→ LangGraph(生产)
│     理由:先用CrewAI验证逻辑,再用LangGraph重写为可控工作流
│
├─ 需要Agent间对话/辩论/共识
│  └─ AutoGen (AG2) 或 Microsoft Agent Framework
│     注意:AutoGen维护模式,新项目走MAF
│
├─ 在微软生态中(Azure/M365/GitHub Copilot)
│  └─ Microsoft Agent Framework
│     理由:原生集成Azure生态
│
├─ LLM调用总共1-3次
│  └─ 不用框架,直接用provider SDK
│     理由:框架开销是净损失
│
└─ 纯RAG(检索+回答)
   └─ LangChain 或 LlamaIndex
      理由:不需要Agent编排层

9.2 常见选型错误

按GitHub Stars选。 三个框架都20K+ stars,信号是噪音。生产适配性比流行度重要。

自己造框架。 「我们在OpenAI SDK上写个薄层。」6个月后你重建了一个更差的LangGraph。不要这么做。用框架,在编排层定制。

把框架选择当作永久决策。 迁移痛苦但可行。框架迭代快。今天的选择18个月后可能不是最优解。为可替换性设计架构。

9.3 一个务实的迁移路径

很多团队的实践路径:CrewAI原型 → LangGraph生产。

复制代码
Week 1-2: CrewAI快速验证
  └─ 确认Agent分工是否合理、任务依赖是否正确

Week 3-6: LangGraph重写
  └─ 加入checkpointing、HITL、可观测性、错误处理

Week 7-8: 生产部署
  └─ LangSmith追踪 + Token预算 + 成本告警

CrewAI的Agent/Task/Crew抽象非常适合验证「这个任务该不该拆成多个Agent」「拆成几个」「各自的角色是什么」。验证完成后,用LangGraph的StateGraph重写,获得生产级的状态管理、错误恢复和可观测性。

来源:internative.net框架对比 2026, similarlabs.com框架对比 2026, innovatrixinfotech.com框架对比 2026, bigaiagent.tech框架对比 2026


10. 总结与下一篇预告

10.1 核心要点

2026年的Agent协议生态形成了清晰的三层结构。MCP(Anthropic主导)解决Agent到工具的连接,A2A(Google主导)解决Agent到Agent的连接,AP2解决Agent间的支付和结算。三者都在Linux基金会AAIF治理下,150+组织支持,三大云厂商全部原生集成。MCP和A2A不是竞争关系,是互补层。

A2A协议的三个核心原语:Agent Card是Agent的数字名片(发布在/.well-known/agent.json),Task是有状态的工作单元(submitted→working→completed),Transport用JSON-RPC 2.0 over HTTPS + SSE。v1.0引入的签名Agent Card解决了跨组织信任问题,这是企业采购的解锁功能。

CrewAI用角色团队抽象让多Agent开发门槛降到最低。Agent的身份三要素(role/goal/backstory)是输出质量的最大杠杆。Task的context参数实现信息在Agent间传递。Flow模式补充了精确控制流能力。30分钟出demo,适合原型验证。

LangGraph用StateGraph把Agent工作流变成有向图。Checkpointing是一等公民,提供崩溃恢复、时间旅行调试和评估管线能力。interrupt原语让人在回路从补丁变成原生特性。LangSmith深度集成提供生产级可观测性。Klarna、Uber、LinkedIn的生产选择。

多Agent协作的失败率远高于直觉。MAST Taxonomy揭示了14种失败模式,79%来自架构设计而非模型能力。错误在交接点乘法增长,朴素多Agent管线累积错误17倍于单Agent。pass@1指标高估可靠性20-40%。Orchestrator+Workers是Q1 2026唯一稳定存活的拓扑。先定义契约再写Agent,先外化状态再考虑消息传递。

选型决策:CrewAI原型快,LangGraph生产稳,AutoGen已维护模式。务实路径是CrewAI验证逻辑后用LangGraph重写为生产系统。LLM调用1-3次不用框架,纯RAG用LangChain/LlamaIndex。

10.2 下一篇预告

第11篇:Agent记忆系统------让AI拥有长期记忆,从MemGPT到Letta实战

这篇讲的是多个Agent怎么协作。下一篇回到单个Agent的内部能力:记忆。LLM本质无状态,Agent的连续性完全依赖外部记忆管理。从全量上下文到RAG到Agentic RAG再到长期记忆产品化,记忆系统的演进路径是什么。Letta(前身MemGPT)怎么像操作系统一样管理上下文窗口,用热数据/温数据/冷数据三级架构实现虚拟内存管理。Mem0和Zep等记忆服务怎么选型。怎么为Agent添加跨会话的长期记忆。

系列推荐阅读:


本文数据来源:Linux Foundation AAIF Press Release(2026.04.09,150+组织,22K+ GitHub stars,5种语言SDK)、agentmarketcap.ai A2A一周年分析(2026.04.23)、PRNewswire A2A新闻稿(2026.04)、rapidclaw.dev A2A完整指南2026、a2a-protocol.org官方规范v1.2、UC Berkeley MAST Taxonomy(arXiv 2503.13657,2025.03发表,2025.10 v3更新)、agentscodex.com MAST企业失败分析(2026.03)、codexical.com多Agent编排失败分析(2026.05)、zartis.com复合错误问题分析(2026)、Augment Code「Bag of Agents」分析(2026)、buildtest.run多Agent生产报告Q1 2026、Composio 2025 AI Agent Report、ReliabilityBench研究、juejin.cn CrewAI完全指南v1.14.3(2026.04)、alicelabs.ai CrewAI企业指南2026、aiskillnav.com CrewAI教程2026、josenobile.co LangGraph 2.0指南(2026)、autolearningagents.com LangGraph完全指南、cowork.ink LangGraph教程2026、appscale.blog Serverless多Agent LangGraph+AgentCore 2026、similarlabs.com CrewAI vs AutoGen vs LangGraph 2026、innovatrixinfotech.com框架对比2026、nomadx.ae AI Agent框架对比2026.07、internative.net框架对比2026、bigaiagent.tech框架对比2026。

相关推荐
甲维斯12 分钟前
我要开始吹牛逼了!Kimi K3 “宇宙无敌”!
前端·人工智能
周末程序猿13 分钟前
图解 120 个大语言模型(LLM)核心概念(61-90)
人工智能
科技圈快迅19 分钟前
游戏投影仪和普通投影仪区别是什么?2026游戏投影仪测评
人工智能
陆枫Larry1 小时前
CPU 和 GPU 的核心区别与适用场景
人工智能
Aa99883341 小时前
AI视觉检测设备厂家的技术选型框架——密封件和磁材的缺陷分类与光学成像原理
人工智能
吴佳浩1 小时前
今天我们讲讲大模型的“核心”技术:蒸馏(Model Distillation)
人工智能·llm·agent
阿里云大数据AI技术1 小时前
阿里云 ES AI 引擎版:面向 Agent 场景,为亿级租户、千亿规模向量设计的搜索引擎
人工智能·elasticsearch·agent
郭小铭1 小时前
[开源] 做了一个本地优先的多 Agent 市场研究桌面:Evidence Loom
人工智能
星栈1 小时前
翻完 Pi 源码:它和 Codex、Claude Code 有何不同
人工智能·agent