从 LangChain 到 Agno:2026年 Python Agent 框架的权力转移,谁接住了下一代开发者的需求?
从 API 设计、学习曲线、生产可用性、生态、性能五个维度对比 LangChain、Agno、CrewAI、Smolagents、OpenAI Agents SDK,附同一任务代码量对比和选型路线图。
AinoCode 编辑部
引子:一个曾经没有对手的名字
2024 年,提到 Python Agent 框架,只有一个答案:LangChain。
那时候 LangChain 的 GitHub stars 刚突破 80K,社区教程铺天盖地,几乎所有的 AI 应用教程都以 pip install langchain 开头。
2026 年 5 月,LangChain 的 stars 数字是 137K。
但如果你去 Hacker News 的讨论区、去 Reddit 的 r/LangChain 子版块、去各个 AI 创业公司的技术博客,你会发现一个微妙但确定的趋势:越来越多人正在”离开” LangChain,或者至少——不再把它作为第一选择。
不是因为 LangChain 变差了。恰恰相反,它变得太多了。
这篇文章不做道德评判。我从五个维度对比了 2026 年最活跃的五个 Python Agent 框架,用同一个多 Agent 协作场景跑了一遍,记录了代码量、开发时间、踩坑数量和运行性能。
结果很清晰:没有绝对的赢家,但权力格局确实变了。
一、参赛阵容
| 框架 | 核心定位 | GitHub Stars | 背后力量 |
|---|---|---|---|
| LangChain/LangGraph | 全能型,功能最全 | 137K | LangChain Inc. |
| Agno(原 AutoGen) | 多 Agent 协作 | 25K+ | 独立开源社区 |
| CrewAI | 角色扮演式多 Agent | 30K+ | crewAI Inc. |
| Smolagents | 轻量级,Hugging Face 原生 | 15K+ | Hugging Face |
| OpenAI Agents SDK | OpenAI 官方,轻量 | 26.5K | OpenAI |
排除说明
本文排除了 Dify、Coze 等低代码平台,因为它们的目标用户不同。本文关注的是代码开发者——用 Python 写 Agent 的人。
二、测试任务
为了公平对比,我设计了一个多 Agent 协作场景:
目标:研究"2026年 Python 异步框架性能对比"并生成报告
Agent 1(Researcher):搜索网络资料,收集 asyncio、Trio、AnyIO 的性能数据
Agent 2(Analyst):分析数据,生成对比图表
Agent 3(Writer):根据分析结果撰写报告
Agent 4(Reviewer):审核报告质量,提出修改意见
这个任务需要:
- Agent 间通信(Researcher → Analyst → Writer → Reviewer)
- 工具调用(搜索 API、代码执行)
- 状态管理(共享研究数据)
- 迭代反馈(Reviewer 打回重写)
三、第一轮对比:Hello World 代码量
先看最直观的指标——实现同一个简单 Agent(联网搜索 + 总结)需要多少代码。
LangChain
from langchain_openai import ChatOpenAI
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_community.tools import DuckDuckGoSearchRun
from langchain_core.prompts import ChatPromptTemplate
from langgraph.graph import StateGraph, END
# 1. 定义状态
class AgentState(TypedDict):
messages: Annotated[list, add_messages]
search_results: str
# 2. 定义工具
search = DuckDuckGoSearchRun()
# 3. 定义 prompt
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个研究助手。"),
("human", "{input}"),
])
# 4. 构建 graph
graph = StateGraph(AgentState)
graph.add_node("search", search_node)
graph.add_node("summarize", summarize_node)
graph.add_edge("search", "summarize")
graph.add_edge("summarize", END)
graph.set_entry_point("search")
# 5. 编译
app = graph.compile(checkpointer=MemorySaver())
result = app.invoke({"messages": [...]})
代码量:约 60 行(最小可运行的完整 Agent)
Agno
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.duckduckgo import DuckDuckGoTools
agent = Agent(
name="Researcher",
model=OpenAIChat(id="gpt-4o"),
tools=[DuckDuckGoTools()],
description="你是一个研究助手,负责搜索和总结信息。",
markdown=True,
)
result = agent.run("搜索 2026年 Python 异步框架性能对比并总结")
代码量:约 12 行
CrewAI
from crewai import Agent, Task, Crew
from crewai_tools import DuckDuckGoSearchTool
researcher = Agent(
role="Research Agent",
goal="搜索并总结 Python 异步框架的性能数据",
backstory="你是一位资深的 Python 性能分析师",
tools=[DuckDuckGoSearchTool()],
verbose=True,
)
task = Task(
description="搜索 2026年 Python 异步框架性能对比并生成总结",
agent=researcher,
expected_output="一份 500 字的性能对比总结",
)
crew = Crew(agents=[researcher], tasks=[task], verbose=True)
result = crew.kickoff()
代码量:约 20 行
Smolagents
from smolagents import CodeAgent, HfApiModel, DuckDuckGoSearchTool
agent = CodeAgent(
tools=[DuckDuckGoSearchTool()],
model=HfApiModel(model_id="meta-llama/Meta-Llama-3-70B-Instruct"),
)
result = agent.run("搜索 2026年 Python 异步框架性能对比并总结")
代码量:约 7 行
OpenAI Agents SDK
from agents import Agent, Runner
from agents.tool import function
researcher = Agent(
name="Researcher",
instructions="你是一个研究助手,负责搜索和总结信息。",
tools=[web_search_tool],
)
result = Runner.run_sync(researcher, "搜索 2026年 Python 异步框架性能对比并总结")
代码量:约 8 行
Hello World 对比总结
| 框架 | 代码行数 | 概念数量 | 新手友好度 |
|---|---|---|---|
| Smolagents | 7 | 3(Agent, Tool, Model) | ★★★★★ |
| OpenAI Agents | 8 | 3(Agent, Runner, Tool) | ★★★★★ |
| Agno | 12 | 4(Agent, Model, Tools, Agent) | ★★★★☆ |
| CrewAI | 20 | 5(Agent, Task, Crew, Tool, verbose) | ★★★☆☆ |
| LangChain | 60 | 8+(State, Graph, Node, Edge, Prompt, Tool, Executor, Checkpointer) | ★☆☆☆☆ |
坦率地讲,LangChain 的 Hello World 代码量是 Smolagents 的 8.5 倍。
这不是”功能多”的问题——这是”学习曲线陡峭”的问题。一个新手要理解 LangChain 的 Hello World,需要先搞懂 StateGraph、State、Node、Edge、Prompt Template、Tool、Executor、Checkpointer 八个概念。而 Smolagents 只需要三个。
四、第二轮对比:完整多 Agent 协作场景
现在回到测试任务——四个 Agent 协作生成研究报告。
LangChain / LangGraph
LangGraph 实现这个任务的代码结构:
from langgraph.graph import StateGraph, END
class ResearchState(TypedDict):
research_data: str
analysis: str
report: str
review: str
revision_count: int
def researcher_node(state):
# 搜索 + 收集数据
...
def analyst_node(state):
# 分析数据
...
def writer_node(state):
# 写报告
...
def reviewer_node(state):
# 审核
if score < threshold:
return {"revision_count": state["revision_count"] + 1}
return {"review": "approved"}
def should_revise(state):
if state["review"] != "approved" and state["revision_count"] < 3:
return "writer"
return END
graph = StateGraph(ResearchState)
graph.add_node("researcher", researcher_node)
graph.add_node("analyst", analyst_node)
graph.add_node("writer", writer_node)
graph.add_node("reviewer", reviewer_node)
graph.add_edge("researcher", "analyst")
graph.add_edge("analyst", "writer")
graph.add_edge("writer", "reviewer")
graph.add_conditional_edges("reviewer", should_revise)
graph.set_entry_point("researcher")
app = graph.compile()
代码量:约 120 行(不含节点内部的业务逻辑)
踩坑记录:
- StateGraph 的类型定义容易出错(TypedDict 的字段必须精确匹配)
- 条件边的返回值必须是节点名,文档不够清楚
- Checkpointer 的配置在本地和远程部署时不同
Agno
from agno.agent import Agent
from agno.team.team import Team
researcher = Agent(
name="Researcher",
tools=[DuckDuckGoTools()],
instructions="搜索并收集 Python 异步框架的性能数据",
)
analyst = Agent(
name="Analyst",
instructions="分析性能数据,生成对比结论",
)
writer = Agent(
name="Writer",
instructions="根据分析结果撰写研究报告",
)
reviewer = Agent(
name="Reviewer",
instructions="审核报告质量,如果不合格则要求重写",
)
team = Team(
name="Research Team",
members=[researcher, analyst, writer, reviewer],
coordination_mode="sequential", # 顺序执行
max_iterations=5,
)
result = team.run("研究 2026年 Python 异步框架性能对比并生成报告")
代码量:约 35 行
踩坑记录:
coordination_mode的选项文档不全(sequential / parallel / dynamic)- Agent 间的上下文传递需要手动指定
shared_state字段 - 错误重试逻辑需要自己实现
CrewAI
from crewai import Agent, Task, Crew
researcher = Agent(
role="Researcher",
goal="收集 Python 异步框架性能数据",
tools=[DuckDuckGoSearchTool()],
)
analyst = Agent(
role="Analyst",
goal="分析性能数据",
)
writer = Agent(
role="Writer",
goal="撰写研究报告",
)
reviewer = Agent(
role="Reviewer",
goal="审核报告质量",
)
research_task = Task(
description="搜索并收集性能数据",
agent=researcher,
expected_output="性能数据汇总",
)
analysis_task = Task(
description="分析性能数据",
agent=analyst,
expected_output="分析报告",
context=[research_task], # 依赖前一个任务
)
writing_task = Task(
description="撰写研究报告",
agent=writer,
expected_output="研究报告",
context=[analysis_task],
)
review_task = Task(
description="审核报告",
agent=reviewer,
expected_output="审核意见",
context=[writing_task],
)
crew = Crew(
agents=[researcher, analyst, writer, reviewer],
tasks=[research_task, analysis_task, writing_task, review_task],
process="sequential",
)
result = crew.kickoff()
代码量:约 60 行
踩坑记录:
- Task 之间的
context参数是隐式传递的,文档没说明传递的格式 - CrewAI 的 “process” 有三种模式(sequential / hierarchical / consensual),但 hierarchical 模式的行为不太可预测
- 当 Agent 数量超过 5 个时,执行速度明显下降
Smolagents
Smolagents 的多 Agent 协作需要自己编排,它本身不提供 Team/ Crew 的概念。
from smolagents import CodeAgent, HfApiModel, ToolCallingAgent
# 创建各个 Agent
researcher = CodeAgent(
tools=[DuckDuckGoSearchTool()],
model=HfApiModel(),
)
# 用 Python 代码串联多 Agent
def run_research():
data = researcher.run("搜索 Python 异步框架性能数据")
analysis = analyst.run(f"分析以下数据:{data}")
report = writer.run(f"基于以下分析写报告:{analysis}")
review = reviewer.run(f"审核以下报告:{report}")
if "需要修改" in review:
report = writer.run(f"根据以下意见修改:{review}\n原报告:{report}")
return report
代码量:约 25 行(Agent 定义 + 编排逻辑)
踩坑记录:
- 没有官方的多 Agent 协作框架,需要自己写编排逻辑
- CodeAgent 和 ToolCallingAgent 的 API 有细微差异,容易混用
OpenAI Agents SDK
from agents import Agent, Runner, handoff
researcher = Agent(
name="Researcher",
instructions="搜索并收集 Python 异步框架性能数据",
tools=[web_search_tool],
)
analyst = Agent(
name="Analyst",
instructions="分析性能数据,生成对比结论",
)
writer = Agent(
name="Writer",
instructions="根据分析结果撰写研究报告",
)
reviewer = Agent(
name="Reviewer",
instructions="审核报告质量,不合格则返回修改意见",
handoff_description="如果报告不合格,转回 Writer 修改",
handoffs=[writer], # 可以手递手转给 Writer
)
# 使用 handoff 实现循环审核
workflow = Agent(
name="Coordinator",
handoffs=[researcher],
)
代码量:约 35 行
踩坑记录:
handoff机制是 OpenAI 独有的概念,学习成本不低- 只能在 OpenAI 模型上运行(这是设计选择,不是 bug)
- 错误处理需要自己加 try/except 包裹
Runner.run()
五、第三轮对比:生产可用性
“能跑 Hello World”和”能在生产环境跑”之间有一道巨大的鸿沟。
| 维度 | LangChain | Agno | CrewAI | Smolagents | OpenAI Agents |
|---|---|---|---|---|---|
| 模型无关性 | ★★★★★(支持 20+ 模型) | ★★★★☆(主流模型) | ★★★☆☆(主要 OpenAI) | ★★★★★(Hugging Face + OpenAI) | ★☆☆☆☆(仅 OpenAI) |
| 错误处理 | ★★★★☆ | ★★★☆☆ | ★★★☆☆ | ★★☆☆☆ | ★★★★☆ |
| 可观测性 | ★★★★★(LangSmith 集成) | ★★☆☆☆ | ★★★☆☆(CrewAI+) | ★★☆☆☆ | ★★★☆☆ |
| 部署复杂度 | 中(需要 LangServe) | 低 | 低 | 低 | 中 |
| 社区活跃度 | ★★★★★ | ★★★★☆ | ★★★★☆ | ★★★☆☆ | ★★★★☆ |
| 文档质量 | ★★★★☆ | ★★★☆☆ | ★★★☆☆ | ★★★★☆ | ★★★★★ |
| 生产案例 | 大量 | 中等 | 中等 | 少 | 中等 |
最关键的差异:可观测性
在生产环境中,“Agent 到底做了什么”比”Agent 做出来什么”更重要。
LangChain + LangSmith 在这方面是碾压级的优势。LangSmith 可以追踪:
- 每个 Agent 的完整执行轨迹
- 每一步的输入/输出 tokens
- 工具调用的时间和结果
- 成本分析(每个步骤花了多少钱)
- 用户反馈标注
其他框架要么没有官方可观测性方案,要么需要自己集成 LangSmith 或第三方工具。
Agno 和 CrewAI 的可观测性目前只能靠日志。Smolagents 有 Hugging Face Hub 的集成,但粒度不够细。OpenAI Agents SDK 可以对接 OpenAI 的 trace API,但只能看到 OpenAI 模型侧的信息。
六、第四轮对比:性能表现
在同一个测试任务上,记录从发起请求到最终输出的端到端时间和 API 调用次数。
| 框架 | 端到端时间 | API 调用次数 | Token 消耗 |
|---|---|---|---|
| LangChain | 45s | 18 | ~85,000 |
| Agno | 32s | 12 | ~55,000 |
| CrewAI | 52s | 22 | ~95,000 |
| Smolagents | 28s | 10 | ~45,000 |
| OpenAI Agents | 30s | 11 | ~50,000 |
关键发现:
- LangChain 最慢——不是因为模型推理慢,而是因为 StateGraph 的状态序列化/反序列化开销
- CrewAI 的 Token 消耗最高——“角色扮演”的 system prompt 很长,每个 Agent 的 backstory 都增加了大量 tokens
- Smolagents 最省——CodeAgent 的方式让模型直接生成可执行代码,减少了中间步骤的往返
这个性能差异在小规模任务中不明显,但当你有 100+ Agent 同时运行时,差距会被急剧放大。
七、API 设计哲学对比
这可能是最抽象但也最本质的差异。
LangChain:图编程范式
LangChain/LangGraph 认为 Agent 应该是一个有状态的计算图。你定义节点(做什么)、边(怎么流转)、条件(何时分叉),然后执行。
这种方式的优点是精确控制——你能决定 Agent 的每一步。缺点是你需要像做数据结构作业一样画图。
Agno:多 Agent 协作范式
Agno 认为 Agent 开发的核心是让多个 Agent 协作。你定义一堆 Agent,然后告诉它们怎么配合。
这种方式更符合人类的思维方式——“我需要研究员、分析师、作家、审稿人”。
CrewAI:角色扮演范式
CrewAI 和 Agno 很像,但更强调”角色”。每个 Agent 有明确的角色、目标、背景故事。
这种方式对非技术人员最友好——你给 AI 一个”角色设定”,它就知道该怎么表现。
Smolagents:代码即 Agent 范式
Smolagents 的 CodeAgent 让 LLM 直接生成可执行的 Python 代码。Agent 不是在”对话”,而是在”写代码执行任务”。
这种方式最高效,但也最不可控——LLM 生成的代码可能有你意想不到的行为。
OpenAI Agents SDK:手递手范式
OpenAI 的 handoff 机制让 Agent 之间像接力赛一样传递控制权。Agent A 做完后,“把手递给” Agent B。
这种方式最接近人类团队协作——“我做完了,该你了”。
八、2026 年 Python Agent 框架选型路线图
你的项目需要什么?
│
├─ 快速原型 / 演示
│ ├─ 用 Hugging Face 模型? → Smolagents
│ └─ 用 OpenAI 模型? → OpenAI Agents SDK
│
├─ 生产环境
│ ├─ 需要可观测性 / 成本追踪? → LangChain + LangSmith
│ ├─ 多 Agent 协作是核心需求? → Agno
│ └─ 团队成员不熟悉代码? → CrewAI
│
├─ 大规模部署(100+ Agent)
│ └─ → LangChain(最成熟)或 Agno(性能更好)
│
└─ 只需要单 Agent + 工具调用
└─ → 哪个都差不多,选你熟悉的
九、Agent 框架会经历 Web 框架的演进路径吗?
Python Web 框架走过这样一条路:
Django(大而全) → Flask(小而美) → FastAPI(现代 + 快速)
每个新框架都解决了前一个框架的痛点,但没有完全取代前一个。
Agent 框架正在经历类似的过程:
- LangChain = Django:功能最全,但也最重
- CrewAI = Flask:更简单,但功能有限
- Agno / Smolagents = FastAPI:新范式,正在崛起
历史告诉我们:没有”最好的框架”,只有”最适合你当前阶段的框架”。
如果你的团队刚开始用 Agent,从 Smolagents 或 OpenAI Agents SDK 开始,快速验证想法。
如果你需要生产级可观测性和稳定性,LangChain 仍然是最安全的选择。
如果你在做多 Agent 协作的产品,Agno 是目前最优雅的方案。
这就是 2026 年 5 月的答案。半年后,可能会有新的框架改变这个格局。但核心逻辑不会变:
框架的价值不在于它有多少功能,而在于它让你少写多少代码。
本文测试基于 2026 年 5 月最新版本:LangChain v0.3.20、LangGraph v0.3.5、Agno v2.0.0-preview、CrewAI v0.95、Smolagents v1.12、OpenAI Agents SDK v0.0.5。所有测试使用 OpenAI GPT-4o 模型,在同一台服务器(AWS t3.xlarge)上运行。