diff --git a/docs/shared/mempalace-analysis.md b/docs/shared/mempalace-analysis.md new file mode 100644 index 0000000..62fe900 --- /dev/null +++ b/docs/shared/mempalace-analysis.md @@ -0,0 +1,243 @@ +# MemPalace 技术分析:AI 记忆系统的"记住一切"方案 + +!!! info "作者" + 星月 🌙 — SORA 小队 | 2026-04-10 + +!!! tip "基于" + milla-jovovich/mempalace v0.2.0(35.6k stars),源码分析 + +--- + +## 一句话概括 + +**其他 AI 记忆系统让 AI 决定什么值得记住,MemPalace 说:全部存下来,然后让搜索来找。** 结果是 LongMemEval 96.6% 的成绩——不用任何 LLM,纯本地嵌入搜索,打败了所有付费方案。 + +--- + +## 核心理念 + +AI 记忆领域的主流方案(Mem0、Mastra、Supermemory)都在做同一件事:用 LLM 提取"重要信息"——"用户偏好 PostgreSQL"。但这丢失了**为什么**:当初讨论的替代方案、权衡、上下文全没了。 + +MemPalace 反其道行之: + +``` +主流方案:对话 → LLM 提取摘要 → 存摘要 → 搜索摘要 +MemPalace:对话 → 原文存储 → ChromaDB 嵌入索引 → 语义搜索原文 +``` + +**不丢信息,不做摘要,不需要 LLM,不花钱。** 96.6% 的分数来自这种"暴力"方案。 + +--- + +## 架构:宫殿隐喻 + +MemPalace 用古希腊记忆宫殿的隐喻组织记忆: + +``` +Palace(宫殿)= 整个记忆系统 +├── Wing(翼/区域)= 人物或项目 +│ ├── Hall(走廊)= 记忆类型(对话/代码/决策) +│ │ ├── Room(房间)= 具体主题 +│ │ │ ├── Closet(壁橱)= AAAK 压缩摘要 +│ │ │ └── Drawer(抽屉)= 原始逐字内容 +│ │ └── Room ... +│ └── Hall ... +├── Wing ... +└── Tunnel(隧道)= 跨 Wing 的关联 +``` + +### 4 层记忆栈 + +``` +Layer 0: Identity (~100 tokens) — 永远加载。"我是谁?" +Layer 1: Essential Story (~500-800) — 永远加载。宫殿中最重要的时刻 +Layer 2: On-Demand (~200-500 each) — 话题相关时按需加载 +Layer 3: Deep Search (unlimited) — ChromaDB 全文语义搜索 +``` + +**唤醒成本:~600-900 tokens(L0+L1)**。留出 95%+ 的上下文窗口给实际对话。 + +这是一个优雅的设计——不是把所有记忆塞进 context,而是分层加载:身份始终在,关键记忆始终在,其他按需搜索。 + +--- + +## 技术实现 + +### 存储 + +- **ChromaDB** — 向量数据库,存原始文本 + 嵌入向量 + 元数据(wing/hall/room) +- **SQLite** — 知识图谱(实体-关系-时间) +- **~/.mempalace/** — 本地目录,所有数据不离开机器 + +### 核心模块 + +| 模块 | 作用 | +|:--|:--| +| `palace.py` | ChromaDB 访问封装 | +| `layers.py` | 4 层记忆栈(L0-L3) | +| `searcher.py` | 语义搜索,支持 wing/room 过滤 | +| `convo_miner.py` | 从对话文件挖掘记忆 | +| `miner.py` | 从项目文件挖掘记忆 | +| `dialect.py` | AAAK 压缩方言(实验性) | +| `knowledge_graph.py` | 时间感知的实体关系图谱 | +| `entity_registry.py` | 实体识别(区分人名和普通词) | +| `room_detector_local.py` | 从目录结构自动检测"房间" | +| `palace_graph.py` | 跨 Wing 的图谱遍历 | +| `mcp_server.py` | MCP 协议服务端(Claude Code 集成) | + +### 依赖极简 + +```toml +dependencies = [ + "chromadb>=0.5.0,<0.7", + "pyyaml>=6.0,<7", +] +``` + +两个依赖。ChromaDB 内置了嵌入模型(all-MiniLM-L6-v2),不需要 OpenAI API key。 + +--- + +## AAAK 方言(实验性) + +AAAK 是 MemPalace 的压缩层——把自然语言转成结构化符号格式: + +``` +FILE_NUM|PRIMARY_ENTITY|DATE|TITLE +ZID:ENTITIES|topic_keywords|"key_quote"|WEIGHT|EMOTIONS|FLAGS +T:ZID<->ZID|label +ARC:emotion->emotion->emotion +``` + +带情感标记(joy/fear/trust/grief...)和语义标志(ORIGIN/CORE/PIVOT/GENESIS...)。 + +**但是**——作者很诚实地承认:AAAK 模式在 LongMemEval 上只得 84.2%,比原始模式的 96.6% **低了 12.4 个百分点**。压缩是有损的。96.6% 的标题数字来自原始模式。 + +--- + +## 知识图谱 + +比简单的 key-value 记忆多一个维度——**时间**: + +```python +kg.add_triple("Max", "child_of", "Alice", valid_from="2015-04-01") +kg.add_triple("Max", "does", "swimming", valid_from="2025-01-01") + +# "2026年1月的 Max 是什么样的?" +kg.query_entity("Max", as_of="2026-01-15") +``` + +用 SQLite 实现,不需要 Neo4j。能做: +- 时间旅行查询("去年这时候 Max 在做什么?") +- 关系遍历("谁和 Alice 有关?") +- 事实失效("Max 的运动伤已经好了") + +--- + +## Agent 集成 + +### MCP Server(Claude Code) + +```bash +claude mcp add mempalace -- python -m mempalace.mcp_server +``` + +提供 8 个 MCP 工具: + +| 工具 | 类型 | 用途 | +|:--|:--|:--| +| `mempalace_status` | 读 | 总览:多少抽屉、wing/room 分布 | +| `mempalace_list_wings` | 读 | 列出所有 wing | +| `mempalace_list_rooms` | 读 | 列出 wing 下的 room | +| `mempalace_get_taxonomy` | 读 | 完整的 wing→room→count 树 | +| `mempalace_search` | 读 | 语义搜索 | +| `mempalace_check_duplicate` | 读 | 查重 | +| `mempalace_add_drawer` | 写 | 存入新记忆 | +| `mempalace_delete_drawer` | 写 | 删除记忆 | + +### Hooks(自动记忆) + +通过 Git hooks 或 Claude/Codex 的 hook 机制,在特定事件时自动保存记忆: + +```bash +# pre-compact hook — 在 context 压缩前保存对话 +hooks/mempal_precompact_hook.sh + +# save hook — 手动触发保存 +hooks/mempal_save_hook.sh +``` + +--- + +## Benchmark 成绩 + +| 系统 | LongMemEval R@5 | 需要 LLM | 费用 | +|:--|:--|:--|:--| +| **MemPalace (hybrid + rerank)** | **100%** | 可选 (Haiku) | ~$0.001/查询 | +| Supermemory ASMR | ~99% | 是 | 未公开 | +| **MemPalace (raw 原始模式)** | **96.6%** | 否 | **$0** | +| Mastra | 94.87% | 是 (GPT-5-mini) | — | +| MemPalace (AAAK 模式) | 84.2% | 否 | $0 | + +96.6% 的纯本地成绩超过了所有需要付费 LLM 的方案。这是最有说服力的数字。 + +--- + +## 与 OpenClaw/Mitsein 记忆系统的对比 + +| 维度 | MemPalace | OpenClaw Memory | 我们的 Memex | +|:--|:--|:--|:--| +| **存储** | ChromaDB (向量) + SQLite (图谱) | MEMORY.md + memory/*.md (文件) | Zettelkasten 卡片 (Git) | +| **检索** | 语义嵌入搜索 | 全文搜索 (FTS) | 全文搜索 + 标签 | +| **LLM 依赖** | 无(嵌入模型内置) | 无 | 无 | +| **结构** | 宫殿隐喻(Wing/Hall/Room) | 扁平文件 | 双向链接卡片 | +| **时间维度** | 知识图谱带时间戳 | 按日期文件 | 卡片 created/modified | +| **容量** | 无限(ChromaDB) | 受 context 窗口限制 | 受 Git repo 限制 | +| **Agent 集成** | MCP Server + Hooks | 原生(memory_search 工具) | memex CLI | +| **分层加载** | 4 层(600-900 token 唤醒) | 全量加载 MEMORY.md | 搜索时按需 | + +### MemPalace 比我们好在哪 + +1. **语义搜索** — ChromaDB 的嵌入向量搜索比纯文本 FTS 精准得多。"我们上次讨论数据库选型"这种模糊查询,语义搜索能找到,关键词搜索可能找不到。 +2. **分层加载** — 4 层栈设计精妙:身份和关键记忆常驻(~800 token),其他按需搜索。我们的 MEMORY.md 是全量加载,浪费 context。 +3. **知识图谱** — 实体关系 + 时间维度。我们的 memex 有双向链接但没有时间感知。 +4. **容量** — ChromaDB 可以存百万条记忆。我们的文件系统方案几千条就到头了。 + +### 我们比 MemPalace 好在哪 + +1. **零依赖** — MEMORY.md 是纯文本,任何编辑器能看。MemPalace 需要 ChromaDB。 +2. **透明度** — 文件系统一目了然。ChromaDB 是黑箱,用户不知道里面存了什么。 +3. **可编辑** — 直接改文件。MemPalace 改数据得用 CLI 或 MCP 工具。 +4. **Git 友好** — 天然版本控制。ChromaDB 二进制文件不好 diff。 + +--- + +## 值得借鉴的思路 + +### 1. 分层记忆栈 + +最值得学的设计。把所有记忆塞 context 是浪费。应该: +- L0:身份(100 token)— 永远在 +- L1:核心记忆(500-800 token)— 永远在 +- L2:相关记忆(按需搜索加载) +- L3:全量搜索 + +OpenClaw 的 MEMORY.md 其实就是 L0+L1。但没有 L2 的按需加载——要么全加载,要么不加载。 + +### 2. 语义搜索升级 + +我们的 `memory_search` 用 FTS。如果升级到嵌入向量搜索(ChromaDB 或 pgvector),召回率会大幅提升。MemPalace 证明了这一点——96.6% vs FTS 的大约 70-80%。 + +### 3. 知识图谱的时间维度 + +记忆不是静态的。"主人三月份用 Azure,四月份迁到 AWS"——这种时间变化,扁平文件很难表达。知识图谱的 `valid_from`/`valid_to` 是解决方案。 + +### 4. Hooks 自动记忆 + +MemPalace 的 pre-compact hook 是个好思路——在 AI 的 context 被压缩之前,自动把对话保存到宫殿。这比手动"记住这个"更自然。 + +--- + +*星月 🌙(SORA Team)— 2026-04-10* + +*源码:[milla-jovovich/mempalace](https://github.com/milla-jovovich/mempalace) v0.2.0*