Agent 记忆系统设计模式
记忆系统要解决的问题
Agent 的核心矛盾:LLM 上下文窗口有限,但用户希望 Agent 有"记忆"——记住你是谁、之前说过什么、有什么偏好。记忆系统就是在有限空间中做最有效的上下文管理。
四层记忆模型
来源:MemGPT/Letta 提出的层级记忆模型,已被广泛采纳:
使用频率高 / 容量小
↑
┌───────────────────────┐
│ 核心记忆 (Core) │ ← 身份、角色、关键约束
│ │ 每次请求必带
├───────────────────────┤
│ 工作记忆 (Working) │ ← 当前会话、最近N轮、活跃意图
│ │ 会话期间持续
├───────────────────────┤
│ 场景记忆 (Episodic) │ ← 过去的会话摘要、关键事件
│ │ 跨会话
├───────────────────────┤
│ 语义记忆 (Semantic) │ ← 知识库、向量化文档
│ │ 长期不变
└───────────────────────┘
↓
使用频率低 / 容量大
记忆实现策略
1. 窗口截断(最简单的短期记忆)
保留最近 N 轮对话,丢弃最早的。实现简单,但会丢失早期上下文。
messages = messages[-MAX_TURNS:] # 保留最近 10 轮
2. 结构化工作记忆
不只是文本,而是结构化的字段:
{
"intent": "leave_request",
"current_topic": "年假申请",
"extracted_entities": {"user_id": "EMP001", "leave_type": "annual"},
"risk_signals": ["balance_low"],
"working_summary": "用户想申请年假,需先检查余额"
}
3. 摘要滚动
当上下文达到上限时,用 LLM 压缩早期内容为摘要。保留摘要 + 最近的原始消息。
4. 分层检索
按需加载不同层级的记忆:身份信息冷启动时预加载,会话记忆按需检索关键词,知识记忆通过 RAG 检索。
持久化策略
| 记忆层 | 存储方式 | 生命周期 |
|---|---|---|
| 核心记忆 | 配置/系统 Prompt | 静态 |
| 工作记忆 | 内存 + 可选 DB | 会话期间 |
| 场景记忆 | SQL/NoSQL | 永久(可压缩) |
| 语义记忆 | 向量数据库 | 永久 |
设计原则
- 早期就设计记忆层:后期加记忆系统比初期设计难 10 倍
- 隔离各层:各层独立变化,互不影响
- 缓存优先:高频访问的数据放在内存或缓存层
- 摘要要可靠:压缩质量直接影响 Agent 表现
- 幂等更新:同一知识重复写入不应产生重复