Hermes 记忆 vs 技能:可视化全解指南

读完这篇,你再也不会搞混记忆和技能,也知道什么时候该建新窗口了。

一、 核心架构:冷热分离与缓存设计

Hermes 的存储架构并非为了简单地“记住更多”,而是基于大模型计算成本的冷热分离原则设计的。

1.1 一张图看懂全家桶

┌──────────────────────────────────────────────────────────┐
│                    每次对话都有                          │
│                                                          │
│   🔥 热数据 (Memory)             ❄️ 冷数据 (Skill)       │
│   ┌──────────────────┐     ┌──────────────────┐         │
│   │   MEMORY(记忆) │     │   SKILL(技能)  │         │
│   │                  │     │                  │         │
│   │  💡 便利贴       │     │  📖 操作手册     │         │
│   │  自动注入每句话  │     │  按需调用加载    │         │
│   │  不超过 4000 字  │     │  多长都可以      │         │
│   │  适合:固定事实  │     │  适合:多步流程  │         │
│   └──────────────────┘     └──────────────────┘         │
│                                                          │
│   🏠 Home(家目录):~/.hermes/                          │
│      └── memories/          └── skills/                 │
│          MEMORY.md               note-taking/            │
│          USER.md                 software-development/   │
│                                  ...                     │
└──────────────────────────────────────────────────────────┘

1.2 核心设计哲学:保护提示词缓存

大模型供应商(如 DeepSeek、Anthropic 等)会缓存你系统提示词的前面部分。如果你每次对话的“前缀”都一样,供应商会直接返回缓存结果——不仅速度快,而且能省下重新计算这部分算力的费用

Hermes 的系统提示词组装顺序如下:

─────────────────────────────────────────────
[0]  默认智能体身份(永远不变)
[1]  工具使用行为指南(永远不变)
[2]  Honcho 集成(可选)
[3]  可选系统消息
[4]  MEMORY.md 快照    ← 这部分每次不变,就能命中缓存
[5]  USER.md 快照       ← 同上
[6]  技能索引           ← 每次只扫名称+简介(≈300 token)
[7]  上下文文件(规则文件)
[8]  日期/时间 + 平台信息
[9]  对话历史
[10] 当前用户消息
─────────────────────────────────────────────
前面这部分越稳定,缓存命中率越高 = 越便宜、越快

为什么这对你很重要? 如果频繁修改记忆,系统提示词的前缀就会变,缓存就会失效(缓存 TTL 通常为 5 分钟)。因此,记忆必须保持精简、高频。真正的诀窍不是记住一切,而是在正确的层级、以正确的成本,记住正确的事情

层级叫法在提示词里?成本
🔥 热MEMORY.md / USER.md✅ 每次都在高(每次都烧)
🌡 温session_search(全文搜索)❌ 按需调用中(只用时烧)
❄️ 冷技能文件(SKILL.md)❌ 按需加载低(只加载需要的)

二、 🔥 记忆(Memory):高频固定的“便利贴”

2.1 本质与工作方式

本质:每次对话自动注入的便利贴。 不管你聊什么,它都在你开头——像你办公桌上贴的一张纸,上面写着你的习惯、路径、规则。

你发消息 → 系统读 MEMORY.md + USER.md → 拼进提示词 → 回复
           ↑ 每次都读,每次都拼

2.2 记忆文件的真实格式与细节

记忆文件其实是纯文本 Markdown,条目之间用 § 分隔,简单到不可能出错:

═══════ MEMORY(你的个人笔记)[37% — 1,501/4,000 chars] ═══════
公司名称:lonsun-site → 朗盛贸易
§
WSL 约束:Ubuntu 24.04 + 镜像网络模式
§
抓取禁令:严禁使用无头浏览器抓取
  • 字符限制而非 Token 限制:这样记忆逻辑与模型无关。不管用 DeepSeek 还是未来换其他模型,4000 字符就是 4000 字符。如果用 Token 限制,不同模型的 Token 化方式不同,需要额外计算工具才能判断是否存满。

  • 无数据库:纯文本存储,无向量库。

  • 自动去重与安全扫描:写入重复内容会被拒绝;系统会扫描凭证泄露或恶意注入。

