先交代一个真实背景:我过去一年里用 LangGraph 做过复杂的客服工作流,拿 AutoGen 跑过多代理辩论式的分析,用 CrewAI 搭过内容生产流水线,也把 Microsoft Agent Framework 的预览版拉起来玩过一阵子。所以这篇文章不是抄文档,而是把这些框架放在同一个业务场景里反复折腾之后的对比记录。如果你最近在选型,或者被“Agent 框架哪个好”这个问题卡住了,希望这篇能帮你节省至少两周的试错时间。
这个标题里的四个名字,代表着四种完全不同的 Agent 组织方式:LangGraph 的核心是“图”,AutoGen 的核心是“对话”,CrewAI 的核心是“角色”,而 Microsoft Agent Framework 的核心是“企业级编排”。它们在文档里都宣称自己能构建多代理系统,但实际用起来,写代码的思路、调试的方式、上线后遇到的坑,完全是不同的路数。下面我从架构原理、代码写法、生产落地三个角度逐一掰开讲。
1. 四个框架的设计哲学与适用定位
1.1 LangGraph:把 Agent 当作一张有状态的状态机图
LangGraph 是 LangChain 生态里专门做 Agent 编排的框架,它的底层思想非常朴素:把你想要 Agent 执行的每一个步骤建模成图里的节点(node),节点之间有向边(edge)连接,整个执行过程就是沿着图从起点走到终点。听起来像是回到了大学数据结构课,但正是这种“把事情显式化”的设计,让 LangGraph 成为四个框架里可控性最强的那个。
比如一个典型的 ReAct Agent,在 LangGraph 里会被拆成“调用模型节点”“调用工具节点”“条件路由节点”三个部分。模型节点负责决定下一步是直接回答还是需要调用工具;如果要调用工具,就跳转到工具节点执行;执行完之后再回到模型节点做下一轮推理。这个循环用代码写出来就是add_node和add_edge的组合,你随时能画出一张清晰的执行流程图,这在复杂业务里是巨大的优势——汇报架构、排查故障、做性能分析,都有据可查。
另一个关键设计是 State(状态)。LangGraph 要求你显式定义一个状态对象,所有节点读写这个状态对象来共享信息。这个状态可以被持久化到数据库里,意味着你的 Agent 进程崩了、重启了,还能从上次中断的地方接着跑。我做的客服工单系统里,用户可能上传一张图片、经过多次人工复核才走完流程,这种长流程如果没有状态持久化,几乎没法交付。LangGraph 的 checkpointer 机制解决的正是这个问题,这也是它和很多纯函数式框架拉开差距的地方。
不过成也可控,败也可控。图的每个节点、每条边都要自己写,导致代码量是四个框架里最大的。如果你只是做一个小 demo,或者想让几个模型自由对话跑个脑暴,用 LangGraph 就是杀鸡用牛刀,写节点和边的时间比调 prompt 的时间还长。
1.2 AutoGen:多个 Agent 围在一张桌子上聊天
AutoGen 是微软开源的多代理对话框架,核心概念是 ConversableAgent。它把所有 Agent 之间的协作建模为“对话”:一个 Agent 发消息,另一个 Agent 接收并回复,消息在多个 Agent 之间循环传递,直到某个终止条件满足。这种设计像极了办公室里几个专家开会讨论问题,特别适合需要多角度分析、辩论、质疑的场景。
我用 AutoGen 做过一个“技术方案评审 Agent”:一个架构师 Agent、一个安全 Agent、一个成本控制 Agent,三个角色围绕同一个需求反复讨论,最后产出综合意见。这种用法很自然,因为 AutoGen 设计上就是让每个 Agent 扮演不同的 system prompt,在对话上下文中不断交换意见。它还内置了 GroupChat 和 GroupChatManager,可以管理三个以上 Agent 的发言顺序,甚至能设定“主持人”来控制话题方向。
但对话模式有天然隐患:上下文长度会飞快增长。每个 Agent 的回复都会追加到共享的对话历史里,几轮讨论下来可能就上万 token 了。另一个问题是“跑偏”,三个 Agent 聊着聊着,话题可能从“方案评估”滑到“某行代码的写法”,不回拉的话整场讨论就废了。我在实际项目中必须给 GroupChat 设置明确的 speaker selection 规则和 max_round,相当于给讨论加了主持人和时间限制。AutoGen 还提供了 stateflow 和 graph 模式来约束流程,但这就等于说它也在往 LangGraph 的方向靠拢。
还有一个值得注意的变化:AutoGen 现在已经整体并入了 Microsoft Agent Framework 的生态,作为其中的底层多代理运行时。如果你今天才第一次接触 AutoGen,我建议直接以 Microsoft Agent Framework 为新起点,但 AutoGen 的对话式思想仍然值得学习,因为你会在很多 Agent 系统里看到“对话/反驳”的影子。
1.3 CrewAI:像组建一支项目团队一样组建 Agent
CrewAI 是我个人觉得最“好懂”的框架,它对标的是真实团队协作:每个 Agent 有明确的 role、goal、backstory,你就是这个团队的负责人。你定义好需要哪些角色(比如“市场分析师”“文案写手”“编辑”),把任务拆解后分配给对应角色,然后通过 Crew 来编排它们按顺序或按层级执行。
这种设计让业务同学很容易理解整个系统在干什么。我做个内容生成流水线时,只要把“收集素材→写初稿→优化SEO→最终校对”的任务链条写好,非技术人员看代码也能猜出每个 Agent 在负责什么。CrewAI 的 Process 支持 sequential(顺序执行)和 hierarchical(层级管理,由一个 manager Agent 管理其他 Agent),后者在任务边界不清晰时特别好用,相当于你招了一个项目经理来派活。
CrewAI 的短板在于灵活度。它的“角色化”抽象虽然好用,但也把执行流程给固化了:你很难像 LangGraph 那样细粒度控制每一步的条件跳转;遇到需要异常恢复、人工确认、并行子任务的复杂场景,CrewAI 的表达能力就不够。另一个实际问题是,它高度依赖底层 LLM 的“自觉性”——Agent 是否真的会按你设定的角色约束去执行,完全取决于模型能力。我在测试中经常发现,模型在简单任务上能严格扮演角色,但一旦任务复杂,角色的边界就模糊了。
1.4 Microsoft Agent Framework:面向企业的一体化解决方案
Microsoft Agent Framework(简称 MS Agent Framework)是 2025 年由微软推出的开源企业级 Agent 开发框架,融合了 AutoGen 和 Semantic Kernel 的沉淀。它提供了一套统一的工作流抽象,包括 Agent、Workflow、Policy 等核心概念,并且围绕企业落地做了大量工程化设计:内置可观测性、运行时长驻、集群部署、与 Azure AI Foundry 的整合,甚至在宣传里把“多代理协议 A2A 支持”放进了路线图。
我用下来感觉它像是一把“瑞士军刀”。它既支持像 LangGraph 那样的显式工作流编排,也支持像 AutoGen 那样的对话式多代理,还提供了统一的 Agent 运行环境来管理生命周期、追踪 token 消耗、保存运行状态。对于既要快速验证、又要稳定上线的团队来说,这种一体化体验是很舒服的。它的 API 风格和 OpenAI Agents SDK 有相似之处:定义 Agent,给它 instructions 和 tools,然后直接 run。上手门槛明显比 LangGraph 低。
但一个很现实的考量是:这套框架太新,社区生态和第三方集成还在快速变化中。你随便搜一个问题,LangGraph 可能已经有几十篇踩坑帖子,微软这套框架的参考资料就少得多。另外,企业级架构往往意味着更多的概念和抽象层,小项目引入它可能会觉得“过度设计”。我的建议是:如果你想评估 Microsoft Agent Framework,先把微软官方的 Agent 开发概述读一遍,再对比你团队实际需要用到多少企业级特性,不要一上来就套全套。
2. 同一个业务场景,四个框架分别怎么写
2.1 场景定义与准备
为了不空谈概念,我挑一个比较有代表性的业务场景来对比:商品评论的智能客服处理。输入一段用户评论,系统需要完成三个子任务:先提炼评论中的关键信息,然后判断用户情感倾向,最后生成一段给用户的回复建议。这个场景不大不小,既涉及单 Agent 的工具调用,也涉及多 Agent 的分工协作,适合展示四个框架的写法差异。
开始之前先统一环境,下面所有代码用 Python 写,LLM 统一假设为 OpenAI 兼容接口,模型使用gpt-4o-mini。实际开发时你完全可以用其他模型厂商的接口,四个框架都支持自定义模型客户端,只是细节配置略有不同。
2.2 LangGraph 实现:显式画出执行流程
在 LangGraph 里,我先定义一个 AgentState 来承载整个流程的数据:
from typing import TypedDict, Annotated from langgraph.graph import StateGraph, START, END from langchain_openai import ChatOpenAI class AgentState(TypedDict): comment: str # 原始评论 key_points: str # 提炼后的关键信息 sentiment: str # 情感判断结果 reply: str # 生成的回复建议 def extract_points(state: AgentState): llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.2) prompt = f"你是客服运营人员,请从用户评论中提炼3-5个关键信息点。\n评论:{state['comment']}" result = llm.invoke(prompt) return {"key_points": result.content} def analyze_sentiment(state: AgentState): llm = ChatOpenAI(model="gpt-4o-mini", temperature=0) prompt = f"请判断用户评论的情感倾向:肯定、否定还是中性。只要输出一个词。\n评论:{state['comment']}" result = llm.invoke(prompt) return {"sentiment": result.content.strip()} def generate_reply(state: AgentState): llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7) prompt = ( f"根据以下信息生成一条给用户的回复建议。\n" f"关键信息点:{state['key_points']}\n" f"情感倾向:{state['sentiment']}\n" f"原始评论:{state['comment']}" ) result = llm.invoke(prompt) return {"reply": result.content} builder = StateGraph(AgentState) builder.add_node("extract", extract_points) builder.add_node("sentiment", analyze_sentiment) builder.add_node("reply", generate_reply) builder.add_edge(START, "extract") builder.add_edge("extract", "sentiment") builder.add_edge("sentiment", "reply") builder.add_edge("reply", END) graph = builder.compile() result = graph.invoke({"comment": "物流太慢了,等了一周才到,不过产品质量还不错"}) print(result["reply"])这段代码最清晰的地方在于:整个流程是肉眼可见的。extract → sentiment → reply三条边一写,架构图就画出来了。如果你后续想改成“情感为否定时先走安抚节点,再生成回复”,只需要加一个条件边,而不是改一堆逻辑。这就是 LangGraph 的核心价值——复杂流程的可控性。
实际开发中我通常会再加一个 checkpointer 参数,把每次运行的状态保存到 SQLite 或 Postgres,这样用户中途刷新页面、Agent 进程重启,都能恢复上下文继续执行。这个特性和“电商订单售后”这种天然长流程的业务非常搭。
2.3 AutoGen 实现:让两个 Agent 协作完成分析
如果用 AutoGen,我不需要手动定义状态机,而是创建两个各司其职的 ConversableAgent:
from autogen import ConversableAgent llm_config = { "model": "gpt-4o-mini", "api_key": "YOUR_API_KEY", } analyzer = ConversableAgent( name="analyzer", system_message=( "你是评论分析助手。你的职责是提炼用户评论的关键信息," "并判断情感倾向(肯定/否定/中性)。" ), llm_config=llm_config, ) replier = ConversableAgent( name="replier", system_message=( "你是客服回复助手。你会收到评论分析结果,然后生成一条得体、" "有针对性的用户回复建议。回复结束后请输出 TERMINATE。" ), llm_config=llm_config, ) result = analyzer.initiate_chat( replier, message="物流太慢了,等了一周才到,不过产品质量还不错", max_turns=3, ) print(result.chat_history)AutoGen 的自由度体现在对话流程上:analyzer 生成分析结果后,replier 会基于这个消息继续生成回复;如果 max_turns 设成 4,甚至可以再来一轮“replier 质疑分析不准确、analyzer 重新分析”的循环。这种迭代式讨论在“需要多角度质疑”的场景里非常好用,比如让两个 Agent 分别从技术和成本角度辩论,最后得到更周全的方案。
我踩过的坑是对话偏离主题。在没有约束的情况下,两个 Agent 很可能在第三轮就聊到“你今天的 prompt 是什么”这种无聊话题。解决办法是:在 system_message 里明确要求回复必须以TERMINATE结束,同时在initiate_chat里设置max_turns。如果你的业务需要三个以上 Agent 参与,可以使用GroupChat和GroupChatManager,但那需要制定更严格的发言顺序规则,否则会出现一个 Agent 连续抢话、其他人被冷落的局面。
2.4 CrewAI 实现:定义角色然后直接开工
CrewAI 的写法在四个框架里最接近“自然语言描述工作流程”:
from crewai import Agent, Task, Crew, Process analyzer = Agent( role="评论分析员", goal="准确提炼用户评论的核心信息和情感倾向", backstory="你是一名经验丰富的电商客服运营,擅长从用户反馈中快速抓住重点。", llm="gpt-4o-mini", ) replier = Agent( role="客户回复专员", goal="生成人性化且专业的用户回复建议", backstory="你是品牌官方客服,风格温和、语气专业,擅长维护品牌口碑。", llm="gpt-4o-mini", ) task1 = Task( description="提炼以下评论的关键信息,并判断情感倾向(肯定/否定/中性):{input_comment}", agent=analyzer, ) task2 = Task( description="基于上一任务的分析结果,生成一条用户回复建议。尽量体现品牌温度。", agent=replier, ) crew = Crew( agents=[analyzer, replier], tasks=[task1, task2], process=Process.sequential, verbose=True, ) result = crew.kickoff(inputs={"input_comment": "物流太慢了,等了一周才到,不过产品质量还不错"}) print(result)这种代码风格在演示和 MVP 阶段非常有优势——你几乎是把业务需求翻译成了 Agent 定义。CrewAI 会让 task1 的输出自动作为 task2 的可用上下文,Agent 之间不需要手写“传递消息”的逻辑。Process.sequential 保证它们按声明顺序执行。
但要注意,如果你只定义了角色而没有充分约束它们,CrewAI 的 Agent 可能会“自由发挥”。我在测试时发现,replier 偶尔会把分析员的输出当成最终回复直接输出,跳过“生成新回复”这一步。解决方法是把 Task 的 description 写得足够具体,甚至可以在 description 里加上“必须包含两个部分:感谢用户反馈 + 针对物流问题的处理建议”。这个框架更适合“把常见工作流程化”的团队,不适合需要动态决策分支的项目。
2.5 Microsoft Agent Framework 实现:统一 Agent 与内置工具
Microsoft Agent Framework 的官方 Python 包名是microsoft-agent-framework,起步写法非常简洁:
import asyncio from microsoft_agent_framework import Agent, Runner from microsoft_agent_framework.tools import FunctionTool @FunctionTool def extract_key_points(text: str) -> str: """简单版关键信息提取,实际项目中可接入 LLM 或关键词算法。""" return text[:50] @FunctionTool def detect_sentiment(text: str) -> str: """简单版情感判断,这里只做演示。""" return "positive" if "不过" in text else "neutral" agent = Agent( name="comment_agent", instructions=( "你是一名电商客服智能助手。请判断用户评论的情感倾向," "并生成一条友好的回复建议。可以使用提供的工具辅助分析。" ), tools=[extract_key_points, detect_sentiment], model="gpt-4o-mini", ) async def main(): result = await Runner.run( agent, input="物流太慢了,等了一周才到,不过产品质量还不错", ) print(result.final_output) asyncio.run(main())微软这套框架用我比较舒服的一点,是它的 Agent 和工具概念很干净:Agent 负责理解任务、决定是否调用工具,工具负责执行具体函数。你可以在instructions里只写目标,把具体方法论交给模型去组合工具。它内部还封装了运行状态追踪、Token 统计、策略控制(Policy)等能力,适合往企业环境里部署。
不过这套框架目前更适合“单 Agent + 工具”的业务形态。虽然它也支持多 Agent 工作流,但相关的稳定性和社区资料还不像 LangGraph 那么成熟。如果你今天要做一个需要精细控制节点跳转的复杂流程,单靠 MS Agent Framework 的默认 SDK 会写得比较别扭,可能还得绕到 workflow 子模块去手动建模。
3. 关键指标对比与选型建议
3.1 一张表看懂四个框架的差异
我把自己在项目里最关心的 8 个维度整理成了表格,方便你一眼找到差异:
| 维度 | LangGraph | AutoGen | CrewAI | Microsoft Agent Framework |
|---|---|---|---|---|
| 核心编排思想 | 图/状态机 | 多代理对话 | 角色化任务派发 | 统一 Agent 运行时 |
| 上手难度 | 中高 | 较低 | 最低 | 中等 |
| 细粒度流程控制 | 最强 | 较弱 | 弱 | 中 |
| 多代理协作模式 | 手动建图编排 | 自由对话/群聊 | 顺序/层级 | 对话+工作流 |
| 状态持久化 | 内置 checkpointer,强 | 依赖外部实现 | 依赖外部实现 | 内置,面向企业 |
| 生产可观测性 | 中(可自行集成) | 中 | 较弱 | 强 |
| 社区生态 | 最丰富 | 丰富但已并入微软体系 | 较丰富 | 起步阶段 |
| 典型适用团队 | 复杂流程开发团队 | 研究探索/讨论型项目 | 内容团队/低代码需求 | 企业平台团队 |
从这张表能看出一条规律:越灵活的框架,学习成本越高;越易用的框架,掌控力越弱。这不是框架的问题,而是取舍问题。你团队里如果有很强的 prompt 工程和流程建模能力,LangGraph 会是长期的效率保障;如果只是想快速把多个 Agent 跑起来看效果,CrewAI 或者 MS Agent Framework 会更合适。
3.2 不同业务场景的选型建议
先说说我的经验结论:金融、政务、企业级复杂工单这类“流程不能错、状态必须能恢复”的业务,优先考虑 LangGraph。这些场景对异常恢复、人工介入、步骤审计的要求极高,LangGraph 的显式图和持久化状态几乎是天然匹配。我做的客服系统就是因为线上出现过一次流程中断,才从早期选择改用 LangGraph。
如果业务场景更像“头脑风暴”“多角色评审”“研究报告生成”,AutoGen 的对话式模型更合适。比如让一个研发团队 Agent 讨论技术方案,本来就是几个角色来回碰撞,AutoGen 的自由度反而是优点。这里我提醒一句:如果是生产环境里用 AutoGen 做长期运行的 Agent,一定要把对话轮次和 token 预算卡死,否则成本会失控。
内容流水线、自动化运营、流程固定的场景可以直接看 CrewAI。比如“从选题→写稿→配图→发布”这类步骤不变、角色明确的工作,CrewAI 的代码量最少、维护成本最低。它特别适合团队里没有专职 AI 工程师的部门,稍微培训一下就能让业务同学改 Agent 描述。
至于 Microsoft Agent Framework,我会把它推荐给计划把 Agent 能力平台化的团队。比如你们公司要建设统一 AI Agent 平台,需要对接 Azure 生态、统一身份认证、统一监控,微软这套框架确实是目前最“正统”的选择。小团队做小项目先跳过它,等生态成熟了再上车也不迟。
4. 实际开发中我踩过的坑
4.1 上下文失控与多代理跑偏
这是我用 AutoGen 时遇到最频繁的问题。三个 Agent 聊得兴起,几轮过后对话历史直接飙到几万 token,后面对话质量明显下降,因为有效信息被淹没在闲聊里了。解决思路有两个:一是把大任务拆成多个小对话,每个小对话只聚焦一个子问题,比如先做单 Agent 信息提取,再做双 Agent 讨论,而不是让所有 Agent 从零开始瞎聊;二是在系统提示里写清楚“每个回复必须控制在三句话内”,利用格式约束来限制上下文膨胀。
CrewAI 的跑偏问题则体现在“角色扮演”失效。模型在简单任务里还能维持人设,一旦任务步骤变多,它会开始忽略 role 设定,直接输出最笼统的答案。我给的意见是:把所有关键约束写进 Task 的 description 里,而不是 Agent 的 backstory 里——Task 是模型必须执行的,backstory 很多时候只是模型的金字塔顶背景噪音。
4.2 Agent 安全问题:工具权限要收敛
Agent 开发领域这两年最热门的话题,就是 Agent 安全。你在给 Agent 挂工具时,不要天真地把所有能力都暴露给它。比如 CrewAI 的某些示例会开启allow_code_execution,让 Agent 能在容器里执行脚本,这个能力如果被 prompt injection 利用,后果很严重。我自己的原则是:最小权限 + 白名单。Agent 需要什么工具,就只给什么工具;凡是能执行系统命令、访问文件系统、调用外部 API 的工具,都要单独做授权,最好由人先审批再执行。
LangGraph 因为图结构透明,相对容易做 audit——每个节点执行了什么操作都能被记录。AutoGen 和 CrewAI 的对话式结构里,工具调用的触发更隐晦,所以你要在工具层额外加一层校验函数。MS Agent Framework 内置 Policy 概念,可以把“工具使用策略”集中管理,这一点对企业用户是实打实的加分项。
4.3 调试方式差异巨大
调试 LangGraph 时,我习惯用它的get_graph().draw_mermaid_png()把图结构可视化,节点和边的走向一目了然,出问题时能快速判断是哪条边跳错了。AutoGen 调试则要打开 verbose 模式,观察 Agent 之间完整的 message 流转,更像是“看聊天记录”。CrewAI 有verbose=True,能看到每个 Task 的中间输出,但跨 Agent 的上下文传递不够透明。
说实话,四个框架里调试体验最让我满意的还是 LangGraph。它把每个 node 的输入输出都暴露在 state 里,你可以用 LangSmith 或自定义中间件记录每次 state 变化,这在排查“某个节点返回了异常格式”时比看纯 LLM 聊天记录高效得多。
4.4 Agent 记忆与长流程状态要保持
很多项目都会遇到“记忆”需求,也就是 Agent 需要记住用户之前的偏好、历史交互。LangGraph 内置 state + checkpointer,天然适合做这种记忆;AutoGen 和 CrewAI 则需要在外部自己维护一个 memory 对象,在每次对话启动时注入上下文。MS Agent Framework 里有 Workflow 和 Agent 生命周期管理,记忆功能会更体系化,但具体用法还在频繁迭代中,你要做好跟随官方文档调整代码的心理准备。
另外一个更底层的建议:不要什么都往记忆里塞。长流程里放太多历史信息反而会干扰模型判断,我一般的做法是只保留“结构化摘要”,比如用户偏好标签、未完成事项、关键结论,而不是把几万字的历史消息原封不动传给模型。这样既省 token,又不容易跑偏。
5. 我的最终建议
做选型决策时,别听别人说“XX 框架最好”,先问自己三个问题:你的业务流程是否需要细粒度控制?你能接受的 prompt 和代码维护成本是多少?你的团队有没有专门做 Agent 工程化的人?
如果让我凭实际体验给一句话:追求流程可控和生产稳定选 LangGraph,追求快速演示和内容类项目选 CrewAI,追求讨论型 Agent 应用选 AutoGen 的思路,考虑企业级平台化选 Microsoft Agent Framework。这四个框架不是简单的“谁替代谁”,而是代表了 Agent 应用的不同组织形态。
最后再分享一个小技巧:无论选哪个框架,第一版先别上复杂多代理,用单个 Agent 把核心链路跑通,再逐步加节点、加角色。我见过太多项目一上来就搞四个 Agent 协作,结果一半时间都花在厘清它们之间的关系上。Agent 开发和你学过的任何工程一样,复杂系统的地基,永远是从一个最简可用的版本开始夯实的。