《LangGraph Memory:为什么 Agent 需要 Checkpointer?》

前三篇我们已经解决了:

  • LangGraph 为什么需要 Graph
  • State 如何在 Node 之间流转
  • Conditional Edge 如何控制动态流程

但是还有一个问题:

一次 Graph 执行结束之后,State 去哪里了?

这就是 LangGraph 的 Memory。


1. Agent 为什么需要记忆?

先看普通函数:

javascript 复制代码
function chat(input) {
  return "你好";
}

每次调用:

复制代码
第一次:
用户:我叫小明

第二次:
用户:我叫什么?

函数本身不知道第一次发生了什么。

因为两次调用之间没有共享数据。


但是聊天 Agent:

复制代码
用户:
我叫小明

Agent:
好的,我记住了


用户:
我叫什么?

Agent:
你叫小明

说明 Agent 必须保存一些信息:

复制代码
历史消息
用户信息
任务状态
工具结果

这些数据就是 State。


2. 最简单的方案:自己维护对象

很多人第一反应:

ini 复制代码
const memory = {};

例如:

arduino 复制代码
const sessions = {
  "user1": {
    name: "小明"
  }
};

看起来没问题。

实际上这就是一个简单的 Memory。

但是随着 Agent 复杂,会出现问题。


问题一:多用户隔离

如果只有一个用户:

ini 复制代码
let state = {};

没有问题。

但是:

css 复制代码
用户A:
我的名字是小明


用户B:
我的名字是小红

需要:

css 复制代码
用户A

State A


用户B

State B

而不是:

复制代码
所有用户

共享一个 State

所以需要一个唯一标识:

复制代码
thread_id

表示:

这一份 State 属于哪个会话。


3. thread_id 是什么?

thread 可以理解成:

一条独立的对话线程。

例如:

vbnet 复制代码
thread_id: "xiaoming-chat"

对应:

css 复制代码
{
  messages:[
    "我叫小明"
  ]
}

另一个:

vbnet 复制代码
thread_id:"xiaohong-chat"

对应:

css 复制代码
{
  messages:[
    "我叫小红"
  ]
}

两个会话互不影响。


4. LangGraph 如何保存 State?

LangGraph 提供:

Checkpointer

它负责保存 Graph 执行过程中的 State。

结构:

复制代码
thread_id

    ↓

State

类似:

css 复制代码
{
  "user-a": {
    messages:[]
  },

  "user-b": {
    messages:[]
  }
}

5. MemorySaver 是什么?

LangGraph 提供了一个简单实现:

ini 复制代码
const checkpointer = new MemorySaver();

MemorySaver:

就是:

存储在内存中的 Checkpointer。

例如:

css 复制代码
MemorySaver

{
  "xiaoming": {
     visitCount:3
  },

  "xiaohong": {
     visitCount:5
  }
}

注意:

MemorySaver 只是开发学习阶段使用。

因为它存在:

复制代码
服务关闭

↓

数据消失

生产环境通常会使用:

  • Redis
  • PostgreSQL
  • MongoDB

等持久化存储。


6. Checkpointer 如何参与 Graph?

之前:

ini 复制代码
const app = graph.compile();

表示:

创建一个普通可执行 Graph。

加入:

ini 复制代码
const app = graph.compile({
  checkpointer
});

表示:

这个 Graph 执行时,需要保存状态。


执行时:

arduino 复制代码
const config = {
  configurable:{
    thread_id:"user-1"
  }
};


await app.invoke(
  {},
  config
);

这里:

复制代码
thread_id

告诉 LangGraph:

使用 user-1 这份状态。


7. 一个访问次数 Demo

State:

javascript 复制代码
const StateAnnotation = Annotation.Root({

  visitCount: Annotation({
    reducer:(prev,next)=>next,
    default:()=>0
  })

});

节点:

javascript 复制代码
function recordVisit(state){

  return {
    visitCount:state.visitCount + 1
  };

}

流程:

sql 复制代码
START

 ↓

recordVisit

 ↓

END

第一次:

css 复制代码
await app.invoke(
 {},
 {
  configurable:{
    thread_id:"xiaoming"
  }
 }
);

执行:

复制代码
0

↓

1

保存:

makefile 复制代码
xiaoming

visitCount:1

第二次:

还是:

vbnet 复制代码
thread_id:"xiaoming"

LangGraph 会找到之前状态:

makefile 复制代码
visitCount:1

继续执行:

复制代码
1

↓

2

8. Memory 和 State 的关系

这里容易混淆:

State:

当前 Graph 执行中的数据。

Memory:

保存这些 State 的机制。

关系:

复制代码
Graph运行

↓

产生State

↓

Checkpointer保存

↓

下一次恢复State

9. LangGraph Memory 的完整模型

最终:

markdown 复制代码
              thread_id

                  ↓

            Checkpointer

                  ↓

                State

                  ↓

        Node → Edge → Node

总结

LangGraph 的 Memory 本质上解决的是:

如何让一次 Graph 执行结束后的 State,在下一次执行时继续存在。

核心概念:

概念 作用
State 保存 Agent 当前数据
thread_id 区分不同会话
Checkpointer 保存和恢复 State
MemorySaver 内存版 Checkpointer

一句话:

Checkpointer 是 LangGraph 的状态保存机制,通过 thread_id 管理不同会话的 State,让 Agent 可以拥有连续的上下文。

相关推荐
枫叶丹43 小时前
从一次推理请求出发:模型、显存、网络与服务系统如何共同决定性能
网络·人工智能·chatgpt·开源·agent·codex
YangYang9YangYan3 小时前
2027 秋招|应用统计学专业投递快消市场部,岗位 JD 拆解与统计能力落地
人工智能·数据分析
lie..3 小时前
30天从零开始学AI应用开发(Day 17):ChromaDB 上手:给本地文档建一个“外挂大脑”
数据库·人工智能·oracle
deepdata_cn3 小时前
Seedance 2.5如何敲开工厂车间的门
人工智能
一水鉴天3 小时前
差-余-残三词体系:术语定稿与设计方案 20261004(豆包)
人工智能
杭州领祺科技3 小时前
27 号令横向隔离落地清单:储能边缘计算网关 ≠ 电力专用网闸,算电协同中心安全分区/纵向加密/SPDnet 怎么配
人工智能·安全·网络安全·边缘计算·储能·电力·电力监控
狂奔蜗牛(bradley)3 小时前
把 EtherCAT 初始化从 FPGA 搬到 ARM:命令通道的接口设计与11个坑
arm开发·人工智能·fpga开发·架构
龍德明宇3 小时前
无摩擦的智能与有重力的主体-龍德明宇
人工智能·深度学习·ai哲学·负主体性·ai存在论
W***25923 小时前
2026深度解读:Work Agent长程任务的执行机制与落地形态
人工智能
正经教主4 小时前
【FDE系列】阶段3:Day 73:RAGAS 评测 — 用数据证明改动有效
人工智能·rag·fde