2026 年 AI Agent 框架选型:LangGraph、Mastra、PydanticAI 对比与 LangGraph 最小实现

框架横向对比(2026)

框架语言适合场景
LangGraphPython生产环境、多 Agent、长流程
MastraTypeScriptNext.js 全栈项目
PydanticAIPythonFastAPI、结构化输出
CrewAIPython多角色协作 Agent
AutoGenPython研究方向、自动代码执行
OpenAI Agents SDKPython轻量 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   →  定时任务