langgraph教程系列-08-让agent记住过去-长期记忆
本文是「LangGraph 教程系列」第 8 篇。写作时基于 langgraph 1.2.10、langchain 1.3.14、langchain-openai 1.4.1、Python 3.12。配套代码仓库 https://github.com/wxj006007/deep-research-assistant 本篇对应 tagv2.2。上一版的研究助手已经会停下来等人审批。审批后恢复得很好只要还是同一个thread_id它就记得这轮检索查过什么、现在该去哪一个节点。但用户换一条新会话呢比如昨天研究过 checkpoint今天继续问 Store又比如他每次都希望中文回答、先给结论再列步骤。checkpoint 不应承担这些跨会话信息——它记录的是某一次执行不是用户档案。这一篇把“记住过去”拆清楚短期记忆仍归 checkpointer长期记忆交给 Store。一、三种东西不要都叫 memory“记忆”在 agent 系统里很容易被说成一个模糊概念。这里至少有三层层次存放内容生命周期本例实现当前 state当前节点需要的 question、docs、round一次图运行ResearchState短期记忆可暂停、恢复、回放的执行快照一个thread_idMemorySaver长期记忆用户偏好、历史研究摘要跨多个 threadInMemoryStore前两层跟着图的执行走第三层以用户为边界独立于某次执行。把它们混在一起常见后果是新会话读不到信息或者所有旧资料不断塞进 statecheckpoint 越来越大。二、v2.2 的记忆分层用户thread_idMemorySaver短期记忆InMemoryStore长期记忆用户偏好历史研究摘要一个用户可以有多条 thread每条 thread 的 checkpoint 相互隔离但它们都可以读取同一个用户 namespace 下的长期 Store。反过来另一个用户即便问了同样的问题也不应读取到前者的资料。三、Store 的最小模型namespace、key 和 value这一篇故意不引入 embedding 或向量库。我们先用可复现的 namespace/key 模型讲清数据归属(users, user_id, profile) - preferences (users, user_id, research) - summaries第一条记录保存稳定的用户偏好第二条记录保存一个摘要列表。它们的 value 都是普通字典store.put((users,alice,profile),preferences,{topics:[LangGraph],style:先给结论再给简洁步骤,language:中文,},indexFalse,)indexFalse明确表示本例不建向量索引、不做语义检索。以后需要从大量历史资料中按自然语言召回时再讨论search()、embedding 和索引策略现在的重点是把跨会话存取边界设计正确。四、把用户身份放进运行时上下文用户身份不是问题本身也不该作为每个节点都写入的 state 字段。LangGraph 的Runtime适合承载这类运行时信息fromdataclassesimportdataclassdataclass(frozenTrue)classResearchContext:user_id:strresearch_id:str编译图时同时传入 checkpointer 与 storegraphbuilder.compile(checkpointerMemorySaver(),storeInMemoryStore(),)节点通过runtime.context知道当前用户通过runtime.store读写长期记忆defload_memory_node(_:MemoryResearchState,runtime:Runtime[ResearchContext])-dict:profileruntime.store.get(profile_namespace(runtime.context.user_id),preferences)summariesruntime.store.get(research_namespace(runtime.context.user_id),summaries)return{memory_context:{preferences:profile.valueifprofileelse{},summaries:summaries.value.get(items,[])ifsummarieselse[],}}memory_context只是这次执行读取到的记忆副本放入 state 供 planner 和 writer 使用真正长期保存的数据仍在 Store 中。这样 checkpoint 保存的是“本轮曾读取了什么上下文”Store 保存的是“下次还能取到什么档案”。五、图结构先读后写v2.2 保留第7篇的人在回路。新增两个节点开始时load_memory成稿后persist_memory。通过拒绝继续完成START读取长期记忆规划查询人工审核搜索取消评估成稿保存研究摘要END读取节点在plan前因此查询规划可以根据用户的语言、风格和已有研究避免重复。保存节点只在成功成稿后执行用户在审批阶段拒绝任务时不应凭空新增一条“研究完成”记忆。六、保存摘要时为什么要有research_id图可能因重试、进程恢复或调用方重复提交而再次执行。若每次都 append一项研究会在长期记忆里留下多份重复摘要。因此 v2.2 的上下文里还有research_id。persist_memory_node写入前会删除同 id 的旧项再保存新项并把历史限制在最近 5 条items[itemforiteminitemsifitem.get(research_id)!research_id]items.append({research_id:research_id,question:state[question],summary:state.get(answer,)[:500],})store.put(namespace,summaries,{items:items[-5:]},indexFalse)这不是分布式事务的完整方案但已经给出一个重要的工程习惯外部写入要有稳定业务 id并且能安全重试。七、跨会话演示先为 Alice 保存偏好再在 thread A 中完成研究context_aResearchContext(user_idalice,research_idcheckpoint-basics)thread_a{configurable:{thread_id:alice-thread-a}}firstgraph.invoke({question:checkpoint 和长期记忆有什么区别},configthread_a,contextcontext_a,)之后 Alice 在一个全新的 thread B 提问context_bResearchContext(user_idalice,research_idmemory-followup)thread_b{configurable:{thread_id:alice-thread-b}}secondgraph.invoke({question:那 Store 应该保存哪些数据},configthread_b,contextcontext_b,)assertsecond[memory_context][preferences][language]中文assertany(item[research_id]checkpoint-basicsforiteminsecond[memory_context][summaries])这里两个thread_id不同所以 checkpoint 不共享但user_id一样所以load_memory读到了同一份长期记忆。把user_id换成 Bob读取结果就是空字典和空摘要列表这才是正确的租户隔离。八、实践边界记忆越多不一定越好长期记忆通常保存的是用户数据因此比普通 state 更需要边界。最小化只保存对后续任务有用的信息本例保存摘要而非全文 docs。显式写入用户偏好应由设置操作或明确同意写入不要从一次回答里偷偷推断永久标签。可删除以用户 namespace 为边界提供清除偏好、清除研究档案的能力。限制容量本例只保留 5 条摘要生产环境还应有 TTL、归档和监控。隔离与授权namespace 必须以可信的用户 id 构造不能直接相信客户端任意传来的 id。InMemoryStore适合教学、调试和单进程 Demo进程重启后数据会消失。真正上线时再替换为持久化 Store读取和写入节点的接口不需要跟着业务代码一起重写。九、跑起来代码在src/v2_2_memory.pypython-msrc.v2_2_memory脚本会验证四件事Alice 的 thread B 能读取 thread A 留下的偏好和摘要同一research_id重试只保留一条摘要Bob 读取不到 Alice 的 Store 数据checkpoint 仍按thread_id隔离Store 则按user_id隔离。十、本篇小结第7篇的 checkpoint 解决的是“这次执行如何暂停和恢复”第8篇的 Store 解决的是“下一次会话还记得什么”。v2.2 在开始时按用户读取偏好和历史摘要在结束时用research_id幂等地保存新的摘要。最关键的区分是thread 管短期执行Store 管长期数据。把这条边界守住记忆才不会变成无限膨胀、难以删除、跨用户泄露的一团 state。有了暂停、恢复和跨会话记忆研究助手的能力已经不只是一口气跑完任务。下一篇我们让它把执行过程以流的形式交给用户什么时候该展示 token什么时候该展示事件什么时候该展示状态更新。