2.3 什么时候用记忆?(一针见血,别啰嗦)

记忆不是日记,不记历史事件。 历史事件靠 session_search 召回。

场景例子
固定路径知识库在 /mnt/d/个人知识库/
用户偏好称呼你”大菜”,叫你”Zack”
环境约束Playwright/Chrome 在 WSL 下跑不了
安全规则删除 D 盘文件必须列清单确认
公司映射lonsun-site → 朗盛贸易
  • ✅ 正确:公司名称:lonsun-site → 朗盛贸易(一句搞定)

  • ❌ 错误:当用户说朗盛贸易/lonsun时,你应该这样那样...(流程放技能)

  • ❌ 错误:2026-04-29 修复了 XX 问题,具体做法是...(日志放温数据搜索)

2.4 记忆冲刷(Memory Flush):长对话的自动沉淀

当对话太长(超过阈值 50%),Hermes 会把对话压缩到 20%。由于摘要是有损的,压缩前系统会执行记忆冲刷

检测到对话过长(超过 50% 阈值)
       ↓
发送指令给模型:"会话即将压缩,请保存任何值得记住的东西"
       ↓
       ↓ 优先保存:用户偏好、修正建议、重复模式
       ↓ 不保存:任务进度、会话结果、临时 TODO
       ↓
模型只开启 memory 工具 → 把重要事实写入 MEMORY.md
       ↓
开始压缩对话(压缩到原来 20%)

这意味着: 长聊天中如果我突然做了一个”正确修正”,即使对话后来被压缩了,这个修正大概率会被自动记住。你甚至不需要说”记住这个”。

三、 ❄️ 技能(Skill):按需加载的“操作手册”

3.1 本质与工作方式

本质:按需加载的操作手册。 用完了就忘,不占每次对话的 token。

你发消息 → Hermes 判断 → "这跟知识库有关" → 去 skills/ 找笔记技能
                                                    ↓
                                              读技能文件 → 按流程执行

3.2 技能里有什么?

以note-taking/knowledge-base-auto-router/SKILL.md为例
├── 核心路径配置(知识库在哪里)
├── 意图路由规则("知识库:" → 写入;"同步网站" → 发布)
├── 完整发布流程(10+ 步详细步骤)
├── 避坑指南(Auto Note Mover 三大坑)
└── 看板处理方案

3.3 什么时候技能 > 记忆?

一句话总结:事实用记忆,流程用技能。

场景记忆技能
”Quartz 在哪”✅ 一句给出路径❌ 杀鸡用牛刀
”同步网站到数字花园”❌ 记不下 20 步流程✅ 完整流程都在
”查一下 MLCC 价格”❌ 查询逻辑写不进几行✅ 含 API 调用 + 重试
”删 D 盘文件注意什么”✅ 提醒必须确认❌ 不需要技能

一句话总结:事实用记忆,流程用技能。

3.4 技能的自我修正

技能是活的。如果在执行中发现流程不对(例如漏了 index.md 检查),你只需指出:“这个不对,漏了一步”。Hermes 会直接定位到对应的技能文件,用 patch 工具精准替换错误步骤。你不需要自己去编辑 Markdown,也不需要教它格式。

四、 🌡️ 跨会话搜索(Session Search):连接孤岛

这是你在建了新窗口之后,让 Hermes 回忆起之前聊过的事的核心工具。

4.1 它是怎么工作的?

它不是把整个老窗口塞回来,而是搜所有历史窗口的摘要

你发新窗口第一句 → Hermes 自动判断 → "ta 在问以前的事"
                                    ↓
                            调用 session_search 工具
                                    ↓
                            返回相关对话的摘要(≈200-300字)

关键特点:

  • 自然语言触发 —— 不需要写 session_search() 这个括号,说”帮我查一下之前聊过什么”就行
  • 只返回摘要 —— 不是把整个老窗口塞回来,而是 AI 读完老窗口后给你的概括,省 token
  • 跨窗口回忆 —— 搜的是所有历史窗口,不只上一个
  • 支持模糊搜索 —— 不记得准确关键词也能搜到,但关键词越准命中率越高

4.2 实战用法与话术

