Notes

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 层,你会更好实现:

  1. System Layer:不变规则(角色、工具规则、安全约束)
  2. Working Memory:当前任务最相关的短上下文(最近 N 轮)
  3. Summary Layer:压缩的任务摘要(可持续更新)
  4. 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(出错后的自我修正)
cd ..