框架横向对比(2026)
| 框架 | 语言 | 适合场景 |
|---|---|---|
| LangGraph | Python | 生产环境、多 Agent、长流程 |
| Mastra | TypeScript | Next.js 全栈项目 |
| PydanticAI | Python | FastAPI、结构化输出 |
| CrewAI | Python | 多角色协作 Agent |
| AutoGen | Python | 研究方向、自动代码执行 |
| OpenAI Agents SDK | Python | 轻量 Tool Calling、OpenAI 为主 |
综合推荐排名:LangGraph > OpenAI Agents SDK > Mastra > PydanticAI > CrewAI > AutoGen
LangGraph:生产首选
LangGraph 基于状态机(StateGraph),天然支持:
- 循环图(Think → Act → Observe → Think)
- Checkpoint 持久化
- Multi-Agent(Supervisor / Swarm)
- Human-in-the-Loop(Interrupt + Resume)
- 与 Playwright/Browser Use 集成
大量生产环境已从 LangChain Agent 迁移至 LangGraph。
LangGraph 最小实现
pip install langgraph langchain-openai langchain-core
tools.py:
from langchain_core.tools import tool
import subprocess
@tool
def search(query: str) -> str:
"""搜索信息"""
return f"搜索结果: {query}"
@tool
def shell(command: str) -> str:
"""执行命令"""
try:
return subprocess.check_output(command, shell=True, text=True, timeout=5)[:5000]
except Exception as e:
return str(e)
app.py:
from typing import TypedDict
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, ToolMessage
from tools import search, shell
llm = ChatOpenAI(model="gpt-4o")
tools = [search, shell]
llm_with_tools = llm.bind_tools(tools)
class AgentState(TypedDict):
messages: list
def agent_node(state):
response = llm_with_tools.invoke(state["messages"])
return {"messages": state["messages"] + [response]}
def tool_node(state):
last = state["messages"][-1]
tool_messages = []
for call in last.tool_calls:
result = search.invoke(call["args"]) if call["name"] == "search" else shell.invoke(call["args"])
tool_messages.append(ToolMessage(content=str(result), tool_call_id=call["id"]))
return {"messages": state["messages"] + tool_messages}
def should_continue(state):
last = state["messages"][-1]
return "tool" if hasattr(last, "tool_calls") and last.tool_calls else END
graph = StateGraph(AgentState)
graph.add_node("agent", agent_node)
graph.add_node("tool", tool_node)
graph.set_entry_point("agent")
graph.add_conditional_edges("agent", should_continue, {"tool": "tool", END: END})
graph.add_edge("tool", "agent")
app = graph.compile()
运行:
result = app.invoke({"messages": [HumanMessage(content="列出当前目录")]})
print(result["messages"][-1].content)
Agent Memory 分级架构
高 Token 消耗的核心问题是全量注入记忆。推荐分三级:
L1 工作记忆 → 最近 10~20 条消息,直接进 Prompt
L2 任务记忆 → 当前项目/任务相关,按需读取
L3 长期记忆 → 用户偏好、历史经验,向量检索 TopK
Memory Router 方案
不让 Memory 全量注入,而是先路由:
def memory_router(state):
query = state["query"]
if "合约" in query:
return {"memory_keys": ["web3"]}
if "SpringBoot" in query:
return {"memory_keys": ["coding", "project"]}
return {"memory_keys": []}
再根据 memory_keys 去向量库检索 Top-K 相关记忆注入 Prompt。
推荐存储方案
Redis → L1 短期记忆(最近消息、任务状态)
pgvector → L2/L3 长期记忆(向量检索)
Qdrant → 替代 pgvector(独立向量库)
这样单次请求上下文通常能从 50k+ Token 压到 3k~10k Token,且效果往往更好(减少无关记忆干扰)。
OpenClaw 与 LangGraph 的关系
OpenClaw 是一个 Agent Runtime(Agent 操作系统),包含 Gateway(消息入口)、Skills(工具插件)、Memory、Workspace。LangGraph 提供了其中 Agent Loop + Persistence + Multi-Agent 的核心能力,但不负责 Gateway 和 Tool 生态。
用 LangGraph 可以实现 OpenClaw 绝大部分核心功能,真正耗工程量的是:权限系统、Tool 生态、Browser 自动化和可观测性系统。
最小技术栈(个人项目)
Next.js / SpringBoot → 前后端
LangGraph → Agent 编排
Redis → 短期记忆
Postgres + pgvector → 长期记忆
Playwright → 浏览器操作
Quartz / @Scheduled → 定时任务