前几篇文章我们讲了LangGraph的三大核心概念State、Node、Edge还亲手写了第一个可运行的Graph。但如果你想做一个真正的对话Agent会发现缺了点什么——记忆。用户跟你聊了半天下次进来一问三不知这体验谁顶得住啊用户跟你聊了半天下次进来一问三不知这体验谁顶得住啊今天我们就从零开始构建一个带持久化记忆的对话Agent。写完这篇你就有了一个可以持续对话、记住历史的完整AI助手。01 | 为什么需要持久化记忆先想一个问题普通的对话系统记忆存在什么问题90% 的教程教你的写法是这样的// 把所有历史都存在内存里constmessagesBaseMessagefunctionchatmessage: stringpushnewHumanMessageconstawaitinvokepushreturn这种写法问题很大进程重启就丢了——服务器一重启所有聊天记录全没了多用户没法搞——多个用户聊天内存混在一起分不清楚内存泄漏——聊得越多数组越长内存爆炸无法回溯——想查看用户上周聊了什么根本找不到LangGraph 给我们提供了更好的方案内置持久化层 检查点Checkpoint机制。02 | LangGraph 的持久化原理LangGraph 的持久化核心概念其实很简单每一次Graph执行完一个步骤都会把当前整个State保存到一个BaseCheckpointSaver里。下次你接着对话的时候直接从这里把State恢复出来就行。用户对话 → 执行Node → 更新State → 保存Checkpoint ↓ 下次对话 → 恢复Checkpoint → 拿到完整State和历史 → 继续对话目前 LangGraph.js 提供了几种持久化实现实现使用场景持久化MemorySaver开发测试、单进程内存重启丢失FileSystemCheckpointSaver生产单实例、本地开发文件系统重启保留PostgresSaver生产多实例、分布式PostgreSQL真正生产级我们今天从最简单的MemorySaver开始然后逐步升级到文件持久化。03 | 第一步基础对话Agent不带记忆先搭个最基础的对话Agent骨架后面再加记忆importChatOpenAIfromlangchain/openaiimportHumanMessageSystemMessagefromlangchain/core/messagesimportStateGraphfromlangchain/langgraphimportENDfromlangchain/langgraph// 1. 定义State类型typeConversationStatemessagesHumanMessage// 2. 初始化模型constnewChatOpenAImodelNamegpt-4otemperature0.7// 3. 定义聊天NodeasyncfunctioncallModelstate: ConversationStateconstnewSystemMessage你是一个友好的AI助手记得用户跟你说过的话。constawaitinvokemessagesreturnmessagesmessages// 4. 构建GraphconstnewStateGraphConversationStatechannelsmessagesreducer(prev, next) // 添加节点addNodemodel// 添加边——模型调用完就结束addEdgemodelEND// 设置入口setEntryPointmodel// 5. 编译Graphconstcompile这就是最基础的版本了。但问题是每次调用都要你自己把所有历史消息拼进去而且重启就没了。接下来加记忆。04 | 第二步加入内存持久化LangGraph 提供了MemorySaver只需改两行代码就能加上持久化importMemorySaverfromlangchain/langgraph// ...前面的代码不变...// 1. 创建一个持久化保存器constnewMemorySaver// 2. 编译的时候传进去constcompilecheckpointer就这么简单对就这么简单现在怎么使用呢每次对话你需要传一个config里面带上thread_id——这就是用户的会话ID// 用户A第一次说话constconfigurablethread_iduser-a-123constawaitinvokemessagesnewHumanMessage你好我叫张小妹consolelogmessagesat1content// 你好张小妹很高兴认识你// 过了一会儿用户A继续说话constawaitinvokemessagesnewHumanMessage我叫什么来着// 使用同一个 thread_idconsolelogmessagesat1content// 你叫张小妹呀我刚记住呢重点就是同一个用户用同一个 thread_id。LangGraph 会自动从checkpoint里恢复所有历史消息你不用自己管。现在这个版本已经能记住对话了可惜还是存在内存里进程重启就丢了。下一步我们搞真正的持久化。05 | 第三步文件系统持久化重启不丢消息LangGraph.js 从 0.3 版本开始自带了FileSystemCheckpointSaver直接就能用importFileSystemCheckpointSaverfromlanggraph/platform/node// 替换掉 MemorySaverconstnewFileSystemCheckpointSaver// 保存checkpoint的目录baseDir./data/checkpoints// 编译Graph的时候用这个constcompilecheckpointer使用方式完全不变还是传thread_id就行constconfigurablethread_iduser-a-123constawaitinvokemessagesnewHumanMessage你好原理就是每个thread_id对应一个文件每次状态更新都会写入文件。只要硬盘不炸对话就一直存在。对于单实例服务来说这个方案完全够用了比搞个PostgreSQL简单多了。06 | 完整可运行代码把所有代码拼起来就是一个完整的带文件持久化的对话AgentimportChatOpenAIfromlangchain/openaiimportHumanMessageSystemMessageBaseMessagefromlangchain/core/messagesimportStateGraphENDfromlangchain/langgraphimportFileSystemCheckpointSaverfromlanggraph/platform/nodeimportasfromfs// 确保目录存在mkdirSync./data/checkpointsrecursivetrue// 1. 定义StatetypeConversationStatemessagesBaseMessage// 2. 初始化模型constnewChatOpenAImodelNamegpt-4otemperature0.7// 3. 聊天NodeasyncfunctioncallModelstate: ConversationStateconstnewSystemMessage你是一个友好的AI助手会记住用户说过的每一句话。回答要简洁自然。constawaitinvokemessagesreturnmessages// 4. 构建GraphconstnewStateGraphConversationStatechannelsmessages// reducer函数把新消息追加到历史后面reducer(prev: BaseMessage[], next: BaseMessage[]) addNodemodeladdEdgemodelENDsetEntryPointmodel// 5. 持久化 编译constnewFileSystemCheckpointSaverbaseDir./data/checkpointsconstcompile// 6. 使用示例asyncfunctionchatthreadId: string, message: stringconstconfigurablethread_idconstawaitinvokemessagesnewHumanMessagereturnmessagesat1contentasstring// 测试一下asyncfunctiontestconsolelogawaitchatuser-1你好我是Jamesconsolelogawaitchatuser-1你还记得我叫什么吗consolelogawaitchatuser-2你好我是张小妹consolelogawaitchatuser-2我叫什么testcatchconsoleerror你直接把这段代码存成index.ts装完依赖就能跑npm install langchain/langgraph langchain/openai langgraph/platform tsc index.ts node index.js07 | 生产级升级PostgreSQL 持久化如果你是多实例部署或者数据量很大那文件系统就不够用了。这时候可以用PostgresSaverimportPostgresSaverfromlangchain/langgraph/checkpoint/postgresimportPoolfrompg// 创建连接池constnewPoolconnectionStringenvDATABASE_URL// 创建持久化保存器constnewPostgresSavertableNamelanggraph_checkpoints// 可自定义表名// 初始化表结构第一次运行需要awaitinitialize// 编译Graphconstcompile使用方式还是一样的完全不用改业务代码。这就是LangGraph设计的精妙之处——持久化实现对业务代码透明切换实现只需要换一个checkpointer就行。08 | 常见坑点和解决方案我自己踩过几个坑给你提个醒坑1State 不能存不能序列化的东西Checkpoint会把整个State序列化存起来所以State里不能放函数、Promise、Buffer这些没法JSON序列化的东西。解决State只存纯数据逻辑放Node里。坑2reducer 函数一定要正确追加消息// 正确写法reducer(prev, next) // 错误写法直接覆盖历史消息丢了reducer(prev, next) 这个错我一开始也犯过结果就是每次只有最新一条消息记住不历史…坑3thread_id 一定要分对用户同一个用户必须用同一个thread_id不然就会拿到别人的对话。最佳实践thread_iduserId - conversationId这样同一个用户不同会话也分开。总结今天我们从零搭建了一个带持久化记忆的对话Agent从内存到文件系统再到PostgreSQL一步步升级。核心要点总结一下LangGraph 的持久化靠CheckpointSaver内置了三种实现只需要在compile()的时候传进去业务代码不用改thread_id区分不同会话同一个会话用同一个ID开发用MemorySaver单实例用FileSystemCheckpointSaver生产多实例用PostgresSaver代码都给你了直接拿去就能用。下一篇我们讲自定义工具开发做好了准备Agent就能调用你自己写的函数了。学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】