1 个目录、2 个文件、0 条遗忘:Hermes Agent 持久化记忆是怎么做到的
【免费下载链接】hermes-agentThe agent that grows with you项目地址: https://gitcode.com/GitHub_Trending/he/hermes-agent
你上周告诉 AI "用 pnpm 别用 npm",今天新开会话它又开始 npm install;你说"回复短一点",下一次它又长篇大论。传统助手的上下文只活在一次对话里,关窗口即失忆,你的每次纠正都是重复劳动。Hermes Agent 的持久化记忆就是为此而生:两个本地文件、一个目录,让 AI 记住用户偏好跨会话生效,不依赖任何云端服务。
Hermes Agent 的解法:2 个文件、2 类记忆
记忆没有做成一个大杂烩,而是严格劈成两半,各管一摊,都放在~/.hermes/memories目录下,随时可以用编辑器打开看:
| MEMORY.md | USER.md | |
|---|---|---|
| 角色 | 代理侧笔记 | 用户侧画像 |
| 记什么 | 环境事实、项目约定、工具特性、踩坑学到的知识 | 你的偏好、沟通风格、期望、工作流习惯 |
| 容量上限 | 2200 字符 | 1375 字符 |
上限按字符而非 token 计——换个模型,预算依然成立,跨模型兼容性是设计出来的,不是碰运气的。
一条记忆的完整生命周期:从注入到生效
理解跨会话记忆,只需盯住一条记忆的三段旅程。
第 1 步:开场拍快照,然后锁死
初始化阶段(见 agent/agent_init.py)会把两个文件读进内存,拍一张快照,整个会话期间不再动。为什么锁死?因为开场前缀稳定,前缀缓存才划算——这是"提示稳定性优先"的取舍,不是 bug。
第 2 步:会话中实时改盘
AI 通过记忆工具增、删、改条目,每次操作即时落盘,工具返回的结果永远反映最新状态。换句话说:开场看到的是冻结快照,磁盘上跑的是实时账本,两层各司其职。
第 3 步:下一次会话,新快照接管
你下次打开 Hermes Agent,上一轮写入的条目会被读成新的快照。你的偏好从这一刻起变成默认行为,无需复述。
原子写入:为什么记忆落盘不能"直接写"
记忆文件是高频小写操作,普通写文件有个风险:写到一半断电,文件就废了。Hermes Agent 的做法是临时文件加重命名:
fd, tmp_path = tempfile.mkstemp( dir=str(path.parent), suffix=".tmp", prefix=".mem_" ) try: with os.fdopen(fd, "w", encoding="utf-8") as f: f.write(content) f.flush() os.fsync(f.fileno()) os.replace(tmp_path, str(path)) # 同一文件系统内原子重命名 except BaseException: os.unlink(tmp_path) raise先写同目录临时文件并强制刷盘,再用os.replace一步换掉正式文件。重命名在同一文件系统上是原子操作,磁盘上永远只有完整的旧版本或完整的新版本,不存在中间态。条目之间用§分隔,天然支持多行。
记忆会进系统提示,所以先防注入
一个容易被忽略的点:记忆内容最终会出现在系统提示里,它本身就是注入攻击面。Hermes Agent 对每条写入都过安检:
- 拦截不可见字符(零宽空格之类),堵住肉眼看不见的夹带通道
- 扫描威胁模式:提示注入、角色劫持、秘密窃取类文本直接拒收
- 收紧写权限:只有记忆工具能碰这两个文件,普通写文件路径够不着
防的不是"记错",而是"被记脏"。
怎么管理记忆文件:5 条操作建议
- ⚡ 先存高价值信息:姓名角色、时区、编码风格、工具链;以及 AI 被你纠正过的约定
- 分对文件:关于"你"的进 USER.md,关于"环境"的进 MEMORY.md
- 存结论不存过程:别倒日志原文,提炼成一句事实
- 盯容量水位:接近上限就合并同类项、删掉过时条目
- 🔍 定期体检:两个文件都是纯 Markdown,直接打开删改即可,这是最低成本的记忆文件管理方式
现在就能动手:告诉 Hermes Agent"记住我的工作流",然后打开~/.hermes/memories,亲眼看看这条记忆落盘的瞬间。
【免费下载链接】hermes-agentThe agent that grows with you项目地址: https://gitcode.com/GitHub_Trending/he/hermes-agent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考