Z.G.(新窗口第一条消息): “帮我查一下之前聊 session_search 关于记忆瘦身那次聊了什么”

Zack: “找到了,上次我们做了这些事…”

搜索小技巧:

  • OR 连接相关词 → "记忆瘦身 OR 技能分工 OR 指南"(搜到概率更高)
  • 精准短语用引号 → "Auto Note Mover"(精确匹配)
  • 不知道关键词 → 直接说内容,如”上次我们修了一个文件重复的问题”
  • 想搜跨多次对话的某个主题 → 一次不行再试一组不同关键词,Zack 会自动组合

关键词对照清单(存着用):

你想聊什么建议发送的话术
记忆 vs 技能"帮我查一下记忆瘦身那次聊了什么"
知识库怎么用"搜索一下知识库路由自动化的记录"
Quartz 发布"查之前 Quartz 同步数字花园的讨论"
之前某个 bug"之前我们修复了什么 bug 记录一下"
元件价格查询"搜一下 Findchips 元器件价格的聊天"
组合/模糊搜索"查查 Auto Note Mover 出了什么问题 OR 索引报错"

4.3 什么时候用 session_search vs 建新窗口 vs 继续用

需求方法说明
新窗口想找回以前聊过的事session_search在新窗口第一句话直接说
当前窗口想继续聊同一个话题继续用记忆已加载,省 token
当前窗口已经 50+ 条,卡了建新窗口 + session_search先切新窗口,再搜
我想看当时的具体文件/代码session_search 拿到摘要后 → 让 Zack 去读文件摘要只能告诉你”做过什么”,具体内容靠文件系统
我不记得关键词了直接说大概内容session_search 用全文搜索,模糊也能匹配

五、 决策指南:Token 损耗与窗口管理

你经常感觉“怪怪的”,不知道该不该新建窗口。理解以下逻辑,就能做出最经济的判断。

5.1为什么有时候说”不要新建窗口,省 token”

5.1.1因为记忆(Memory)重新加载会消耗 token。

新建窗口 → 系统加载 MEMORY.md(~1500 字)+ USER.md(~600 字)
         → 直接消耗 ≈2000 token
         → 再加上系统提示词(~8000 token)
         → 第一句话还没说,已消耗 ≈10000 token

如果一个对话还能继续(上下文还没爆),续着用比新建省 token,因为记忆已经加载过了,新消息只增加少数 token。

5.1.2 但省钱的原因不止一个:提示词缓存(Prompt Caching)

除了”记忆不用重新加载”之外,还有一个更大的原因——提示词缓存

Hermes 刻意保持系统提示词的前缀(prefix)稳定不变,是因为大模型供应商会缓存这部分:

你第一次发消息:
  系统提示词前缀(稳定不变)→ 供应商缓存起来(花一次算力)

你第二次发消息:
  系统提示词前缀(跟上次一样)→ 供应商直接用缓存(打折!)

你新建窗口:
  系统提示词前缀(跟上次一样)→ 缓存可能还在(TTL 5 分钟)

如果在同一个窗口内继续聊,缓存前缀一直有效,系统提示词那上万 token 的”算力”是共享的。

但如果你频繁新建窗口,或者每次会话间隔太长(超过缓存 TTL 5 分钟),缓存就失效了。这就是为什么短期密集的对话尽量别切窗口

一句话:提示词缓存是省大钱的地方,记忆瘦身只是省小钱。 但两者目的一致——维持系统提示词前缀稳定。

5.2 为什么有时候又说”上下文太长,建议建新窗口”

旧消息越堆越多(50条以上),即使每次你只说几个字,模型每次回复都要把一万多 Token 的历史重新处理一遍。这就是为什么对话越长,回复越慢、越贵,且模型开始“忘掉”开头设定的原因。

旧消息 1:2000 token
旧消息 2:1500 token
...
旧消息 50:几百个 token
────────────────
合计:可能 15,000-20,000+ token

5.3 插曲:“一轮”到底怎么算?

真相:左侧聊天窗口的消息数 ≠ 你实际发送的消息数。

当你发 1 条消息,Zack 背后会调用多次工具:

