四维解析Agent记忆架构:从零实战LangGraph长期记忆

用「两个维度、一个注入点」框架讲透系统提示词、短期记忆、长期记忆与 AGENTS.md,附对照表和 LangGraph 实战代码。

一、痛点开场:你的 Agent 为什么「转头就忘」?

做 Agent 开发,大概率都知道

上一轮对话里,用户刚说完「我是小红书博主,语气活泼一点,多带 emoji」,Agent 乖巧照办。结果用户换了个会话重新进来,它瞬间打回「官方客服腔」,仿佛昨天的叮嘱从没发生过。

更崩溃的是长对话:聊到第 30 轮,它开始答非所问,你让它回忆开头提的需求,它一脸茫然------转头就忘,堪称数字版金鱼。

你想修,打开搜索引擎一搜,四个术语劈头盖脸砸过来:系统提示词、短期记忆、长期记忆、AGENTS.md。每个词都眼熟,真让你说清区别和协作关系,又只能含糊带过------尤其面试被问到「你的 Agent 记忆怎么设计的」,心虚感直接拉满😭

问题出在哪?这四个概念根本不在同一个维度上,混在一起看,永远理不清。

这篇文章借用 LangChain 官方文档里的一个框架------「两个维度、一个注入点」------把四者放进同一张坐标系,一次性讲透:各自是什么、存在哪、谁写入、怎么进入模型上下文。

读完你能带走两样东西:

  • • 一张可直接收藏的四概念对照速查表

  • • 一段 LangGraph 从零接入长期记忆的最小可运行代码

先从一句话定义开始,把四个概念逐个讲透。

二、四个概念,一句话各讲透

先立个判断标准:这四个概念里,三个是「运行时记忆」,一个是「文件」📌

系统提示词 = 运行时指令。

每次调用模型时放进 system message 的那段话,定义模型的行为与能力。LangChain 文档的原话是:"The system prompt sets the LLM's behavior and capabilities"。它默认静态,但也可通过 middleware 动态生成------这一点后面至关重要。

短期记忆 = 线程内的对话历史。

作用域是单个 thread(会话),最典型形式就是对话消息历史。在 LangGraph 里它表现为 agent 的 state,靠 checkpointer 持久化到数据库:图每步完成时更新、每步开始时读取,天然支持中断恢复。开场那个「聊 30 轮就失忆」的坑,病根就在这------上下文窗口有限,长对话必须主动「遗忘」(裁剪 / 摘要 / 过滤),否则就会 context loss,响应变慢、成本上升。

长期记忆 = 跨会话的持久数据。

作用域是自定义 namespace 而非 thread ID,基于 LangGraph store 以 namespace + key 存 JSON 文档,跨 thread、跨 session 随时可召回------「用户是小红书博主」这类偏好,就该存这里。

AGENTS.md = 文件形态的程序性记忆。

注意,它不是运行时记忆,而是 Git 版本化的 agent 打包配置。LangChain 的 Context Hub 文档定义得很清楚:agent 仓库打包其配置,常见文件就是「AGENTS.md for system prompt and operating instructions」------本质是「系统提示词 + 操作指令」的文件载体。

最后补一个记忆分类学:长期记忆还会细分为语义记忆 (用户事实,如 profile)、情景记忆 (过往经历,常做成 few-shot 示例)、程序性记忆(规则与指令)三类------而 AGENTS.md,正是程序性记忆的文件化形态。这个归类记住了,后面的对照表就顺了。

三、核心框架:一张对照表 + 两个维度、一个注入点

四个概念逐个讲完,是时候把它们放进同一张坐标系了。LangChain 的 context engineering 文档里藏着一个特别好用的框架:两个维度、一个注入点。先上对照表,建议直接收藏👇

概念 可变性 生命周期 存储位置 谁写入 如何进入上下文
系统提示词 静态(可动态生成) 每次调用 代码 / 动态生成 开发者 system message(直接)
短期记忆 动态 单次会话(thread) checkpointer(state) 运行时自动追加 消息历史(直接)
长期记忆 动态 跨会话 store(namespace/key) 应用逻辑 / 后台任务 检索后经系统提示词注入(间接)
AGENTS.md 静态 跨会话 / 跨版本 Git 文件 开发者(或 AI 辅助维护) 加载后并入系统提示词

维度一 · 可变性:系统提示词和 AGENTS.md 是静态的------开发者说了算;短期、长期记忆是动态的------运行时自己长出来。

维度二 · 生命周期:系统提示词活不过一次调用,短期记忆活不过一个 thread;长期记忆和 AGENTS.md 则跨会话、跨版本存活。

一个注入点 ------这是全篇最关键的认知:模型实际看到的一切指令,最终都经由 system message 进入上下文。这是四者唯一的交汇口。

由此推出一个被 90% 的人搞错的事实:长期记忆不会自动出现在上下文里 。标准做法是在 middleware 中从 runtime.store 读出用户偏好,再拼进动态系统提示词。文档原话:

"Successful agents draw on memories, preferences, and configuration to provide the right instructions."

整条协作链路串起来就是:

开发者写 AGENTS.md / 系统提示词 → 运行时 state 追加消息 → 应用逻辑或后台任务写 store → middleware 汇总注入 system message

四、实战:LangGraph 从零接入长期记忆

