Agent 记忆系统(深挖)
ReAct 循环(深挖) 展示了 Agent 怎么一步步思考和行动。但每轮循环之间,Agent 需要记住之前发生了什么——搜过什么、结果是什么、用户说过什么。这就是 Agent 的记忆系统。
三层记忆架构
AI 记忆不是一个大池子。学术界普遍采用三层模型 1:
工作记忆(Working Memory):当前任务的上下文。这一轮搜索的结果、上一步的思考、当前对话。容量有限(跟 AI 的上下文窗口一样大),任务结束就清空。
短期记忆(Short-term Memory):当前对话的所有内容。你说了什么、AI 回答了什么、每一步的 Thought-Action-Observation。对话结束就归档。
长期记忆(Long-term Memory):跨对话的信息。你的偏好(“我喜欢简洁的回答”)、你的身份(“我是律师”)、重要事实(“上次讨论的项目叫 Alpha”)。持续存在,不随对话消失。
工作记忆:有限的金子
Agent 的每一步决策都依赖工作记忆。但工作记忆就是 AI 的上下文窗口——塞太多会溢出,塞太少信息不全。
冲突:你希望 Agent 记住尽可能多的上下文(搜过的资料、之前的推理),但上下文窗口价格昂贵且有限。
解决:不是什么都记。工作记忆里只放最相关的信息。怎么挑?这就是 上下文管理 里讲的”写、选、压、隔”。
短期记忆:对话的流水账
最简单的短期记忆实现:把整个对话历史存在一个列表里,每次 Agent 要做决定时,把最近 N 轮对话放进去。
问题:对话超过 20 轮怎么办?全塞进去上下文窗口就炸了。
解决:上下文压缩(深挖)。把老对话压缩成摘要,只保留关键信息。
工具推荐:LangChain 的 ConversationSummaryMemory——自动把老对话压缩成一句话摘要。Mem0(2023 年开源)功能更强,不仅记对话,还能提取关键事实。
长期记忆:跨对话的知识
这是最难的一层。你说过”我是律师”,三天后 Agent 还记得吗?
存储方式:
- 向量化存储:把每次对话里的关键信息转成向量(一串表示含义的数字),存进向量库。下次对话时检索相关记忆。
- 知识图谱:用实体-关系存储。比如”用户职业=律师""用户偏好=简洁回答”。
- 关键事实列表:最简单的实现——一个
{key: value}的字典。
Mem0 是怎么做的 2:
- 每轮对话结束,Mem0 自动提取关键事实
- 事实存进向量库
- 下次对话开始,Mem0 检索跟当前问题相关的历史事实
- 把事实注入 AI 的输入,AI 就知道”这个用户是律师,上次聊的是合同”
记忆管理的三个陷阱
1. 记忆污染。 Agent 记住了错误的信息。“用户说喜欢详细回答”——其实用户说的是”这次详细一点,平时不用”。怎么区分一次性偏好和长期偏好?Mem0 用”事实冲突检测”——如果新事实和旧事实矛盾,以新为准。
2. 记忆泄露。 用户 A 的记忆被注入到用户 B 的对话中。多租户场景必须做记忆隔离。
3. 记忆膨胀。 长期记忆无限增长,检索越来越慢。需要定期清理——超过 90 天没被访问的记忆,归档或删除。
实践:LangChain 记忆示例
LangChain 提供了记忆管理功能。基本思路:每轮对话结束后,自动压缩成摘要,下次对话时自动加载。
(以下代码供有编程基础的读者参考。零基础读者可以跳过,不影响理解。)
相关笔记
- ReAct 循环(深挖) — 记忆为 ReAct 循环提供上下文
- 上下文管理 — 工作记忆就是上下文管理的对象
- 上下文工程 — 上下文工程四件事:写选压隔
来源
- Park et al., “Generative Agents”, 2023, https://arxiv.org/abs/2304.03442
- Mem0 GitHub, https://github.com/mem0ai/mem0
- LangChain Memory Documentation
注释
-
Park et al., “Generative Agents: Interactive Simulacra of Human Behavior”, 2023, https://arxiv.org/abs/2304.03442 ↩
-
Mem0 GitHub, https://github.com/mem0ai/mem0 ↩
关联9
知识图谱局部图谱 · 点节点跳转