目录
[一、先把问题说清楚:Agent 为什么需要 Memory](#一、先把问题说清楚:Agent 为什么需要 Memory)
[二、很多人一上来就做错了:Memory 不是把对话存进向量库](#二、很多人一上来就做错了:Memory 不是把对话存进向量库)
[1. 该记的没记,不该记的记了一堆](#1. 该记的没记,不该记的记了一堆)
[2. 检索相似,不等于检索有用](#2. 检索相似,不等于检索有用)
[3. 错误会被反复继承](#3. 错误会被反复继承)
[三、Agent Memory 至少要分层,不要混成一锅](#三、Agent Memory 至少要分层,不要混成一锅)
[1. Working Memory:工作记忆](#1. Working Memory:工作记忆)
[2. Episodic Memory:情节记忆](#2. Episodic Memory:情节记忆)
[3. Semantic Memory:语义记忆](#3. Semantic Memory:语义记忆)
[六、Memory 最大的敌人,不是遗忘,而是污染](#六、Memory 最大的敌人,不是遗忘,而是污染)
[1. 过期信息](#1. 过期信息)
[2. 错误归纳](#2. 错误归纳)
[3. 低质量总结](#3. 低质量总结)
[4. 工具返回脏数据](#4. 工具返回脏数据)
[七、落到工程上,Memory 更像状态系统,不像知识库插件](#七、落到工程上,Memory 更像状态系统,不像知识库插件)
[1. State Store](#1. State Store)
[2. Long-term Store](#2. Long-term Store)
[3. Memory Manager](#3. Memory Manager)
[4. Retrieval Layer](#4. Retrieval Layer)
[5. Observability](#5. Observability)
[八、一个实用判断:什么时候真的需要复杂 Memory](#八、一个实用判断:什么时候真的需要复杂 Memory)
背景
这两年,大家聊 Agent,常常会把注意力放在规划、工具调用、反思这些能力上。好像只要模型会拆任务、会用工具、会自己纠错,一个"聪明的 Agent"就差不多成型了。
但真做过系统的人很快会发现,问题往往不出在"它不会想",而出在"它记不住"。
用户前面说过什么,它忘了;刚刚调用工具得到的结果,它没接上;上一次执行失败的原因,它没有沉淀;一个多轮任务跑到第六步时,它已经把最初目标弄丢了。最后你会发现,很多 Agent 看起来像是"推理不够强",本质上其实是 memory 设计太差。
所以,Agent Memory 这个话题值得单独拿出来讲。因为它不是一个边角能力,而是 Agent 从 demo 走向可用系统时,最容易被低估、也最容易踩坑的一层。
一、先把问题说清楚:Agent 为什么需要 Memory
普通聊天模型的工作方式,本质上是"看到一段上下文,生成一个结果"。它并不天然拥有持续状态。你这轮给它什么,它就基于这轮来算;下一轮要是你没把关键信息再带上,它就像什么都没发生过。

但 Agent 不一样。Agent 的任务通常不是"一问一答",而是持续执行:
- 帮用户订一张机票,同时比较价格、时间和退改规则
- 分析一批日志,定位异常原因,再给出修复建议
- 调研一个主题,搜集资料、归纳观点、形成报告
- 调用多个工具,把一个目标拆成多个步骤去完成
这类任务天然有连续性。也就是说,Agent 需要记住三类东西:
第一类,是用户相关的信息 。比如偏好、历史约束、常用配置。
第二类,是任务过程中的状态 。比如当前做到哪一步、前一步工具调用返回了什么、哪个分支失败过。
第三类,是可复用的经验。比如下次再遇到类似任务,它应该少走弯路。
没有 memory,Agent 每一步都像临时工;有了 memory,它才像一个真正"在工作"的系统。
二、很多人一上来就做错了:Memory 不是把对话存进向量库
这是最常见的误区。
不少系统说自己支持 memory,实际做法非常简单:把历史对话切块,做 embedding,扔进向量库;下次用户再问,从里面召回几段相似内容,拼回 prompt 里。这当然比完全没有记忆强,但离"可用的 Agent Memory"还差很远。
原因很简单:记忆不是档案馆,记忆是为了支撑决策。
如果只是把所有东西都存下来,会出现几个问题:
1. 该记的没记,不该记的记了一堆
用户随口一句"今天有点忙",可能并不重要;但"我只接受上海出发、晚上八点后起飞"这种约束,如果没被结构化记住,后面任务就很容易跑偏。
2. 检索相似,不等于检索有用
向量检索擅长找"语义像不像",但 Agent 更常需要的是"这条信息当前有没有决策价值"。
比如用户问"继续上次那个任务",最重要的不是找一段语义最接近的对话,而是定位"上次停在第几步、失败原因是什么、已有结果是什么"。
3. 错误会被反复继承
一旦错误内容被写进 memory,后面又反复被检索出来,系统就会稳定地产生错误。这种问题比"偶尔忘记"更糟,因为它会让 Agent 变成一个持续自信但持续出错的系统。
所以,Memory 设计的核心不是"存没存",而是三件事:存什么、怎么取、何时更新。
三、Agent Memory 至少要分层,不要混成一锅
比较实用的做法,是把 memory 分成几层来设计,而不是统一扔进一个池子里。

1. Working Memory:工作记忆
这是最贴近当前任务的一层,保存的是当前上下文里的关键状态。
比如:
- 当前目标
- 已完成的步骤
- 上一个工具调用结果
- 当前待决策的问题
- 临时变量和中间结论
这层记忆的特点是:更新频繁、时效短、必须准确 。
它更像程序运行时的内存,而不是长期知识库。
很多 Agent 在长任务里越跑越乱,就是因为 working memory 没设计好。模型每一步都在读一大坨历史文本,却没有一个干净、可引用、可更新的"当前状态对象"。
工程上更推荐把它做成结构化状态,比如 JSON 或 state object,而不是完全依赖自然语言摘要。因为自然语言会漂,结构化状态更适合做检查、回滚和调试。
2. Episodic Memory:情节记忆
这层记的是"发生过什么"。
比如:
- 某次任务的执行轨迹
- 某个问题为什么失败
- 某个工具在什么场景下不稳定
- 用户上一次修改过哪些要求
这类记忆的价值不在于实时参与每一步,而在于需要时可以被回看、总结、反思。
它更像"任务日志 + 经验样本"。
很多反思式 Agent,本质上就在利用这一层:不是让模型凭空变聪明,而是让它从自己的历史行为里提炼规律。
3. Semantic Memory:语义记忆
这层保存相对稳定的知识和偏好。
比如:
- 用户常住城市
- 常用语言
- 报告偏好偏技术还是偏业务
- 某个内部系统的字段定义
- 某类任务的固定约束
这类信息更新没那么频繁,但会持续影响后续任务。
它更适合做成实体化、可编辑、带版本的信息,而不是埋在聊天记录里。
一句话概括:
working memory 管当下,episodic memory 管经历,semantic memory 管长期规律。
把这三层混在一起,系统大概率会越来越乱。
四、真正难的不是"存",而是"写入策略"
Memory 设计里最容易被忽略的问题,是写入。

很多系统默认"用户说什么都记"。这在聊天产品里可能勉强还能接受,但在 Agent 系统里会迅速把记忆池污染掉。
更合理的做法是:不是每次交互都写 memory,而是满足条件才写。
比如可以设一些简单但有效的写入规则:
- 明确的用户偏好,写入长期记忆
- 当前任务关键状态,写入工作记忆
- 重要失败原因,写入情节记忆
- 一次性闲聊内容,不写
- 置信度低的信息,不写
- 彼此冲突的信息,先挂起,不直接覆盖
这里最关键的一点是:memory 写入应该是一个"决策动作",不是副作用。
也就是说,Agent 在写 memory 前,最好先回答三个问题:
- 这条信息未来还会不会用到?
- 它影响的是当前任务,还是长期行为?
- 它的置信度够不够高?
没有这一步,memory 很快就会从"资产"变成"噪音源"。
五、检索也不能只靠相似度,要结合任务状态
写完之后,另一个问题是怎么取。

很多系统检索 memory 的方式非常单一:拿当前 query 去向量库查 top-k。这个方法简单,但对 Agent 来说通常不够。
因为 Agent 的记忆读取,不只是"当前这句话像什么",更是"当前这个任务阶段需要什么"。
举个例子:
用户说:"继续上次那个分析任务,把最后结论整理成邮件。"
这时最有价值的信息可能包括:
- 上次任务的最终中间结论
- 任务停下来的位置
- 用户的邮件风格偏好
- 之前失败过的格式要求
这些信息彼此在语义上未必最像"整理成邮件",但它们在任务结构上是最相关的。
所以更好的做法通常是混合检索:
- 语义检索:找相关内容
- 结构检索:按任务 ID、用户 ID、实体 ID 定位
- 时间检索:优先最近状态
- 规则检索:固定拿某些关键字段,如用户偏好、系统约束
也就是说,Memory retrieval 最好不是一个接口,而是一套策略。
六、Memory 最大的敌人,不是遗忘,而是污染
很多人担心 Agent 忘东西,但在实际系统里,更危险的往往是"记错了还一直用"。

这类污染通常来自几个地方:
1. 过期信息
比如用户之前说要英文报告,后来改成中文,但系统还在沿用旧偏好。
2. 错误归纳
用户一次性要求被系统误认为长期偏好,结果后面全都按这个执行。
3. 低质量总结
有些系统喜欢定期压缩历史,生成摘要写回 memory。问题是摘要本身可能遗漏关键约束,或者过度概括,最后等于用一句模糊的话替代了完整上下文。
4. 工具返回脏数据
外部工具返回有误,Agent 又把结果当成事实写进长期记忆,后果会越来越严重。
所以,memory 系统最好有这些能力:
- 版本管理
- 可覆盖更新
- 失效时间或衰减机制
- 来源标记
- 人工可审查
- 冲突检测
简单说,memory 不能只管"记住",还要管"纠错"和"忘掉"。
七、落到工程上,Memory 更像状态系统,不像知识库插件
从实现角度看,一个靠谱的 Agent Memory 系统,通常至少包含下面几个模块:

1. State Store
保存当前任务运行状态,支持读写、回滚、恢复。
这部分更接近工作流引擎,而不是 RAG。
2. Long-term Store
保存长期偏好、知识、历史经验。
可以是数据库,也可以结合向量库,但最好有结构化字段。
3. Memory Manager
负责判断什么时候写、写到哪里、怎么合并、怎么淘汰。
这是 memory 设计里最有含金量的部分。
4. Retrieval Layer
根据当前任务状态,决定取哪些记忆回来。
不是单纯 top-k,而是多路召回加筛选。
5. Observability
能看到 memory 是怎么被写入、怎么被读取的。
否则一旦系统出错,你根本不知道是模型推理错了,还是 memory 污染了。
这也是为什么说,Agent Memory 不是"接个库就行"。
它本质上是 状态管理、检索策略和知识治理 的组合问题。
八、一个实用判断:什么时候真的需要复杂 Memory
也不是所有 Agent 都值得上完整 memory 体系。
如果你的场景是:
- 单轮任务
- 步骤很短
- 用户偏好不重要
- 每次执行相互独立
那其实只要上下文窗口够用,或者做一点简单历史引用,就够了。
但如果你的场景有下面这些特征,就该认真设计 memory 了:
- 多轮持续任务
- 用户偏好影响结果
- 任务经常中断再恢复
- 需要跨会话延续状态
- 有反复出现的工作模式
- 需要从失败里学习
这时候,memory 不是锦上添花,而是系统骨架的一部分。
九、总结
很多人以为 Agent 的进化路线,是更强的模型、更长的上下文、更复杂的推理链。
但从工程实践看,真正决定一个 Agent 是否"像个靠谱同事"的,往往不是它能不能想,而是它能不能持续、稳定、带着上下文地工作。
而这件事,最终会落到 memory 设计上。
所以,Agent Memory 最值得讨论的点,从来都不是"用哪家向量库""embedding 维度多大",而是:
- 你把什么当成记忆
- 你让谁决定写入
- 你怎么保证它被正确取回
- 你如何处理错误、过期和冲突
说到底,好的 memory 不是为了让 Agent "记得更多",而是为了让它在关键时刻,记得对的东西。