最近总有人问我同一个问题:LangGraph、AutoGen、CrewAI 和 Microsoft Agent Framework 四个框架到底怎么选。说实话,这个问题很难一两句回答,因为它们只是名字里都带“Agent”,设计哲学和适用场景其实差得很远。我在过去一段时间里,用同一个模拟任务把这四个框架都跑了一遍,踩了不少坑,也摸清了各自脾气。这篇就围绕框架的核心差异、实操方式和选型建议展开,希望帮你在选型上省点时间。
先说结论方向:不存在所谓“最强框架”,只存在“最匹配你团队和场景的框架”。LangGraph 胜在可控,AutoGen 赢在对话式多智能体,CrewAI 最简单易上手,Microsoft Agent Framework 则走的企业级大一统路线。下面我逐一拆开说,附带实际代码写法和我踩过的坑。
1. 为什么 Agent 开发框架这么乱?选型前先想清楚这三件事
1.1 Agent 和传统程序到底差在哪
很多人刚开始接触 Agent 开发时会有一个错觉:写 Agent 就是调一次大模型接口而已。但在真实业务里,Agent 和普通程序的核心区别在于“动态决策权”。
传统程序是固定流水线:输入进来,走完 A 步骤,再走 B 步骤,最后输出。每一步都提前定义好了,中间不会自己改变路径。Agent 则不同,它需要根据当前上下文、中间结果、外部反馈,动态决定下一步是继续调用工具、换一种方式提问,还是直接终止。这种“会拐弯”的执行逻辑,决定了你不能只靠一层 API 调用实现,而是需要一套编排机制。
编排机制要解决四件事:
- 怎么组织多步推理,而不是一次就完事;
- 怎么让 Agent 反复调用外部工具(搜索、数据库、代码执行器)并拿到真实结果;
- 怎么管理中间状态,让长期任务不丢上下文;
- 怎么在关键节点上人工介入,而不是全自动一把梭。
四个框架的差异,本质上就是把这几个问题的答案做了不同的排列组合。所以选型之前,你一定要先想清楚自己的业务到底需要哪种“拐弯”方式。是需要精确控制的流程图,还是更自由的自组织对话,又或者是像项目组一样按角色分工的协作模式。
1.2 四个框架的“出身”决定了设计取向
选框架时不能只看特性列表,还要看框架的演进基因。这就像招人,简历上技能点都差不多,但工作习惯往往来自他之前待过的团队。
- LangGraph 是从 LangChain 生态里长出来的,底子是大语言模型应用工作流,所以它天然强调“图”这种结构化的编排方式,开发思维偏向严谨的流程控制;
- AutoGen 出自研究型团队,早期定位是探索多智能体对话的边界,所以它的核心交互模型就是“多个 agent 聊天”,自由度高,但代价是流程控制不够直观;
- CrewAI 的定位从一开始就是“低门槛、像组织团队一样组织 Agent”,所以它用 Role、Task、Crew 这些东西把概念收敛到了最小集合,新人十分钟就能理解;
- Microsoft Agent Framework 走的是微软生态的大一统路线,目标是让企业团队在同一套框架里管理 Agent、工具、记忆和运维监控,风格偏工程化和平台化。
这四个框架不是“互相替代”的关系,更多是“不同场景的最优解”。你如果拿 LangGraph 的思维去硬套 CrewAI,会觉得它不够严谨;拿 CrewAI 的思维去上手 LangGraph,又会觉得概念太多、学得累。
1.3 选型的三条核心评判标准
抛开具体框架,我建议用这三条标准去筛:
第一条是可控性。你的业务是否允许 Agent 自由发挥?比如涉及资金操作、工单流转、对外发布,最好选择一个能明确限定状态流转路径的框架;如果是头脑风暴类、内容初稿类,自由度高一点反而效果更好。
第二条是可维护性。想象一下 Agent 跑挂了,你能不能快速看出是在哪一步挂的、当时状态是什么、能不能从某个中间节点恢复重新跑。状态快照、日志回放、Debug 工具,这三样在生产环境里比任何酷炫功能都重要。
第三条是生态和接入成本。看看你的团队已经依赖哪些基础设施:模型是 OpenAI 还是本地部署?需要接入 LangChain 的组件吗?数据库、消息队列、监控系统是不是特定技术栈?框架能多快融入现有体系,决定了落地速度。
这三条标准没有先后之分,完全取决于你的项目处于哪个阶段。我在下面的章节里,也基本是按照这套逻辑去拆解四个框架的。
2. 四个框架逐一拆解:设计思想、代码模型、适用场景
2.1 LangGraph:用图把“不可控”变成“可控”
LangGraph 的核心概念是状态图(StateGraph)。你把 Agent 的行为拆成一堆节点(Node),节点之间用普通边或者条件边(Conditional Edge)连接,每个节点执行后都会更新一个共享状态(State)。
这种设计的好处非常直接:整个流程是显式的。你可以肉眼看到 Agent 从哪个节点进、哪个节点出、什么时候走分支、什么时候进入循环。对于生产系统来说,这种“流程可读性”是极度宝贵的。出了问题时,你可以直接把状态图打出来,对照日志定位。
我第一次存储历史记录时,就用 LangGraph 搭过一个客服分类 Agent,核心代码大概是这种感觉:
from typing import TypedDict, Literal from langgraph.graph import StateGraph, END class AgentState(TypedDict): user_input: str category: str confidence: float def classify_node(state: AgentState): # 调用模型对用户输入分类 category, confidence = classify_with_model(state["user_input"]) return {"category": category, "confidence": confidence} def route_after_classify(state: AgentState) -> Literal["human_review", "auto_reply"]: # 根据置信度决定分支 if state["confidence"] < 0.6: return "human_review" return "auto_reply" def human_review_node(state: AgentState): # 人工介入节点 return {"category": "reviewed_by_human"} def auto_reply_node(state: AgentState): # 自动回复节点 return {"reply": "auto generated"} graph = StateGraph(AgentState) graph.add_node("classify", classify_node) graph.add_node("human_review", human_review_node) graph.add_node("auto_reply", auto_reply_node) graph.set_entry_point("classify") graph.add_conditional_edges("classify", route_after_classify, { "human_review": "human_review", "auto_reply": "auto_reply", }) graph.add_edge("human_review", END) graph.add_edge("auto_reply", END) app = graph.compile()LangGraph 真正强的地方不只是这个图,而是三件配套能力:Checkpointing、持久化、断点续跑。Checkpointing 意味着每一步状态都会被打快照,任务中途挂了可以从最近一次快照恢复,这个机制配合人工审核场景非常好用。断点续跑则意味着你可以在某个节点暂停,人工审核完再继续执行后面的节点。
它的缺点也很明显。学习曲线比较陡峭,你至少需要理解 State、Node、Edge、Conditional Edge、Reducer 这些概念,对于只想快速跑一个 Demo 的人来说,这个门槛并不低。
2.2 AutoGen:让 Agent 相互对话,任务在对话中完成
AutoGen 的思路和 LangGraph 完全反着来。它不强求你画流程图,而是让你创建两个或多个 Agent,让它们通过聊天消息来合作完成一个任务。
核心对象是 ConversableAgent,里面有 UserProxyAgent(代表用户方,通常负责真实执行工具)和 AssistantAgent(代表 AI 助手)等预制角色。任务推进的方式是“来回说话”,一轮一轮地把信息聊出来。
举个例子,让一个“分析师 Agent”和一个“代码执行 Agent”合作完成数据处理任务:
from autogen import ConversableAgent, UserProxyAgent assistant = ConversableAgent( "assistant", llm_config={"config_list": [{"model": "gpt-4", "api_key": "..."}]}, system_message="你是数据分析助手,给出 Python 代码完成数据处理。", ) executor = UserProxyAgent( "executor", human_input_mode="NEVER", code_execution_config={"work_dir": "workspace", "use_docker": True}, ) result = assistant.initiate_chat( executor, message="请读取 data.csv,统计各分类数量并输出结果。", max_turns=10, )这种设计天然的优点是多智能体协作的自由度和涌现能力。多个 Agent 可以各持立场,比如一个负责挑毛病、一个负责写方案,通过对话产生比单 Agent 更深入的结果。研究场景和讨论型任务尤其适合这种模式。
但代价同样明显。对话式编排的“失控风险”更高。你没法像 LangGraph 那样精准定义状态流转路径,Agent 可能在对话里反复绕圈,也可能在第十轮突然自己跑偏。而且多轮对话意味着 token 消耗较大,每一次消息都是全量上下文重放,账单会涨得比较快。
2.3 CrewAI:像组建项目组一样搭建 Agent
CrewAI 的学习成本是四个框架里最低的。它把 Agent 抽象成了三个核心概念:Agent(角色)、Task(任务)、Crew(团队)。翻译过来就是:你给每个人定义角色,把任务拆出来分给各角色,最后组成一个团队按流程跑。
它内部预置了顺序(Sequential)和层级(Hierarchical)两种流程。顺序流程就是 A 任务跑完再接 B 任务,层级流程会引入一个“经理”Agent 来规划任务分配。我搭过一个内容生产流水线,思路是这样的:
from crewai import Agent, Task, Crew, Process researcher = Agent( role="行业研究员", goal="收集并整理市场数据", backstory="你擅长从公开信息中提取关键洞察", tools=[search_tool], ) writer = Agent( role="内容编辑", goal="根据研究结果写一篇结构化报告", backstory="你擅长将数据转化为易读内容", ) research_task = Task( description="收集最近一个季度的市场动态", agent=researcher, ) write_task = Task( description="基于研究结果输出一份市场分析报告", agent=writer, ) crew = Crew( agents=[researcher, writer], tasks=[research_task, write_task], process=Process.sequential, ) result = crew.kickoff()如果你是第一次做 Agent 开发,CrewAI 是最合适的入门框架。概念少、代码像自然语言、跑通全流程不需要理解复杂底细,拿来接私活或者做验证性 Demo 特别快。
但它的灵活性有限。复杂条件分支、循环、多级状态管理这些能力比较薄弱,本质上更适合“流程相对固定的协作任务”。如果你的业务需要精确控制“什么条件下走哪条路”,CrewAI 会比较吃力。
2.4 Microsoft Agent Framework:面向企业接入的大一统方案
Microsoft Agent Framework 是这四个里面最年轻的一个,设计目标也最宏大:把 Agent 开发、托管、运维收编到一套企业级体系里。它和 Semantic Kernel、Azure AI Foundry 生态关系紧密,支持 Python、.NET、JavaScript 多语言,对企业现有微软技术栈非常友好。
从官方公开资料来看,它的核心概念比较系统化:Agent 是基本执行单元,负责绑定指令、模型和工具;对话状态支持持久化管理;框架层面提供了 Agent Host(宿主)概念,用于统一承载多个 Agent 的运行与调度。我现在用一个非常简化的伪代码来形容它的写法:
# 以下代码结构为示意,具体 API 以官方最新文档为准 from agentframework import Agent, AgentHost host = AgentHost(name="customer_analysis") def analyze_reviews(context): # 调用模型和工具完成评论分析 ... agent = Agent( name="review_analyzer", system_prompt="你负责分析产品评论并输出结构化摘要", tools=[search_tool, sql_tool], handler=analyze_reviews, ) host.add_agent(agent) result = host.run(agent_id="review_analyzer", input_text="...")我的整体感受是,这个框架的定位不是给个人开发者玩票用的,而是面向需要统一管控、审计、多团队协作的企业环境。比如长文对话、工具接入、权限控制、可观测性这些能力,它都尝试提供标准化方案。如果你的团队已经深度使用微软生态,那么这个框架的集成价值会非常明显。
但在社区规模、第三方教程和思维资源方面,它明显比 LangGraph 和 AutoGen 年轻。遇到问题时要查上下文相关的信息,解决思路不一定丰富,这点需要有心理准备。
3. 同一场景四框架实现:需求拆解与代码对比
3.1 模拟任务:做一个新产品用户反馈调研 Agent
为了对比真实差异,我设计一个共同场景:用户发来一批产品评论文本,Agent 需要完成三步:
- 对评论进行情感分类(积极、消极、中性);
- 提炼高频关键词和共性主题;
- 生成一份简短的调研报告。
两个额外约束:当分类置信度太低时,需要重新分析而不是硬分类;所有中间结果要能被记录和回溯。这个场景不算复杂,但足够暴露框架在状态管理、流程控制和数据传递上的思路差异。
3.2 LangGraph 实现:显式节点流
在 LangGraph 里,我把三步行为拆成四个节点:读评论、分类、提炼主题、生成报告,并在分类之后加一条条件边,专门处理低置信度分支。
from typing import TypedDict, Literal from langgraph.graph import StateGraph, END class ReviewState(TypedDict): raw: list[str] sentiments: list[dict] themes: list[str] report: str low_confidence: bool def classify_node(state: ReviewState): # 对每条评论做情感分类,记录置信度 result = sentiment_model(state["raw"]) low = any(item["confidence"] < 0.6 for item in result) return {"sentiments": result, "low_confidence": low} def retry_classify_node(state: ReviewState): # 换个角度重新分析低置信度评论 retried = retry_sentiment_model(state["raw"], state["sentiments"]) return {"sentiments": retried, "low_confidence": False} def theme_node(state: ReviewState): return {"themes": extract_themes(state["sentiments"])} def report_node(state: ReviewState): return {"report": generate_report(state["themes"])} def route(state: ReviewState) -> Literal["retry", "theme"]: return "retry" if state["low_confidence"] else "theme" builder = StateGraph(ReviewState) builder.add_node("classify", classify_node) builder.add_node("retry", retry_classify_node) builder.add_node("theme", theme_node) builder.add_node("report", report_node) builder.set_entry_point("classify") builder.add_conditional_edges("classify", route, { "retry": "retry", "theme": "theme", }) builder.add_edge("retry", "theme") builder.add_edge("theme", "report") builder.add_edge("report", END) app = builder.compile()写这一段时,我已经能很明显感觉到 LangGraph 的流程“长在代码里”:状态结构、分支逻辑、回退机制全都显式存在。后续如果是别人接手,他也只要顺着图往下看就能理解业务逻辑。
3.3 AutoGen 实现:角色对话推进
在 AutoGen 里,同样的任务变成了两个 Agent 的对话。一个负责分析和提炼话题,另一个负责写报告。
from autogen import ConversableAgent researcher = ConversableAgent( "researcher", system_message=( "你是产品评论分析专家。" "你先逐条判断情感,再提炼主题。" "当置信度低时主动说'信息不足,换一种角度重试'。" ), llm_config={"config_list": [{"model": "gpt-4", "api_key": "..."}]}, ) writer = ConversableAgent( "writer", system_message="你根据研究员的分析结果,写一份简洁的调研报告。", llm_config={"config_list": [{"model": "gpt-4", "api_key": "..."}]}, ) result = researcher.initiate_chat( writer, message="这些是新产品评论数据:" + str(raw_data), max_turns=6, ) print(result.summary)写完后我的感觉是代码量确实小很多,但问题的隐患也随之而来:低置信度重试是否触发,取决于模型在对话里是否“记得”要重试,而不是由明确的分支逻辑保证。你没法在代码里强制写一条“如果置信度低就走重试节点”的规则,这就导致行为稳定性差一些。
3.4 CrewAI 实现:任务分工协作
CrewAI 的做法是将评论分类、主题提炼、报告生成拆成三个 Task,分配给两个 Agent,用顺序流程执行。
from crewai import Agent, Task, Crew, Process analyst = Agent( role="评论分析师", goal="准确判断评论情感并提炼主题", backstory="你是一名专业的舆情分析师", ) reporter = Agent( role="报告撰写员", goal="基于分析结果产出精简调研报告", backstory="你擅长结构化表达", ) task_classify = Task( description="对以下评论做情感分类,输出每条评论的情感标签", agent=analyst, ) task_theme = Task( description="基于情感分类结果,提炼高频主题和关键词", agent=analyst, ) task_report = Task( description="基于主题结果,生成一份 500 字以内的调研报告", agent=reporter, ) crew = Crew( agents=[analyst, reporter], tasks=[task_classify, task_theme, task_report], process=Process.sequential, ) result = crew.kickoff()CrewAI 的实现最像“写需求文档”:把活分给人,然后把整个团队串联起来就行。这种模式在流程固定时效率很高,几乎不需要额外状态管理代码。但如果你想加“置信度低就重试”这种条件分支,CrewAI 就不好弄了,你得将自动重试逻辑封到工具或模型提示词里,而不是作为独立流程节点。
3.5 Microsoft Agent Framework 实现:宿主管理、工具优先
由于 Microsoft Agent Framework 的 API 仍在快速演进,我这里只写面向思路的伪代码。实际开发时你以官方文档为准。
# 伪代码示意,不可直接运行 from agentframework import AgentHost, Agent, Tool host = AgentHost() agent = Agent( name="review_analysis_agent", instruction="分析产品评论,输出情感分类、主题与报告", model="gpt-4", tools=[ Tool(name="sentiment_tool", func=sentiment_analyze), Tool(name="theme_tool", func=theme_extract), Tool(name="report_tool", func=report_generate), ], ) host.add_agent(agent) output = host.run(agent.name, input={"reviews": raw_data})这样写的优势在于,Agent 内部到底是先分类、再提炼、最后写报告,还是反复交叉调用工具,都由模型结合工具自行决定。你不必预先定义状态图,适合那些“行为模式不完全确定,需要模型自己规划”的任务。但同时你也牺牲了一部分确定性。
3.6 四套写法的核心差异总结
可以把四个框架在实现同一任务时的差异整理成一张表:
| 维度 | LangGraph | AutoGen | CrewAI | Microsoft Agent Framework |
|---|---|---|---|---|
| 核心抽象 | 状态图/节点/条件边 | 可对话 Agent | 角色/任务/团队 | Agent/Agent Host/工具 |
| 流程控制 | 强控制,显式分支 | 弱控制,靠对话推进 | 中控制,支持顺序与层级 | 中强控制,靠指令与工具编排 |
| 状态管理 | 内置 Checkpoint,支持持久化 | 对话历史,长任务需手动管理 | 任务间传参,适合短流程 | 平台级托管,支持持久化状态 |
| 学习门槛 | 较高 | 中等 | 低 | 中高,依赖生态概念 |
| 调试难度 | 可回放、可断点续跑 | 消息日志相对直观 | Debug 开关,流程简单 | 企业级遥测,需要接入生态 |
| 适合阶段 | 生产系统/严谨流程 | 研究探索/多角色讨论 | 快速原型/固定流程 | 企业级集成/多语言团队 |
4. 实际踩过的坑:状态、记忆、工具调用、调试
4.1 状态设计踩过的坑
LangGraph 看起来自由,但状态设计不当时会带来性能问题。我之前把原始文本、中间结果、模型原始响应全塞进一个 State,每个节点结束都会把整个 State 序列化一次。数据量一大,流程明显变慢。后来只保留必要字段,把大体积文本放到外部存储,只在 State 里放引用 ID,速度立刻上来了。
AutoGen 的坑在对话历史。聊天式设计虽然开发爽,但 Agent 每多聊一轮,历史消息总量就大一圈。有一次我没限制 max_turns,两个 Agent 围绕一个无关细节来回确认了十几轮,Token 消耗翻了好几倍。后来我在系统消息里写明规则,再设置消息上限,才算控制住。
CrewAI 的坑主要是任务间数据传递。默认场景下,后一个 Task 不一定能自动拿到前一个 Task 的完整输出。你在编写 Task 描述时必须明确说明“上一个阶段的输出字段是什么”,否则模型自己猜,结果经常漏数据。
4.2 工具调用的幻觉和失败重试
不管哪个框架,Agent 调用工具时都可能出现两种典型问题:一是模型自己编造了工具返回结果(低版本的调用模式下尤其常见);二是工具参数 schema 不严谨,模型怎么生成都报错。
我习惯的做法是:所有工具返回值都加上结构化校验;工具描述里写清楚“什么时候该用、参数应该填什么”;一旦工具调用失败,在流程定义里安排一个“重新调用”分支,而不是直接把错误信息塞回给模型让它自行处理。这样 Agent 的容错行为就变得可预期。
4.3 调试与可观测性
调试 LangGraph 时最有用的功能是 Checkpoint 和断点回放。你可以让图运行到某个节点前暂停,打印当时的 State,甚至手动修改 State 再继续跑。这相当于给 Agent 流程装了一个“单步调试器”。
AutoGen 调试主要靠消息打印。我建议关键节点把消息 ID、发送方、内容摘要都打出来,别只打最终摘要。否则查问题时根本不知道是哪一轮对话把 Agent 带偏的。
CrewAI 有个 Debug 开关,开了之后能输出比较详细的提示词和中间决策。对于追踪“模型为什么这么回答”帮助不小。不过生产环境建议关掉,因为它会暴露系统提示词细节,而且日志量很大。
4.4 成本控制技巧
多智能体编排的隐形成本容易被忽略。框架本身免费的,但 Token 消耗是实打实的。我在这几个框架上都用过同一个省钱组合拳:
- 优先用便宜的小模型做分类、抽取、路由,最后只让大模型负责生成报告;
- 在 State 或上下文中做裁剪,只保留与当前节点最相关的字段;
- 在流程外层做好缓存,同一批输入不重复跑;
- 用人工介入节点代替不必要的全自动推理链条,该断就断。
这一套组合下来,我的实际调用成本能降至少三分之一。
5. 最终选择:一张表看懂不同团队该选谁
5.1 对比总表
| 选型需求 | 推荐框架 | 理由 |
|---|---|---|
| 生产系统,要求流程绝对可控 | LangGraph | 状态图显式、断点续跑、审计清晰 |
| 研究原型,探索多角色协作 | AutoGen | 对话自由,适合讨论式智能体 |
| 快速交付内容流水线 | CrewAI | 入门轻松,代码接近业务语言 |
| 微软技术栈、企业级统一管理 | Microsoft Agent Framework | 多语言、托管、生态集成完整 |
5.2 分场景选型建议
如果你的核心诉求是“这个流程必须按我说的走”,比如订单流转、运营审核、风控判断这类高风险业务,选 LangGraph。它虽然写起来多花点时间,但这些约束都是生产系统必需的安全网。
如果你的诉求是“我想看看多个智能体相互讨论能碰撞出什么结果”,比如阅读观点、自动辩论,或者快速做研究实验,选 AutoGen。它给你自由度,让你先跑起来,而不是先画图。
如果你的诉求是“下周就要上线一个内容自动处理工具”,团队里还有不太熟悉大模型开发的成员,选 CrewAI。它的角色概念容易理解,代码风格自然,团队成员自主性也强。
如果你的团队已经深度使用微软生态,企业内部也有统一管控、审计、多团队协作的要求,那么认真研究一下 Microsoft Agent Framework。它替你解决的是“孤立的 Agent 如何纳入企业体系”这个更大问题。
5.3 我的个人建议
在我的实际项目经验里,很多团队的现状不是单项选择,而是组合使用。比如某个团队最终用的是:CrewAI 做最初的产品验证和给老板汇报 Demo,之后沉淀为 LangGraph 的生产实现。这种“快速验证 + 严谨落地”的路径,我认为是很务实的做法。
另外,我不建议一上来就追最新框架。除非框架能显著降低现有成本、解决你具体碰到的痛点,否则稳定压倒一切。
框架选型这种事,说到底不是选一个“名字最响”的,而是选一个“队友们愿意长期维护”的。同样的流程在一个框架里可能写得很难看,换一个框架就顺滑很多。我希望这篇文章不只是帮你做清单式的对比,还能帮你理解每一个框架的思考逻辑,最终找到适合你们团队的那个。