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. 自动摘要

对话超过阈值时自动生成摘要。

常见坑

  1. 全量历史塞进上下文: token 爆炸
  2. 不做摘要: 长对话的关键信息被截断丢失
  3. 长期记忆不更新: 用户偏好变了但记忆没变
  4. 记忆和上下文不分: 记忆是数据源,上下文是每轮组装的信息包

参考资料

创建于 2026/6/30 更新于 2026/7/15