Hermes Agent 记忆系统详解:MEMORY.md 与跨会话持久化

本文是《Hermes Agent 深度解析》系列第 2 篇

系列索引


引言

背景问题

大多数 AI Agent 都是"一次性"的------你问完,它答完,下次再问就是全新的对话。用户的偏好、项目的习惯、之前学到的经验,统统不记得。

Hermes Agent 解决了这个问题。它拥有有限、有序的记忆,能够跨会话持久化。

本文目标

  1. 理解 MEMORY.mdUSER.md 的区别和用途
  2. 掌握记忆工具的三个操作:add / replace / remove
  3. 了解容量管理和最佳实践
  4. 理解记忆在系统提示中的呈现方式

1. 两个记忆文件

Hermes Agent 的记忆由两个文件组成:

文件 用途 字符限制
MEMORY.md Agent 的个人笔记------环境事实、约定、学到的东西 2,200 字符(约 800 tokens)
USER.md 用户画像------偏好、沟通风格、期望 1,375 字符(约 500 tokens)

存储位置:~/.hermes/memories/

1.1 MEMORY.md------Agent 的个人笔记

用于 Agent 需要记住的环境信息和工作流经验

  • 环境事实(操作系统、工具、项目结构)
  • 项目约定和配置
  • 工具怪癖和解决方法
  • 已完成任务日记
  • 有效的技能和技巧

1.2 USER.md------用户画像

用于关于用户身份和偏好的信息:

  • 姓名、角色、时区
  • 沟通偏好(简洁 vs 详细)
  • 雷区和需要避免的事
  • 工作流习惯
  • 技术技能水平

2. 记忆工具操作

Agent 通过 memory 工具管理记忆,有三个操作:

2.1 add------添加记忆

python 复制代码
memory(action="add", target="memory", content="这台服务器运行 Debian 12,PostgreSQL 16")
memory(action="add", target="user", content="用户偏好简洁的回复,不喜欢冗长的解释")

2.2 replace------替换记忆

使用子字符串匹配,不需要完整文本:

python 复制代码
# 如果记忆包含 "User prefers dark mode in all editors"
memory(action="replace", target="memory",
       old_text="dark mode",
       content="User prefers light mode in VS Code, dark mode in terminal")

2.3 remove------删除记忆

python 复制代码
memory(action="remove", target="memory", old_text="旧的项目信息")

3. 记忆在系统提示中的呈现

3.1 冻结快照模式

在每个会话开始时,记忆被注入系统提示作为冻结快照

复制代码
═════════════════════════════════════════════
MEMORY (你的个人笔记) [67% --- 1,474/2,200 字符]
═════════════════════════════════════════════
用户项目是一个 Rust Web 服务,位于 ~/code/myapi,使用 Axum + SQLx §
这台机器运行 Ubuntu 22.04,安装了 Docker 和 Podman §
用户偏好简洁的回复,不喜欢冗长的解释

3.2 格式说明

元素 说明
标题 显示哪个存储(MEMORY 或 USER PROFILE)
使用百分比 让 Agent 知道容量
§ 分隔符 标记不同条目
冻结模式 会话期间不变,保持 LLM 前缀缓存

3.3 重要特点

记忆更改不会立即生效。当 Agent 在会话期间添加/删除记忆条目时,更改会立即持久化到磁盘,但要到下一个会话开始时才会出现在系统提示中。


4. 容量管理

4.1 字符限制

存储 限制 典型条目数
memory 2,200 字符 8-15 条
user 1,375 字符 5-10 条

4.2 记忆满时

当你尝试添加超出限制的条目时,返回错误:

json 复制代码
{
  "success": false,
  "error": "Memory at 2,100/2,200 chars. Adding this entry (250 chars) would exceed the limit. Replace or remove existing entries first.",
  "current_entries": ["..."],
  "usage": "2,100/2,200"
}

4.3 最佳实践

当记忆超过 80% 容量时,先整合再添加:

  1. 读取当前条目
  2. 确定可以合并的条目
  3. replace 合并为更短版本
  4. 然后 add 新条目

5. 记忆条目规范

5.1 好条目 vs 坏条目

✅ 好:紧凑、信息密集

markdown 复制代码
# 打包多个相关事实
用户运行 macOS 14 Sonoma,使用 Homebrew,安装了 Docker Desktop 和 Podman。Shell:zsh + oh-my-zsh。编辑器:VS Code + Vim 键绑定。

