MemPalace
AI 记忆系统,LongMemEval 基准 96.6%(无 API 调用),本地存储,完全隐私
基本信息
| 项目 | 内容 |
|---|---|
| GitHub | https://github.com/milla-jovovich/mempalace |
| 语言 | Python 3.9+ |
| 存储 | ChromaDB(语义搜索)+ SQLite(知识图谱) |
| 依赖 | chromadb, pyyaml,无外部 API |
| 许可 | MIT |
| 版本 | v3.0.0 |
核心定位
其他记忆系统(Mem0 / Zep / Mastra)用 LLM 决定"什么值得记忆"——提取事实,丢弃原文。
MemPalace 的反直觉发现:直接存储原始对话文本 + ChromaDB 语义搜索,在 LongMemEval 基准上跑出 96.6%,超过所有需要付费 API 的系统。
核心洞察:LLM 提取会丢失"为什么",而语义搜索能找到它。
架构:The Palace(宫殿记忆法)
灵感来自古希腊演说家——把信息放进虚拟建筑的"房间"里,走进去就能找到。
WING (人物/项目)
└── ROOM (具体主题,如 auth-migration)
└── CLOSET (摘要,指向原文)
└── DRAWER (原始 verbatim 文件)
跨 WING 的同一主题 → TUNNEL(隧道)跨 Wing 连接
同 WING 内的相关主题 → HALL(走廊)连接
六类 Hall(记忆类型,每 Wing 都有):
hall_facts — 已做出的决定
hall_events — 会议、里程碑、调试
hall_discoveries — 突破、新洞察
hall_preferences — 习惯、偏好
hall_advice — 建议和解决方案
宫殿结构的检索收益(实测 22,000+ 对话记忆):
| 搜索范围 | R@10 |
|---|---|
| 全量 closet 搜索 | 60.9% |
| + wing 过滤 | 73.1% |
| + hall 过滤 | 84.8% |
| + room 过滤 | 94.8% |
wing + room 过滤带来 +34% 提升——结构不是装饰,是检索本身。
四层记忆栈
| 层级 | 内容 | Token 量 | 加载时机 |
|---|---|---|---|
| L0 | Identity(身份) | ~50 | 始终 |
| L1 | Critical Facts(关键事实) | ~120 | 始终 |
| L2 | Room Recall(当前项目上下文) | ~200-500 | 按需 |
| L3 | Deep Search(全量语义搜索) | 无上限 | 按需显式查询 |
Wake-up 成本:~170 tokens,$0.70/年(vs LLM 摘要方案 $507/年)。
两大核心模块
1. 语义搜索层(ChromaDB)
- 原始文本存储,不摘要、不提取
- 每个记忆带 metadata:wing / room / hall / date
- wing + room 过滤是核心检索机制
- 可选 rerank(Haiku / Sonnet)冲到 100%
2. 知识图谱层(SQLite)
时序实体关系三元组,取代云端 Neo4j:
kg.add_triple("Kai", "works_on", "Orion", valid_from="2025-06-01")
kg.add_triple("Maya", "assigned_to", "auth-migration", valid_from="2026-01-15")
# 2026-01-20 的视角
kg.query_entity("Maya", as_of="2026-01-20")
# → Maya 被分配了 auth-migration(当时有效)
# 时间线
kg.timeline("Orion")
# → 项目的编年史
- validity window:事实有生效期,过期自动失效
- 历史查询始终有效
- 无外部依赖(vs Zep 需要 Neo4j 云服务 $25/mo+)
AAAK 方言(实验性)
状态更新(April 7, 2026):官方承认问题并修正。
- 不是无损压缩,是 lossy 缩写系统
- 小规模不节省 token:overhead 大于节省(实测:66 tokens 原文 → 73 tokens AAAK)
- 大规模可节省:同一实体重复出现数百次时,实体代码摊薄
- LongMemEval 回归:AAAK 模式 84.2% vs 原始模式 96.6%,差 12.4 点
- 存储默认是原始文本,AAAK 是加载层的独立压缩选项
设计目标:任何能读文本的 LLM(Claude / GPT / Gemini / Llama / Mistral)无需解码器直接读 AAAK。
MCP Server(19 工具)
Claude Code / Gemini CLI 可直接调用:
claude mcp add mempalace -- python -m mempalace.mcp_server
工具分类:
| 类别 | 工具数 | 代表工具 |
|---|---|---|
| Palace 读 | 7 | mempalace_search, mempalace_list_wings, mempalace_get_taxonomy |
| Palace 写 | 2 | mempalace_add_drawer, mempalace_delete_drawer |
| 知识图谱 | 5 | mempalace_kg_query, mempalace_kg_add, mempalace_kg_timeline |
| 导航 | 3 | mempalace_traverse, mempalace_find_tunnels |
| Agent 日记 | 2 | mempalace_diary_write, mempalace_diary_read |
AI 自动从 mempalace_status 响应中学会 AAAK 规范,无需手动配置。
Auto-Save Hooks
Claude Code 专用,自动保存工作记忆:
- Save Hook:每 15 条消息触发结构化保存(主题/决定/引用/代码变更)
- PreCompact Hook:上下文压缩前紧急保存
基准测试结果
| Benchmark | Mode | Score | API Calls |
|---|---|---|---|
| LongMemEval R@5 | Raw ChromaDB | 96.6% | $0 |
| LongMemEval R@5 | Hybrid + Haiku rerank | 100% | ~$0.001/query |
| LoCoMo R@10 | Raw | 60.3% | $0 |
| LoCoMo R@10 | Hybrid + Sonnet | 100% | ~$0.003/query |
96.6% = 最高已发布零 API 调用分数。
关键源文件
| 文件 | 作用 |
|---|---|
knowledge_graph.py |
时序三元组图谱(SQLite) |
palace_graph.py |
Wing/Room/Hall/Tunnel 图遍历 |
searcher.py |
ChromaDB 语义搜索 |
layers.py |
L0-L3 四层记忆栈 |
dialect.py |
AAAK 缩写方言 |
mcp_server.py |
MCP 协议 19 工具 |
convo_miner.py |
对话导入(按 exchange pair 分块) |
onboarding.py |
引导初始化 |
对 Claude Code 项目的参考价值
| 方向 | 启示 |
|---|---|
| 原始文本 > 提取摘要 | 语义搜索足够强,不需要 LLM 做提取决策;减少信息损失 |
| 分层加载 | L0/L1 常驻 + L2/L3 按需,成本降低 95%+ |
| 结构化元数据 | wing/room/hall 三级 metadata,语义过滤外加结构过滤 |
| 时序知识图谱 | 替代 Zep/Neo4j,SQLite 完全本地化,validity window 设计精巧 |
| Claude Code Hook | 15条消息自动保存,在压缩前紧急保存——防止上下文丢失 |
| AAAK 诚实教训 | 官方 README 修正了过度宣传——benchmark 数据要严格可复现 |
诚实局限性(README 官方承认)
- AAAK 在小规模场景不节省 token,README 例子有误(已修正)
- 30x 无损压缩宣传过度——AAAK 是 lossy 设计
- "+34% palace boost" 夸大——metadata 过滤是 ChromaDB 标准功能
- 矛盾检测工具
fact_checker.py存在但未接入 KG 操作流程 - 100% Haiku rerank 结果有文件但 benchmark 脚本未公开
核心卖点(96.6% raw)是真实可复现的。