如何设计一个可用的 Agent Memory?写入、检索、更新和遗忘机制怎么做?

如何设计一个可用的 Agent Memory?写入、检索、更新和遗忘机制怎么做?
为什么 LLM 需要 Memory?
LLM 每次对话本质上是独立的。你跟它聊完,它什么都不记得;下次再聊,它又是一个全新的"人"。
这不是 bug,是原理决定的。LLM 的"记忆"来自上下文窗口,而窗口大小是固定的——ChatGPT 目前大概是 12.8 万 tokens,Claude 更多一些,但总有个头。
一旦对话超过这个长度,早期的信息就被"挤出去"了,再也拿不回来。
你可能会问:那延长上下文窗口不就行了?
没那么简单。窗口越长,计算成本越高、响应速度越慢、模型还容易"分心",抓不住重点。所以现实做法是:给 LLM 外挂一个记忆系统,让它自己决定该记什么、什么时候查。
类比一下:LLM 像金鱼,只有几秒钟的短期记忆。你需要给它一本"笔记本",它才能记住上周你问过的需求、去年你提过的偏好、那些对它来说很重要但不在当前对话里的事。

Memory 的三种形态
设计 Agent Memory,先搞清楚信息存在哪里。
1. Token 级记忆(外部存储)
最直接的理解——把对话、事实、偏好都存进外部数据库。向量数据库存语义、关系数据库存结构化信息、甚至直接用文件都行。
这种方式最显式,你知道每条记忆存在哪里,也知道怎么查。但缺点是:需要自己维护、更新、清理。
2. 参数化记忆(模型内部)
模型训练时学到的知识,存在模型参数里。比如你问"Python 是谁发明的",模型能回答,不是因为查了数据库,而是它"脑子里"记得。
这种方式最难控制,你没法精确修改或删除某条"记忆"。而且模型会"遗忘"——不常见的信息容易被覆盖。
3. 潜在记忆(隐状态)
介于上面两者之间。像大脑的工作记忆,利用当前上下文中的隐式信息。比如 agent 在执行任务时,中间步骤的推理结果以 hidden state 的形式流动,不显式存储但确实在"记忆"。
三种形态的对比:
| 形态 | 存储位置 | 控制难度 | 典型场景 |
|---|---|---|---|
| Token 级 | 外部数据库 | 容易 | 用户偏好、历史对话 |
| 参数化 | 模型参数 | 困难 | 通用知识、常识 |
| 潜在 | 运行时状态 | 中等 | 推理中间结果 |
类比来说:
- Token 级 = 书架上的书,你知道在哪,随时能翻
- 参数化 = 馆员脑子里的知识,拿出来容易但改不了
- 潜在 = 桌上的便签,用完就扔,但临时记东西很方便

四大机制:写入与检索
Memory 系统最核心的四个操作:写入、检索、更新、遗忘。我们先说前两个。
写入:什么该记?
不是所有信息都值得存。写入机制要回答的问题是:这条信息重要吗?
判断维度通常有五个:
时间维度——这是不是一个重要的时间节点?deadline、里程碑、约定。
空间维度——信息是否和特定环境相关?比如"这个项目用 Vue2,下次遇到类似项目要问清楚版本"。
参与者维度——记住了"谁说过什么",下次就能对得上号。
意图维度——用户当前的意图是什么?持续跟踪意图能提升后续服务质量。
文化维度——有些偏好是隐含的,比如"中国人不喜欢直接被批评",这类跨文化信息需要敏感捕捉。
一个常见的实现思路是:让 LLM 自己判断。每次交互后,问它:"这段对话有什么值得记住的?"它来决定。
检索:怎么找到它?
记忆存了不代表能用到。检索机制决定什么时候、怎么把记忆捞出来。
三种常见方式:
关键词检索——最简单,按字面匹配。搜"Python"就返回带"Python"的结果。快、准,但找不到同义词。
语义检索——用向量相似度来找。搜"编程语言"能找到"Python"、"Java"相关内容。理解力更强,但可能返回不太相关的结果。
混合检索——两种结合。先语义召回候选集,再关键词过滤。现实项目里用得最多。
检索还有个关键点:什么时候触发检索?
- 每次交互前查一次(开销大但最及时)
- 按任务阶段触发(比如开始新任务时)
- 定期批量刷新

