Memory记忆系统
2137 字约 7 分钟
domain/aiai/agents
2026-07-24
记忆系统是 Agent 实现持续学习、个性化服务和跨会话一致性的基础。没有记忆的 Agent 就像金鱼——每次对话都从零开始。记忆系统让 Agent 能记住过去的交互、积累知识、适应用户偏好,从"工具"变成"伙伴"。
一句话解释
记忆系统让 Agent "记住事情"——当前对话的上下文(短期)、过去的经验(长期)、以及正在处理的信息(工作记忆)。
核心问题
为什么 Agent 需要记忆系统?
- LLM 本身无状态:每次调用都是独立的,没有跨会话的记忆
- 上下文窗口有限:即使 128K tokens 的窗口,也无法容纳所有历史信息
- 个性化需求:用户期望 Agent 记住自己的偏好和习惯
- 经验积累:Agent 需要从过去的成功和失败中学习
短期/长期/工作记忆三层架构
1. 短期记忆(Short-term Memory)
定义:当前对话或任务中的上下文信息,生命周期限于单次会话。
内容:
- 当前对话的消息历史
- 当前任务的中间状态和结果
- 临时的工作变量
实现方式:
- 直接放在 LLM 的上下文窗口中(in-context)
- 对话历史的消息列表
- 任务状态的临时存储
限制:受上下文窗口大小限制,需要管理策略(如滑动窗口、摘要压缩)
2. 长期记忆(Long-term Memory)
定义:跨会话持久化存储的信息,包括用户偏好、学到的知识、历史经验。
内容:
- 用户偏好和习惯
- 过去交互的摘要
- 学到的事实和规则
- 任务执行的经验(成功/失败模式)
实现方式:
- 向量数据库(语义检索)
- KV 存储(结构化存储)
- 文件系统(持久化文档)
关键挑战:
- 什么信息值得存入长期记忆?
- 旧信息何时淘汰?
- 如何避免记忆膨胀?
3. 工作记忆(Working Memory)
定义:当前正在处理的信息,是短期记忆中"活跃"的部分。类比人类的"脑中正在想的事情"。
内容:
- 当前推理步骤的中间结果
- 正在分析的信息片段
- 需要注意的关键状态
实现方式:
- 上下文窗口中的"活跃区域"
- 专门的工作记忆缓冲区
- Scratchpad(草稿本)机制
三层架构对比
| 维度 | 短期记忆 | 长期记忆 | 工作记忆 |
|---|---|---|---|
| 生命周期 | 单次会话 | 跨会话持久化 | 当前任务步骤 |
| 容量 | 受上下文窗口限制 | 理论上无限 | 非常有限(经典说法 7±2 项,更多研究认为有效容量更依赖任务与信息组织方式;工程直觉:工作记忆必须极简) |
| 访问速度 | 快(直接在上下文中) | 慢(需要检索) | 最快(焦点信息) |
| 存储位置 | 上下文窗口 | 向量库/KV/文件 | 上下文窗口的活跃区 |
| 类比 | 桌面上的文件 | 文件柜里的档案 | 正在阅读的那一页 |
记忆检索策略
从长期记忆中高效找到相关信息是关键挑战:
1. 语义检索
原理:将查询和记忆内容都编码为向量,通过语义相似度匹配。
优势:能匹配语义相似但表述不同的记忆 劣势:可能遗漏精确匹配的信息
2. 时间衰减
原理:越近的记忆权重越高,越旧的记忆权重越低。
公式:weight = decay_factor ^ (current_time - memory_time)
适用场景:用户偏好可能随时间变化(最近喜欢的 != 一直喜欢的)
3. 重要性加权
原理:每条记忆有一个重要性分数,检索时综合考虑相关性和重要性。
重要性评估:
- 用户显式标记的重要信息
- 被多次引用的记忆(高频访问 = 重要)
- 情感强度高的记忆(强烈偏好/不满)
4. 混合检索
实际推荐:语义相关性 × 时间衰减 × 重要性加权 = 综合分数
final_score = semantic_score × time_decay × importance_weight记忆更新与整合
新信息如何写入
| 写入策略 | 描述 | 适用场景 |
|---|---|---|
| 追加 | 直接添加新记忆,不修改旧记忆 | 事实性信息 |
| 覆盖 | 新信息替换冲突的旧信息 | 偏好变化、信息更新 |
| 整合 | 将新信息与相关旧记忆合并为一条更完整的记忆 | 知识积累 |
| 摘要 | 将多条旧记忆压缩为一条摘要,释放空间 | 记忆空间不足时 |
旧信息如何淘汰
- LRU(最近最少使用):淘汰最久未被访问的记忆
- 重要性阈值:重要性低于阈值的记忆被归档或删除
- 冲突解决:新旧信息矛盾时,保留最新的(或保留两者并标注时间)
- 定期压缩:将详细记忆压缩为摘要,保留核心信息
MemGPT/Letta 的 OS 式记忆管理
核心思想
MemGPT(现更名为 Letta)由 UC Berkeley 提出,将 LLM 的上下文管理类比操作系统的虚拟内存管理:
操作系统概念 → Agent 记忆概念
─────────────────────────────────────
主内存(RAM) → LLM 上下文窗口
虚拟内存(磁盘) → 外部记忆存储
页面置换 → 记忆检索和替换
内存分页 → 记忆分块管理核心机制
- 自主记忆管理:Agent 自己决定什么信息放入上下文窗口、什么存入外部记忆
- 分层存储:
- Main Context(主上下文):直接在 LLM 上下文中的信息
- Archival Memory(归档记忆):持久化存储的海量记忆
- Recall Memory(回忆记忆):过去对话的索引
- 记忆操作工具:Agent 通过工具调用来读写记忆(
core_memory_append,archival_memory_insert,archival_memory_search)
Letta 的意义
Letta 证明了 Agent 可以像操作系统管理内存一样管理自己的上下文——不需要人类手动管理"什么该记住、什么该忘记"。
Agent 记忆 vs RAG 的异同对比
| 维度 | Agent 记忆 | RAG |
|---|---|---|
| 数据来源 | 交互历史 + 外部知识 | 外部知识库 |
| 更新方式 | 动态(每次交互都可能更新) | 静态(定期批量更新) |
| 检索触发 | Agent 自主决定何时检索 | 每次查询都检索 |
| 个性化 | 高度个性化(用户特定) | 通用(所有用户共享) |
| 生命周期 | 随 Agent 持续运行 | 随知识库存在 |
| 隐私要求 | 高(涉及用户个人信息) | 中(通常是公共知识) |
核心区别:RAG 是"查资料",Agent 记忆是"回忆"。RAG 检索的是外部知识库,Agent 记忆检索的是自己的经验。
记忆的隐私与安全问题
- 数据最小化:只存储必要的信息,不过度收集
- 加密存储:敏感记忆(如用户个人信息)需要加密
- 访问控制:不同 Agent/模块对记忆的访问权限不同
- 遗忘权:用户有权要求 Agent 删除特定记忆
- 审计日志:记忆的读写操作需要记录日志
与 Agent状态管理的配合
记忆系统与 Agent状态管理 密切相关:
- 短期记忆 ≈ 任务的当前状态
- 工作记忆 ≈ 当前正在处理的子任务状态
- 长期记忆 ≈ 跨任务的经验积累
详见 Agent状态管理 中关于状态持久化和恢复的讨论。
常见误区
- 把所有对话历史都塞进上下文:上下文窗口有限,需要选择性保留
- 忽视记忆淘汰:只增不减导致记忆膨胀,检索质量下降
- 记忆不做检索优化:存了很多记忆但找不到,等于没存
- 忽视隐私:Agent 记住了用户的敏感信息但没有保护
- 记忆和 RAG 混为一谈:记忆是 Agent 自己的经验,RAG 是外部知识库
可继续补充的方向
- 记忆的自动化重要性评估
- 多 Agent 共享记忆的架构设计
- 记忆的压缩与摘要算法
- 长期记忆的遗忘曲线模型
关联笔记
- Agent基础 — Agent 基础概念
- Agent状态管理 — 状态管理与记忆的配合
- AI 与 Agent — Agent 概念入口
- ReAct模式 — 记忆在 ReAct 循环中的作用
- Reflection反思机制 — 反思经验存入长期记忆