聊一聊 Hermes v0.16 的 Memory Sync 模块:为什么你明明存了记忆,Agent 还是记不住你叫什么名字
最近笔者一直在玩 Hermes v0.16 桌面版本的 Profile 沙盒 + Kanban 流水线,一切
最近笔者一直在玩 Hermes v0.16 桌面版本的 Profile 沙盒 + Kanban 流水线,一切看着挺顺。直到有一天,Agent 开口喊了我一声:
「赵老师」
我姓赵吗?不姓。我什么时候告诉它我姓赵了?没有。它是从哪翻出这个称呼的?
去拆了一遍 Hermes 的 Memory Sync 模块,把来龙去脉搞清楚了。记录一下。
先看 Memory 干了什么
Hermes 内置的持久化记忆系统设计本身并不复杂,由两坨文件组成:
文件用途默认容量上限~/.hermes/memories/MEMORY.md环境事实、工具癖好、学到的东西2200 字符~/.hermes/memories/USER.md你的偏好、交流习惯、身份1375 字符
两个值可以在 config.yaml 里覆盖(memory.memory_char_limit / memory.user_char_limit),这是默认值。
两坨文件在每次新会话启动时会被裹进系统提示(System Prompt)里,作为一段冻结的快照文字。Agent 全程只能读这个快照,不能改。要改记忆?它得调 memory 工具写磁盘——但这改动要等到下一次新会话才会加载。
关键设计决策就一句:内存快照冻结、落盘异步、新会话生效。
这条设计有两层考虑:
- 前缀缓存:不变的系统提示前缀能保住 LLM 的 KV Cache,省掉首次推理的计算量。具体省多少取决于模型和上下文长度,但原理是普遍的。
- 稳定性:如果 Agent 中途能改自己的系统提示,会引入不确定的循环——它可能改了记忆后,下一轮 LLM 调用看到的提示和之前不一致,导致行为漂移。
代价就是:你当场纠正它的事,它得下辈子(下一个会话)才记得住。
(有一个边界情况:context compression 触发时,系统提示会重建,记忆文件会重新从磁盘加载。但这不频繁,对名字不存的问题没有帮助。)
「赵老师」到底是怎么冒出来的
勘测现场。打开我当前 Profile 的 USER.md,内容是这样的:
User is Chinese parent (爸爸) building a voice-interactive digital avatar for their child on Windows RTX 4060 8GB……
里面没有一句话写了我的真实姓名(我确实没给)。
记忆条目中唯一的人称代称是「爸爸」。一个真实姓名都没出现过。
再翻 另外一个Profile 的 USER.md:
Teacher —……..
这些文件透露出几个信息:
- 笔者有多个教师属性的 Profile 挂在同一个 Hermes 实例下
- 每个 Profile 有自己的记忆文件,彼此隔离
- 主 Profile的记忆里没有名字
模型拿到这段拼图之后的推理链路大致如下(虽然无法从 LLM 内部追踪确认,但从输入信息构成来看这是最合理的推导):
系统提示里有「教师角色 Profile + 用户是爸爸 [这也是某次推导生成的,疑似性别歧视]」
→ 综合得出「用户大概率是学校里的一位老师」
→ 需要用一个称呼 → 常见中文称呼「X老师」
→ 姓什么?记忆里没写。怎么办?——生成一个。
→ 输出「赵老师」
这个「赵」不是从任何记忆文件里读出来的——全盘搜索记忆文件找不到这个字符串。是模型在缺乏锚定信息时的填充行为。你让它猜,它就会猜一个。猜对了是运气,猜错了是一声「赵老师」。
至此,真相大白。。。。
笔者的反思:一定要定期清理各 Profile 的 MEMORY.md
本文转载自微信公众号,如有侵权请联系删除。
- 标题: 聊一聊 Hermes v0.16 的 Memory Sync 模块:为什么你明明存了记忆,Agent 还是记不住你叫什么名字
- 作者: lxiol
- 创建于 : 2026-06-20 01:24:41
- 更新于 : 2026-06-20 01:24:41
- 链接: https://blog.lxiol.cn/2026/06/20/聊一聊-Hermes-v016-的-Memory-Sync-模块为什么你明明存了记忆Agent-还是记不住你叫什么名字/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。