转译:深度拆解 Hermes Agent 的记忆系统:它如何修正 OpenClaw 的误区 · AI HOT
宝玉@dotey54
2026-04-30 01:02·64天前
AI 摘要Hermes Agent采用四层记忆架构,核心是保持提示词稳定以优化缓存。第一层是固化在提示词中的MEMORY.md和USER.md文件,容量小以确保缓存友好性;第二层是通过session_search调用的SQLite历史会话存档,实现按需检索;第三层是压缩对话时的记忆冲刷机制,优先保存关键信息;第四层是作为程序记忆的技能管理系统。可选的Honcho层用于深层用户建模。与OpenClaw的流水账存储不同,Hermes严格区分记忆层级,强调缓存效率,旨在以正确成本记住正确信息。
宝玉@dotey · X2026-04-30 01:02·64天前
在 X 看原推· x.comAI 摘要Hermes Agent采用四层记忆架构,核心是保持提示词稳定以优化缓存。第一层是固化在提示词中的MEMORY.md和USER.md文件,容量小以确保缓存友好性;第二层是通过session_search调用的SQLite历史会话存档,实现按需检索;第三层是压缩对话时的记忆冲刷机制,优先保存关键信息;第四层是作为程序记忆的技能管理系统。可选的Honcho层用于深层用户建模。与OpenClaw的流水账存储不同,Hermes严格区分记忆层级,强调缓存效率,旨在以正确成本记住正确信息。
- 使用字符限制而非 Token 限制:这让记忆逻辑与模型无关。Hermes 不需要调用特定模型的计算工具就能判断记忆是否存满。
- 简单的分隔符文件格式:条目之间用 § 分隔。没有复杂的向量数据库(Vector DB),没有自定义二进制存储,就是纯文本。
- 刻意保持极小的系统提示词空间:这是整个设计的重中之重。Hermes 不想把所有历史都塞进提示词,它只想要最有价值的事实。
- 记忆是"精选状态",而不是"日记":这是 Hermes 与 OpenClaw 最大的区别。
OpenClaw 的日志更像是"流水账"。而 Hermes 则反其道而行。它的工具架构和测试逻辑强调: • 保存用户偏好。 • 保存环境事实。 • 保存反复出现的错误修正。 • 保存稳定的规范。 • 不保存任务进度。 • 不保存会话结果。 • 不保存临时的待办事项(TODO)。
真相是:Hermes 希望 MEMORY.md 和 USER.md 保持精简、高频且对缓存友好。
Hermes 通过一个拥有三种操作的 memory 工具来管理这些文件:add(添加)、replace(替换)、remove(移除)。
一个好用的细节是:replace 和 remove 使用子字符串匹配。你不需要记住条目的内部 ID,只需要传入现有条目中一段唯一的文字即可。
此外,系统会拒绝完全重复的内容,并拦截危险信息。源代码会扫描记忆条目,防止提示词注入(Prompt Injection,即通过输入恶意指令误导 AI)、凭证泄露或隐藏的 Unicode 字符。
第二层:用于情景回溯的 session_search
如果说 MEMORY.md 是 Hermes 的"短期热记忆",那么 session_search 就是它的"长尾回溯系统"。
所有过去的会话都存储在 SQLite 数据库中,拥有完整的索引和搜索功能。当模型需要想起以前聊过的内容时,它不去翻 MEMORY.md,而是搜索这个会话数据库。
其工作流程是: 1. 在过去的消息中进行全文搜索。 2. 按会话分组结果。 3. 加载匹配度最高的会话。 4. 使用一个便宜的辅助模型对这些会话进行摘要总结。 5. 将精炼后的回顾内容返回给主模型。
这是一种非常务实的设计。它比盲目地把长篇累牍的历史塞进每一个提示词要便宜且高效得多。
第三层:压缩与记忆冲刷(Memory Flush)
Hermes 另一个聪明之处在于它处理长对话"压缩"的方式。
当会话变得太长,Hermes 会压缩对话中间的部分以节省空间。但摘要是有损的,重要事实可能会丢失。
"会话即将压缩,请保存任何值得记住的东西。优先保存用户偏好、修正建议和重复模式,而非具体的任务细节。"
然后它运行一次额外的模型调用,只开启 memory 工具。如果模型觉得有什么东西该留下来,就会在对话被"洗掉"之前把它写入 MEMORY.md。
技能(Skills)存储在 ~/.hermes/skills/ 下。当 Hermes 发现了一个复杂的流程、修复了一个棘手的问题或学会了更好的方法时,它可以将其保存为"技能"。
大多数记忆系统只关注"语义回溯"(名字、偏好、事实),但智能体还需要记住如何做事。
为了效率,Hermes 不会把所有技能都塞进提示词,而是只放一个技能索引,只有在需要时才加载具体的技能内容。
最后是可选的 Honcho 层。如果说本地记忆是 Hermes 的笔记本,Honcho 就是它尝试构建的复杂用户模型。它能实现跨设备、跨平台的记忆连续性。
最精妙的是它如何在不破坏提示词缓存的前提下实现集成: • 在会话的第一轮,Honcho 的上下文会被织入系统提示词。 • 在之后的对话中,为了保持提示词稳定,Honcho 的回溯内容会附加在当前用户的提问后面,而不是修改系统提示词。
这确保了缓存依然有效,同时 AI 依然能读到最新的背景信息。
• OpenClaw:记忆更接近"以 Markdown 为中心的存储",日志和长效文件是主要事实来源。 • Hermes:提示词记忆被严格限制,历史记录存在 SQLite 里,只有需要时才搜索。
Hermes 更加关注缓存效率。 它认为:不是所有东西都配住在"系统提示词"这个黄金地段。
- 冷热分离:小规模提示词记忆负责常驻信息,搜索负责偶尔用到的信息。
- 缓存优先:它意识到频繁改动提示词会导致延迟增加和成本上升。
- 记忆的多样性:它承认记忆是分层的--包括个人画像、情景回溯、操作技能和深层建模。
Hermes 的核心设计原则最令我折服:记忆应该让智能体变得更好用,而不是通过摧毁提示词的稳定性来换取博闻强识。
真正的诀窍不是记住更多,而是在正确的层级、以正确的成本,记住正确的事情。
Manthan Guptahttp://x.com/i/article/2034841599101009921
Hermes 的上下文结构 在理解记忆之前,我们先看看 Hermes 到底给模型发送了什么。
系统提示词(System Prompt)大致是按以下顺序组装的: ------- 【0】 默认智能体身份 【1】 工具使用行为指南 【2】 Honcho 集成模块(可选) 【3】 可选系统消息 【4】 固化的 MEMORY.md 快照 【5】 固化的 USER.md 快照 【6】 技能索引 【7】 上下文文件(AGENTS.md, SOUL.md 等规则文件) 【8】 日期/时间 + 平台信息 【9】 对话历史 【10】 当前用户消息 --------
这非常关键,因为 Hermes 正在针对大模型供应商的提示词缓存(Prompt Caching)机制进行优化。代码显示,提示词构建器的目标非常明确:让稳定的前缀部分尽可能长时间地保持不变。
这一个决定就解释了 Hermes 大部分的记忆架构。
如果某条信息每一轮对话都要用到,Hermes 会尽量把它缩得很小并注入进去;如果信息量很大、属于历史旧账或者偶尔才有用,Hermes 就会把它踢出提示词,改用"按需检索"的方式。
Hermes 将持久记忆存储在 ~/.hermes/memories/ 下的两个文件中:
1). MEMORY.md 智能体笔记:环境、规范、工具怪癖、教训 限制:2,200 字符
2). USER.md 用户画像:偏好、沟通风格、身份信息 限制:1,375 字符
这容量真不大。加起来大约只有 1,300 个 Token(模型理解文本的最小单位)。
在会话开始时,Hermes 加载这两个文件,把它们渲染进提示词区块,然后在整个会话期间固化这个快照。会话中途写入的记忆会立即存入硬盘,但不会改变已经生成的系统提示词。这些改动只有在开启新会话,或者触发了"压缩(Compression)"导致的提示词重建时才会生效。
═══════════ MEMORY (你的个人笔记) 【67% - 1,474/2,200 字符】 ═══════════ 用户的项目是一个位于 ~/code/myapi 的 Rust Web 服务,使用 Axum + SQLx § 这台机器运行 Ubuntu 22.04,安装了 Docker 和 Podman § 用户喜欢简洁的回复,讨厌冗长的解释
- 使用字符限制而非 Token 限制:这让记忆逻辑与模型无关。Hermes 不需要调用特定模型的计算工具就能判断记忆是否存满。
- 简单的分隔符文件格式:条目之间用 § 分隔。没有复杂的向量数据库(Vector DB),没有自定义二进制存储,就是纯文本。
- 刻意保持极小的系统提示词空间:这是整个设计的重中之重。Hermes 不想把所有历史都塞进提示词,它只想要最有价值的事实。
- 记忆是"精选状态",而不是"日记":这是 Hermes 与 OpenClaw 最大的区别。
OpenClaw 的日志更像是"流水账"。而 Hermes 则反其道而行。它的工具架构和测试逻辑强调: • 保存用户偏好。 • 保存环境事实。 • 保存反复出现的错误修正。 • 保存稳定的规范。 • 不保存任务进度。 • 不保存会话结果。 • 不保存临时的待办事项(TODO)。
真相是:Hermes 希望 MEMORY.md 和 USER.md 保持精简、高频且对缓存友好。
Hermes 通过一个拥有三种操作的 memory 工具来管理这些文件:add(添加)、replace(替换)、remove(移除)。
一个好用的细节是:replace 和 remove 使用子字符串匹配。你不需要记住条目的内部 ID,只需要传入现有条目中一段唯一的文字即可。
此外,系统会拒绝完全重复的内容,并拦截危险信息。源代码会扫描记忆条目,防止提示词注入(Prompt Injection,即通过输入恶意指令误导 AI)、凭证泄露或隐藏的 Unicode 字符。
第二层:用于情景回溯的 session_search
如果说 MEMORY.md 是 Hermes 的"短期热记忆",那么 session_search 就是它的"长尾回溯系统"。
所有过去的会话都存储在 SQLite 数据库中,拥有完整的索引和搜索功能。当模型需要想起以前聊过的内容时,它不去翻 MEMORY.md,而是搜索这个会话数据库。
其工作流程是: 1. 在过去的消息中进行全文搜索。 2. 按会话分组结果。 3. 加载匹配度最高的会话。 4. 使用一个便宜的辅助模型对这些会话进行摘要总结。 5. 将精炼后的回顾内容返回给主模型。
这是一种非常务实的设计。它比盲目地把长篇累牍的历史塞进每一个提示词要便宜且高效得多。
第三层:压缩与记忆冲刷(Memory Flush)
Hermes 另一个聪明之处在于它处理长对话"压缩"的方式。
当会话变得太长,Hermes 会压缩对话中间的部分以节省空间。但摘要是有损的,重要事实可能会丢失。
"会话即将压缩,请保存任何值得记住的东西。优先保存用户偏好、修正建议和重复模式,而非具体的任务细节。"
然后它运行一次额外的模型调用,只开启 memory 工具。如果模型觉得有什么东西该留下来,就会在对话被"洗掉"之前把它写入 MEMORY.md。
技能(Skills)存储在 ~/.hermes/skills/ 下。当 Hermes 发现了一个复杂的流程、修复了一个棘手的问题或学会了更好的方法时,它可以将其保存为"技能"。
大多数记忆系统只关注"语义回溯"(名字、偏好、事实),但智能体还需要记住如何做事。
为了效率,Hermes 不会把所有技能都塞进提示词,而是只放一个技能索引,只有在需要时才加载具体的技能内容。
最后是可选的 Honcho 层。如果说本地记忆是 Hermes 的笔记本,Honcho 就是它尝试构建的复杂用户模型。它能实现跨设备、跨平台的记忆连续性。
最精妙的是它如何在不破坏提示词缓存的前提下实现集成: • 在会话的第一轮,Honcho 的上下文会被织入系统提示词。 • 在之后的对话中,为了保持提示词稳定,Honcho 的回溯内容会附加在当前用户的提问后面,而不是修改系统提示词。
这确保了缓存依然有效,同时 AI 依然能读到最新的背景信息。
• OpenClaw:记忆更接近"以 Markdown 为中心的存储",日志和长效文件是主要事实来源。 • Hermes:提示词记忆被严格限制,历史记录存在 SQLite 里,只有需要时才搜索。
Hermes 更加关注缓存效率。 它认为:不是所有东西都配住在"系统提示词"这个黄金地段。
- 冷热分离:小规模提示词记忆负责常驻信息,搜索负责偶尔用到的信息。
- 缓存优先:它意识到频繁改动提示词会导致延迟增加和成本上升。
- 记忆的多样性:它承认记忆是分层的--包括个人画像、情景回溯、操作技能和深层建模。
Hermes 的核心设计原则最令我折服:记忆应该让智能体变得更好用,而不是通过摧毁提示词的稳定性来换取博闻强识。
真正的诀窍不是记住更多,而是在正确的层级、以正确的成本,记住正确的事情。
Manthan Guptahttp://x.com/i/article/2034841599101009921