当一个 Agent 说"我记得",它真的理解自己记住了什么吗?本文通过源码分析,深度拆解 Hermes Agent 的长期记忆系统与 OpenClaw 的反思机制,从设计哲学到实现细节,厘清两条截然不同的记忆路线。
序:两种记忆哲学
在 AI Agent 的记忆设计中,存在两条根本不同的路线:
- 长期记忆(Long-Term Memory):像人一样,把经历变成稳定的知识,需要时检索使用
- 反思机制(Reflection):不是被动存储,而是在使用前主动分析、提炼、从经验中学习
Hermes Agent 走第一条路,OpenClaw 走第二条路。两者都不是完美的——理解它们的局限,才能用好它们。
一、Hermes Agent:长期记忆系统
1.1 核心架构:MemoryManager + MemoryProvider
Hermes Agent 的记忆系统由 MemoryManager(agent/memory_manager.py)统一编排,这是一个精巧的插件式架构:
1 | # run_agent.py 中的初始化 |
关键约束:只能有一个内置 + 一个外部 provider。 这不是技术限制,而是产品哲学——避免工具 Schema 膨胀和记忆后端冲突。
MemoryProvider 抽象基类(agent/memory_provider.py)定义了生命周期:
1 | initialize() → session 启动时连接/建表 |
1.2 内置记忆: +
内置的 BuiltinMemoryProvider 将两个 Markdown 文件作为记忆载体:
MEMORY.md:项目级记忆——项目结构、约定、已解决的问题USER.md:用户画像——偏好、沟通风格、长期目标
这两个文件通过 memory_context XML 标签注入到上下文中:
1 | # memory_manager.py:build_memory_context_block() |
这个 <memory-context> 围栏是给模型的明确信号:这是记忆,不是用户输入。
1.3 外部 Provider:Honcho、Mem0、Hindsight
Hermes Agent 支持插入外部记忆后端(plugins/memory/ 目录),目前官方支持:
| Provider | 特点 |
|---|---|
| Honcho | 轻量对话摘要,注重实用性 |
| Mem0 | 向量嵌入 + 语义检索 |
| Hindsight | 经验驱动的记忆优化 |
| Holographic | 分布式记忆一致性 |
| RetainDB | 结构化关系记忆 |
每个 Provider 实现 MemoryProvider ABC,可以自由替换。唯一限制:同时只能激活一个外部 Provider。
1.4 FTS5 全文搜索:SessionDB
记忆的检索层基于 SQLite + FTS5(hermes_state.py):
1 | # SessionDB 支持 FTS5 搜索历史对话 |
这是**情节记忆(Episodic Memory)**的实现——完整的对话历史,可按时间检索。
1.5 自动创建 Skills:从经验中沉淀
Hermes Agent 不只是存储记忆,它从经验中生成可复用技能:
1 | # agent/prompt_builder.py 中对模型的指令 |
当 Agent 完成一个复杂任务,它被提示将解决方案写成 SKILL.md,下次遇到类似问题直接加载 Skill——这是从情节记忆到**程序记忆(Procedural Memory)**的转化。
1.6 Insights Engine:用量分析记忆
agent/insights.py 提供了会话级分析引擎:
1 | class InsightsEngine: |
这是元认知(Metacognitive)记忆——不是存储任务内容,而是存储 Agent 自身行为模式的统计。
1.7 上下文压缩:保护核心记忆
ContextCompressor(agent/context_compressor.py)在上下文快满时做有损压缩,但有保护机制:
1 | threshold_percent = 0.75 # 75% 上下文时触发压缩 |
BuiltinMemoryProvider.on_pre_compress() 钩子允许记忆 Provider 在压缩前提取关键信息,确保记忆层不会被压缩掉。
二、OpenClaw:反思机制
2.1 反思的哲学:Correct Once, Never Again
OpenClaw 的反思系统建立在核心理念上:不要重复犯错,每一次纠正都应该成为永久改进。
这与 Hermes Agent 的"存储后检索"模式相反——OpenClaw 不存储对话本身,而是存储从对话中提炼出的规则和模式。
2.2 /reflect Skill:自我改进循环
OpenClaw 的核心反思 Skill(openclaw/skills/agent-reflect)实现了一个四步循环:
1 | 扫描对话 → 信号识别 → 分类映射 → 写入 Agent 定义 |
信号识别(signal_patterns.md)定义了三种信号:
| 信号类型 | 描述 | 置信度 |
|---|---|---|
| 显式纠正 | 用户明确说"不要这样做" | 高 |
| 隐式成功 | 某方案一次通过,没有重试 | 高 |
| 行为观察 | Agent 注意到自己的行为模式 | 中 |
分类映射将信号路由到目标文件:
1 | 代码风格规则 → code-reviewer, frontend-developer |
关键约束:永远不自动应用——所有变更提案必须经过用户显式批准。Skill 生成完整 diff,用户说"OK"才写入。
2.3 Thinking Clock:周期性反思
Issue #17287 实现的"思考时钟"是一个双模型编排的主动反思系统:
1 | 每 N 分钟(默认5分钟)→ 触发"tick" |
成本对比:
- 纯主模型(200 ticks/天):$50+/天
- 双模型编排(200 + 10 escalation):$2.5/天
本质上是注意力资源分配:用廉价模型做外围扫描,用昂贵模型做深度思考。OpenClaw 称之为"环境认知(Ambient Cognition)"——不是被动等待用户输入,而是周期性地主动审视自己的状态。
2.4 Memory-Core Plugin SDK
OpenClaw 在 Plugin SDK 中内置了 memory-core,包含多个专业引擎:
1 | memory-core/ |
这是一个生产级的记忆基础设施,支持嵌入、多模态输入、QMD 查询描述语言,以及可插拔存储。设计思路接近 Mem0/Weaviate,但深度集成到 OpenClaw 运行时。
2.5 Skills as 程序记忆
OpenClaw 的 Skills 遵循 ~/.claude/skills/{name}/SKILL.md 格式——与 Claude Code 共用同一套 Skill 标准。每个 Skill 包含:
- name / description:元数据
- triggers:激活关键词
- platforms:适用平台
- metadata:配置变量
Skills 由 Agent 动态加载(按需读取 SKILL.md),不占用固定上下文。OpenClaw 通过 skill-creator Skill 支持从对话中自动生成新 Skill——同样是"反思→沉淀"模式。
2.6 Session JSONL:情节记忆但不存储
OpenClaw 的会话存储为 JSONL 文件(~/.openclaw/agents/main/sessions/{sessionId}.jsonl),但 /reflect Skill 只读取每个 session 的最后约 50 行——这意味着:
- 不存储完整历史,只保留最近经验
- 长期知识必须通过反思显式提取并写入 Skill/CLAUDE.md
- 这是刻意设计的遗忘机制——避免记忆过载和过时信息污染
三、核心对比
| 维度 | Hermes Agent | OpenClaw |
|---|---|---|
| 记忆类型 | 长期记忆(Semantic + Episodic) | 反思提炼(Procedural) |
| 存储内容 | 对话历史、项目信息、用户偏好、技能 | 从对话中提炼的规则、模式、新技能 |
| 检索方式 | FTS5 全文搜索 + 嵌入向量检索 | Skill 动态加载 + 周期性扫描 |
| 遗忘机制 | 有界存储(压缩摘要) | 强制遗忘(只读最近 50 行) |
| 学习方式 | 被动积累 | 主动反思 |
| 外部 Provider | Honcho, Mem0, Hindsight 等插件 | Memory-Core SDK(内置) |
| Skill 生成 | 自动从经验创建 SKILL.md | /reflect Skill 提案 + 用户批准 |
| 记忆工具 | memory、session_search 工具 |
/reflect 命令 + Thinking Clock |
| 上下文窗口策略 | 压缩保护 + 记忆注入 | Skill 动态加载 + 轻量上下文扫描 |
| 成本控制 | 固定 FTS5 检索成本 | Thinking Clock 可变成本(双模型编排) |
四、设计哲学的本质分歧
Hermes Agent = 人类记忆模型
1 | Experience → Episodic Memory → Semantic Memory → Skill |
Hermes Agent 的设计模仿人类海马体-皮层记忆系统:
OpenClaw = 组织学习模型
1 | Experience → Reflection → Rule/Skill → Next Experience |
OpenClaw 的设计模仿组织知识管理:
- 不存储原始会议记录,而是写"经验教训"
- 不保留完整邮件历史,而是提炼 SOP(标准操作流程)
- 知识的价值在于被引用,不在于被存档
五、各自的局限
Hermes Agent 的陷阱
- 记忆污染:FTS5 检索可能召回过时或错误的信息,特别是在上下文快满时被压缩过的记忆
- ** Provider 锁死**:一次只能用一个外部 Provider,切换成本高
- Skill 膨胀:Auto-created Skills 如果不维护,会积累大量过时 Skill,反而成为噪声
- 无主动推理:记忆只在被检索时激活,Agent 不会主动检查记忆的相关性
OpenClaw 的陷阱
- 反思覆盖不足:只有显式调用
/reflect或 Thinking Clock 触发时才工作,如果用户从不触发就等于没有记忆 - 50 行限制的信息丢失:复杂的多轮任务无法通过最后 50 行完整重建
- 自我偏见的风险:“Sycophantic reflection”——模型可能认同自己的输出而非真正批判(学术研究已发现此问题)
- Skill 碎片化:每个 Skill 是独立文件,缺乏全局索引,跨 Skill 的模式无法被自动发现
六、适用场景
选 Hermes Agent 当:
- 需要跨会话保持项目上下文(长期开发任务)
- 用户偏好必须被记住(个人助理场景)
- 需要 FTS5 精确搜索历史对话
- 需要接入 Mem0 等第三方记忆服务
- Skill 自动生成且不需要用户审批
选 OpenClaw 当:
- 需要从经验中提炼可复用规则
- 任务由短期冲刺组成,不需要完整历史
- 记忆的"干净"比"完整"更重要
- 需要周期性主动思考(Thinking Clock)
- 与 Claude Code 共用 Skill 生态
结语
两条路线并无优劣之分。Hermes Agent 的记忆系统更接近人类的连续性自我,而 OpenClaw 的反思系统更接近人类的批判性学习。
最有意思的方向是将两者结合:用 Hermes Agent 的长期存储做情节记忆,用 OpenClaw 的反思机制做经验提炼。事实上,OpenClaw 的 memory-core SDK 已经有向量嵌入能力,而 Hermes Agent 的 BuiltinMemoryProvider 也在往更智能的检索方向发展。
记忆的本质不是存储,而是让过去的经验影响未来的行为。在这个意义上,最成功的 Agent 记忆系统,或许既不是"记住一切",也不是"反思一切",而是记住正确的事情,并确保这些事情在正确的时间、以正确的方式影响决策。
本文源码分析基于 Hermes Agent v0.8.0( NousResearch/hermes-agent)和 OpenClaw(openclaw/openclaw),2026年4月。