Agent 长记忆不是向量库:从记忆流到内存管理
这篇是对一组 Agent 长记忆论文的消化笔记,主要包括:
我读完后的核心判断是:Agent 长记忆不是一个向量数据库功能,而是一套状态管理系统。
一个能长期工作的 Agent 至少要回答五个问题:
新经验写成什么
旧经验怎么整理
当前任务取回什么
冲突信息怎么处理
这套记忆到底有没有帮到任务
向量检索只回答了第三个问题的一小部分。把聊天记录切块、embedding、top-k 召回,只能叫“可检索历史”,还不能叫“长记忆”。
1. 长记忆首先是行为一致性问题
Generative Agents 是理解 Agent memory 的起点。它的目标不是做问答,而是在一个类似 The Sims 的小镇里,让 25 个 agent 表现得像有持续生活的人。
这个目标很适合暴露长记忆的本质。一个 agent 如果早上听说晚上有聚会,下午遇到朋友时应该能提起这件事,晚上应该知道要去哪里。它不是在回答“数据库里有没有这个事实”,而是在维持一条连续的生活轨迹。
论文里的架构可以拆成三块:
memory stream: 记录观察、计划、反思
retrieval: 按相关性、近因性、重要性取回记忆
reflection / planning: 把具体事件压缩成高层认识,再生成计划
最有启发的是 memory stream。它不是只存外部事实,而是把 agent 的观察、计划、反思都写进去。计划不是临时 prompt,反思也不是一次性分析,它们都会成为之后行为的历史条件。
这点非常关键:Agent 的长期一致性,来自“过去的内部状态也被记住了”。
如果只存用户说过什么,agent 仍然会忘记自己之前怎么判断、怎么承诺、准备做什么。一个真正的长记忆系统,应该把外部事实、内部判断、未完成计划、失败教训都纳入同一个状态演化过程。
2. 反思不是鸡汤,是压缩失败经验
Reflexion 把记忆从“事实记忆”推进到“经验记忆”。
它的思路很直接:Agent 做任务失败后,不更新模型参数,而是把反馈转成一段语言反思,放入 episodic memory,下一轮尝试时带上这段反思。
这听起来简单,但它解决了一个很实际的问题:环境反馈通常太稀疏。
测试没过
任务失败
分数是 0
动作无效
这些反馈本身不能直接指导下一次行动。Reflexion 做的是把反馈翻译成“下次应该避免什么、应该先检查什么、应该换哪种策略”。
所以 Reflexion 的记忆不是原始日志,而是失败日志的语义压缩。
工程上可以这样理解:
不要只存:命令 X 失败了
应该存:我没有先确认文件位置,导致修改了错误目标;下次应先定位调用链和测试失败点
这类记忆有三个好处:
- 它短,可以放进上下文。
- 它可读,方便人审计。
- 它可迁移,同类任务还能复用。
但 Reflexion 也有边界。它依赖反馈质量,也依赖 agent 本来就有能力执行正确动作。一个 action space 里没有的能力,靠反思不会凭空长出来。一个完全错的反馈,也会被写成错误经验。
所以反思记忆适合做“少量试错后的策略修正”,不适合被神化成自动学习系统。
3. MemGPT 把上下文当成内存来管理
MemGPT 对工程实现最有用,因为它换了一个角度:不要把长记忆理解为“模型记住更多”,而要理解为“系统管理有限上下文”。
它借鉴操作系统的内存层级,把 LLM 的 prompt 看成 main context,把外部存储看成 external context。当前上下文像 RAM,外部数据库像磁盘。模型不能直接看到磁盘里的所有东西,必须通过函数调用把相关内容搬进当前上下文。
MemGPT 的主结构可以简化成:
main context
system instructions
working context
FIFO message queue
external context
recall storage
archival storage
control flow
queue manager
memory pressure warning
function executor
function chaining
这里最值得学的是 memory pressure。
当上下文快满时,系统不是静默截断,而是给 agent 一个“内存压力”信号,让它决定哪些信息要写入 working context 或 archival storage。超过阈值后,queue manager 会 flush 一部分历史,并生成递归摘要。
这比普通聊天应用的“自动摘要历史消息”更系统化。因为 MemGPT 让 agent 参与了内存管理:它可以搜索、写入、替换、分页读取,也可以连续调用多个函数再回答用户。
这给工程实现一个很清楚的原则:
长记忆系统不应该只问“召回哪几段文本”
还应该问“什么时候触发整理、谁有权写入、写入失败怎么办、上下文快满时如何退化”
MemGPT 的价值不在于它的某个检索算法,而在于它把上下文变成了受管理的稀缺资源。
4. Mem0 和 A-Mem 走向生产化
前面几篇更像基础范式。到了 Mem0 和 A-Mem,问题开始变得更生产化:长期对话里到底存什么,怎么更新,怎么避免成本爆炸。
Mem0 的路线是从对话中抽取紧凑记忆。它不是每轮都把完整历史塞给模型,而是从消息对中抽取 salient information,再和已有记忆对比,执行类似 ADD、UPDATE、DELETE 的操作。
这很像把原始事件流整理成一张不断维护的事实表:
用户偏好
长期目标
身份信息
最近变化
关系和约束
Mem0 还加入了 graph memory,用实体和关系表达更复杂的关联。论文在 LOCOMO 这类长期对话记忆任务上比较了多类 baseline,并强调相比 full-context 方法,记忆化表示能显著降低 token 成本和延迟。它的一个重要工程信号是:生产系统不能只追求准确率,还必须同时看 latency、token consumption、memory availability。
A-Mem 的路线更像个人知识管理。它借鉴 Zettelkasten,把每条记忆写成原子 note,带有内容、时间、context、keywords、tags、links。新记忆进入系统后,不只是被保存,还会触发两件事:
link generation: 和相关旧记忆建立连接
memory evolution: 更新旧记忆的上下文描述和标签
这比普通 RAG 多了一步:知识库本身会随经验演化。
普通向量库里,两条相似记忆只是“查询时可能一起被召回”。A-Mem 里,它们可以被显式链接,旧 note 的描述也会因为新经验而改变。这样 memory store 不再是静态仓库,而是会生长的知识网络。
5. 我会怎么设计一个 Agent 长记忆系统
读完这些论文后,我会把 Agent 长记忆拆成五条路径。
第一条是写入路径。
不要默认存完整日志。每次交互结束后,应判断哪些内容值得进入长期记忆。值得写入的通常不是“用户说了什么”,而是:
稳定偏好
长期目标
明确承诺
关键环境事实
失败后的修正原则
对后续任务有约束力的决定
第二条是整理路径。
长期记忆一定会变脏。用户会改变主意,旧事实会过期,多条记忆会重复或冲突。系统需要合并、更新、标记过期,而不是无限追加。
第三条是读取路径。
检索不能只看 embedding similarity。Generative Agents 的相关性、近因性、重要性是一个很好的起点。生产系统还应该考虑任务类型、时间有效性、来源可信度、冲突状态和 token 预算。
第四条是执行路径。
记忆取回来以后,不应该直接相信。特别是长任务里,agent 应该把记忆当成候选证据,再结合当前环境验证。旧记忆能减少搜索,但不能替代检查。
第五条是评估路径。
如果没有评估,记忆系统很容易变成“看起来很智能”的装饰。可以至少测四类问题:
事实召回:能否记住明确事实
时间推理:能否处理前后变化
多跳整合:能否组合多段历史
行为改进:失败经验是否减少重复错误
这也是 Mem0、A-Mem 这类论文的共同提醒:长记忆不仅要回答对,还要便宜、快、可维护。
6. 几个容易误解的点
第一,长上下文不等于长记忆。
长上下文只是让模型一次能看更多 token,但注意力利用会退化,成本也会增加。长记忆关心的是如何选择、整理和使用历史。
第二,RAG 不等于 Agent memory。
RAG 更像查询外部资料。Agent memory 还包括自我状态、承诺、计划、失败经验和关系演化。
第三,反思不等于自动进步。
反思只有在反馈可靠、动作空间足够、agent 能执行修正策略时才有用。否则它可能只是把错误包装成更自信的错误。
第四,保存越多不一定越好。
记忆过多会带来检索噪声、冲突、隐私风险和成本问题。一个好的记忆系统应该有遗忘和压缩机制。
7. 我的 takeaway
Agent 长记忆的核心不是“让模型记住一切”,而是“让系统维护可用的过去”。
Generative Agents 告诉我们,持续行为需要 memory stream、reflection 和 planning。Reflexion 告诉我们,失败经验可以被语言化后复用。MemGPT 告诉我们,上下文是有限内存,需要 paging 和 control flow。Mem0 和 A-Mem 则提醒我们,生产环境还要处理延迟、成本、更新、冲突和结构化组织。
所以我会用一句话总结:
向量库是记忆系统的检索器,不是记忆系统本身。
一个真正可用的 Agent 长记忆系统,应该像小型操作系统加个人知识库:知道什么该写,什么该忘,什么时候该取回,取回后如何验证,以及旧经验如何改变未来行为。
自检
读完这篇,可以用三个问题检查自己是否真的理解了:
- 为什么“把所有聊天记录塞进向量库”不能等同于长记忆?
- Reflexion 存的到底是失败日志,还是从失败中压缩出的修正策略?
- MemGPT 为什么把 LLM 上下文类比成 RAM,而不是把外部数据库直接当成无限 prompt?