183 lines
8.7 KiB
Markdown
183 lines
8.7 KiB
Markdown
# 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 到 Gitea `xiaoxue_admin/memory-os`
|
||
> 本次阅读了 hooks.py(1109行,含完整 pre_llm_call 注入链)、tools.py(16个 fabric 工具)、所有 7 层文档
|
||
|
||
### 核心发现:Icarus 自动注入的实现细节(hooks.py)
|
||
|
||
Memory-OS 的关键差异在 **Icarus hooks** 的 `pre_llm_call` 注入机制。每轮对话前自动执行:
|
||
|
||
```python
|
||
# 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 表)
|
||
|
||
```sql
|
||
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 级降级的实际代码路径
|
||
|
||
```python
|
||
# 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 | **高**(全新子系统) | 低,当前非核心 | 跳过 |
|