Agent 记忆系统架构设计
记忆系统的本质是解决"LLM 上下文窗口有限"和"长任务 / 跨会话需要历史信息"这对核心矛盾。本文从架构演进的角度,系统梳理 Agent 记忆系统的分层设计、长期记忆的动静拆分、记忆治理与防爆炸机制。
一、为什么两层架构不够用?
早期 Agent 的记忆设计非常朴素,只有两层:
- 短期记忆:当前会话内的对话历史,直接塞进上下文窗口
- 长期记忆:跨会话的历史信息,存入向量库按需召回
这套架构放在简单问答、闲聊场景勉强够用。但一到复杂长任务、企业级场景,三个致命问题就暴露了:
- 粒度太粗:短期记忆是对话流水账,无法区分"任务目标"和"闲聊内容"
- 边界模糊:什么该进短期、什么该进长期,缺乏清晰判定标准
- 缺少治理:只存不治,三个月后记忆库必然熵增成一团浆糊
真实踩坑案例:某团队做调研报告 Agent,用户要求"写一份 10 章的行业报告",跑了 3 小时后,Agent 忘了要写 10 章,只输出 3 章就结束了。这就是传统两层架构的死穴——长任务跑着跑着就忘了最初的目标。
二、四层记忆架构:从热到冷的分层设计
2025-2026 年的工业级实践,已经收敛到四层记忆架构。核心思路是按访问频率和生命周期,从热到冷清晰分层:
第 0 层:上下文窗口记忆(In-Context Memory) → 热记忆,直接推理
第 1 层:工作记忆(Working Memory) → 任务认知黑板
第 2 层:会话记忆(Episodic Memory) → 单会话完整历史
第 3 层:长期记忆(Long-term Memory) → 跨会话持久沉淀
四层核心参数对照
| 记忆层级 | 定位 | 存储介质 | 典型容量 | 访问延迟 | 核心职责 |
|---|---|---|---|---|---|
| 第 0 层 上下文窗口 | 热记忆/当前交互 | LLM 原生上下文 | 4k~128k tokens | 最低(直接推理) | 承载当前对话的直接输入 |
| 第 1 层 工作记忆 | 任务认知黑板 | 内存/文件/任务状态 | 无硬限制 | 低 | 锚定任务目标、中间产物、实体关系 |
| 第 2 层 会话记忆 | 单会话完整历史 | SQLite/本地文件 | 单会话无限 | 中 | 承接上下文溢出的历史内容 |
| 第 3 层 长期记忆 | 跨会话知识沉淀 | 文件/DB/向量索引 | 理论无限 | 较高 | 持久化用户偏好、关键事实、可复用知识 |
三大核心优势
第一,冷热分离。高频访问的热记忆放上下文,低频的冷记忆放向量库,兼顾速度和容量。
第二,升降级机制。会话结束后自动提炼精华写入长期记忆(降级);检索命中的冷记忆重新注入上下文(升级)。记忆在四层之间流动,不是一成不变的。
第三,治理边界清晰。每一层都有独立的清理、去重、过期机制,从根源避免"记忆熵增"。
为什么不把所有记忆都塞进上下文?
三个现实问题绕不开:
- 成本问题:上下文是 O(n²) 的 Token 开销,1M 窗口跑起来成本几十倍上涨
- 注意力问题:长上下文存在"中间遗忘效应",模型注意力集中在开头和结尾,中间信息大概率被忽略
- 延迟问题:窗口越大推理越慢,线上 C 端产品扛不住
结论:窗口再大,分层记忆依旧是工程最优解。
三、逐层深度拆解
第 0 层:上下文窗口记忆
这是最基础的一层——把对话历史直接放入 LLM 提示词,依托注意力机制来"记住"。
三大实现方案:
| 方案 | 原理 | 适用场景 | 踩坑点 |
|---|---|---|---|
| 固定窗口截断 | 只保留最近 N 轮/token,超出丢弃 | 闲聊、简单客服 | 用户开头的全局指令容易被截断 |
| 滑动窗口+置顶保护 | 系统指令永久置顶,只截断普通对话 | 工业界标配 | 需要标记哪些消息"免截断" |
| 实时令牌压缩 | 工具返回的大内容先摘要再进上下文 | 大量工具调用的 Agent | 摘要质量影响后续效果 |
开源实现对比:
- Hermes:
MEMORY.md/USER.md保存短而稳定的长期信息,核心记忆注入 + 会话搜索 - OpenClaw:核心记忆和近期笔记按需进入上下文,更早历史通过检索召回
- DeerFlow 2.0:Sub-Agent 上下文隔离 + 中间产物落地 + 摘要压缩
上下文窗口的"中间遗忘效应"怎么缓解?
① 重要信息放开头或结尾;② 关键内容定期重复出现;③ 不要过度依赖长上下文,该分层就分层。
第 1 层:工作记忆——长任务的"认知黑板"
这是四层架构相比两层架构最关键的增量。传统短期记忆是"对话流水账",工作记忆是"结构化任务认知"。
工作记忆存储的不是对话内容,而是:
- 任务目标锚定(最终目标是什么,防止跑偏)
- 实体关系图谱(涉及的人、事、物及其关联)
- 中间结果持久化(已完成的子任务产出,不用反复重算)
- 断点续传支持(任务中断后从上一个状态继续)
举例:写一篇万字调研报告——
- 短期记忆存的是你和 Agent 的每一句对话
- 工作记忆存的是"当前写到第几章、已确认的核心论点、引用的数据源"
开源实现对比:
| 项目 | 实现方式 | 核心创新 |
|---|---|---|
| DeerFlow 2.0 | Sub-Agent 上下文隔离 + 文件产物沉淀 | 子任务隔离、sandbox 文件系统降低长任务失忆风险 |
| OpenClaw | 工作区每日笔记 + 检索索引 | 当前工作上下文可直接检查,更早历史通过 memory_search 召回 |
| Hermes | 有界核心记忆 + 会话搜索 | 用小而稳定的核心偏好约束当前任务 |
工作记忆和传统短期记忆有三个维度的本质区别:
- 内容不同:流水账 vs 结构化任务状态
- 目的不同:“记住说了什么” vs “记住要做什么、做到哪了”
- 价值不同:没有工作记忆,Agent 做不了超过 10 轮的长任务
第 2 层:会话记忆——上下文的"外存"
上下文窗口装不下的内容,先存在这一层。边界很清晰:当前会话内有效,会话结束默认不跨会话加载。
两大实现方案:
(1)滚动摘要
- 原理:对话快满时,把前面内容总结成短摘要,用摘要替换原始记录
- 优点:压缩长度的同时保住任务目标、风格要求、已确认结论
- 缺点:多一次模型调用,摘要质量直接影响后续效果
- 优化手段:用便宜小模型做摘要(成本是主模型的 1/10),关键信息标记"不参与摘要"
(2)会话内检索
- 原理:整个会话历史向量化,按需召回最相关片段
- 适用:单会话超长篇任务(写书、大型调研)
开源实现:Hermes 用 SQLite 会话搜索;OpenClaw 每日笔记 + 检索索引;DeerFlow 2.0 上下文压缩 + 中间结果落地。
第 3 层:长期记忆——"越用越聪明"的核心
跨会话的持久化记忆。上次对话你说过"讨厌写注释",这次找 Agent 写代码,它自动就记住了。
核心技术链路:存储 → 索引 → 检索 → 注入
存储层:三大方案
| 项目 | 存储介质 | 设计哲学 | 优势 |
|---|---|---|---|
| Hermes | Markdown 核心记忆 + SQLite/FTS5 | 轻量化、本地优先 | 部署简单,会话搜索方便 |
| OpenClaw | MEMORY.md + memory/*.md + SQLite 混合索引 | 人类可读、可直接编辑 | 调试方便,可人工修正记忆 |
| DeerFlow | 本地长期记忆 + 文件系统产物 | 长任务上下文工程 | 适合多步骤任务和中间结果沉淀 |
索引层:混合检索是主流
纯向量检索已经不够用,现在是三驾马车:
- 向量相似度:语义匹配
- BM25 关键词:精确匹配
- 实体标签:结构化过滤
检索层:不是什么都值得存
- ✅ 该存:用户稳定偏好、任务核心目标、已确认重要事实、可复用结论
- ❌ 不该存:临时对话、中间过程、错误信息
四、长期记忆的动静拆分:为什么 Facts 和 History 必须分开?
DeerFlow 体系对长期记忆做了进一步拆分,这是理解工业级记忆系统设计的关键:
长期记忆 = 动态长期记忆(History)+ 静态长期记忆(Facts)
拆分的五个核心原因
1. 信息属性本质不同
- History 是"过程":记录行为演变、阶段性轨迹,是连续叙事型总结
- Facts 是"结论":存储离散、稳定、可复用的确定性单点事实
若混为一体,查询"用户常用编辑器"这种单点信息时,需要遍历大段历史摘要做冗余匹配。
2. 更新频率完全不同
- History 按月/季度低频增量汇总,只新增阶段性总结
- Facts 极慢迭代,只有用户明确修正时才修改或删除条目
统一存储会出现:为了少量事实修改,频繁重写整段长篇历史摘要。
3. 检索模式差异化
- Facts:支持向量检索、分类过滤、置信度筛选,按需抽取少量关键事实
- History:多用于全景复盘、长周期背景溯源,一般不全量塞进单次 Prompt
4. 置信度管理需要隔离
Facts 每条附带置信度打分:
< 0.5:无效推断,自动丢弃0.5~0.7:弱推导,标记待复核0.7~0.9:强逻辑推导0.9~1.0:用户明确口述,可信度最高
History 是概括性叙事,无需逐条置信校验。合并后无法区分"确凿事实"和"归纳推测"。
5. 生命周期淘汰策略可独立配置
- 静态事实:多年未使用降级归档
- 动态时序:按时间段分段压缩,久远历史精简
五、记忆爆炸治理:五层纵深防线
每一轮对话都触发长期记忆存储,会不会爆炸?DeerFlow 的答案是:不会,因为架构本身内置了分层写入阈值和异步聚合机制。
源头防控:从写入规则杜绝逐轮冗余
| 层级 | 写入策略 | 防膨胀机制 |
|---|---|---|
| User 短期记忆 | 覆盖式更新 | 始终只保留当前一轮总结,天然不膨胀 |
| History 中长期 | 定时批量聚合(月/季度) | 数百轮对话浓缩为一段月度总结,拒绝逐轮追加 |
| Facts 事实 | 抽取校验前置 | 相似度去重、低置信过滤、单轮新增上限 |
五层存量治理机制
第一层:事实生命周期分级归档
- 超过设定年限从未被检索调用的 Fact → 标记归档
- 同一维度矛盾事实 → 按置信度+时间+来源优先级自动取舍
- 定期批量巡检,用户明确推翻的旧事实主动标记失效
第二层:历史时序分层压缩
- 近期内容保留详细摘要
- 更早阶段逐年精简合并
- 超远期里程碑统一收拢,不再保留细碎细节
第三层:上下文注入裁剪
- 基于当前对话主题做相关性向量匹配,只召回 Top-N
- 设置单次注入 Token 上限,超限自动二次摘要压缩
第四层:存储分库隔离,冷热分离
- 热数据:当前周期 User、近期 History、高频 Fact → 内存 + 在线库
- 冷数据:归档历史、低频 Fact → 低成本归档存储,常规对话不加载
第五层:写入限流与异步队列削峰
- 长期记忆写入全部放入异步消息队列
- 设置单位时间最大入库频次,防止批量抽取击穿存储
- 关键事实修改可开启人工复核,防止 LLM 幻觉批量生成脏数据
六、工业级记忆治理:五大核心机制
记忆熵增定律
只要不加治理,记忆系统一定会自发地从有序走向混乱。只存不治,三大问题必然出现:
- 重复记忆:同一事实存 N 遍,检索结果全是冗余
- 过时记忆:信息过期了还在用,导致决策错误
- 冲突记忆:新旧事实矛盾,Agent 不知道该信哪个
五大治理机制全景
| 治理机制 | 目标 | 核心策略 |
|---|---|---|
| 准入机制 | 不是什么都能进长期记忆 | 重要性打分 + 语义去重 + 事实校验,“宁可少存,也别乱存” |
| 合并归一化 | 解决冗余与实体混乱 | 语义去重合并 + 实体归一化("张三/张总/张工"→同一实体ID) + 冲突解决 |
| 过期遗忘 | 该忘的就得忘 | 时间衰减 + 访问频率衰减 + 定期清理;核心记忆永久保存,普通记忆 90 天过期 |
| 升降级 | 四层联动 | 降级(热→冷):对话溢出写入会话记忆,会话结束提炼写入长期记忆;升级(冷→热):检索命中注入上下文 |
| 安全可控 | 用户要有控制权 | 可视化管理界面 + 全链路审计日志 + 防注入防护 |
主动遗忘会不会把重要信息删掉?
不会,记忆分级处理——
- 核心记忆(用户偏好、重要事实):永久保存
- 普通记忆(单次对话结论):90 天过期
- 临时记忆(中间过程):会话结束就删
七、开源项目记忆架构全景对比
| 维度 | Hermes | OpenClaw | DeerFlow 2.0 |
|---|---|---|---|
| 核心定位 | 有界持久记忆 + 会话搜索 | 个人助理运行时 + 工作区文件记忆 + 混合检索 | 长任务 SuperAgent + 上下文工程 + 本地长期记忆 |
| 上下文窗口 | 核心记忆注入 + 会话搜索 | 核心记忆/近期笔记按需进入上下文 | Sub-Agent 隔离 + 上下文压缩 |
| 工作记忆 | 有界核心偏好约束 | 工作区每日笔记 + 检索索引 | Sub-Agent 上下文隔离 + 文件产物沉淀 |
| 会话记忆 | SQLite 会话搜索 | 每日笔记 + memory_search | 上下文压缩 + 中间结果 offload |
| 长期记忆 | Markdown 核心记忆 + SQLite/FTS5 | MEMORY.md + memory/*.md + 混合索引 | 本地长期记忆 + 文件系统产物 |
| 记忆治理 | 字符上限 + 写入校验 + 重复检测 | 文件可编辑 + 检索增强 + Dreaming 辅助 | 五层纵深防线(写入限流→压缩→归档→裁剪→削峰) |
八、三大设计原则
原则一:分层原则——冷热分层,按需加载
永远不要把所有记忆都塞进上下文窗口。
- 热记忆(第 0 层 + 第 1 层)放缓存,追求速度
- 温记忆(第 2 层)放本地数据库,追求连贯
- 冷记忆(第 3 层)放向量库/归档存储,追求容量
记忆在四层之间自动升降级,该升的升,该降的降。
原则二:治理原则——对抗熵增,动态治理
记忆系统不是"存进去就完事"的仓库,它是需要持续治理的数据资产。五大机制一个都不能少:准入要严、去重要勤、过期要忘、升降要顺、用户要可控。
这是 90% 团队踩过的最大的坑:上线前只做存取不做治理,半年后只能全量清库重来。
原则三:务实原则——场景驱动,按需选择
没有最好的架构,只有最适合场景的架构。
- 个人日常 → Hermes,简单就是美
- 个人助理长期运行 → OpenClaw,透明就是生产力
- 多步骤长任务 → DeerFlow,sub-agent + sandbox + 上下文压缩更合适
九、总结:一句话记住四层记忆
| 层级 | 一句话 | 缺了会怎样 |
|---|---|---|
| 第 0 层 上下文窗口 | 拼速度 | 当前对话无记忆 |
| 第 1 层 工作记忆 | 拼长任务稳定性 | 做不了长任务 |
| 第 2 层 会话记忆 | 拼会话连贯性 | 长对话中间失忆 |
| 第 3 层 长期记忆 | 拼个性化体验 | 做不到"越用越懂你" |
整个 Agent 记忆系统的架构演进,本质上是从"粗放的存取"走向"精细的分层治理"。理解了这四层架构 + 动静拆分 + 五层防爆炸机制,实际做项目,就有了坚实的理论基础。

609

被折叠的 条评论
为什么被折叠?



