<!-- title: 断点即续命：五栈状态持久化深拆 -->

智能体跑飞了、进程崩了、上下文爆了——这些都不是最痛的。最痛的是**跑到第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） | 多后端 | ✅ | ✅ | ⚠️ | ⚠️ |

---

## 深度分析

### 1. LangGraph Checkpointer：唯一的"全状态机"派

LangGraph 是五栈里**唯一把整个图状态当一等公民持久化**的框架。它的 `checkpointer` 在每个超级步（super-step）后自动落盘——不是存"最后一条消息"，而是存"此刻所有 channel 的值 + 执行指针"。

```python
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 倍。

### 2. OpenAI Agents SDK：Session 只记消息，不记"走到哪"

OpenAI 的 Agents SDK 把持久化收敛在 `Session` 抽象上，名字很有迷惑性——它**只持久化消息历史**，让多轮对话能跨进程延续，但**不持久化执行指针**。官方原话：内置 session memory 用于"automatically maintain conversation history"。

```python
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 漂亮；但教不了"断点续跑"，宣传持久化时要对学员说清边界，否则交付时翻车。

### 3. AutoGen 0.4：手动快照，不是逐步检查点

AutoGen 0.4 重写后提供了 `save_state` / `load_state`，看似对称漂亮，实测是**一次性全量序列化为 JSON 文件**，没有逐步 checkpoint 的概念。

```python
# 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 的多智能体叙事仍然好卖，但"可恢复"这个卖点要谨慎，别在训练营承诺"崩溃自动续跑"。

### 4. CrewAI Flows：State 是"业务数据"，不是"恢复点"

CrewAI 的 Flows 引入了 `Flow[State]`，状态管理文档写得很丰满，但实测会发现——**它的 state 是节点间传数据的载体，不是执行恢复的锚点**。Flow 默认全在内存里跑完，崩了就崩了，没有 checkpointer 这一层。

```python
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 引擎。

### 5. Pydantic AI：官方亲口说"不是完整检查点"

Pydantic AI 主打类型安全，持久化是**公认的短板**。核心库没有内置 checkpoint，多轮靠你手动喂 `message_history`：

```python
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。

```mermaid
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
```

---

## 持久化的三个隐藏成本（实测踩坑）

光看能力表会漏掉工程现实。跑过生产的人都知道，"能存"和"存得起"是两回事：

1. **序列化税**。LangGraph 要求 state 全部可被 Protobuf 表达；遇到带文件句柄、数据库连接、lambda 的局部变量，checkpoint 直接失败。Pydantic AI 因为根本不存，反而没这个坑——这是"没有功能"带来的隐性收益。
2. **重放幂等性陷阱**。time-travel 听着爽，但回放时会**重新执行工具调用**。如果某步是"扣款""发邮件""写库"，重放就等于重复扣款。LangGraph 文档要求你自己在工具层做幂等 key，多数新手训练营根本不提，交付即事故。
3. **存储膨胀**。逐步 checkpoint 在长跑任务里会产生海量中间态，PostgresSaver 生产环境一周不清理就能把磁盘吃满。需要配 TTL/分区策略，这部分所有框架都甩给开发者。

---

## 推荐方案（按场景）

| 你的场景 | 推荐栈 | 理由 |
|---------|--------|------|
| 长流程、需审计回放、金融/合规 | **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 培训市场最大的技术泡沫之一。

---

## 参考来源

1. [Persistence — LangGraph Docs (LangChain)](https://docs.langchain.com/oss/python/langgraph/persistence) — 官方 Checkpointer / time-travel / fork 机制说明
2. [Sessions — OpenAI Agents SDK](https://openai.github.io/openai-agents-python/sessions/) — Session 内置记忆与 SQLiteSession/RedisSession 用法
3. [Managing State — AutoGen (Microsoft)](https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-guide/tutorial/state.html) — AutoGen 0.4 的 save_state/load_state 全量快照 API
4. [State Management and Persistence — CrewAI DeepWiki](https://deepwiki.com/crewAIInc/crewAI/3.3-state-management-and-persistence) — CrewAI Flows 的 state 性质与持久化边界
5. [step_persistence README — pydantic-ai-harness (GitHub)](https://github.com/pydantic-ai-harness/pydantic-ai-harness/blob/main/pydantic_ai_harness/experimental/step_persistence/README.md) — 官方明确"非完整图状态检查点"的实验特性

> [!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 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
