智能体跑飞了、进程崩了、上下文爆了——这些都不是最痛的。最痛的是跑到第40步崩了,得从第0步重来。2026年主流Agent框架几乎都宣称"有持久化能力",但把文档翻到底、把代码跑穿之后会发现一个被刻意模糊的事实:"持久化消息"和"持久化执行状态"是两件事。前者只是把聊天记录存进数据库,重启后能接着聊;后者是把你停在"图的第3个节点、第2个工具调用的中间态"原样恢复,甚至能倒回第2步改个参数再往下跑(time-travel)。本期把 LangGraph、OpenAI Agents SDK、AutoGen、CrewAI Flows、Pydantic AI 五栈的持久化层拉出来,按"崩溃恢复""断点续跑""时间旅行""分支回放"四个硬指标逐一拆穿。
在实测之前,先把行业话术对齐。一份 Agent 的"运行态"实际由三层构成,绝大多数框架只存了最浅的一层:
| 层次 | 内容 | 举例 |
|---|---|---|
| L1 消息流 | 对话历史、工具调用记录 | "用户说了X,agent调了工具Y" |
| L2 执行指针 | 当前停在第几个节点/第几步 | "跑到 node_3,下一步进 node_4" |
| L3 环境态 | 局部变量、工具中间产物、子进程句柄 | "已下载3/5个文件,临时句柄还活着" |
只有同时持久化 L1+L2(理想加上 L3)的,才是真正的"执行检查点(execution checkpoint)"。只存 L1 的,充其量叫"对话记忆"。下面五栈的差异,根源全在这里。
| 框架 | 持久化层级 | 存储后端 | 崩溃恢复 | 断点续跑 | 时间旅行 | 分支回放 |
|---|---|---|---|---|---|---|
| LangGraph | L1+L2(全图) | Memory/SQLite/Postgres/Redis | ✅ | ✅ | ✅ | ✅ |
| OpenAI Agents SDK | L1(仅消息) | InMemory/SQLite/Redis | ⚠️半 | ✅ | ❌ | ❌ |
| AutoGen 0.4 | L1+部分L2(手动快照) | JSON文件 | ⚠️半 | ✅ | ⚠️手搓 | ❌ |
| CrewAI Flows | 业务State(非执行态) | 内存/手动 | ❌ | ❌ | ❌ | ❌ |
| Pydantic AI | 无内置(手动message_history) | 自理 | ❌ | ⚠️ | ❌ | ❌ |
| MS Agent Framework(新晋) | L1+L2(durable workflow) | 多后端 | ✅ | ✅ | ⚠️ | ⚠️ |
LangGraph 是五栈里唯一把整个图状态当一等公民持久化的框架。它的 checkpointer 在每个超级步(super-step)后自动落盘——不是存"最后一条消息",而是存"此刻所有 channel 的值 + 执行指针"。
from langgraph.checkpoint.postgres.aio import AsyncPostgresSaver
from langgraph.graph import StateGraph
graph = builder.compile(checkpointer=AsyncPostgresSaver.from_conn_string(DB_URI))
# 时间旅行:列出某 thread 的全部历史检查点
history = [s async for s in graph.aget_state_history(
{"configurable": {"thread_id": "user_42"}})]
# 倒回第5个检查点,改个输入再往下跑(fork)
await graph.ainvoke({"rewrite": True}, config=history[5].config)
aget_state_history 返回的是带时间戳的状态链,任何一步都能 invoke(None, config) 原地重放,或 update_state 后 fork 出新分支。这是 time-travel 和 human-in-the-loop 能落地的根基。缺点:状态必须可 JSON 序列化(Protobuf 表达),大 state 会拖慢每步落盘;生产部署需要自己管 Postgres 的 WAL 和分区,没有自动清理过期 checkpoint 的内置策略。变现评估:这是目前最适合做"可回放、可审计 Agent"训练营的栈,金融风控、合规审计场景是天然买单方,客单价能拉到普通 Agent 课的 2-3 倍。
OpenAI 的 Agents SDK 把持久化收敛在 Session 抽象上,名字很有迷惑性——它只持久化消息历史,让多轮对话能跨进程延续,但不持久化执行指针。官方原话:内置 session memory 用于"automatically maintain conversation history"。
from agents import Agent, Runner
from agents.memory.sqlite import SQLiteSession
session = SQLiteSession("conv.db")
# 进程崩了重启,对话历史还在,但"上次跑到哪一步"没了
await Runner.run(agent, "继续刚才那个分析", session=session)
SQLiteSession / RedisSession(社区 openai-agents-redis)解决的是 L1 层。它没有 time-travel API,没有 fork——因为根本没有"步"的概念可回溯。对纯对话型 Agent 这足够,但对多步工具编排,一旦中间某步崩了,重跑会重复调用付费工具(地图API、数据库写入),既烧钱又可能破坏幂等性。变现评估:适合做"客服/陪伴类 Agent"的快速落地课,门槛低、demo 漂亮;但教不了"断点续跑",宣传持久化时要对学员说清边界,否则交付时翻车。
AutoGen 0.4 重写后提供了 save_state / load_state,看似对称漂亮,实测是一次性全量序列化为 JSON 文件,没有逐步 checkpoint 的概念。
# 0.4 的 Team/Agent 状态 API
await team.save_state("./team_state.json") # 全量快照
await team.load_state("./team_state.json") # 全量恢复
它存的是当前对话 + agent 内部状态的截面,没有历史步链,所以 time-travel 要靠你自己手搓"每次 save 存成带版本号的文件"。社区已有 issue(#6466)在追"跨会话持久化",微软自己的迁移指南也承认:Agent Framework 的 Workflow 相比 AutoGen 的 Team 抽象,优势之一就是"built-in support for checkpointing"。等于官方承认 AutoGen 这块是短板。缺点:load 是 all-or-nothing,没有事务保证;对 GroupChat 的 manager agent 状态序列化容易丢自定义字段。变现评估:AutoGen 的多智能体叙事仍然好卖,但"可恢复"这个卖点要谨慎,别在训练营承诺"崩溃自动续跑"。
CrewAI 的 Flows 引入了 Flow[State],状态管理文档写得很丰满,但实测会发现——它的 state 是节点间传数据的载体,不是执行恢复的锚点。Flow 默认全在内存里跑完,崩了就崩了,没有 checkpointer 这一层。
from crewai.flow.flow import Flow, start, listen
class S(BaseModel):
draft: str = ""
class MyFlow(Flow[S]):
@start()
def gen(self): self.state.draft = "..." # 内存态,不自动落盘
@listen(gen)
def refine(self): ...
社区资料里 "persistence" 多指把 final output 存数据库、或用外部 memory(如 mem0)补记忆,没有"恢复到 Flow 某个节点"的原生能力。要续跑得自己把 state 序列化、自己写"从哪个 listener 重入"的逻辑。缺点:长 Flow(10+ 节点)一旦中途失败,整条链白跑,且 CrewAI 对失败的重试粒度是 task 级而非 step 级。变现评估:CrewAI 的角色化多智能体 demo 极其讨喜,适合"营销/内容生产"类产品化训练营;但它的工程短板在"长时间、可恢复"任务上,定位时要说清楚——它适合短任务编排,不适合当 durable workflow 引擎。
Pydantic AI 主打类型安全,持久化是公认的短板。核心库没有内置 checkpoint,多轮靠你手动喂 message_history:
result = await agent.run("继续", message_history=past_messages)
# 框架不帮你存 past_messages,你得自己接 DB
最有意思的是 pydantic-ai-harness 里那个实验性 step_persistence,README 自己白纸黑字写着:"It is not a full graph-state checkpoint"——这是五栈里唯一在文档里主动认怂的,反而显得诚实。它只能存"能力态 + 工作区快照",执行指针和环境态恢复有限。社区方案(如接 Vectorize 的持久记忆)基本是"5 行代码外挂"打补丁。变现评估:Pydantic AI 的强项在结构化输出和依赖注入,做"需要强 schema 校验"的 Agent(表单抽取、API 编排)是第一梯队;但"持久化"不该作为它的卖点,授课时把它定位成"无状态、靠外部记忆层补齐"更负责任。
下面这张图把五栈放进同一个坐标:横轴是持久化深度(L1→L3),纵轴是恢复能力。能站到右上角的只有 LangGraph 和新晋的 MS Agent Framework。
flowchart TB
subgraph L3["L3 环境态 — 工具中间产物/句柄"]
L3a["(几乎无框架原生支持)"]
end
subgraph L2["L2 执行指针 — 停在第几节点"]
LG2["LangGraph ✅"]
AF2["MS Agent Framework ✅"]
AG2["AutoGen ⚠️手动"]
end
subgraph L1["L1 消息流 — 对话/调用历史"]
OA1["OpenAI Agents SDK ✅"]
OA1b["AutoGen ✅"]
PY1["Pydantic AI ✅手动"]
CR1["CrewAI ✅输出"]
end
L3 --> L2 --> L1
subgraph CAP["恢复能力(越右越强)"]
direction LR
C0[仅对话续聊] --> C1[崩溃恢复] --> C2[断点续跑] --> C3[时间旅行] --> C4[分支回放]
end
LG2 -.->|四项全有| C4
AF2 -.->|durable workflow| C3
OA1 -.->|仅 C0/C2| C2
CR1 -.->|C0| C0
PY1 -.->|靠外挂| C0
光看能力表会漏掉工程现实。跑过生产的人都知道,"能存"和"存得起"是两回事:
| 你的场景 | 推荐栈 | 理由 |
|---|---|---|
| 长流程、需审计回放、金融/合规 | LangGraph + PostgresSaver | 唯一全状态机,time-travel 是刚需 |
| 纯对话/客服类 Agent | OpenAI Agents SDK + SQLiteSession | L1 够用,上手最快,别假装能续跑编排 |
| 多智能体研究/原型 | AutoGen 0.4 | save_state 够做实验,生产慎用 |
| 短任务编排/营销内容流水线 | CrewAI Flows | demo 漂亮,但定位成无状态编排器 |
| 强 schema 输出/API 编排 | Pydantic AI | 类型安全第一,记忆层用 mem0/Vectorize 外挂 |
| 微软生态/企业级 durable | MS Agent Framework | AutoGen 正统继承者,内置可恢复 workflow |
一句话收口:选持久化栈,先问自己"崩了要不要从断点续",而不是"要不要存历史"。前者决定你能不能上生产,后者只是锦上添花。把消息持久化当执行持久化卖,是当下 Agent 培训市场最大的技术泡沫之一。
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
