系列文章目录【 LangChain v1.2 入门系列教程】【一】开篇入门 | 从零开始跑通你的第一个 AI Agent【 LangChain v1.2 入门系列教程】【二】消息类型与提示词工程【 LangChain v1.2 入门系列教程】【三】工具Tools开发让 Agent 连接外部世界【 LangChain v1.2 入门系列教程】【四】结构化输出让 Agent 返回可预测的结构【 LangChain v1.2 入门系列教程】【五】记忆管理让 Agent 记住对话【 LangChain v1.2 入门系列教程】【六】流式输出 让 Agent 告别“想好了再说”【 LangChain v1.2 入门系列教程】【七】中间件——给 Agent 装上外挂文章目录系列文章目录前言一、langchain v1.2版本重构记忆机制二、记忆类型分类短期 vs 长期三、Checkpoint 检查点机制四、快速上手让 Agent 记住你的名字五、thread_id实现多用户会话隔离的核心六、记忆的读取、更新与重置完全掌控对话记忆1.手动读取记忆查看完整历史对话方法1通过checkpointer方法2通过agent2.手动更新记忆修改或删除对话历史七、生产级方案使用 PostgreSQL 持久化记忆1.安装PostgreSQL 以window为例1官网下载2安装3添加环境变量4验证安装是否成功5登录数据库6创建数据库2.安装依赖3.代码实现总结前言在前几篇文章中我们学会了如何构建基础的 Agent给 Agent 绑定工具实现复杂能力。但你可能已经发现每次与 Agent 对话它都像是“失忆”了一样完全不记得你上一句说了什么。这篇教程我们就从 0 到 1带你彻底搞懂 LangChain v1.2 的记忆管理看完就能写出能记住对话、支持多用户隔离、可直接生产落地的 Agent。一、langchain v1.2版本重构记忆机制在 v1.2 版本中LangChain 对记忆机制进行了重大革新下放了 LangGraph框架 Checkpointer 的状态管理机制。将对话历史直接作为 Agent 状态State的一部分通过检查点Checkpoint自动持久化。这彻底告别了旧版冗余的 Memory 类设计更加统一和强大使用上也更加简单方便。简单理解Agent 的状态包括对话历史现在是一个“自动保存的游戏进度”随时可以存档和读档。二、记忆类型分类短期 vs 长期在 LangChain 的体系中记忆分为两大核心类型短期记忆也叫会话级记忆作用范围是 ** 单个对话线程Thread** 内对应我们常说的单场对话的聊天记录。比如你和 AI 的一个聊天窗口从开启到结束的所有交互都属于短期记忆的管理范围。长期记忆跨会话、跨线程的持久化记忆比如记住“用户张三喜欢素食”无论开启多少次新对话Agent 都知道通常会结合向量数据库、外部存储实现。三、Checkpoint 检查点机制Checkpointer是记忆的 “存储硬盘”负责把 Agent 的每一步运行状态包括对话历史、自定义字段持久化保存。它会在 Agent 每一次调用、每一步工具执行完成后自动保存状态快照在 Agent 每次执行前自动读取最新状态并恢复记忆。LangChain 提供了多种开箱即用的 Checkpointer 实现测试环境用InMemorySaver内存级对应短期记忆生产环境用PostgresSaver数据库级对应长期记忆等。四、快速上手让 Agent 记住你的名字接下来让我们用一个简单示例演示下短期记忆的实现fromlanggraph.checkpoint.memoryimportInMemorySaver# 初始化内存级记忆引擎checkpointerInMemorySaver()agentcreate_agent(modelllm,checkpointercheckpointer#绑定记忆引擎开启记忆能力)#配置会话指定thread_id标识唯一对话config{configurable:{thread_id:1}}# 第一轮告诉名字response1agent.invoke({messages:[HumanMessage(你好我叫小明)]},configconfig)print(f第一轮回答{response1[messages][-1].content})## 第二轮询问名字response2agent.invoke({messages:[HumanMessage(我叫什么名字)]},configconfig)print(f第二轮回答{response2[messages][-1].content})运行这段代码你会发现第二轮对话中AI 完美记住了你第一轮输入的名字一个带记忆的 Agent 就这么简单实现了说明InMemorySaver将对话状态保存在 Python 内存中进程重启后数据丢失也称作短期记忆适合开发和测试环境。thread_id会话的唯一标识符相同 thread_id 的调用会共享同一份对话历史。不同用户必须使用不同的 thread_id否则会出现串台现象必须给invoke方法传入带thread_id的 config否则 Agent 无法找到对应的记忆所有对话历史都会自动存在 AgentState 的messages字段中无需手动维护五、thread_id实现多用户会话隔离的核心在上面示例代码中config 里的 thread_id 是记忆管理的核心。它就像聊天软件的“会话窗口ID”。不同 thread_id会话完全隔离。用户 A 和用户 B 的对话互不干扰。相同 thread_idAgent 会加载该 ID 下的所有历史状态实现连续对话。我们用代码演示两个不同用户使用不同的 thread_id对话记忆完全互不影响# 初始化内存级记忆引擎checkpointerInMemorySaver()agentcreate_agent(modelllm,checkpointercheckpointer#绑定记忆引擎开启记忆能力)#小明的会话idconfig_xiaoming{configurable:{thread_id:1}}#小红的会话idconfig_xiaohone{configurable:{thread_id:2}}# 小明的对话print(—————— 以下是小明对话 ——————)agent.invoke({messages:[HumanMessage(你好我叫小明我的工号是10001)]},configconfig_xiaoming)response1agent.invoke({messages:[HumanMessage(我的工号是多少)]},configconfig_xiaoming)print(f小明的AI回复{response1[messages][-1].content})# 小明的对话print(—————— 以下是小红对话 ——————)agent.invoke({messages:[HumanMessage(你好我叫小红我的工号是20002)]},configconfig_xiaohone)response2agent.invoke({messages:[HumanMessage(我的工号是多少)]},configconfig_xiaohone)print(f小红的AI回复{response2[messages][-1].content})# 验证会话隔离小红的会话里无法获取小明的信息print(—————— 验证会话隔离 ——————)response3agent.invoke({messages:[HumanMessage(你知道小明的工号是多少吗)]},configconfig_xiaohone)print(f验证会话隔离回复{response3[messages][-1].content})运行后你会发现小明和小红的会话记忆完全独立AI 在小红的会话中完全无法获取小明的信息完美实现了多用户的记忆隔离。ps:在生产环境中建议使用「用户 ID 会话 ID」作为 thread_id确保每个用户的每个对话都有全局唯一标识从根本上避免记忆串扰。六、记忆的读取、更新与重置完全掌控对话记忆除了自动的记忆读写我们还可以手动对记忆进行操作满足各类业务场景的定制化需求。1.手动读取记忆查看完整历史对话方法1通过checkpointer# 初始化内存级记忆引擎checkpointerInMemorySaver()agentcreate_agent(modelllm,checkpointercheckpointer#绑定记忆引擎开启记忆能力)#配置会话指定thread_id标识唯一对话config{configurable:{thread_id:1}}#第一轮对话agent.invoke({messages:[HumanMessage(你好我叫小明)]},configconfig)#第二轮对话responseagent.invoke({messages:[HumanMessage(我叫什么名字)]},configconfig)checkpointer_tuplecheckpointer.get_tuple(configconfig)if(checkpointer_tuple):#获取对话历史messagescheckpointer_tuple.checkpoint[channel_values][messages]print(messages,messages)方法2通过agent# 初始化内存级记忆引擎checkpointerInMemorySaver()agentcreate_agent(modelllm,checkpointercheckpointer)# 绑定记忆引擎开启记忆能力# 配置会话指定thread_id标识唯一对话config{configurable:{thread_id:1,},}agent.invoke({messages:[HumanMessage(你好我叫小明)]},configconfig)agent.invoke({messages:[HumanMessage(我叫什么名字)]},configconfig)#读取当前状态stateagent.get_state(config)#获取对话历史messagesstate.values[messages]print(messages,messages)2.手动更新记忆修改或删除对话历史插入消息checkpointerInMemorySaver()agentcreate_agent(modelllm,checkpointercheckpointer)# 绑定记忆引擎开启记忆能力# 配置会话指定thread_id标识唯一对话config{configurable:{thread_id:1,},}agent.invoke({messages:[HumanMessage(你好我叫小明)]},configconfig)agent.invoke({messages:[HumanMessage(我叫什么名字)]},configconfig)agent.update_state(config,{messages:[AIMessage(content[系统备注] 这是一条插入的系统消息)]}#末尾插入)删除某条消息fromlangchain.messagesimportRemoveMessage agent.update_state(config,{messages:[RemoveMessage(id019d5dfa5e1668c0b673312e2761a7d),# 通过message id]})清空所有消息fromlangchain.messagesimportRemoveMessagefromlanggraph.graph.messageimportREMOVE_ALL_MESSAGES agent.update_state(config,{messages:[RemoveMessage(idREMOVE_ALL_MESSAGES),# 清空所有]})清空后追加消息agent.update_state(config,{messages:[RemoveMessage(idREMOVE_ALL_MESSAGES),# 清空所有HumanMessage(新内容)# 追加到末尾]})修改某条消息new_messages[]#重建消息列表formsginmessages:if(msg.content你好我叫小明):#替换新消息new_msgtype(msg)(content这是替换后的消息,idmsg.id)new_messages.append(new_msg)else:new_messages.append(msg)agent.update_state(config,{messages:[RemoveMessage(idREMOVE_ALL_MESSAGES),#清除所有*new_messages#更新]})psupdate_state 的 messages 字段不是赋值覆盖而是 reducer 累加处理 —— 必须用 REMOVE_ALL_MESSAGES 清空后再按目标顺序展开完整列表才能实现原地修改效果七、生产级方案使用 PostgreSQL 持久化记忆上面我们用的InMemorySaver是内存级存储程序重启后记忆会全部丢失仅适用于测试和本地开发。生产环境中我们需要使用数据库实现记忆的持久化存储。LangChain 官方推荐的生产级方案是PostgresSaver基于 PostgreSQL 数据库实现支持高并发、数据持久化、分布式部署是生产环境的首选1.安装PostgreSQL 以window为例1官网下载https://www.postgresql.org/2安装pgAdmin4(图形化管理工具)按需勾选其他全选一直“next“后安装最后点击finish完成3添加环境变量打开“系统属性“-“环境变量“在系统变量“Path“”新增环境变量安装目录\18\bin4验证安装是否成功打开终端Windows 用 CMD 或 PowerShell输入psql--version如图显示出版本号证明安装成功5登录数据库在终端输入psql-Upostgres输入密码如下图所示连接成功6创建数据库在 postgres# 提示符下输入CREATE DATABASE mydb;将 mydb 替换为你想要的数据库名称查看数据库列表\l发现mydb已在数据库列表中数据库安装和创建工作完成。2.安装依赖pipenvinstallpsycopg[binary]langgraph-checkpoint-postgres3.代码实现from langgraph.checkpoint.postgresimportPostgresSaver llmChatOpenAI(modelQwen/Qwen3-8B,base_urlhttps://api.siliconflow.cn/v1,api_keyAPI_KEY,)DB_URIpostgresql://用户名:密码数据库地址:端口/数据库名#例如postgresql://postgres:123456localhost:5432/mydbwith PostgresSaver.from_conn_string(DB_URI)as checkpointer:# 首次运行时自动创建必要的表checkpointer.setup()config{configurable:{thread_id:1}}# 创建agentagentcreate_agent(modelllm,system_prompt你是一个智能助手请根据用户提问作答,checkpointercheckpointer,)agent.invoke({messages:[HumanMessage(你好我叫小明)]},configconfig)agent.invoke({messages:[HumanMessage(我叫什么名字)]},configconfig)运行这段代码后所有的对话记忆都会持久化到 PostgreSQL 数据库中。哪怕你重启程序、关闭服务器只要重新连接同一个数据库使用同一个thread_id就能完全恢复之前的对话记忆实现跨会话、跨进程的记忆续传。ps:对于生产环境建议在数据库层面设置数据保留策略定期清理旧会话数据既保护隐私又节省存储成本总结LangChain v1.2 将记忆管理统一到 LangGraph 的 Checkpointer 机制中对话历史成为 Agent 状态的一部分彻底告别了旧版繁琐的 Memory 类设计。通过 InMemorySaver 可快速实现短期记忆会话级而 thread_id 则是多用户隔离的核心钥匙——不同 ID 实现完全独立的对话空间。更进一步开发者可以手动读取、更新甚至重置记忆满足各种定制化需求。生产环境中切换到 PostgresSaver 即可获得持久化、高可用的长期记忆能力。掌握这套记忆体系你就能轻松构建出真正“有记性”、可落地的智能 Agent。下一篇我们将继续探讨“流式输出”功能。