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,由于分词器不同,会引发判定逻辑崩溃。