相关新闻

从零部署技术向盲盒应用:全流程指南与API集成实践

从零部署技术向盲盒应用:全流程指南与API集成实践

这次我们来看一个名为“进来开盲盒!”的项目。从标题来看,这很可能是一个结合了趣味性与技术实现的应用,其核心玩法是模拟线上“开盲盒”的体验。在技术层面,这类项目通常会涉及前端交互、后端逻辑处理、以及可能的数据随机化算法…

2026/8/4 2:08:30 阅读更多 →
15(S)-HETE-biotin标记技术原理与实验操作指南

15(S)-HETE-biotin标记技术原理与实验操作指南

1. 项目概述15(S)-HETE-biotin是一种重要的生物素标记化合物(CAS号:1217461-45-4),在生命科学研究领域具有广泛应用价值。这种化合物通过将生物素分子与15(S)-羟基二十碳四烯酸[15(S)-HETE]共价连接而成,主要用于蛋白质…

2026/8/4 2:08:30 阅读更多 →
89-Prompt自动优化-DSPy框架-元Prompt-APE算法

89-Prompt自动优化-DSPy框架-元Prompt-APE算法

文章目录【89.PythonAI】Prompt自动优化:让AI帮你写Prompt,比你自己写的好10倍导入语1 ~> 人肉调参的天花板1.1 手工优化为什么低效1.2 自动优化的统一范式2 ~> 路线一:元Prompt——五分钟上手的轻量方案2.1 什么是元Prompt2.2 迭代循环…

