《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 可以拥有连续的上下文。

相关推荐
锋行天下1 小时前
LangGraph 同级节点之间修改数据先后问题
人工智能
u1301301 小时前
AI 日报(2026年9月12日)
人工智能
东风破_1 小时前
《LangGraph Human-in-the-loop:Interrupt 如何让 Agent 等待人工确认》
人工智能
2601_962218611 小时前
万象生鲜系统业财一体化底层打通技术自动生成经营账单
大数据·数据库·人工智能·python·算法
智塑未来1 小时前
中文短剧出海翻译工具横评:VMEG AI、鬼手、Vozo AI、ElevenLabs怎么选?
人工智能
东风破_1 小时前
《LangGraph 条件路由与循环:如何让 Agent 自己决定下一步?》
人工智能
我爱吃土豆11 小时前
AI 编程工具远程开发指南:Codex 桌面版与 WorkBuddy 通过 SSH 连接云服务器实践
服务器·人工智能·ssh
袁俪2 小时前
推理成本门槛
人工智能
2601_962304252 小时前
怎么用AI绘画零基础制作专属插画头像?
人工智能·ai作画