8.7 KiB
Memory-OS 7 层记忆架构 与 织忆对比
来源:微信公众号文章「7 层记忆架构!给 Agent 装个真正的 "记忆操作系统"」(2026-07-01 提取) GitHub 项目:Memory-OS(3天 648 star),专为 Hermes-Agent 设计的记忆升级系统 提取日期:2026-07-01
一句话定位
Memory-OS 是 Hermes Agent 原生记忆系统之上叠加的 7 层记忆增强层,不是独立系统。它改了 Hermes 的 Icarus 插件(pre_llm_call 注入)、加了新存储层(Facts/Qdrant/Wiki)、扩展了 Ground Truth 层级——对 Hermes 有侵入性。
织忆是完全独立的记忆后端服务,通过 HTTP + Rust IPC 插件桥接 Hermes。两套系统架构理念不同,但 Memory-OS 的设计值得参考。
7 层对照总表
| 层级 | Memory-OS | 织忆 | 差距 |
|---|---|---|---|
| L1 Workspace | MEMORY.md + USER.md + CREATIVE.md(常驻) | MEMORY.md + USER.md(Hermes 原生) | ❌ 无 CREATIVE.md 隔离 |
| L2 Sessions | FTS5 全文索引 + Icarus 自动注入 | state.db + session_search 工具 | ❌ 无自动预注入(需 Agent 主动调) |
| L3 Facts | 结构化事实 + 信任评分(全新) | 织忆 knowledge graph(语义关系) | ❌ 无信任评分 / fact_feedback 循环 |
| L4 Fabric | LLM 提取跨会话经验卡片(重写 Icarus) | 织忆 episodes 表(206 条) | ⚠️ 织忆有但提取逻辑未 LLM 化 |
| L5 Qdrant | Dense + BM25 双检索 + 4 级降级 | bge-m3 向量 + 语义搜索 | ⚠️ 织忆无 BM25 稀疏 + 无显式降级策略 |
| L6 Wiki | 双定时任务自动策展知识库 | 无此层 | ❌ 织忆无自动知识策展 |
| L7 Ground Truth | 4 级权威层级,强制 Agent 使用 | SOUL.md 3 级 + rulebook.md | ⚠️ 织忆层级少,无"注入记忆优先"prompt |
可借鉴的设计
1. 信任评分机制(L3 Facts)
fact_feedback 工具:
每次都调用 fact_feedback 反馈有用/无用
trust_score 基于 retrieved / helpful 比值计算
织忆可以做:给图谱边或 memory 条目加 recall_count / useful_count,算置信度。当前 graph.db 没有这个字段。
2. 4 级降级策略(L5 Qdrant)
Level 1 → Dense + BM25 RRF 混合检索
Level 2 → 仅 Dense 向量检索
Level 3 → grep 目录下 .md 文件(词法)
Level 4 → SQLite 搜 lineage 表
全挂 → fail-open,不阻塞 Agent
织忆当前:只走 LanceDB 语义搜索。如果 LanceDB / bge-embed 挂了 → 没有降级备份。
3. FTS5 自动注入(L2 Sessions)
Memory-OS 的做法是让 Icarus 在 pre_llm_call 阶段自动查相关历史注入系统提示,不等 Agent 调用 session_search。
织忆当前:靠 Hermes 原生的 memory_search / memory_graph_navigate 工具,Agent 必须主动调用。
4. CREATIVE.md 隔离(L1 Workspace)
MEMORY.md = memory 工具写(环境事实、约定)
USER.md = 用户手写(画像、偏好)
CREATIVE.md = Icarus 写(学习心得、状态)
解决了 memory 工具和 Icarus 双写入冲突。
织忆当前:MEMORY.md 同时被 memory 工具和 织忆 commit 写入,有同样冲突风险。
5. 强制注入优先级 Prompt(L7)
2. **Injected memory — [qdrant], [fabric], [sessions], [facts]** —
Ground truth for documented knowledge and prior decisions. When
injected memory contradicts your assumptions or training knowledge,
injected memory wins. Never treat a question as novel when the answer
is already in your prompt.
织忆当前:SOUL.md 有 Ground Truth 层级但缺少这样的显式注入记忆优先指令。
架构差异
| 维度 | Memory-OS | 织忆 |
|---|---|---|
| 进程架构 | Hermes 进程内插件(Icarus 钩子) | 独立 Go daemon + Rust sidecar |
| 依赖度 | 强依赖 Hermes | 框架无关,HTTP API 对接任何 Agent |
| 存储引擎 | Hermes 原生 SQLite + Qdrant | LanceDB + SQLiteGraphStore |
| 向量维度 | Qwen3-Embedding-8B 4096维 | bge-m3 1024维 |
| 注入方式 | pre_llm_call 钩子自动注入 | Agent 主动调用工具触发 |
| Wiki 能力 | 双定时任务自动策展 | 无 |
实际源码阅读补充(2026-07-01 全量 Clone + 读代码后)
已 clone 到
/tmp/memory-os/并 push 到 Giteaxiaoxue_admin/memory-os本次阅读了 hooks.py(1109行,含完整 pre_llm_call 注入链)、tools.py(16个 fabric 工具)、所有 7 层文档
核心发现:Icarus 自动注入的实现细节(hooks.py)
Memory-OS 的关键差异在 Icarus hooks 的 pre_llm_call 注入机制。每轮对话前自动执行:
# hooks.py 注入链(283-434行)
pre_llm_call(user_message):
├── _is_social_close(message)? # 社交关闭检测:ok/thanks/emoji → 不搜索
├── _search_qdrant(query, top_k=2) # Qdrant 语义检索 → [qdrant]
│ ├── embed_query() → dense 向量
│ ├── embed_query_sparse() → BM25 稀疏向量
│ └── search_with_fallback() → 4级降级
├── _search_sessions(query) # FTS5 会话搜索 → [sessions]
│ ├── FTS5 OR 查询:取用户消息中 ≥4 字符的 token
│ ├── 排除当前会话
│ └── Python 层去重
└── _search_facts(query) # 结构化事实 FTS5 → [facts](仅首轮)
├── 查 memory_store.db facts_fts
└── 返回 content[:200] + trust_score
关键模式差异:
- Memory-OS:事件驱动 — 每轮自动注入,Agent 无需操心
- 织忆:轮询驱动 — Agent 主动调工具,不调就没有
信任评分实现细节(facts 表)
CREATE TABLE facts (
fact_id INTEGER PRIMARY KEY,
content TEXT, category TEXT, entities TEXT,
trust_score REAL DEFAULT 0.50, -- 贝叶斯先验
retrieval_count INTEGER DEFAULT 0,
helpful_count INTEGER DEFAULT 0,
created_at TEXT, last_accessed_at TEXT
);
织忆差距:graph.db 的 edge 表中已有 weight 字段,但没有 retrieval_count / helpful_count / trust_score。改 SQLite schema 3 行 SQL 即可解决。
4 级降级的实际代码路径
# context_enhancer.py 中的 search_with_fallback
def search_with_fallback(dense_vector, sparse_vector, query_text, ...):
try:
# Level 1: Hybrid (dense + sparse → RRF)
return hybrid_search(...)
except:
try:
# Level 2: Dense only
return dense_search(...)
except:
try:
# Level 3: Lexical (grep vault/*.md)
return lexical_search(query_text)
except:
try:
# Level 4: SQLite lineage table
return sqlite_search(query_text)
except:
return [] # fail-open
织忆当前是 Level 2 only(bge-embed vector search)。加 Level 1(BM25)需要 ONNX 模型或 fastembed;加 Level 3/4 简单,直接 grep graph.db 或 LanceDB 的 content 字段。
| 织忆可能受益的点(优先级排序,2026-07-01 源码更新版)
| 优先级 | 借鉴项 | 实现方式 | 实现成本 | 价值 | 当前状态 |
|---|---|---|---|---|---|
| P0 | 降级策略 — bge-embed 挂了走 fallback | zhiyid recall handler 加 3 级退化:① LanceDB → ② graph.db LIKE 搜索 → ③ 返回空 | 低(改 1 个 Go handler) | 高,消除单点故障 | 未实现 |
| P1 | 自动注入钩子 — pre_llm_call 自动查织忆 | 改 Hermes 织忆插件,加 on_session_message 钩子:取消息最后 200 字 → zhiyi_recall() → [织忆] 注入 system prompt |
中(改 Python 插件 ~50 行) | 高,减少 Agent 遗 | 未实现 |
| P2 | 信任评分 — graph 边 / memory 条目加反馈闭环 | ① graph.db edge 表加 retrieval_count + helpful_count + trust_score ② 新增 POST /api/v1/graph/edge/feedback 端点 ③ zhiyid 自动调用(类似 Memory-OS fact_feedback) |
中(SQLite + 1 API + 1 定时任务) | 中,消除矛盾信 | 未实现 |
| P3 | CREATIVE.md 隔离 — 防止双写入冲突 | SOUL.md 新增 CREATIVE.md 章节,织忆 commit 目标改写 CREATIVE.md 而非 MEMORY.md |
低(改 skill 工具~10 行) | 中,防冲突 | 未实现 |
| P4 | 强制注入 Prompt — SOUL.md 加优先指令 | SOUL.md Ground Truth 加 Level 2:Injected memory [织忆] wins over assumptions |
极低(改 SOUL.md) | 中,减少遗忘 | ⚠️ 已部分实现(4 级但有 gap) |
| P5 | Wiki 策展 — 自动知识库 | LLM 双定时任务提取 raw/ → 概念/实体/对比 → 嵌入 Qdrant | 高(全新子系统) | 低,当前非核心 | 跳过 |