理论讲完,动手。场景:给公众号写作 Agent 加上「记住用户写作风格偏好」的跨稿件记忆------用户说一次「语气活泼、多带 emoji」,换稿件、换会话都生效。

第一步 · 建 store

引入 LangGraph store,数据按 namespace + key 组织成 JSON 文档,namespace 用 user_id:

复制代码
await store.put(["user_42"], "preferences", {
  style: "活泼",
  platform: "小红书",
});

第二步 · 写入策略二选一

热路径(响应前同步写入)实时但拖慢响应;后台异步任务不阻塞主链路,但当轮对话用不上刚写的记忆。风格偏好更新频率低、容忍延迟,建议直接选后台异步。

第三步 · middleware 注入(最关键一环)

长期记忆不会自动进上下文,要用 dynamicSystemPromptMiddleware 从 runtime.store 检索,再动态拼进系统提示词:

复制代码
const injectMemory = dynamicSystemPromptMiddleware(async (state, runtime) => {
  const prefs = await runtime.store.get([userId], "preferences");
  return baseSystemPrompt + (prefs ? `\n用户偏好:${JSON.stringify(prefs.value)}` : "");
});

这正是官方那句「Successful agents draw on memories, preferences, and configuration」的落地写法。

五、趋势观点:AGENTS.md 为什么突然火了?

最近逛 GitHub 不难发现一个现象:从 Claude Code 到各家 agent 框架,仓库根目录里越来越多地躺着一个 AGENTS.md。它不是 README,不是注释,而是写给 agent 看的「上岗手册」。

为什么突然火了?本质是提示词的身份正在升级------从「代码里的字符串」,变成「可评审、可版本化、可分发、可多 agent 复用的工程资产」📦

两种形态对比,差距一目了然:

  • • 硬编码在代码里:改一句指令要翻源码、走发布;想知道上周谁动了哪句话?基本无从追溯

  • • Git 管理的 AGENTS.md:Code Review、diff 追踪、回滚、跨 agent 复用,软件工程的全套基建直接白捡

更激进的玩法也在发生:LangChain 的 Reflection / meta-prompting 支持 agent 基于反馈自我改写程序性记忆------改写对象正是这类文件。换句话说,「AI 维护 AI 的规则」不是科幻,是文档里现成的能力。

落到行动上,建议很朴素:

  • • 新项目:一开始就把系统提示词抽到文件层管理,尽早吃版本化红利

  • • 老项目 :至少做到模块化拼装(比如 assembleSystemPrompt 那种按职责拆函数),给将来文件化留好接口

六、结尾:速查卡 + 互动引导

最后,把全文浓缩成两句话,背下来就够用:

  • • 系统提示词是指令的「运行时形态」,AGENTS.md 是它的「文件化形态」------同属程序性记忆,一个写给运行时,一个交给 Git 管。

  • • 短期记忆是单次对话的工作记忆,长期记忆是跨对话的持久数据------一个活在 thread 里,一个活在 store 里。

再浓缩一层:前两者是「每次都要给的规则」,后两者是「运行时积累、需要被检索注入的信息」📌

速查卡来了,截图收藏这一张就够👇

概念 一句话 存哪 谁写入 进上下文方式
系统提示词 运行时指令 代码 开发者 system message 直达
短期记忆 对话历史 checkpointer 运行时 消息历史直达
长期记忆 跨会话数据 store 应用 / 后台 middleware 注入
AGENTS.md 规则文件 Git 开发者 并入系统提示词

下次面试再被问「Agent 记忆怎么设计」,把这张表默出来,补一句「两个维度、一个注入点」,基本就稳了😎

最后想听听你的实战情况👇

你的项目用上长期记忆了吗?走的是 LangGraph store,还是自建的 Redis / 向量库方案? 。

如果这篇帮你理清了概念,欢迎转发 给那个还在混淆这几个术语的同事------或者,转给下周要面试你的面试官也行😄

相关推荐
碧海银沙音频科技研究院1 小时前
炬芯ATS308X的扩音器:麦克风到扬声器直通功能实现
java·linux·运维
Rain的Java大神之路1 小时前
被问麻了!Function Calling、MCP、Skill 到底啥关系?一张图讲透三层架构,附 Java 生产落地全流程+30个坑
java·后端·ai编程
Wang's Blog1 小时前
Java 项目部署之 Docker工具快速入门: Docker Compose 初识与安装
java·开发语言·docker
ss2731 小时前
PG实战笔记 | 04 PostgreSQL市场地位与实际案例
数据库·postgresql
niucloud-admin1 小时前
JAVA V6 多商户商城 开发文档——项目启动
java·开发语言·python
学逆向的1 小时前
C 控制台指令
c语言·开发语言·网络安全
沫璃染墨1 小时前
从零入门数据结构与算法(一):复杂度分析——从算法效率到时间与空间复杂度
c语言·开发语言·数据结构·笔记·算法·飞书
众链网络1 小时前
Agent 重试的工程解法:幂等、断点续跑与熔断怎么落地
java·前端·数据库·人工智能
贾宝玉的玉宝贾2 小时前
FreeSWITCH 简单图形化界面 70 - 监听/密语的lua脚本
开发语言·junit·lua·voip·freeswitch·sip·ippbx