跳到主要内容

持久记忆

Hermes Agent 拥有跨会话持久保留、受限且经过整理的记忆能力,因此它可以记住你的偏好、项目、环境,以及它学到的内容。

工作原理

智能体的记忆由两个文件组成:

文件作用字符上限
MEMORY.md智能体自己的笔记:环境事实、约定、学到的内容2,200 字符(约 800 tokens)
USER.md用户画像:你的偏好、沟通风格、预期1,375 字符(约 500 tokens)

二者都存储在 ~/.hermes/memories/ 中,并会在会话开始时以冻结快照的形式注入系统提示。智能体通过 memory 工具自行管理记忆,可以新增、替换或删除条目。

信息

字符上限的目的是让记忆保持聚焦。记忆满了之后,智能体会整合或替换旧条目,为新信息腾出空间。

记忆在系统提示中的呈现方式

每次会话开始时,记忆条目会从磁盘读取并渲染到系统提示中:

══════════════════════════════════════════════
MEMORY (your personal notes) [67% — 1,474/2,200 chars]
══════════════════════════════════════════════
User's project is a Rust web service at ~/code/myapi using Axum + SQLx
§
This machine runs Ubuntu 22.04, has Docker and Podman installed
§
User prefers concise responses, dislikes verbose explanations

该格式包含:

  • 显示当前存储区(MEMORY 或 USER PROFILE)的头部
  • 使用率百分比和字符计数,便于智能体感知容量
  • § 作为条目分隔符
  • 条目本身可以是多行文本

冻结快照模式:系统提示中的记忆只会在会话开始时注入一次,整个会话中不会变化。这是有意为之,用来保留 LLM 的前缀缓存性能。会话中若智能体新增或删除了记忆,这些更改会立刻写入磁盘,但直到下一个会话开始前,都不会反映到系统提示中;不过工具响应会始终显示实时状态。

memory 工具的动作

智能体通过 memory 工具执行以下动作:

  • add — 添加新的记忆条目
  • replace — 用新内容替换旧条目(通过 old_text 做子串匹配)
  • remove — 删除已不再相关的条目(同样通过 old_text 做子串匹配)

没有 read 动作,因为记忆会在会话开始时自动注入系统提示,智能体天然可以看到这些内容。

子串匹配

replaceremove 使用短而唯一的子串来定位条目,不要求你提供完整原文。old_text 只需能唯一标识某一个条目即可:

# If memory contains "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")

如果子串匹配到多个条目,工具会返回错误,并要求提供更具体的匹配内容。

两个 target 的区别

memory:智能体自己的笔记

适合保存智能体需要记住的环境、工作流和经验:

  • 环境事实(OS、工具、项目结构)
  • 项目约定与配置
  • 发现的工具特性与绕坑方法
  • 已完成任务的简要记录
  • 有效的技能和方法

user:用户画像

适合保存与用户身份、偏好、沟通风格相关的信息:

  • 姓名、角色、时区
  • 沟通偏好(简洁还是详细、格式偏好)
  • 反感的表达方式或需要避免的内容
  • 工作习惯
  • 技术熟练度

应该保存什么,不应该保存什么

应主动保存的内容

智能体会自动保存,无需你额外要求。典型场景包括:

  • 用户偏好:如 “我更喜欢 TypeScript 而不是 JavaScript” → 保存到 user
  • 环境事实:如 “这台服务器运行 Debian 12 和 PostgreSQL 16” → 保存到 memory
  • 纠正信息:如 “Docker 命令不要加 sudo,用户已经在 docker 组里” → 保存到 memory
  • 约定:如 “项目使用 tab、120 列宽、Google 风格 docstring” → 保存到 memory
  • 已完成的工作:如 “2026-01-15 已把数据库从 MySQL 迁到 PostgreSQL” → 保存到 memory
  • 明确要求记住的事情:如 “记住我的 API key 每月轮换一次” → 保存到 memory

