HexaMind v2.0:第七层——让记忆系统拥有实时触觉
前五篇文章讲了 HexaMind 是怎么从五层走到六层、怎么搭建、怎么运维的。一个读者从头看到尾,会觉得这个记忆系统已经被造得很完善了:存事实、做语义搜索、自己进化教训、画知识图谱,甚至能主动预判你下一步想干嘛。
但如果你真的把它跑起来,会发现一个很微妙的问题:它是"档案馆"式的记忆。
HexaMind 所有知识都来自每日 cron 的批量整理:凌晨 2:30 读昨天的对话 → 提炼事实 → 写入知识库。它记得住你昨天说过的偏好、上个月踩过的坑,但对刚刚发生的事情(比如 5 分钟前你纠正了它一个配置路径)是完全盲的。它要等到下一个凌晨才知道这件事。
而 Hermes Agent 自己带的热缓存 MEMORY.md,虽然能记住一些东西,但它就是个平面文本文件:没有结构、没有语义、没有范围隔离。不同 session 的事实混在一起,长到一定程度就撑爆了。
这就是 v2.0 要解决的问题。
L0:不是又多一层,是补了一整个维度
scope-recall(范围感知记忆)是一个 Hermes 原生的记忆提供者插件。把它接入 HexaMind 后,它不是简单地变成"第七层",而是补上了一个 HexaMind v1 从第一天就缺失的维度:实时性。
之前的六层(L1 事实库 → L2 向量编码 → L3 语义搜索 → L4 教训进化 → L5 知识图谱 → L6 主动性)全是"离线"层:它们依赖 cron 批处理,数据流是单向的、延迟 24 小时的。
L0 是"在线"层:每轮对话都在工作。
L0 scope-recall ← 每轮自动捕获,实时写入
L1 agent-memory ← 持久知识,cron 批处理
L2 embedding
L3 LanceDB 语义
L4 教训进化
L5 知识图谱
L6 主动性
L0 是怎么工作的:两阶段实时管线
L0 的内存管理不是每分钟轮询,而是事件驱动 + 定时消化:
阶段一:实时捕获(对话结束即写入)
scope-recall 作为 Hermes 的 memory provider,hook 在每一轮 user→assistant 对话结束时自动触发。你发一条消息、我回一条,这一轮结束,一条 journal_entry 就落盘了。不是定时扫,零延迟。
阶段二:后台消化(每 2 小时,LLM 提取)
journal 只是原始记录——把"刚才说了什么"记下来。真正把它变成结构化知识(memories、fact_claims、entities、relations)的是 journal digest。默认每 2 小时跑一次,把积压的 journal entries 批量送给 LLM 做语义提取。
每轮对话 → journal_entry (实时,0 延迟)
│
↓ 每 2 小时
digest 提取 (DeepSeek LLM)
├─ memories (持久记忆,按范围隔离)
├─ fact_claims (结构化事实主张)
├─ entities (自动发现实体)
└─ relations (实体间关系)
重启网关后,L0 已经自动写入了 204 条 journal entries,Digest 从里面提取出了第一条记忆:
"在 Hermes 环境中,无法从网关内部执行
hermes gateway restart命令,因为该命令会终止当前 shell 进程及其所有子进程,导致执行命令的自身也被杀死。正确的重启方式是通过外部终端或通过 systemd 用户服务。"
这条记忆被自动分类为 ops(运维),从 1 条 journal entry 提取。它不是我手动写的——它就是 L0 自己看完对话后总结出来的。
L0 的七张表
scope-recall 不是一个简单的"对话日志"。它的数据库有七张表,覆盖了从原始对话到结构化知识的完整管线:
| 表 | 做什么 | 和 HexaMind v1 的区别 |
|---|---|---|
journal_entries |
原始对话日志 | v1 靠 cron 读历史,延迟 24h |
memories |
持久记忆(按范围隔离) | v1 的 facts 表只有全局一个维度 |
fact_claims |
自动提取的结构化事实主张 | v1 靠自己写,L0 自动提取 |
memory_entities |
自动发现的实体 | v1 的 entities 需手动录入 |
memory_relations |
实体间关系 | v1 的 link_fact_to_entity 也是手动的 |
task_episodes |
任务执行记录 | v1 没有 |
procedural_playbooks |
自动生成的流程手册 | v1 没有 |
这里面最有价值的是 范围隔离。scope-recall 把记忆分成两层:
- 共享范围(user / memory / project / ops):跨 session 持久化,所有对话都能访问
- 本地范围(general):仅当前 session 可见,下一轮就清掉
这意味着 A 群聊里讨论的项目配置,不会被 B 群聊引用。v1 的所有 facts 都在一个全局池子里,没有这个边界概念。
从"档案馆"到"活系统"
架构层面上最大的变化,是数据流从单向变成了闭环:
v1 的数据流:
用户对话 → 凌晨 cron 批处理 → 提炼 facts → 写入 L1
(中间有 24 小时真空期)
v2 的数据流:
用户对话 → L0 实时捕获(journal → digest 每 2h 提取 → memories)
│
↓ 每日 02:30
L1 持久化(promote)+ 02:30 cron 消化新增对话
│
↓ 每日 03:30
L2 → L3 向量化上线
L0 先把"刚发生了什么"记录下来并即时消化成结构化记忆,让 Hermes 在当前 session 就能引用。到了凌晨,cron 把 L0 里高价值的持久事实提升到 L1,同时对当天新增的对话做深度提炼。两条数据线并行不冲突。L0 的数据库(~/.hermes/scope-recall/memory.sqlite3)和 L1 的数据库(~/.agent-memory/memory.db)完全独立。
检索也打通了。原来的 hexamind_search.py 只搜 L1(FTS5)+ L3(语义向量)。现在原生支持 L0,一条命令搜遍七层:
hexamind_search.py "gateway 重启配置" 8
# 输出:
# channels: L0=1 L1=3 L3=3 merged=5
L0 返回的是最近几分钟内和你聊过的内容;L1 返回的是知识库里精确匹配的配置事实;L3 返回的是语义相近但你用词不同的记忆。三个通道的结果自动去重合并。
真实的坑:打通实时提取花了什么代价
说起来很顺滑,实际上搞的时候卡了半天。
scope-recall 的 digest 需要调 LLM 做语义提取。默认配置指向 OpenAI 的 gpt-4o-mini,但我没有 OpenAI 的 API key。于是第一步:切到 DeepSeek——写 config.json 配 model 和 base_url。
重启后 digest 跑了三次,全报错:LLM extraction failed (unknown)。
排查发现 scope-recall 的 journal_extractors.py 里读取配置是这样的:
api_key_env = str(journal_config.get("api_key_env") or "")
我传进去的是 ["DEEPSEEK_API_KEY"],一个数组。str() 强转后变成了字面量字符串 "['DEEPSEEK_API_KEY']"——没有一个环境变量叫这个名字。所以 scope-recall 永远读不到 API key,LLM 调用永远失败。
改成裸字符串 "DEEPSEEK_API_KEY",第二条 digest 立刻就跑通了,第一条结构化记忆就被提了出来。
配置只需要这么几行:
{
"capture_llm": {
"enabled": true,
"model": "deepseek-v4-pro",
"base_url": "https://api.deepseek.com",
"api_key_env": "DEEPSEEK_API_KEY"
},
"journal": {
"extractor": "llm",
"background_digest_enabled": true,
"api_key_env": "DEEPSEEK_API_KEY",
"model": "deepseek-v4-pro",
"base_url": "https://api.deepseek.com"
}
}
加上把 DeepSeek API key 写到 .env,重启网关,就完了。
运行半天后的数据
| 层级 | 指标 | 数量 |
|---|---|---|
| L0 | journal_entries | 204 |
| L0 | memories | 1(持续增长中) |
| L1 | facts | 293 |
| L4 | lessons | 54 |
| L5 | entities | 33 |
| L3 | vectors | 293 |
journal 在跑,memories 在涨,digest 每 2 小时跑一次。scope-recall 不是一个"装好就摆着"的插件——它在每一轮对话里都在工作,每 2 小时把原始对话消化成结构化知识。
一句话总结
HexaMind v2 不是又多了一层。
它补上了 v1 从第一天起就存在的空白:实时记忆。v1 是档案馆,v2 是活的。能记住 5 分钟前你说的话,也能从三个月前的知识图谱里推理出你不认识的新关系。
L0 scope-recall 负责"这一秒";L1-L6 负责"这一生"。两个加起来,才是一个完整的 AI 记忆系统。