Agent 核心能力 ②:Memory(记忆管理)
摘要:OpenAI 兼容的对话 API 是无状态的:模型不会替你记住历史。Memory 的任务是:在 context window 有限的情况下,让 Agent 在“看起来连续”的同时,控制成本并保留关键事实。
1. Memory 解决的到底是什么问题
1.1 两个硬约束
- 上下文窗口有限:对话越长,越容易超长或变贵
- 历史全发很浪费:很多轮对话对当前任务并不重要
1.2 一个软目标
让 Agent 具备:
- 任务连续性(记得用户偏好、约束、目标)
- 可恢复性(中断后还能接着做)
- 可控性(哪些信息能被记住/忘记)
2. Short-term Memory:消息列表(最简单)
最朴素的做法:把最近 N 轮 messages 全部发给模型。
优点:实现简单、效果直接。 缺点:
- token 成本线性增长
- 对长任务会撞 context window
适合:短对话、PoC。
3. Long-term Memory 三种策略(从简单到强)
3.1 Buffer Window(截断)
只保留最近 N 轮。
- ✅ 实现极简
- ❌ 会“硬失忆”(把关键事实截没了)
工程建议:
- 永远保留 system prompt
- 额外保留一个“事实层”(例如用户偏好、项目路径、约束)
3.2 Summary(总结)
定期让模型把历史压缩成一段 summary,再把 summary 放回上下文。
常见做法:
- 每对话 M 轮触发一次总结
- 或 token 超阈值时触发
总结内容应该包含:
- 用户目标(Goal)
- 已完成的进度(Progress)
- 关键约束(Constraints)
- 关键决定(Decisions)
- 待办事项(Next actions)
一个可用的 summary prompt:
你是对话记录员。请把以下对话总结为可供后续任务继续执行的“工作摘要”。
要求:
- 用要点列表
- 必须包含:目标/约束/已完成/下一步
- 不要写无关闲聊
优缺点:
- ✅ 成本可控,连续性强
- ❌ 会丢细节;summary 写坏了会持续污染后续
3.3 Vector Store(向量检索记忆)
把历史对话/笔记/用户资料切片后向量化,按需检索相关片段注入 prompt。
检索触发方式:
- 每次用户提问都检索
- 或当模型判断“需要回忆”时才检索(工具化)
优缺点:
- ✅ 可扩展到海量记忆
- ✅ 能找回很久以前的细节
- ❌ 工程复杂度更高(切分、入库、召回质量、去噪)
注意:向量检索不是“真记忆”,只是“相关片段召回”。召回不准仍然会答错。
4. 记忆的工程分层(推荐架构)
把 memory 拆成 4 层,你会更好实现:
- System Layer:不变规则(角色、工具规则、安全约束)
- Working Memory:当前任务最相关的短上下文(最近 N 轮)
- Summary Layer:压缩的任务摘要(可持续更新)
- Retrieval Layer:向量检索召回的“证据片段”
拼接 prompt 时的顺序一般是:
- system
- summary
- retrieval snippets(带来源)
- recent messages
5. Memory 的常见坑
5.1 把不该记的也记了
- 隐私、密钥、敏感信息不应进入长期存储
- 工具输出(尤其是大段日志)不要直接存长期记忆
5.2 记忆不可审计
你需要能回答:
- Agent 为什么“记得”这个?来源是什么?
- 这个记忆什么时候更新的?
5.3 检索召回噪声太大
常见手段:
- 加 rerank
- 加时间/主题过滤
- 给每条记忆加 metadata(类型、项目、时间)
6. 下一步
Memory 解决“持续性”,Planning 解决“复杂性”。 下一篇我们会把 Agent 的规划能力拆成三种模式:
- ReAct(思考-行动-观察)
- Plan-and-Solve(先计划再执行)
- Reflection(出错后的自我修正)