概念 study · 研习 #server, tooling, llm 2026-05-30

Hermes 记忆系统详解与 Provider 选型

本文深入讲解 Hermes Agent 的记忆系统——它如何工作、有哪些 Provider 可选、以及我们在 Hindsight 和 Holographic 之间踩过的坑。

前置:Hermes Agent 已安装 → Hermes Agent 安装与踩坑实录

内置记忆系统

两层结构

Hermes 的默认记忆系统由两个 Markdown 文件组成:

文件 用途 上限
MEMORY.md Agent 的笔记——环境、项目、约定、教训 2,200 字
USER.md 用户画像——身份、偏好、习惯 1,375 字

都存储在 ~/.hermes/memories/ 下,每会话开始时注入到系统提示词。

工作原理

每次新会话启动
    │
    ├─→ 读取 MEMORY.md + USER.md
    │
    └─→ 注入到 Agent 的「系统提示词」里

会话进行中
    │
    ├─→ 用户纠正 Agent / 说「记住这个」→ Agent 用 memory 工具写入
    │
    ├─→ Agent 发现新环境信息 / 约定 → 自动写入
    │
    └─→ 写入成功后,下次会话生效

⚠️ 重要: 记忆在会话中写入后,不会立即生效。要等到下一次新会话,更新的记忆才会注入。这是故意的——避免中途改提示词破坏 LLM 的 prefix cache。

记什么、不记什么

✅ 存(持久) ❌ 不存(临时)
用户身份、偏好 会话进度、TODO 列表
项目路径、环境信息 PR 号、issue 号
经验教训、工作约定 已完成的任务日志
工具配置、踩坑记录 一周内会过期的信息

原则:存「下次还用得上的事实」,不存「这次干了什么」。

三个操作

Agent 通过 memory 工具管理记忆:


为什么需要 Memory Provider

内置记忆系统的问题:

限制 影响
2,200 字上限 项目多时不够用
纯文本匹配 只能按子串搜索,不能语义检索
无去重 可能存重复信息
无优先级 新旧记忆同等权重

Memory Provider 是 Hermes 的可插拔记忆后端,解决这些问题。


8 个 Provider 对比

Hermes 共有 8 个 Provider,通过 ops config set memory.provider <name> 切换:

Provider 存储方式 外部依赖 从国内访问 复杂度
holographic 本地 SQLite + FTS5 ❌ 零 本地 0ms ⭐ 低
内置默认 Markdown 文件 ❌ 零 本地 0ms ⭐ 低
honcho 独立服务 需部署 本地 0ms ⭐⭐ 中
openviking 字节跳动云 云服务 国内快 ⭐ 低
mem0 Mem0 云 API API Key 海外慢 ⭐ 低
supermemory Docker 向量 DB Docker 本地 0ms ⭐⭐⭐ 高
hindsight 知识图谱 + 向量 云/本地 看模式 ⭐⭐⭐ 高
byterover 本地 CLI brv CLI 本地 0ms ⭐⭐ 中
retaindb 云 API API Key 海外慢 ⭐ 低

Hindsight vs Holographic:实战对比

这是我们尝试的两个 Provider,过程和结果完全不同。

Hindsight:想用最牛的,被现实教育

Hindsight 是 vectorize-io 开发的记忆系统,功能最强:

我们选的是 local_embedded(本地嵌入式),理论上最理想——功能全、隐私好、不走云。

🕳 坑点 1:安装超大。

uv pip install hindsight-all

包体积 ~200MB,还带一个嵌入的 PostgreSQL。在国内从清华镜像下载就很慢。

🕳 坑点 2:需要下载 HuggingFace 模型,国内几乎不可能。

Hindsight 本地模式需要两个 HuggingFace 模型:

  • BAAI/bge-small-en-v1.5(嵌入模型,~130MB)
  • cross-encoder/ms-marco-MiniLM-L-6-v2(重排序模型,~200MB)

从国内下载 HuggingFace 模型的成功率极低。我们的 daemon 反复下载超时:

RuntimeError: Cannot send a request, as the client has been closed.
ERROR: Application startup failed. Exiting.

🕳 坑点 3:内存爆炸。

PostgreSQL + Python daemon + 模型加载 ≈ 1.6GB 内存。我们的服务器总共才 4GB。

🕳 坑点 4:端口混乱。

Hindsight daemon 默认端口 8888,但实际启动后绑定到 9177。Hermes 配置默认连 8888,导致 Gateway 报错:

Hindsight API at http://localhost:8888 reports version None

结论:放弃 Hindsight,不适合国内环境。

Holographic:够用就好

Holographic 是本地的轻量级 Provider:

特性 说明
存储 本地 SQLite
检索 FTS5 全文搜索(比子串匹配强一个量级)
自动去重
信任评分 ✅ 旧信息自动降权
实体解析
外部依赖 ❌ 零
内存占用 零额外(SQLite 本身几乎不吃内存)
安装 内置,无需 pip install

切换到 holographic 只需一行:

ops config set memory.provider holographic

然后重启 Gateway(/restartpkill + 重启)。

🕳 注意: 切换 Provider 后旧的 MEMORY.md 不会自动迁移。如果需要保留旧记忆,先确保 memory 工具在当前会话中确认过旧记忆内容,新 Provider 会在后续会话中重建。


实战教训

1. 先跑通再优化

内置记忆(2,200 字)对绝大多数个人场景完全够用。别急着换 Provider——等真的撞到上限再说。

2. 国内环境下,零依赖是王道

凡是需要下载 HuggingFace 模型、访问海外 API 的 Provider,在国内大概率翻车。优先考虑:

3. 切换 Provider 后要验证

# 1. 确认 config
grep provider ~/.hermes/config.yaml | grep memory

# 2. 重启 Gateway
pkill -f "ops gateway run"
~/.hermes/scripts/start-gateway.sh &

# 3. 检查日志没有 provider 相关报错
tail -f ~/.hermes/logs/gateway-cron.log | grep -i memory

相关阅读: