Skip to content

记忆系统

Hermes Agent 内置了一套持久化记忆系统,让智能体能够在不同会话之间保留关键信息,从而提供更连贯、更个性化的交互体验。

核心记忆文件

Hermes 使用两个持久化文件存储核心记忆,位于 ~/.hermes/memories/ 目录下:

MEMORY.md(智能体笔记)

  • 路径: ~/.hermes/memories/MEMORY.md
  • 容量上限: 2200 个字符
  • 用途: 存储智能体自己的工作笔记、重要发现、任务进度、偏好设置等

典型内容示例:

markdown
# Agent Memory

## 用户偏好
- 喜欢简洁的回答,不需要冗余解释
- 代码示例优先使用 Python
- 时区:Asia/Shanghai

## 项目信息
- 当前项目:new-api(Go + React)
- 数据库:SQLite(开发)/ PostgreSQL(生产)
- 前端包管理器:Bun

## 重要提醒
- API 密钥存储在 .env 文件中,不要提交到 git

USER.md(用户档案)

  • 路径: ~/.hermes/memories/USER.md
  • 容量上限: 1375 个字符
  • 用途: 存储用户的个人信息、习惯、背景知识,帮助智能体更好地理解用户

典型内容示例:

markdown
# User Profile

## 基本信息
- 职业:全栈开发者
- 技术栈:Go, Python, React, TypeScript
- 工作语言:中文(首选)/ 英文

## 工作习惯
- 早上处理复杂任务,下午做代码审查
- 喜欢 TDD(测试驱动开发)
- 使用 VSCode + Vim 键位

## 沟通风格
- 直接、简洁
- 喜欢代码示例
- 不需要过多客套

记忆注入机制

冻结快照注入

记忆内容在会话开始时作为冻结快照注入到上下文中:

系统提示词
    └── [冻结区域]
         ├── MEMORY.md 内容
         └── USER.md 内容
         └── [会话开始 - 以下为动态内容]
              ├── 用户消息
              └── 助手回复

为什么使用冻结快照?

这种设计有两个核心优势:

  1. 前缀缓存优化:冻结的记忆内容不会随对话变化,使得 LLM 推理提供商(如 Anthropic)可以对这部分内容进行 KV 缓存,显著降低 Token 成本和延迟。

  2. 一致性保证:会话内不会出现记忆"变化"导致的上下文混乱——智能体看到的是会话开始时的快照。

跨会话持久化

  • 写入时机:记忆变更立即写入磁盘(不等待会话结束)
  • 生效时机:新内容在下一个会话开始时才会出现在上下文中
  • 当前会话:记忆工具可以读取最新内容,但注入的快照不会改变

Memory 工具操作

使用 memory 工具可以对持久化记忆文件进行增删改操作:

add(追加内容)

向记忆文件追加新内容:

请记住:我正在开发一个名为 hermes-docs 的 VitePress 文档站点,
使用 Vue 3 和 Vite,部署在 Vercel 上。

Hermes 会将这段信息追加到 MEMORY.md。

replace(替换内容)

通过子字符串匹配找到并替换现有内容:

把记忆中关于"数据库:SQLite"的部分更新为"数据库:PostgreSQL(已迁移)"

replace 操作使用子字符串匹配定位目标内容,因此匹配字符串需要足够精确以避免误替换。

remove(删除内容)

从记忆文件中删除指定内容:

删除记忆中关于旧项目的信息

直接查看记忆文件

bash
cat ~/.hermes/memories/MEMORY.md
cat ~/.hermes/memories/USER.md

外部记忆提供商

除了内置的文件记忆,Hermes 还支持 7 种外部记忆提供商,提供更强大的存储和检索能力:

提供商特点适用场景
Honcho用户模型构建,跨智能体共享多智能体协作、用户画像
OpenViking开源向量记忆自托管、隐私优先
Mem0智能记忆提取与去重长期对话、知识积累
Hindsight基于反馈的记忆优化强化学习、偏好学习
Holographic高维向量存储复杂语义检索
RetainDB关系型记忆存储结构化知识、关系推理
ByteRover轻量级嵌入式存储资源受限环境

配置外部提供商

yaml
# ~/.hermes/config.yaml
memory:
  provider: mem0          # 选择提供商
  api_key: "your-api-key"
  
  # 保留内置文件记忆作为快速访问
  keep_local: true

除了核心记忆文件,Hermes 还提供基于 SQLite FTS5(全文检索)的会话历史搜索功能。

工作原理

所有会话消息存储在 ~/.hermes/state.db 中,FTS5 索引使得跨会话全文检索极其高效:

sql
-- 内部实现示意
CREATE VIRTUAL TABLE messages_fts USING fts5(
    content,
    session_id UNINDEXED,
    role UNINDEXED,
    timestamp UNINDEXED
);

使用 session_search 工具

搜索我们之前讨论过的关于 PostgreSQL 迁移的内容
查找上周关于 API 设计的对话

命令行检索

bash
# 搜索包含特定关键词的历史会话
hermes sessions browse --search "PostgreSQL"

# 导出相关会话
hermes sessions export --search "API设计" --format jsonl

详细的会话管理功能请参阅 会话管理


记忆最佳实践

什么应该放入 MEMORY.md

  • 当前正在进行的项目信息
  • 重要的技术决策和原因
  • 常用的命令、配置、密钥位置(非敏感)
  • 未完成的任务和下一步计划
  • 智能体自己发现的重要规律

什么应该放入 USER.md

  • 用户的技术背景和专业水平
  • 沟通风格偏好
  • 工作习惯和时区
  • 常用工具和技术栈
  • 语言偏好

记忆卫生

由于字符限制较小(MEMORY.md 2200 字符,USER.md 1375 字符),定期清理过时信息非常重要:

请清理 MEMORY.md 中已完成的任务,并更新项目状态
压缩 MEMORY.md,删除冗余内容,保留最重要的信息

隐私与安全

  • 记忆文件存储在本地,不会自动上传到云端
  • 使用外部提供商时,数据传输遵循各提供商的隐私政策
  • 可以随时手动编辑或清空记忆文件:
bash
# 清空所有记忆
echo "" > ~/.hermes/memories/MEMORY.md
echo "" > ~/.hermes/memories/USER.md

# 备份记忆
cp -r ~/.hermes/memories/ ~/backup/hermes-memories-$(date +%Y%m%d)/

基于 MIT 许可发布 | 由 Nous Research 开发