你的消息 → Zack 判断需要什么工具
           ├── terminal(找文件)
           ├── search_files(搜内容)
           ├── write_file(写文件)
           ├── patch(修改文件)
           ├── execute_code(跑 Python)
           ├── web_search(查资料)
           ├── read_file(读内容)
           └── ...(可能 5~10 次)
每条工具调用算 1 条消息 → 最后 Zack 的回复算 1 条

所以:你发 1 条 → AI 可能产生 5~10 条消息。

[你] "帮我查一下那个文件"
[Zack] → terminal ls                      ← 1
[Zack] → search_files                     ← 2  
[Zack] → read_file                        ← 3
[Zack] → write_file                       ← 4
[Zack] → "找到了,在 /mnt/d/..."            ← 5
────────────────────────────────────
结果:你发了 1 条,窗口多出 5 条记录。

5.4 决策表:什么时候该建新窗口?

不要数轮数,看感觉。

场景信号怎么办底层逻辑
左侧消息 50~80+ 条了建新窗口历史太多,烧 token 更亏。
回复速度明显变慢了建新窗口上下文窗口快满,推理效率下降。
想换个完全不同的话题建新窗口避免话题混杂,避免模型混乱。
正在做多步操作(同步网站等)别建强行切断会导致 Zack 丢失当前的执行状态。
不确定/想找之前的结论用搜索发“帮我查一下之前聊过 XX”让 Zack 评估。

六、 FAQ 快答

Q:记忆和技能哪个更耗 token? 记忆每次消息都耗(自动注入)。技能只在调用时耗。记忆是长期订阅费,技能是单次购买。

Q:记忆被截断了怎么办? 只有前 4000 字符被注入。超出的部分等于不存在。所以把事情控制在 4000 以内,多的放技能。

Q:我能自己编辑记忆/技能吗? 能。记忆文件在 ~/.hermes/memories/,技能在 ~/.hermes/skills/,都是 Markdown 文件。但建议让 Zack 操作,手动改如果混入隐藏 Unicode 字符或 Markdown 格式错误,会导致加载报错。

Q:技能太多会不会混乱? Zack 每次回复前会自动扫描所有技能的简介,选中相关的才加载。跟搜索引擎一样——你搜”天气”不会出来菜谱。这层筛选是自动的,你不需要操心。

Q:如果 Zack 每次都扫描技能列表,那不是很浪费 token? 扫描只看名称 + 一句话简介(≈300 token 出头),并非读全部内容。扩展几百个技能的成本极低。

Q:session_search 会把我整个旧窗口的内容搬过来吗? 不会。它只返回 AI 生成的摘要(200~300 字),告诉你”上次讨论了什么、结论是什么”。如果想看具体文件内容,让 Zack 去读文件。

Q:我能在当前窗口里搜当前窗口的内容吗? 能,但没必要。当前窗口的历史已经在你和 Zack 的对话中了,直接问”刚才那个文件在哪”就行。session_search 是为跨窗口回忆设计的——当你建了新窗口,忘了老窗口的事,才用它。

Q:搜关键词的格式重要吗? 不重要。直接说中文,Zack 会自动理解并调用工具。你不需要写括号、逗号、引号——那些是给程序员看的格式,跟你说就行。

Q:记忆文件是存在数据库里的吗? 不是。纯文本 Markdown,用 § 符号分隔条目。没有数据库,没有 JSON,没有向量。简单到手动就能编辑。

Q:我写重复的内容,记忆会保存两次吗? 不会。memory 工具会自动去重。且写入时附带安全扫描,防恶意注入。

Q:什么是「记忆冲刷」?什么时候会发生? 当对话太长需要压缩时(超过 50% 阈值),Hermes 会在压缩前先通知模型:“把值得记住的东西写进记忆”。这就叫记忆冲刷。长对话中你做出重要修正后,即使对话被压缩了,这个修正通常会被自动记住——你甚至不需要说”记住这个”。

Q:为什么用字符限制而不是 Token 限制? 保证模型无关性。如果用 Token 限制,未来从 DeepSeek 换到 Claude,由于分词器不同,会引发判定逻辑崩溃。


🚀 交互式数据看板

[▶ 打开 Hermes 架构可视化控制台 →](../交互式可视化看板/Hermes 记忆 vs 技能:可视化全解指南.html)