记忆蒸馏:LLM 驱动的记忆整理与提炼
记忆蒸馏:LLM 驱动的记忆整理与提炼
概述
记忆蒸馏(Memory Distillation)是一种使用 LLM 对 Agent 散落的短期/中期记忆进行定期整理的技术。它的核心思想是:记忆随时间积累会变得越来越分散和冗余,需要定期提炼为高密度、可检索的长期记忆。
这一过程类比人类的”睡眠记忆巩固”——大脑在睡眠期间将白天的经历整理为长期记忆。在 Agent 系统中,这被称为 Deep Dream 机制。
蒸馏触发时机
| 触发方式 | 时机 | 目的 |
|---|---|---|
| 定时触发 | 每日固定时间(如 23:55),带随机抖动 | 常规记忆整理 |
| 手动触发 | 用户通过 /memory dream 等命令触发 | 按需整理 |
| 上下文截断后 | 对话轮次超限被裁剪时 | 保留被裁剪内容的摘要 |
蒸馏流程
输入材料
- 当前长期记忆(MEMORY.md):已有的核心信息、偏好、决策
- 近期每日记忆:最近 N 天的
memory/YYYY-MM-DD.md文件
LLM 蒸馏任务
LLM 需要完成两个任务:
Part 1: 更新长期记忆([MEMORY] 标记)
- 合并提炼:将含义相近的多条合并为高密度表述
- 新增萃取:从每日记忆中提取值得永久记住的信息(偏好、决策、人物、规则)
- 冲突更新:新信息与旧条目矛盾时以新为准
- 清理无效:删除临时性记录、空白条目、重复内容
- 删除冗余:已被更精炼表述涵盖的旧条目应删除
Part 2: 梦境日记([DREAM] 标记)
用叙事风格记录整理过程中的发现:
- 发现了哪些重复或矛盾
- 从日记中提取了什么新洞察
- 做了哪些清理和优化
- 整体感受和观察
输出格式(严格遵守)
[MEMORY]- 记忆条目1- 记忆条目2...
[DREAM]梦境日记内容...关键设计决策
去重机制
蒸馏操作使用输入哈希去重:对每日记忆内容计算 MD5,结的当前日期构成 dedup_key = "{date}:{daily_hash}"。同一日内相同输入不重复蒸馏,避免资源浪费。
异步执行
蒸馏操作在后台线程中执行,不阻塞 Agent 的主回复流:
flush_from_messages() → 同步去重 → 启动后台线程 → LLM 摘要 → 写入文件上下文注入
蒸馏产生的每日摘要可以通过回调函数注入到 Agent 的实时消息列表中,实现一次 LLM 调用同时服务磁盘持久化和上下文连续性。
降级策略
当 LLM 不可用时,系统回退到规则摘要:
- 提取每条用户消息的前 500 字符
- 提取助手回复的第一条有意义的内容
- 格式化为
"- 用户: X → 回复: Y"的紧凑格式
与记忆系统的关系
记忆蒸馏是 记忆系统设计 中的高级功能,建立在三层记忆架构之上:
对话上下文(agent.messages) ↓ 触发截断每日记忆(memory/YYYY-MM-DD.md) ↓ 触发蒸馏长期记忆(MEMORY.md)—— 精炼后注入系统提示陷阱与对策
| 陷阱 | 对策 |
|---|---|
| LLM 编造不存在的记忆 | 蒸馏 prompt 中严格约束”只能基于提供的材料,严禁编造” |
| 蒸馏后 MEMORY.md 膨胀 | 设定条数上限(如 50 条),优先合并而非追加 |
| 重复蒸馏浪费 token | 输入哈希去重,同一日相同输入只执行一次 |
| 蒸馏延迟导致记忆丢失 | 先写入每日记忆文件(同步),蒸馏异步执行 |
| MEMORY.md 被写坏 | 先解析 LLM 输出,[MEMORY] 部分为空则跳过写入 |
设计权衡
优势:
- 定期自动整理,无需人工干预
- 梦境日记提供可审计的整理记录
- 异步执行不阻塞用户交互
代价:
- 每次蒸馏消耗一次 LLM 调用(通常 2000-8000 tokens)
- 需要足够的每日记忆积累才能产出有价值的蒸馏结果
替代方案:
- 仅用规则摘要(无需 LLM,但质量较低)
- 用户手动整理(质量可控但不自动)
- 纯向量检索(无需蒸馏,但缺乏主动提炼)