用「两个维度、一个注入点」框架讲透系统提示词、短期记忆、长期记忆与 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 / 向量库方案? 。
如果这篇帮你理清了概念,欢迎转发 给那个还在混淆这几个术语的同事------或者,转给下周要面试你的面试官也行😄