不应保存的内容

  • 琐碎或显而易见的信息:如 “用户问过 Python”
  • 容易重新发现的事实:如 “Python 3.12 支持 f-string 嵌套”
  • 原始大块数据:代码、日志、数据表等
  • 一次性上下文:临时路径、单次调试信息
  • 已经在上下文文件中的内容:如 SOUL.md、AGENTS.md 的现有指令

容量管理

记忆有严格字符限制,以控制系统提示长度:

存储区上限典型条目数
memory2,200 字符8-15 条
user1,375 字符5-10 条

记忆满了会发生什么

当新增条目会超出上限时,工具会返回错误:

{
"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"
}

此时智能体应当:

  1. 查看当前条目(错误响应中会返回)
  2. 找出可以删除或合并的内容
  3. 通过 replace 把相关条目压缩整合
  4. 再执行 add

最佳实践:当记忆使用率超过 80%(系统提示头部可见)时,应先整合条目再继续新增。例如把三条零散的 “project uses X” 合并成一条更紧凑的项目说明。

好的记忆条目示例

紧凑、信息密度高的条目效果最好:

# Good: Packs multiple related facts
User runs macOS 14 Sonoma, uses Homebrew, has Docker Desktop and Podman. Shell: zsh with oh-my-zsh. Editor: VS Code with Vim keybindings.

# Good: Specific, actionable convention
Project ~/code/api uses Go 1.22, sqlc for DB queries, chi router. Run tests with 'make test'. CI via GitHub Actions.

# Good: Lesson learned with context
The staging server (10.0.1.50) needs SSH port 2222, not 22. Key is at ~/.ssh/staging_ed25519.

# Bad: Too vague
User has a project.

# Bad: Too verbose
On January 5th, 2026, the user asked me to look at their project which is
located at ~/code/api. I discovered it uses Go version 1.22 and...

防重复

记忆系统会自动拒绝完全重复的条目。如果你尝试添加已存在的内容,它会返回成功,但提示“未添加重复项”。

安全扫描

由于记忆内容会被注入系统提示,因此在接受前会先扫描注入和信息外泄模式。若内容匹配风险模式(如 prompt injection、凭据外泄、SSH 后门)或包含不可见 Unicode 字符,就会被拦截。

会话搜索

除了 MEMORY.md 和 USER.md 之外,智能体还可以通过 session_search 工具搜索过去的会话:

  • 所有 CLI 与消息平台会话都会存入 SQLite(~/.hermes/state.db),并使用 FTS5 做全文搜索
  • 搜索结果会返回相关历史会话,并用 Gemini Flash 做摘要
  • 即使某件事不在活跃记忆中,智能体仍可以找回几周前讨论过的内容
hermes sessions list    # Browse past sessions

session_search 与 memory 的区别

特性Persistent MemorySession Search
容量总计约 1,300 tokens无上限(所有历史会话)
速度即时可用(已在系统提示中)需要搜索 + LLM 摘要
使用场景应始终在上下文中的关键事实查找某次历史对话中的具体内容
管理方式由智能体手工维护自动保存所有会话
Token 成本每个会话固定约 1,300 tokens按需发生

Memory 适合存放必须始终在上下文中的关键事实;Session Search 更适合 “我们上周是不是聊过 X?” 这类需要回忆具体历史内容的问题。

配置

# In ~/.hermes/config.yaml
memory:
memory_enabled: true
user_profile_enabled: true
memory_char_limit: 2200 # ~800 tokens
user_char_limit: 1375 # ~500 tokens

外部记忆大模型提供商(provider)

如果你需要比 MEMORY.md / USER.md 更深层、更持久的记忆能力,Hermes 还内置了 8 个外部记忆大模型提供商(provider)插件,包括 Honcho、OpenViking、Mem0、Hindsight、Holographic、RetainDB、ByteRover 和 Supermemory。

这些外部大模型提供商(provider)始终与内置记忆并存(不会替代内置记忆),并额外提供知识图谱、语义搜索、自动事实提取、跨会话用户建模等能力。

hermes memory setup      # pick a provider and configure it
hermes memory status # check what's active

完整信息见 Memory Providers