2026/8/4 2:08:30 阅读更多 →

最新新闻

全息MIMO系统信道建模与Matlab实现

全息MIMO系统信道建模与Matlab实现

1. 项目概述多用户全息MIMO表面(Holographic MIMO Surface)是近年来无线通信领域的前沿研究方向,它通过将大量天线单元密集排列在二维平面上,形成近乎连续的电磁波调控表面。这种技术突破了传统MIMO系统的天线数量限制&#xff0c…

2026/8/4 2:37:53 阅读更多 →
Unity UGUI粒子特效实战:ParticleEffectForUGUI插件原理与优化指南

Unity UGUI粒子特效实战:ParticleEffectForUGUI插件原理与优化指南

1. 项目概述:为什么UI粒子效果是提升游戏质感的利器?在Unity项目里摸爬滚打这么多年,我见过太多游戏,玩法不错,但UI界面总感觉“差一口气”。这种“差一口气”的感觉,很多时候就出在缺乏动态反馈和视觉层次…

2026/8/4 2:37:53 阅读更多 →
Spring Boot+Vue+MySQL构建保险合同管理系统全栈实践

Spring Boot+Vue+MySQL构建保险合同管理系统全栈实践

1. 项目概述:可盈保险合同管理系统的技术架构与价值这个基于Spring BootVueMySQL的保险合同管理系统,是我在金融科技领域实施过最典型的全栈项目之一。系统采用前后端分离架构,后端基于Spring Boot 2.7实现业务逻辑和RESTful API,…

2026/8/4 2:37:53 阅读更多 →
华为 VRP 交换机运维知识点

华为 VRP 交换机运维知识点

一、接口基础与运维查询命令1. Interface 接口概念1.1 区分 Interface / PortPort:物理硬件端口,设备面板可见光口 / 电口;Interface:软件层面统一接口对象,包含物理接口 逻辑虚拟接口,日常运维二者口语混…

2026/8/4 2:37:53 阅读更多 →
基于Deepseek与FusionApp的轻量级影视CMS开发实践

基于Deepseek与FusionApp的轻量级影视CMS开发实践

1. 项目概述:基于Deepseek与FusionApp的轻量级影视CMS开发这个项目本质上是一个利用Deepseek AI能力与FusionApp框架快速搭建的影视内容管理系统(CMS)。作为从业十余年的全栈开发者,我实测发现这种组合能在3天内完成传统团队2周的…

2026/8/4 2:37:53 阅读更多 →
Unity资源逆向实战:AssetStudio核心原理与Lua脚本反编译全解析

Unity资源逆向实战:AssetStudio核心原理与Lua脚本反编译全解析

1. 项目概述:为什么我们需要一个完整的Unity资源逆向方案?在游戏开发、安全研究、内容创作乃至独立游戏学习的过程中,我们常常会遇到一个共同的难题:如何从一款已经打包发布的Unity游戏或应用中,提取出我们需要的资源&…

2026/8/4 2:36:52 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →