我加了 `InMemorySaver`,为什么 Agent 还是没记忆?
Agent 能调工具之后我开始做一件看起来很基础但很容易踩坑的事让 Agent 记住上下文。我按照文档加了checkpointerInMemorySaver()满心期待 Agent 能像 ChatGPT 一样记得上一句。结果第二次运行脚本它又问这是我们的第一次对话吗我一度怀疑InMemorySaver是个假的记忆组件。后来才搞明白不是没记忆是我的用法让它没法记忆。一、我当时想干什么我想实现最简单的多轮对话第一轮我问旧金山天气怎么样第二轮我问那明天呢Agent 应该能理解明天指的是旧金山明天的天气我写的代码fromlangchain.agentsimportcreate_agentfromlangchain_core.toolsimporttoolfromlangchain_core.utils.uuidimportuuid7fromlangchain_openaiimportChatOpenAIfromlanggraph.checkpoint.memoryimportInMemorySavertooldefsearch(query:str)-str:搜索工具returnf搜索结果{query}llmChatOpenAI(modeldeepseek-chat,temperature0,openai_api_key你的 api key,openai_api_basehttps://api.deepseek.com/v1,)agentcreate_agent(modelllm,tools[search],checkpointerInMemorySaver(),)config{configurable:{thread_id:str(uuid7())}}resultagent.invoke({messages:[{role:user,content:旧金山天气怎么样}]},configconfig,)resultagent.invoke({messages:[{role:user,content:那明天呢}]},configconfig,)在这个脚本里记忆是工作的。但当我再次运行脚本问上一轮我问了什么Agent 说这是我们的第一次对话。二、我写的代码要让记忆跨脚本运行保持必须保证thread_id不变并且使用持久化存储。测试时最简单的办法是固定thread_id# 不要每次都用新的 uuidconfig{configurable:{thread_id:user-chenzc-001}}或者把thread_id存到文件里importos THREAD_ID_FILEthread_id.txtdefget_thread_id():ifos.path.exists(THREAD_ID_FILE):withopen(THREAD_ID_FILE,r)asf:returnf.read().strip()new_iduser-chenzc-001withopen(THREAD_ID_FILE,w)asf:f.write(new_id)returnnew_id config{configurable:{thread_id:get_thread_id()}}真正生产环境应该用 SQLite 或 Postgresfromlanggraph.checkpoint.sqliteimportSqliteSaverwithSqliteSaver.from_conn_string(checkpoints.sqlite)ascheckpointer:agentcreate_agent(modelllm,tools[search],checkpointercheckpointer,)三、我遇到的坑坑 1InMemorySaver只存当前进程我以为InMemorySaver像 Redis 一样会持久化。实际上它就是内存里的一个字典脚本结束就清空。fromlanggraph.checkpoint.memoryimportInMemorySaver checkpointerInMemorySaver()# 这个对象在进程里存数据# 进程结束数据消失如果你要跨运行保持记忆必须换成SqliteSaver或PostgresSaver。坑 2uuid7()每次运行都变我的代码里config{configurable:{thread_id:str(uuid7())}}每次运行脚本uuid7()都会生成一个新的thread_id。LangGraph 把每个新thread_id当成一次全新对话自然没有历史。这就好比你每次打开微信都用一个新微信号当然看不到昨天的聊天记录。坑 3流式输出也忘了传config我改成stream_events后又踩了一次同样的坑streamagent.stream_events({messages:[{role:user,content:搜索 AI 新闻并总结}]},versionv3,)报错KeyError: thread_id因为 Agent 配置了checkpointer所以stream_events也必须传configstreamagent.stream_events({messages:[{role:user,content:搜索 AI 新闻并总结}]},configconfig,versionv3,)坑 4一次脚本运行只算一轮对话我最初的测试方式是运行脚本 → 输入一个问题 → 得到回答 → 脚本退出 → 再次运行脚本。这种方式下即使thread_id固定、用了持久化 checkpointer第二轮运行时 Agent 看到的历史也只有第一轮那一条消息。因为脚本一次运行只发了一次invoke。要测试真正的多轮对话应该把输入放在while循环里config{configurable:{thread_id:user-chenzc-001}}whileTrue:user_inputinput(你)ifuser_input.lower()in[exit,quit]:breakresultagent.invoke({messages:[{role:user,content:user_input}]},configconfig,)print(result[messages][-1].content)四、搞清楚后的结论LangChain Agent 的记忆机制有三个层级每次 invoke 独立同一进程内多轮跨进程持久化无 checkpointer无记忆InMemorySaver 固定 thread_id进程内记忆SqliteSaver/PostgresSaver 固定 thread_id长期记忆关键认知checkpointer 负责存thread_id负责定位是哪次对话InMemorySaver只保当前进程重启就丢uuid7()适合一次会话内的临时 ID跨运行要用固定 ID 或持久化生成invoke和stream_events都需要config五、我的收获记忆不是默认开启的它需要你显式地告诉系统这是谁的对话、存在哪里。我以前以为加了checkpointer就万事大吉结果发现它只是基础设施。真正让记忆生效的是thread_id的一致性和存储介质的持久性。这件事也让我意识到 LangChain 的设计哲学它把每个能力都拆成显式配置而不是隐式魔法。记忆如此工具如此Agent 也如此。下一篇我会写 Middleware——怎么给 Agent 加容错、人工审核和文件操作能力。

相关新闻

工程经营管理软件怎么选型,统筹营收成本回款规避项目经营亏损

工程经营管理软件怎么选型,统筹营收成本回款规避项目经营亏损

当前建筑行业竞争白热化,行业整体利润空间持续压缩,不少工程企业同时运营多个在建项目,依靠财务、商务各自独立Excel台账核算营收、成本、应收款项,单个项目盈亏核算滞后、隐性成本失控、应收账款催收乏力等问题层出不穷&#xff…

2026/7/7 18:00:20 阅读更多 →
2026短视频矩阵服务商揭秘:这些核心优势你不可错过

2026短视频矩阵服务商揭秘:这些核心优势你不可错过

在短视频流量红利持续释放的当下,越来越多的企业开始寻求专业的短视频矩阵服务商来破解获客难题。然而,市面上服务商水平参差不齐,选择一个可靠、高效的合作伙伴,往往能直接影响企业线上业务的成败。本文将不从营销角度出发&#…

2026/7/7 18:00:20 阅读更多 →
GetQzonehistory:三步完成QQ空间历史数据永久备份的终极指南

GetQzonehistory:三步完成QQ空间历史数据永久备份的终极指南

GetQzonehistory:三步完成QQ空间历史数据永久备份的终极指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字时代,我们的青春记忆和珍贵时光往往散落在各种…

2026/7/7 17:58:19 阅读更多 →

最新新闻

AD5593R与PIC32MZ的混合信号系统设计与实践

AD5593R与PIC32MZ的混合信号系统设计与实践

1. AD5593R与PIC32MZ1024EFK144的硬件协同设计AD5593R这颗芯片最吸引人的地方在于它的多功能引脚配置——8个I/O引脚可以独立配置为12位DAC输出、12位ADC输入、数字输出或数字输入。我在实际项目中经常用它来替代传统的独立ADC和DAC芯片组合,特别是在空间受限的嵌入…

2026/7/7 19:10:38 阅读更多 →
力扣1008:前序重建BST

力扣1008:前序重建BST

力扣 1008 题解析与 C 代码 一、问题解析题目描述:给定一个整数数组 preorder,表示二叉搜索树(BST)的前序遍历结果,请重建该二叉搜索树并返回其根节点。题目保证对于给定的测试用例,总能找到一棵二叉搜索树…

2026/7/7 19:06:38 阅读更多 →
Donau集群环境变量配置指南:SLURM_*变量到Donau的完美转换

Donau集群环境变量配置指南:SLURM_*变量到Donau的完美转换

Donau集群环境变量配置指南:SLURM_*变量到Donau的完美转换 【免费下载链接】donau-slurm-wrappers donau-slurm-wrappers provide some scripts for Slurm Users to submit and manage jobs in Donau cluster environment 项目地址: https://gitcode.com/openeule…

2026/7/7 19:06:37 阅读更多 →
OpenSSL漏洞修复与版本升级:保障系统安全的关键步骤

OpenSSL漏洞修复与版本升级:保障系统安全的关键步骤

OpenSSL漏洞修复与版本升级:保障系统安全的关键步骤 【免费下载链接】openssl 项目地址: https://gitcode.com/openeuler/openssl 前往项目官网免费下载:https://ar.openeuler.org/ar/ OpenSSL作为开源的加密库,广泛应用于各种系统和…

2026/7/7 19:06:37 阅读更多 →
终极鸣潮游戏模组指南:解锁无限游戏体验的完整教程

终极鸣潮游戏模组指南:解锁无限游戏体验的完整教程

终极鸣潮游戏模组指南:解锁无限游戏体验的完整教程 【免费下载链接】wuwa-mod Wuthering Waves pak mods 项目地址: https://gitcode.com/GitHub_Trending/wu/wuwa-mod 还在为《鸣潮》游戏中的技能冷却、体力限制和繁琐操作而烦恼吗?WuWa-Mod作为…

2026/7/7 19:06:37 阅读更多 →
物联网Node-Red开发教程-第2章工作界面与流程基础

物联网Node-Red开发教程-第2章工作界面与流程基础

第2章 工作界面与流程基础 学习目标 熟悉 Node-RED 编辑器的四大区域布局 独立完成第一个 Hello World 流程 深入理解消息对象 msg 的结构和属性 掌握节点端口与连线的规则 学会流程的导入导出和日常管理操作 2.1 编辑器布局 Node-RED 的编辑器是一个基于 Web 的界面,打开 ht…

2026/7/7 19:04:37 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