# 具体、可操作的约定
项目 ~/code/api 使用 Go 1.22,sqlc 处理 DB 查询,chi 路由器。用 'make test' 运行测试。CI 通过 GitHub Actions。

# 带上下文的经验
预发服务器 (10.0.1.50) 需要 SSH 端口 2222,不是 22。密钥在 ~/.ssh/staging_ed25519。

❌ 坏:太模糊或太冗长

markdown 复制代码
# 太模糊
用户有一个项目。

# 太冗长
2026年1月5日,用户让我看他们的项目,位于 ~/code/api。我发现它使用 Go 1.22 版本...

5.2 保存什么 vs 跳过什么

✅ 保存(主动)

  • 用户偏好:"我更喜欢 TypeScript"
  • 环境事实:"这台服务器运行 Debian 12"
  • 纠正:"不要对 Docker 命令使用 sudo"
  • 约定:"项目使用 tabs,120 字符行宽"
  • 明确请求:"记住我的 API 密钥轮换是每月一次"

❌ 跳过

  • 琐碎信息:"用户问了关于 Python 的问题"
  • 容易重新发现的事实:"Python 3.12 支持 f-string 嵌套"
  • 原始数据转储:大段代码、日志
  • 会话特定的临时内容

6. 重复预防

记忆系统自动拒绝完全重复的条目。如果添加已存在的内容,返回成功但提示"no duplicate added"。


7. 安全扫描

记忆条目在接受之前会扫描注入和泄露模式,因为它们会被注入系统提示。匹配威胁模式(提示注入、凭证泄露、SSH 后门)的内容会被阻止。


8. Honcho 集成(可选)

对于更深入的跨工具用户理解,可以启用 Honcho(来自 Plastic Labs)。

8.1 启用 Honcho

bash 复制代码
# 1. 安装
uv pip install honcho-ai

# 2. 创建配置
cat > ~/.honcho/config.json << 'EOF'
{
  "enabled": true,
  "apiKey": "your-honcho-api-key",
  "peerName": "your-name",
  "hosts": {
    "hermes": {
      "workspace": "hermes"
    }
  }
}
EOF

8.2 工作原理

阶段 说明
预取 每个回合,Honcho 用户表示注入系统提示
同步 每次对话后,消息同步到 Honcho
查询 Agent 可通过 query_user_context 主动查询

Honcho 完全可选------禁用时零行为改变。所有 Honcho 调用非致命,服务不可达时 Agent 正常继续。


总结

核心要点

要点 说明
两个文件 MEMORY.md(Agent笔记)+ USER.md(用户画像)
三个操作 add / replace / remove
容量限制 memory 2,200 / user 1,375 字符
冻结快照 会话开始时注入,会话期间不变
子字符串匹配 replace/remove 只需唯一子字符串

下篇预告

【系列03】Hermes Agent 技能系统:让 AI 学会自我进化

下一篇我们将解析 Hermes Agent 的技能系统:

  • SKILL.md 格式和目录结构
  • 技能创建、编辑、删除操作
  • 渐进式披露(Progressive Disclosure)
  • 技能 Hub 和安全扫描

相关资料

相关推荐
pele2 小时前
如何用 contextmenu 事件自定义鼠标右键菜单的显示逻辑
jvm·数据库·python
2301_773553622 小时前
怎样禁用phpMyAdmin的控制台历史记录_防凭证与查询留存
jvm·数据库·python
m0_743623922 小时前
Go语言怎么实现生产者消费者_Go语言生产者消费者模式教程【精通】
jvm·数据库·python
baidu_340998822 小时前
CSS Grid布局如何为特定项目指定位置_使用grid-row和grid-column
jvm·数据库·python
Godlovesea2 小时前
ubuntu系统禁止内核更新
python
weixin_458580122 小时前
如何用 blur 与 focusout 区分不冒泡与冒泡的失焦事件
jvm·数据库·python
旷世奇才李先生2 小时前
Python爬虫实战:多线程爬取\+数据清洗\+可视化(附完整源码)
开发语言·爬虫·python
MediaTea2 小时前
Scikit-learn:一个最小机器学习工作流示例
人工智能·python·机器学习·scikit-learn
qq_349317482 小时前
Layui如何修改表格单元格内文字的行间距
jvm·数据库·python