四大机制:更新与遗忘
更新:记忆会过时
Memory 不是只进不出的水库。随着时间推移,记忆会过时,需要压缩和更新。
摘要压缩是最常见的做法。当一条记忆变得太长(比如记了几十轮对话),用 LLM 把它压缩成几条核心要点。
比如原始记录:
用户今天说想要一个登录功能,后来又说改成微信登录,然后要求加验证码...
压缩后:
用户需求:微信登录 + 验证码
双层记忆架构是一种更系统的做法。以 Letta 为例:
主记忆层——存放当前最重要的上下文,每次请求都会完整加载。
递归记忆层——历史记忆的压缩版本,按时间线组织,定期从主记忆中提炼更新。
这样设计的好处是:主记忆保持精简(不会撑爆上下文),递归记忆保留历史(需要时能查到)。
遗忘:不是越多越好
人类会遗忘,记忆系统也需要。
自然衰减——最简单,给记忆加个"保质期"。超过一定时间没被访问,就降低权重或删除。
主动删除——用户明确说"忘掉上次说的",或者系统发现某条记忆是错误的。
智能衰减——根据访问频率和质量动态调整。不常用的记忆慢慢淡化,被反复引用的记忆保持新鲜。
关键原则:遗忘不是 bug,是设计需要。垃圾记忆太多反而会干扰推理。好的 Memory 系统要像好脑子——记住该记的,忘掉该忘的。

主流框架对比
说太多原理,来点实际的。现在主流的 Agent Memory 框架有哪些?
Mem0:五层语义记忆
Mem0 的设计思路是分层记忆:
- 用户偏好层——长期偏好,比如"用户喜欢简洁的回答"
- 会话层——当前对话的上下文
- 实体层——人、地点、概念等实体信息
- 事实层——从对话中抽取的事实
- 语义层——高层次的意图和关系
每层有自己的更新策略和检索优先级。适合需要精细化记忆管理的场景。
Letta:双层 + Agent 心智
Letta 更关注Agent 的自我认知。它的双层架构我们上面讲过,但不止于此——Letta 还想让 Agent 记住"自己是谁"、理解自己的行为模式。
适合需要长期一致性和自我认知的场景,比如陪伴机器人、数字分身。
怎么选?
| 场景 | 推荐框架 |
|---|---|
| 客服、知识库 | Mem0 |
| 陪伴、长期助手 | Letta |
| 简单场景 | 自己做,Mem0 太重 |
选框架像选工具:拧螺丝用手,装修用冲击钻。没有最好,只有最适合。

面试怎么答
基础版(能过):
LLM 有上下文窗口限制,交互太长早期的信息就丢了,所以需要外部 Memory 系统。Memory 主要分三种形态:Token 级(存在外部数据库)、参数化(存在模型里)、潜在(运行时隐状态)。
设计 Memory 核心是四个机制:写入时判断什么值得记,常用时间/空间/参与者/意图/文化五维度判断;检索有关键词、语义、混合三种方式;更新通过摘要压缩或双层记忆架构防止过时;遗忘通过自然衰减或主动删除清理无用记忆。
加分版(让面试官眼前一亮):
我理解 Memory 设计和认知科学里的记忆分类很像——工作记忆对应上下文窗口,情景记忆对应 Token 级存储,语义记忆对应参数化知识。
实际项目中,我更倾向 Mem0 的分层思路,因为不同层级的记忆更新频率不同,混在一起管理容易乱。但如果是长期陪伴场景,Letta 的双层架构更合理,既保证了主记忆精简,又保留了历史信息的可追溯性。
关键认知是:Memory 不是越多越好,需要质量控制和遗忘机制。我见过很多系统堆了几十万条记忆但效果很差,就是缺了这两点。
一句话总结
Agent Memory 本质是给"金鱼脑"外挂一个笔记本,通过写入判断、检索召回、更新压缩、遗忘淘汰四步,让 LLM 记住该记的、忘掉该忘的。

