Memory Manager
Memory Manager 是 AI Agent 中管理短期记忆(对话历史)和长期记忆(用户画像、知识)的组件。它决定了 Agent 能"记住"什么、"忘记"什么。
#type / concept
#status / evergreen
#tech / ai
#tech / architecture
[!info] related notes
Memory Manager
一句话定义
Memory Manager 是 AI Agent 中管理记忆的组件。它不只是”保存聊天记录”,而是决定 Agent 能记住什么(短期对话历史、长期用户画像)、怎么压缩(摘要、截断)、怎么注入到上下文中。
它解决什么问题
LLM 的上下文窗口有限。一个长对话可能有 100 条消息,但上下文窗口只能容纳 20 条。Memory Manager 需要:
- 决定哪些消息保留、哪些摘要、哪些丢弃
- 维护跨会话的长期记忆(用户画像、偏好)
- 在每轮对话时组装最优的记忆片段
核心原理
记忆分层
┌─────────────────────────────────────────┐
│ Memory Manager │
│ │
│ ┌──────────────────────────────────┐ │
│ │ Short-term Memory (会话级) │ │
│ │ 最近 N 轮对话 + 对话摘要 │ │
│ └──────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────┐ │
│ │ Long-term Memory (跨会话) │ │
│ │ 用户画像、偏好、历史摘要 │ │
│ └──────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────┐ │
│ │ Working Memory (当前任务) │ │
│ │ 结构化状态、中间结果 │ │
│ └──────────────────────────────────┘ │
└─────────────────────────────────────────┘
Python 实现
class MemoryManager:
def __init__(self, short_term: ShortTermMemory, long_term: LongTermMemory):
self.short_term = short_term
self.long_term = long_term
async def get_context(self, session_id: str, user_id: str) -> MemoryContext:
# 1. 获取短期记忆(最近对话)
recent_messages = await self.short_term.get_recent(session_id, limit=10)
summary = await self.short_term.get_summary(session_id)
# 2. 获取长期记忆(用户画像)
user_profile = await self.long_term.get_user_profile(user_id)
# 3. 组装记忆上下文
return MemoryContext(
recent_messages=recent_messages,
conversation_summary=summary,
user_profile=user_profile,
)
async def update(self, session_id: str, user_id: str, new_messages: list):
# 1. 更新短期记忆
await self.short_term.append(session_id, new_messages)
# 2. 如果对话太长,生成摘要
if await self.short_term.is_too_long(session_id):
messages = await self.short_term.get_all(session_id)
summary = await self.summarize(messages)
await self.short_term.set_summary(session_id, summary)
await self.short_term.clear_old_messages(session_id)
# 3. 提取长期记忆(用户偏好等)
profile_updates = await self.extract_profile_updates(new_messages)
if profile_updates:
await self.long_term.update_user_profile(user_id, profile_updates)
常见设计模式
1. 滑动窗口
只保留最近 N 轮对话,更早的做摘要。
2. 重要性排序
根据消息重要性决定保留哪些(工具调用结果比闲聊更重要)。
3. 自动摘要
对话超过阈值时自动生成摘要。
常见坑
- 全量历史塞进上下文: token 爆炸
- 不做摘要: 长对话的关键信息被截断丢失
- 长期记忆不更新: 用户偏好变了但记忆没变
- 记忆和上下文不分: 记忆是数据源,上下文是每轮组装的信息包