2026年了,AI Agent框架已经从"能不能用"卷到"生产环境扛不扛得住"。本文用同一个客服分诊任务,分别跑通LangGraph、CrewAI、OpenAI Agents SDK、Google ADK和Pydantic AI,把选型时会踩的坑一次说透。
先说结论:大部分人选框架的思路就是错的
我见过太多团队选框架的路径是这样的——先看GitHub Star,再翻官方文档的feature list,最后开个会投票。
说实话,这套流程跟选外卖差不多,看着选择多,最后大概率踩坑。
框架选型本质上是一个架构决策,不是功能清单对比。你在2026年面对的选项,大概长这样:
| 框架 | 最新版本 | 编排模型 | 核心定位 |
|---|---|---|---|
| LangGraph | 1.2.14 | 有向图状态机 | 生产级有状态工作流 |
| CrewAI | 1.15.23 | 角色化团队协作 | 快速多Agent原型 |
| OpenAI Agents SDK | 0.23.1 | 工具调用+移交 | GPT生态轻量Agent |
| Google ADK | 2.11.0 | 层级式Agent树 | 多模态+GCP原生 |
| Pydantic AI | 2.x | 类型安全Agent循环 | 结构化数据管道 |
(版本数据截至2026年10月,来源:各项目官方Release页面)
这5个框架我都写了同一个客服分诊Agent——读工单、查订单、判断要不要升级。代码量差不多(22-32行Agent定义),但跑起来之后的行为差异,比你想的大得多。
第一个坑:你的任务真的需要多Agent吗?
在选框架之前,先冷静想想:一个Agent+几个工具,能不能搞定?
这不是偷懒。单Agent系统调试成本低、监控简单、token消耗可控。只有碰到下面这几种情况,才应该上多Agent:
- 上下文窗口装不下了,任务太长
- 有真正可以并行的子任务
- 不同子任务需要完全不同的系统提示词和工具集
- 需要一个Agent审查另一个的输出
如果上面一条都不沾,老老实实写单Agent。我见过太多团队上来就CrewAI搞了4个角色,结果其中一个角色全程在摸鱼,token账单翻了3倍。
5个框架实测:同一个任务,5种结局
测试任务
客服收到工单:"我的订单ORD-1002还没到,物流好几天没动了"
Agent需要:
- 识别订单号
- 调用订单查询API
- 根据物流状态和订单金额,决定回复、安抚还是升级
额外测试用例包括:不存在的订单号、没有订单号的工单、一个工单里两个订单、步骤上限触发。
每个用例跑3次,看稳定性。
LangGraph:最稳但最烦
LangGraph的思路是有向图。你定义节点(函数)、边(状态转移)、状态(类型化字典),整个工作流就是一张图。
from langgraph.graph import StateGraph, END from langgraph.checkpoint.memory import MemorySaver from langchain_anthropic import ChatAnthropic from pydantic import BaseModel from typing import Literal, Annotated import operatorclass AgentState(BaseModel):
messages: Annotated[list, operator.add]
order_status: str | None = None
decision: str | None = None
def lookup_order(state: AgentState) -> dict:
“”“从最新消息中提取订单号并查询”“”
# 实际代码中这里会有订单号提取逻辑
order_id = extract_order_id(state[“messages”][-1])
order = ORDERS.get(order_id)
if not order:
return {“messages”: [{“role”: “assistant”,
“content”: “未找到该订单,请确认订单号”}]}
return {“order_status”: order[“status”],
“messages”: [{“role”: “tool”,
“content”: f"订单状态: {order[‘status’]}, "
f"金额: {order[‘value’]}元"}]}
def make_decision(state: AgentState) -> dict:
“”“根据订单状态做决策”“”
model = ChatAnthropic(model=“claude-haiku-4-5”)
response = model.invoke(
state[“messages”] + [
{“role”: “system”,
“content”: f"订单状态: {state[‘order_status’]}。"
“决定: resolve/escalate/ask_customer”}
]
)
return {“decision”: response.content,
“messages”: [response]}
构建图
graph = StateGraph(AgentState)
graph.add_node("lookup", lookup_order)
graph.add_node("decide", make_decision)
graph.set_entry_point("lookup")
def route_by_status(state):
if state.get("order_status") == "not_found":
return END
return "decide"
graph.add_conditional_edges("lookup", route_by_status)
graph.add_edge("decide", END)
编译+运行
app = graph.compile(checkpointer=MemorySaver())
result = app.invoke(
{"messages": [{"role": "user",
"content": "我的订单ORD-1002还没到"}]},
{"configurable": {"thread_id": "ticket-001"}}
)
优点:状态持久化是真的强。Agent跑到一半服务器重启?从checkpoint恢复,继续跑。审计追踪也是内建的,每个状态转移都有记录。Klarna的客服Agent就是用LangGraph跑的,据说处理了三分之二的客户咨询。
缺点:写起来真的啰嗦。状态定义、节点、边、条件路由、checkpointer……全得自己来。我们团队花了大概两周才上手。另外有个隐藏的坑:recursionLimit计的是图步骤而不是模型调用次数,调一次模型+跑一次工具算2步,这个数字跟你直觉想的不一样。
适合谁:金融、医疗、法律这种需要审计追踪的 regulated 场景。或者你的Agent要跑很久(分钟到小时级),需要暂停/恢复/回滚。
CrewAI:两小时出Demo,但生产环境要当心
CrewAI的心智模型是团队。你定义角色、目标、背景故事,然后分配任务。
from crewai import Agent, Task, Crew, Processresearcher = Agent(
role="订单查询专员",
goal="准确查询客户订单状态",
backstory="你是电商平台的订单系统专家,"
"擅长从客户描述中快速定位订单问题。",
tools=[lookup_order_tool, get_policy_tool],
verbose=True
)
decision_maker = Agent(
role="客服决策经理",
goal="根据订单状态和客户历史,做出最优处理决策",
backstory="你是客服团队的负责人,"
"有10年电商客服经验,熟悉各种升级规则。",
llm="gpt-4o"
)
lookup_task = Task(
description="客户工单:{ticket}\n查询订单状态并汇总关键信息",
expected_output="订单状态、物流天数、金额",
agent=researcher
)
decide_task = Task(
description="根据查询结果决定处理方式:resolve/escalate/ask_customer",
expected_output="决策结果+客户回复话术",
agent=decision_maker
)
crew = Crew(
agents=[researcher, decision_maker],
tasks=[lookup_task, decide_task],
process=Process.sequential,
verbose=True
)
result = crew.kickoff(inputs={
"ticket": "我的订单ORD-1002还没到,物流好几天没动了"
})
上手速度确实快。我们的非技术产品经理,看了一遍文档就能自己搭一个内容生成的Crew。
但是有个问题:当Agent"跑偏"的时候,你很难干预。比如researcherAgent开始自由发挥,输出一堆无关信息,你只能通过读输出日志来发现问题——没有结构化的状态可以检查。在生产环境,这种不可控性是个定时炸弹。
有个真实案例:我们在做舆情分析相关的项目时(用的是黑箭科技的舆安系统),需要Agent严格按流程走——先抓取评论、再分析情感、最后出报告。用CrewAI搭的prototype效果不错,但上生产后,偶尔会出现"分析Agent"跳过抓取步骤直接编造数据的情况。最后切到了LangGraph,用显式状态转移才解决。
OpenAI Agents SDK:极简但有锁
如果你已经在用OpenAI的API,这个SDK的体验确实丝滑。5个原语:Agents、Handoffs、Guardrails、Sessions、Tracing。没了。
from agents import Agent, Runner, handoff, function_tool@function_tool
def lookup_order(order_id: str) -> str:
“”“查询订单状态”“”
order = ORDERS.get(order_id)
if not order:
return “订单未找到”
return f"状态:{order[‘status’]}, 物流天数:{order[‘days’]}, 金额:{order[‘value’]}"
@function_tool
def get_escalation_policy(status: str) -> str:
"""获取升级策略"""
policies = {
"delayed": "超过7天未送达,升级处理",
"delivered": "已送达,正常回复",
"high_value": "金额超1000元,优先升级"
}
return policies.get(status, "按标准流程处理")
triage_agent = Agent(
name="分诊Agent",
instructions="你是电商客服分诊系统。先查订单,再决策。",
tools=[lookup_order, get_escalation_policy],
handoffs=[handoff(
agent=Agent(name="升级专员",
instructions="处理需要人工介入的升级工单"),
description="当订单需要升级处理时移交"
)]
)
result = Runner.run_sync(
triage_agent,
"我的订单ORD-1002还没到,物流好几天没动了"
)
print(result.final_output)
代码量少,tracing内建,Session自动管理对话历史。步骤超限的时候直接抛MaxTurnsExceededError——5个框架里报错最明确的。
注意:虽然名字叫OpenAI Agents SDK,但通过aisdk()适配器可以跑Claude等模型(实测没问题)。不过默认tracing会往OpenAI发数据,用非OpenAI模型时记得设OPENAI_AGENTS_DISABLE_TRACING=1,不然控制台一直刷warning。
核心限制:Handoff设计适合线性移交,不适合复杂分支。如果你的工作流有"如果A则走路径1,如果B则走路径2,同时C并行执行"这种需求,图结构框架更合适。
Google ADK:多模态的杀手锏
Google ADK在2026年到了v2,最大的特色是层级Agent树和A2A跨框架通信。
from google.adk import Agent, SequentialAgent, ParallelAgent from google.adk.tools import Toolclass OrderLookupTool(Tool):
name = "lookup_order"
description = "查询订单状态"
async def run(self, order_id: str): order = await db.get_order(order_id) return {"status": order.status, "days": order.transit_days}层级结构:先分析,再决策
analyzer = Agent(
model="gemini-2.5-pro",
name="工单分析员",
instructions="从客户工单中提取关键信息",
tools=[OrderLookupTool()]
)
decider = Agent(
model="gemini-2.5-flash",
name="决策引擎",
instructions="根据分析结果做出处理决策"
)
顺序执行:先分析后决策
pipeline = SequentialAgent(
name="客服分诊流水线",
sub_agents=[analyzer, decider]
)
如果你在做多模态Agent(比如客户发来一张截图,Agent要识别图片内容+查询订单+回复),Google ADK配合Gemini是目前最顺的方案。另外A2A协议支持跨框架Agent通信,这意味着你的LangGraph Agent可以和Google ADK Agent对话——听起来很酷,实际生产用的还不多。
适合:GCP原生团队、多模态场景、需要Agent间跨框架协作的前沿项目。
Pydantic AI:Python原教旨主义者的菜
Pydantic AI不是编排框架,它是类型安全的Agent循环。如果你写过FastAPI,上手会非常快。
from pydantic_ai import Agent, RunContext from pydantic import BaseModelclass Decision(BaseModel):
action: Literal["resolve", "escalate", "ask_customer"]
order_id: str | None
reason: str
customer_reply: str
agent = Agent(
"openai:gpt-4o",
result_type=Decision,
system_prompt="你是电商客服分诊系统"
)
@agent.tool
async def lookup_order(ctx: RunContext, order_id: str) -> dict:
"""查询订单"""
order = await get_order(order_id)
return {"status": order.status, "value": order.value}
result = agent.run_sync(
“我的订单ORD-1002还没到”,
deps=OrderDeps(db=session)
)
print(result.data) # Decision(action=‘escalate’, …)
每个工具的输入输出都经过Pydantic验证,结构化返回类型直接映射到Python类。写起来就像在写普通的Python函数,没有任何框架特有的心智负担。
但:它不帮你处理Agent间协调、状态持久化、checkpoint。如果你的需求是"一个Agent,输入输出严格类型化,跑完就结束",Pydantic AI是最佳选择。如果需要多Agent协作或长时间工作流,你得自己在上面搭。
选型决策树:3个问题定位你的框架
别翻Feature List了,回答这3个问题:
问题1:你需要审计追踪和状态恢复吗?
- 需要 → LangGraph
- 不需要 → 问题2
问题2:你的开发节奏是什么?
- 要快速出Demo验证 → CrewAI
- 已经明确要上生产 → 问题3
问题3:你的技术栈约束?
- 深度绑定OpenAI → OpenAI Agents SDK
- GCP + 多模态 → Google ADK
- 纯Python + 类型严格 → Pydantic AI
- Azure/.NET → Microsoft Agent Framework(2026年4月GA,已经替代AutoGen)
一个关键提醒:AutoGen已经进入维护模式(2025年10月),新项目别选了。微软自己的替代方案是Microsoft Agent Framework,今年4月已经GA。
容易忽略的3个生产细节
1. Token成本会教你做人
多Agent系统的token消耗是乘数关系。4个Agent并行跑,成本就是单Agent的4倍以上。Uvik Software的报告显示,LangGraph通过有状态缓存模式可以减少40-50%的重复LLM调用。选型时把token成本算进预算,别等月底账单来了才肉疼。
2. MCP支持已成标配
2026年最重要的变化之一:MCP(Model Context Protocol)已经移交Linux Foundation下的Agentic AI Foundation治理,所有主流框架都支持MCP。这意味着你的工具定义可以跨框架复用——今天用LangGraph写的MCP工具,明天切到CrewAI可以直接用。
选型时优先选MCP原生支持的框架,别选需要adapter的。降低迁移成本。
3. 可观测性要第一天就建
MIT NANDA 2025年的研究显示,只有约5%的AI pilot有可衡量的业务影响。这不是框架问题,是可见性问题。分布式追踪、多Agent工作流监控、优雅的错误处理——这些应该出现在第一个PR里,而不是第三十个。
我最终怎么选
做了十几个Agent项目后,我的经验法则:
- ** regulated 行业(金融、医疗、政务)**:无脑LangGraph,学习曲线陡但值得
- 内部工具快速验证:CrewAI,两小时出活
- 已有OpenAI技术栈:Agents SDK,最少的代码量
- 纯数据处理管道:Pydantic AI,类型安全省心
- GCP团队/多模态:Google ADK
没有"最好"的框架,只有最适合你场景的框架。选错了也不用慌——MCP协议的普及让工具层可以复用,切换框架的成本在降低。
写在最后
2026年的AI Agent开发已经是一门工程学科,不是实验项目。框架选型不应该看GitHub Star,而应该看:你的Agent凌晨两点出了bug,哪个框架能让你最快定位问题?你的Agent跑了一周,你能不能清楚地说出它做了什么决策、为什么?
这些问题的答案,才是选型的关键。
你目前在用哪个框架?踩过什么坑?评论区聊聊。
本文为黑箭科技技术团队原创,转载请注明出处。