HexaMind 六层记忆体系:从 L5 到 L6 的架构进化
五层记忆管的是"记住什么",第六层多管一件:"提前做什么"。这篇讲主动性层的加入,也顺带把整套编号从"由细到粗"重构成"由底到顶"。
记忆系列三篇:五层记忆体系 讲分层设计,本篇讲 L6 主动性层的加入,HexaMind 搭建攻略 是能照着复现的操作手册。
一、回顾:五层记忆做了什么
《Hermes 五层记忆体系》 那篇按"抽象精度从细到粗"编号:第1层是按天写的原始日志,往上依次是向量、知识图谱、模式热度,最顶上的第5层才是 agent-memory 这个语义库。
从这篇起我把编号倒过来,改成"从底层存储到顶层行动"的 L1→L6,更符合直觉:地基在 L1,越往上越靠近决策。同一套系统,只是换了个数数的方向。对照关系是这样:
| HexaMind L1–L6 | 职责 | 对应五层那篇 |
|---|---|---|
| L1 结构化存储 | SQLite + FTS5 存事实和偏好(agent-memory) | 原第 5 层 |
| L2 向量编码 | 文本转 1536 维向量 | 原第 2 层 |
| L3 语义检索 | 向量相似度搜索,"基金回撤" ≈ "组合亏损" | 原第 5 层的向量搜索 |
| L4 自我进化 | 从错误中学习,避免重复踩坑(self-improving) | 原第 4 层 |
| L5 知识图谱 | 实体关系推理(ontology) | 原第 3 层 |
原来的"第1层 日层日志"并进了 L1 的原始记录,不再单列;原来当附属缓冲区的 proactivity,这篇里升成独立的一层 L6。
不管怎么编号,五层的核心价值都是层次化检索:先精确匹配,未命中走语义召回,再补全关联实体、注入已知陷阱。但它有一个结构性问题:
所有五层都是被动的。 它们在等用户提问,然后检索。没有人提前准备。
二、L6 的加入:从"检索"到"预判"
HexaMind 在五层之上增加了第六层,主动性(Proactivity):
┌─────────────────────────────────────────────────┐
│ L6 主动性 │ 预判需求、提前行动 │ ← 新增
├─────────────────────────────────────────────────┤
│ L5 知识图谱 │ 实体关系推理 (ontology) │
├─────────────────────────────────────────────────┤
│ L4 自我进化 │ 从错误中学习 (self-improving) │
├─────────────────────────────────────────────────┤
│ L3 语义检索 │ LanceDB 向量相似度搜索 │ ← 升级
├─────────────────────────────────────────────────┤
│ L2 向量编码 │ 文本→向量 (embedding) │
├─────────────────────────────────────────────────┤
│ L1 结构化存储 │ SQLite + FTS5 (agent-memory) │
└─────────────────────────────────────────────────┘
L6 回答的问题是:"用户现在需要什么?下一步是什么?"
它读取 L1(事实)、L4(错误经验)、L5(关系图谱),在用户开口前就做好准备。
五层 vs 六层的行为对比
| 场景 | 五层(被动) | 六层(主动) |
|---|---|---|
| 用户打开终端 | 等指令 | 自动注入持仓快照 + 上次未完成任务 |
| 用户问"部署" | 检索部署步骤 | 已提前加载当前模板状态 + 上次部署时间 + 已知陷阱 |
| cron 运行失败 | 等用户发现 | 主动检查上次输出,发现 FAILED 状态自动告警 |
| 切换基金页面 | 按需查询数据 | 已预先注入当前交易日的净值日期 + 假期日历 |
五层记忆:"你要什么,我给你找什么。" 六层记忆:"我知道你要来,东西已经备好了。"
三、L3 的升级:LanceDB 替代基础向量检索
除了新增 L6,L3 也从基础向量检索升级为 LanceDB:
| 旧 L3 | 新 L3 | |
|---|---|---|
| 存储引擎 | 基础向量存储 | LanceDB 向量索引 |
| 检索精度 | 余弦相似度 | 余弦相似度 + 索引优化 |
| 可扩展性 | 受限于内存 | 磁盘索引,支持更大规模 |
| 与 L1 的关系 | L1 和 L3 可能存储重复内容 | L1 是唯一真源,L3 只存向量 + L1 引用 |
L1 是唯一真源原则:L3 不再存储原始文本副本,只存向量索引和 L1 的引用指针。避免"改了 L1,L3 还是旧数据"的同步问题。
四、六层协作规则
HexaMind 定义了严格的层间协作规则,这是五层时代没有的:
规则 1: L1 是唯一真源 — 所有结构化事实存储在 L1,L3 持有向量索引副本
规则 2: L2 是桥 — 任何写入 L1 的记忆,自动经 L2 编码后写入 L3
规则 3: L3 负责模糊召回 — 不存储原始文本,只存向量 + 指向 L1 的引用
规则 4: L4 从错误中进化 — 用户纠正触发 L4 更新,同时修改 L1 旧事实
规则 5: L5 构建关联 — 知识图谱独立维护,跨层消费
规则 6: L6 预判行动 — 读取 L1+L4+L5,在用户开口前做好准备
五、检索工作流
六层检索不再是简单的逐层递进,而是有明确的分流逻辑:
用户查询
│
├── L1 (FTS5) ──────→ 精确关键词匹配
│ ┌─ 命中 → 直接返回事实
│ └─ 未命中 → 继续
│
├── L3 (LanceDB) ───→ 语义向量检索
│ ┌─ 命中 → 与 L1 结果合并去重
│ └─ 未命中 → 继续
│
├── L5 (ontology) ──→ 实体关系推理
│ 关联实体补全
│
├── L4 (self-improving) ──→ 检查是否有相关错误经验
│ └─ 注入"已知陷阱"警告
│
└── L6 (proactivity) ──→ 基于当前上下文预判下一步
└─ 注入建议行动
关键改进:L6 在检索流程的最后运行。它消费 L1/L3/L4/L5 的全部输出,综合判断下一步该做什么。
六、存储工作流
新信息到达时按类型分流存储:
新信息
│
├─ 精确事实/偏好/常量?
│ └→ L1 存储 → L2 编码 → L3 写向量
│
├─ 错误纠正?
│ └→ L4 记录 + L1 更新旧事实
│
├─ 包含实体关系?
│ └→ L5 建边
│
└─ 用户行为模式?
└→ L6 更新预判规则
一条信息可以同时触发多层。比如用户纠正了部署命令,会同步触发 L1(更新事实)、L4(记录纠正)、L6(更新预判:下次部署场景自动使用新命令)。
七、五层→六层的核心收益
| 维度 | 五层 | 六层 |
|---|---|---|
| 检索模式 | 被动等待 | 主动预判 |
| L3 引擎 | 基础向量存储 | LanceDB 生产级索引 |
| L1-L3 关系 | 可能重复存储 | L1 唯一真源,L3 只存引用 |
| 层间规则 | 隐含约定 | 6 条铁律显式定义 |
| 防重复 | 靠记忆 | L1/L3 防重复原则 + L1-First 写入 |
| 错误处理 | L4 事后记录 | L4 实时纠正 + L6 预判避坑 |
核心一句话:五层让记忆"不遗忘",六层让记忆"有预见"。
八、铁律
HexaMind 定义了五层时代没有的禁止规则:
❌ 禁止用 FTS5 替代 L3 语义检索
❌ 禁止跳过 L2 编码直接写入 L3
❌ 禁止 L3 成为"第二个 L1" — L3 存储的是向量,不是原文副本
❌ 禁止静默覆盖 L1 事实而不更新 L3 索引
✅ 每次检索必须同时走 L1 + L3 双通道
✅ 每次纠正必须触发 L4 记录
✅ 新实体必须立即在 L5 中建节点
这些铁律确保六层不会退化成"看起来六层,实际只用一两层"。