Agentmemory + Hermes 深度运行机制分析

问题
AI 编码 Agent 有一个共同的痛点:每次新会话都是一张白纸。你花了 30 分钟解释项目架构、JWT 认证方案、测试规范,下次对话一切归零。传统的 CLAUDE.md / .cursorrules 文件上限 200 行且内容容易过时。更致命的是,没有任何自动机制把 Agent 自己学到的东西沉淀下来——每次工具调用的上下文、每次失败的教训、每次成功的模式,全部随会话结束而消失。
agentmemory 的答案
agentmemory 是 2026 年增长最快的 Agent 记忆系统之一(10.4k stars,3 个月)。它专为编码 Agent 设计,通过 12 个生命周期 hook 自动捕获每一次工具调用,压缩为结构化记忆,下次会话自动注入相关上下文。零手动操作,零外部数据库。
本文从 Hermes Agent 的视角,深度剖析 agentmemory 的运行机制:它如何与 Hermes 集成、数据如何在流水线中流动、性能开销多大、以及与你可能已经部署的 GBrain 如何分工。
三层记忆架构
agentmemory 官方文档明确区分了三个记忆层:
| 层级 | 系统 | 存储什么 | 例子 |
|---|---|---|---|
| 世界知识 | GBrain | 人物、公司、会议、概念 | "Pedro 是 Brex 的 CEO" |
| Agent 操作 | agentmemory | 偏好、模式、会话连续性 | "用户喜欢简洁格式" |
| 当前对话 | Session Context | 对话历史、当前任务 | "我们在讨论 PR #42" |
这不是两个竞品之间的选择,而是同一个 Agent 的两个记忆器官。GBrain 管"知道什么",agentmemory 管"怎么操作"。两者通过 MCP 协议同时接入 Hermes,各司其职。
两种集成模式
模式 A:MCP Server(零侵入)
最简单的接入方式——在 Hermes 的 config.yaml 中加几行配置:
mcp_servers:
agentmemory:
command: npx
args: ["-y", "@agentmemory/mcp"]
memory:
provider: agentmemory
这会暴露 43 个 MCP 工具给 Hermes。agentmemory 服务器作为独立进程运行在 localhost:3111,与 Hermes 完全解耦。Hermes 按需调用这些工具,无 hook 注入,无运行时开销。
模式 B:Memory Provider Plugin(深度集成)
将 integrations/hermes 复制到 ~/.hermes/plugins/agentmemory/,注册 3 个生命周期 hook:
| Hook | 触发时机 | 关键:用户是否等待? |
|---|---|---|
on_session_end | 会话结束 | 否——用户已离线 |
on_pre_compress | 上下文压缩前 | 否——后台执行 |
on_memory_write | 手动写入记忆时 | 按需触发 |
这是最关键的架构决策:与 Claude Code 的 12 个 hook(每个 PostToolUse 都触发)不同,Hermes 的 hook 全部在会话边界触发。活跃对话中没有任何 hook 执行。用户感受到的延迟为零。
内部流水线:一条记忆的旅程
当 on_session_end 触发时,一条记忆经历以下转换:
on_session_end hook 触发
↓
SHA-256 去重(5 分钟窗口)
↓
隐私过滤器(剥离 API key、secrets、<private> 标签)
↓
存储原始观察记录(完整保真度)
↓
LLM 压缩 → 结构化事实 + 概念 + 叙事
↓
向量嵌入(all-MiniLM-L6-v2,384 维,本地 CPU)
↓
BM25 + Vector + Knowledge Graph 三路索引
↓
下次 SessionStart 自动注入 ~2000 token
注意:无需配置任何 API key 即可运行。默认模式下使用合成压缩(synthetic compression)代替 LLM 调用,使用本地 all-MiniLM-L6-v2 模型做向量嵌入。整套流水线零外部依赖。
三路混合搜索
agentmemory 的检索是三重信号融合(RRF 排序):
| 流 | 机制 | 适用场景 |
|---|---|---|
| BM25 | 词干提取 + 同义词扩展 | 精确关键词匹配 |
| Vector | 余弦相似度(384 维) | 语义相似搜索 |
| Graph | 知识图谱 BFS 遍历 | 实体关联扩展 |
这意味着你可以问"上次我们怎么修的那个 N+1 查询问题?",即使记忆中从未出现"N+1"这个词——向量搜索能匹配到"数据库查询性能优化",图谱能关联到相关的 ORM 配置。
性能特征:对 Hermes 体验的影响
时间维度
| 阶段 | 操作 | 延迟 | 用户感知 |
|---|---|---|---|
| SessionStart | 注入 ~2000 token 上下文 | <100ms | 一次性加载 |
| 工具调用中 | 无任何 hook | 0ms | 零感知 |
| SessionEnd | 压缩 + 向量化 + 索引 | 1-5s | 用户已离线 |
| PreCompress | 重新注入记忆 | <100ms | 后台 |
核心结论:活跃对话期间零开销。所有重量级操作(压缩、向量化、索引)都在会话结束后后台执行。
资源占用(树莓派 5 实测估算)
| 状态 | CPU | RAM | 磁盘 |
|---|---|---|---|
| 空闲 | ~0% | ~50MB | — |
| 搜索(10k 条) | <5% | ~30MB | 35.7MB 索引 |
| 向量嵌入 | 20-40% | ~150MB | — |
增量仅 ~250MB RAM。在已有 GBrain (265MB) + Hermes (391MB) + Postgres (200MB) 的树莓派上,总占用仍不到 8%。远未触及 15GB 上限。
Token 经济
这是 agentmemory 最被低估的价值:
传统方式(CLAUDE.md):全部记忆注入上下文
1,000 条观察 = 43,834 token(占据 22% 上下文窗口)
5,000 条观察 = 220,335 token(已超出 200K 窗口上限)
agentmemory:只注入 Top-10 相关记忆
任意规模 = ~1,972 token(仅 0.3% 上下文窗口)
记忆库越大,节省越显著。对于长期运行的编码 Agent,这是上下文窗口利用率的关键优化。
与同类系统的定位
| 维度 | agentmemory | Mem0 | Letta | Zep |
|---|---|---|---|---|
| 检索 R@5 | 95.2% | ~68% | ~83% | — |
| 自动捕获 | 12 hook 全自动 | 手动 add() | Agent 自编辑 | API 写入 |
| Token 效率/会话 | ~2,000 | ~1,764 | 中等 | 600,000 |
| 外部依赖 | 0(SQLite) | 可选向量DB | Postgres | Neo4j |
| 编码 Agent 优化 | 是 | 否 | 否 | 否 |
| Hermes 原生集成 | 插件 + MCP | 教程 | 间接 | 间接 |
实战要点
- 从模式 A 开始:MCP Server 零配置,性能影响为 0。先跑一周看效果。
- 模式 B 才需 hook:需要自动上下文注入时才启用 Plugin。两者可共存。
- 不配 API key 也能用:合成压缩 + 本地嵌入的检索精度依然达到 95.2%(基准测试)。
- 与 GBrain 不冲突:世界知识放 GBrain,操作记忆放 agentmemory。同一条 SSH 命令不会同时写入两个系统。
- PR #307 是关键:即将支持 OpenAI 兼容本地 LLM(Ollama/LM Studio/vLLM),届时可完全脱离云端。
一句话总结:agentmemory 做的事就是——你下次打开 Hermes 时,它已经知道你上次在修哪个 bug、用的什么方案、为什么选那个方案。不再需要重新解释。