1. 背景与理论框架
1.1. 核心问题
大语言模型本身是无状态的------每次调用都从零开始,它不记得任何事情。这个根本约束决定了所有 Agent 框架都必须在模型外面搭一套记忆系统,并回答四个架构问题:存什么、存在哪、怎么取、怎么管。
1.2. 记忆的四个层次
Agent 记忆通常被划分为四种类型,其中外部记忆 和情景记忆是三个框架差异最大的地方:
| 记忆类型 | 特征 | 三家差异度 |
|---|---|---|
| 上下文记忆(In-context) | Token 窗口内,零延迟,会话结束即消失 | 无差异 |
| 外部记忆(External) | 文件、数据库、向量库,跨会话存活 | 差异大 |
| 情景记忆(Episodic) | "做过什么、怎么做的、结果如何"的结构化记录 | 差异最大 |
| 参数记忆(Parametric) | 模型训练权重中的知识 | 无差异 |
2. OpenClaw:文件系统即记忆
2.1. 核心设计
OpenClaw 的记忆架构建立在一个极简原则上:没有写进文件的,不存在。所有长期状态必须持久化到磁盘上的 Markdown 文件里,文件本身就是记忆的存储介质,也是人机协作的接口。
为什么选择文件而不是数据库?
文件的人类可读性、手动可编辑性和 Git 版本可回溯性是数据库不具备的。代价是查询能力远不如数据库。
2.2. 三层记忆结构
| 层级 | 存储位置 | 内容 | 加载策略 |
|---|---|---|---|
| 短期记忆(Daily Log) | memory/YYYY-MM-DD.md |
当天活动 append-only 日志 | 当日 + 昨日自动注入 |
| 近端记忆(Sessions) | sessions/ 目录 |
完整会话存档 | 对话过长时冲刷到此 |
| 长期记忆 | MEMORY.md |
偏好、决策、持久事实 | 每次 DM 会话自动加载 |
这套分层设计的核心思想是:模型不需要知道所有事,只需要知道此刻最相关的事。
2.3. 检索机制:BM25 + 向量混合搜索
底层以 SQLite 为基础,建立 FTS5 全文索引和 sqlite-vec 向量索引,支持语义搜索与精确匹配的混合检索。向量维度为 1536,且具备优雅降级能力------如果没有安装向量扩展,系统回退到 JS 暴力计算。
2.4. 长期记忆演进:Dreaming 系统
OpenClaw 设计了一套名为 "Dreaming" 的后台记忆巩固系统,通过 Cron 定时任务自动运行,将短期信号逐步转化为长期记忆。Dreaming 由三个阶段组成,按顺序依次执行:Light → REM → Deep。
- Light:识别当日日志中的关键信息
- REM:跨日志关联,发现模式和趋势
- Deep:将经过验证的模式写入长期 MEMORY.md
2.5. 核心痛点
- 记忆只进不出:OpenClaw 的 MEMORY.md 是纯追加模式,用几个月就膨胀成几万行的"怪兽文件",患上了"数字囤积症"。
- 提炼依赖人工:从日志升级到长期记忆主要靠人手动维护,自动化程度有限。
- 记忆质量不稳定:写入决策完全由 LLM 自主判断,无结构化约束。
3. Claude Code:分层索引的 Hint 型记忆
3.1. 核心设计
Claude Code 的记忆系统定位为 Hint 型记忆,以项目为单位的文件系统方案,提供结构化分层组织。它没有一个庞大的知识库,而是将记忆划分为多个主题文件,通过一个索引文件串联。
3.2. 四层架构
| 层级 | 文件 | 说明 |
|---|---|---|
| CLAUDE.md | CLAUDE.md(项目/个人/组织三级 scope) |
静态规则文件,由用户手动编写 |
| Auto Memory | memory/ 目录(MEMORY.md 索引 + 多主题 .md) |
Agent 会话中自动记录,200 行索引上限 |
| Auto Dream | 后台压缩整理 | 空闲时合并碎片化记忆 |
| KAIROS(未发布) | 常驻守护进程模式 | 源码泄露中发现,尚不开放 |
用户写入的 CLAUDE.md 是静态的、预先设定的规则;而 Auto Memory 是动态的------Agent 在会话中发现有价值的信息时,会自动保存为 Markdown 文件。
3.3. 四种记忆类型
系统通过 memoryTypes.ts 严格定义了四种记忆类型,各有明确的作用域和存储规则:
| 类型 | 用途 | 作用域 | 举例 |
|---|---|---|---|
| User(用户记忆) | 角色、职责、偏好 | 始终私有 | "用户是数据科学家,专注于日志系统" |
| Feedback(反馈记忆) | 用户纠正、偏好反馈 | 私有/团队 | "集成测试必须用真实数据库,禁止 mock" |
| Project(项目记忆) | 决策、截止日期、技术选型 | 团队共享 | "认证模块重写是由合规需求驱动的" |
| Reference(参考记忆) | 外部系统指针 | 团队共享 | "Bug 跟踪在 Linear INGEST 项目" |
每个笔记是独立的 Markdown 文件,MEMORY.md 充当索引------每行不超过 150 字符的简短标签指向详细文件,Claude 先读索引再按需拉取具体文件。
3.4. 存储路径
~/.claude/projects/<project-path>/memory/
├── MEMORY.md # 索引文件,每行一个条目指针
├── user_role.md # 用户的角色和技能
├── feedback_testing.md # 测试规范的反馈
├── project_auth.md # 认证模块的决策
└── reference_linear.md # 外部工具引用
3.5. 核心痛点
- 200 行索引硬上限:最多约 200 条记忆,超出无法写入。
- 仅精确关键词匹配:搜索依赖关键词匹配,"port conflicts"搜不到"docker-compose mapping"。
- 记忆不出 Claude Code:切换到其他 Agent 从零开始。
- 无中长期记忆桥接:Auto Dream 能处理几天内的杂讯,但无法跨越月级时间。
4. Hermes Agent:主动学习型的自进化记忆
4.1. 核心设计
Hermes Agent 的记忆系统是其"自我成长"能力的核心支撑。它设计得极为克制------核心记忆仅由 两个纯文本文件 承载,用 § 分隔条目:
~/.hermes/memories/
├── MEMORY.md # Agent 的个人笔记(环境事实、项目约定、工具怪癖)
└── USER.md # Agent 对用户的认知(偏好、沟通风格、工作习惯)
这两个严格的上限产生了巧妙的设计效果:容量有限迫使 Agent 挑重要的事情记,不重要的自然被挤掉。与 OpenClaw 的"只进不出"形成鲜明对比------Hermes 通过硬约束迫使 Agent 做信息压缩,过时的自然被淘汰,留下的都是高密度事实。
4.2. 超限处理机制
当新记忆会导致超限时,Hermes 选择让 add 操作直接失败,并把当前所有条目返回给 LLM,让模型自己决策保留什么、删除什么------而非静默丢弃或自动压缩。这种设计赋予模型对记忆的完全掌控权。
4.3. 三层记忆架构
| 层级 | 存储方式 | 功能 |
|---|---|---|
| 瞬时记忆层 | Redis 缓存 | 毫秒级响应,最大 100 MB/Session |
| 工作记忆层 | SQLite + FTS5 全文搜索 + 向量索引 | 跨会话语义检索,10 万条对话关键信息召回率 92.3% |
| 长期记忆层 | MEMORY.md + USER.md | 结构化知识,字符硬上限约束 |
工作记忆层的 FTS5 检索引擎支持 TB 级上下文数据的毫秒级检索,辅以 LLM 生成的摘要,确保 Agent 能想起数周前的对话细节。
4.4. 主动触发与自我进化
Hermes 的最大区别在于触发时机的主动性。OpenClaw 是被动触发式记忆------用户说"记住"才会记;Claude Code 做到了主动记录,但底线是"对事不对人"。
而 Hermes 的记忆系统是有机的:
- 自动记忆写入:Agent 自主判断哪些信息值得存入 MEMORY.md/USER.md
- Skill 自主创建:当 Agent 调用 5 次以上工具、自我纠错或被用户纠正后,自动将成功经验蒸馏为结构化的 Skill 文件。如果后续发现更优路径,还会通过"补丁"方式优化已有技能
- Nudge Engine:定时提醒 Agent 回顾历史,检查是否有值得提炼的经验
- 用户建模(Honcho 引擎):感知用户的回复风格偏好(简洁 vs 详细)、领域背景(资深工程师 vs 初学者),实现"辩证式"用户理解
4.5. 记忆冻结快照
MemoryStore 维护两组平行状态------实时可写的条目列表和会话开始时冻结的快照。这种设计保证了前缀缓存效率------同一会话中 system prompt 不必反复变化。
5. 记忆压缩算法深度对比
记忆的"存储"只是手段,"记住该记的、忘掉该忘的"才是目的。三个框架在压缩算法上的分歧,比存储结构上的分歧更本质------它直接决定 Agent 长期运行后的信息密度有多高。
5.1. OpenClaw:渐进式巩固(Dreaming 管线)
OpenClaw 不删除数据,而是通过 "巩固" 模拟人类睡眠的记忆加工过程,将原始日志逐级抽象。其压缩管线可抽象为三层提炼:
原始日志 (Daily Log)
│
▼ Light : 提取当日实体、决策、关键事件,消除时间线冗余,生成结构化摘要
│
▼ REM : 跨日志关联,合并重复事实,识别模式(如"用户总是拒绝 Docker 方案")
│
▼ Deep: 将高置信度模式蒸馏为持久记忆规则,写入 MEMORY.md
压缩策略特征:
- 算法类型:提取式摘要 + 多步关联推理,基于 LLM 提示链
- 核心机制:不丢弃任何原始数据,原始日志始终保留;上层提取物仅作为快捷索引
- 压缩比:无硬约束,压缩比取决于 LLM 输出长度,典型 20:1~50:1
- 信息丢失风险:极低(原始完整日志可回溯),但检索效率随日志膨胀而线性下降
- 遗忘控制:无主动遗忘机制,冗余信息通过人工清理实现
优劣:信息保真度最高,但"数字囤积症"是最大代价------三个月后 Agent 调取记忆需要扫描数万行日志。
5.2. Claude Code:索引合并 + 摘要头
Claude Code 的压力来自 200 行索引硬上限。当记忆条目逼近阈值时,需执行压缩。其 Auto Dream 机制运作方式如下:
- 碎片合并:将多个内容高度重叠的笔记文件合并为一个概括性文件,原文件被新文件替代
- 生成摘要头:每个记忆文件开头生成一句不超过 150 字符的摘要行,作为索引条目
- 索引瘦身:合并后旧索引行删除,总索引行数不突破 200 行阈值
压缩策略特征:
- 算法类型:合并式压缩 + 提取式摘要,单向不可逆
- 核心机制:基于 LLM 的文本整合,产生一个"覆盖旧事实的新版本",旧细节永久丢失
- 压缩比:强制遵守索引上限,驱动压缩频率;压缩比受条目数量驱动,无固定值
- 信息丢失风险:高,细节在合并中可能被平滑掉,特别是低频但重要的边缘案例
- 遗忘控制:类似"覆盖式遗忘"------新综合描述替代细粒度历史记录,无法回退
优劣:查询极快(索引文件仅 200 行),但语义保真度在迭代压缩中持续衰减,对长期跨项目知识积累不友好。
5.3. Hermes Agent:有界淘汰 + 模型自主裁剪
Hermes 的压缩由其硬字符上限驱动,不依赖后台定时任务,而是在记忆写入时实时判断。实现机制分两层:
- 原子写入失败触发 :当
add操作超过字符上限时,API 返回失败,同时将现有全部条目序列化后送入 LLM - 模型自主决策 :LLM 需要同时完成两件事------评估新记忆的重要程度,并从现有条目中自选淘汰对象 。它可能选择:
- 直接丢弃新记忆(如果新信息重要性低)
- 删除一条旧的不再相关的条目(如一个已修复的工具 Bug 怪癖)
- 将两条高度相关的旧条目压缩合并为一条高密度表述,腾出空间
- 重新权衡全局优先级,进行大规模重排
压缩算法可以被形式化为一个受限优化问题:
给定现有记忆集合 M,每条记忆 m_i 有价值分数 s_i(LLM 自行评估),总字符约束 C_max,新记忆 m_new 的估计价值 s_new。求解子集 M' ⊆ M ∪ {m_new},满足 ∑ len(m_i) ≤ C_max 且 ∑ s_i 最大化。
压缩策略特征:
- 算法类型:淘汰式裁剪 + 信息高度浓缩,LLM 作为剪枝函数
- 核心机制 :硬约束倒逼;淘汰在写入时刻同步完成,不依赖后台定时任务
- 压缩比:确定性的 2,200 / 1,375 字符硬分割,信息密度随时间持续上升
- 信息丢失风险:中等,且有"结构性遗忘"风险------被淘汰的条目不可恢复
- 遗忘控制:主动自然淘汰------旧的不相关记忆被新信息挤出,模仿人类有限记忆模型
对比 OpenClaw 的"只进不出"和 Claude Code 的"后台合并覆盖",Hermes 的淘汰是显性、有记录且由模型全权决策的------每次决策都是一个完整的记忆管理对话回合。
5.4. 压缩算法三向对比
| 维度 | OpenClaw | Claude Code | Hermes Agent |
|---|---|---|---|
| 压缩触发时机 | 后台定时(Cron) | 后台空闲时自动触发 | 写入超限时实时同步触发 |
| 压缩方法 | 三阶段提取式巩固,原始数据永存 | 多文件合并 + 摘要头生成,覆盖旧文件 | 模型自主裁剪 + 淘汰或浓缩,旧条目不可恢复 |
| 压缩约束 | 无上限约束,压缩为优化索引 | 200 行索引上限驱动 | 硬字符上限 2200/1375 强约束 |
| 信息丢失模式 | 无丢失,但检索效率逐日衰减 | 细节在合并中消失,不可逆 | 模型自选遗忘对象,记忆密度递增 |
| 遗忘哲学 | 不遗忘,只提炼 | 新版覆盖旧版,事实被平滑 | 主动选择性遗忘,模仿人类记忆 |
| 适合的长期运行时序 | 知识库型长期积累 | 中短期项目周期 | 长期自主学习与自适应 Agent |
6. 三框架核心对比总览
| 对比维度 | OpenClaw | Claude Code | Hermes Agent |
|---|---|---|---|
| 设计哲学 | 文件是唯一真理 | Hint 型记忆,按需加载 | 主动学习,自我进化 |
| 存储介质 | Markdown + SQLite + 向量索引 | Markdown 索引文件体系 | 有界 MD + SQLite + FTS5 |
| 记忆分层 | 三级(日志→会话→长期) | 四层(CLAUDE.md→Auto Mem→Dream→KAIROS) | 三层(瞬时→工作→长期) |
| 长期记忆上限 | 无(纯追加,易膨胀) | 200 行索引硬上限 | 硬约束(2,200 + 1,375 字符) |
| 检索方式 | BM25 + 向量混合搜索 | 精确关键词匹配 | FTS5 全文搜索 + LLM 摘要 |
| 触发方式 | 被动(用户说"记住") | 主动但"对事不对人" | 主动,全历史检索 |
| 压缩算法 | 三阶段提取式巩固,原始数据不丢 | 合并式压缩 + 摘要头,覆盖旧版 | 实时淘汰式裁剪,模型自主决策 |
| 遗忘/压缩哲学 | 不遗忘,只提炼(数字囤积) | 新覆盖旧,细节被平滑 | 主动选择性遗忘,密度持续上升 |
| 自动化程度 | 低(人工提炼为主) | 中(自动记录但需用户指导) | 高(Skill 自动蒸馏 + Nudge) |
| 跨会话连续性 | 48 小时日志 + 长期文件 | 项目内持久化 | 跨会话主动检索历史 |
| 可迁移性 | 本地文件,可移植 | 绑定 Claude Code 生态 | 记忆插件可切换,全局共享 |
| 核心局限 | 数字囤积症,记忆质量不稳 | 无语义搜索,记忆量小 | 硬上限可能丢失细节 |
7. 选型建议
| 场景 | 推荐框架 | 理由 |
|---|---|---|
| 知识库型长期积累 / 需完整审计 | OpenClaw | 信息不丢失,文件透明可审计,适合需要完整记录的场景 |
| AI 编程 / 项目周期中短期协作 | Claude Code | 精准上下文管理,索引式快速定位,与开发流程深度集成 |
| 需自主进化、长期共处的智能伙伴 | Hermes Agent | 主动学习、自适应压缩,从工具进化为"另一半脑" |
| 追求极致简化同时保持成长性 | Hermes Agent(轻量部署) | 两个文件即可承载完整长期记忆,自然淘汰噪音 |
| 多 Agent 协作 / 团队共享记忆 | OpenClaw + 共享记忆插件 | 支持记忆按客户隔离、跨 Agent 共享与版本回溯 |
三个框架的压缩算法分歧,本质上是对「完美记忆」与「有用记忆」的不同追求------OpenClaw 保证你什么都不丢,Claude Code 保证你找得快,Hermes Agent 保证你记下的都是值得的。没有绝对优劣,核心取决于你对 Agent 的定位:是一个需要你精心照料的无限记事本,还是一个能自己打理记忆、越用越懂你的智能伙伴。