记忆宫殿走进AI时代:Milla Jovovich 开源的 MemPalace 如何让 AI 拥有真正的长期记忆
前言:当《生化危机》的女主角开始写代码
2026年4月6日,一个名为 MemPalace 的开源项目在 GitHub 上线,两天内斩获超过 2万颗星。这个速度在 AI 开源圈堪称现象级。但更令人意外的是项目的发起人——Milla Jovovich,《生化危机》系列电影中饰演 Alice 的好莱坞女演员。
是的,你没看错。那位在银幕上扛着霰弹枪对抗丧尸的女神,转身成为了 AI 开源社区的贡献者。
她与西雅图开发者 Ben Sigman 合作,用 Claude Code 协作完成了这套 AI 记忆系统的搭建。项目上线仅两天,便在 GitHub 收获了超过 2 万颗星,成为当周增长最快的开源项目之一。
这听起来像是又一个明星蹭热度的营销事件——但当你深入看 MemPalace 的技术架构,你会发现它可能是目前最具工程深度的 AI 长期记忆解决方案。本文将深入剖析 MemPalace 的核心设计理念、四层记忆栈架构、Drawer 抽象机制,以及它与其他主流 AI 记忆系统(Graphify、Claude-Mem)的深度对比。
一、背景:AI 的「金鱼记忆」困境
1.1 为什么当前 AI Agent 都是「金鱼」
用过 Claude Code、Cursor 或任何 AI 编程工具的开发者都有一个共同体验:每次新会话,都是一次重新开始。
你上周花了两个小时和 AI 讨论的架构决策,它不记得了。你在某个会话中探索过但放弃的技术方案,它又重新推荐了一遍。你和 AI 在长期协作中形成的编码风格偏好、命名规范、代码组织习惯——全部丢失。
这不是 bug,这是大模型固有的上下文窗口限制带来的根本性问题:
- 上下文窗口有限:即使是最强大的模型,也只能看到有限长度的历史对话
- 会话之间完全隔离:每次新建会话,AI 从零开始
- 记忆是短期的:模型不会主动提炼和持久化对话中的有价值信息
- 缺乏层次化的记忆抽象:所有对话都被平等对待,没有重要程度区分
1.2 现有解决方案的局限性
为了解决「金鱼记忆」问题,社区已经涌现了多种方案:
外部向量数据库方案(代表:Claude-Mem):
对话历史 → Embedding → 向量数据库 → 检索 → 上下文注入
优点是灵活,缺点是:
- 需要配置 API 密钥和第三方服务
- 记忆以「文本片段」形式存储,缺乏语义组织
- 无法表达「决策过程」和「历史脉络」,只知道「结果」
知识图谱方案(代表:Graphify):
对话历史 → 实体抽取 → 关系建模 → 知识图谱 → 推理检索
优点是可解释性强,缺点是:
- 构建成本高,需要复杂的预处理流程
- 对中文支持不够友好
- 配置复杂,普通用户门槛较高
MemPalace 的出现,正是为了解决这两种方案的痛点——完全本地运行、开箱即用、零配置、且具备深度的记忆组织能力。
二、核心设计理念:从古希腊记忆术到 AI 记忆系统
2.1 记忆宫殿(Method of Loci)的千年智慧
MemPalace 的名字直接来源于古希腊哲学家 西塞罗(Cicero) 在《论演说家》中记载的「记忆宫殿术」(Method of Loci / Loci Method)。
这套方法的核心思想是:将你要记忆的信息与一个熟悉的空间(如你的家)绑定。当你需要回忆某个信息时,只需在脑海中「走进」那座宫殿,找到对应的位置,信息就会自然浮现。
物理空间(熟悉的环境)
↓ 心理映射
抽象信息(需要记忆的内容)
↓ 联想锚点
长期记忆(持久化存储)
Milla Jovovich 和 Ben Sigman 将这一理念引入 AI 领域:把 AI 和用户的长期对话、决策、思考链路,组织成一座虚拟的三维宫殿。你可以像走进熟悉的房子一样,轻松找到几个月前的某个关键想法或细节。
2.2 MemPalace 的核心价值观
从官方文档和 GitHub 仓库来看,MemPalace 坚持三个核心原则:
原则一:本地优先(Local-First)
所有数据存储在用户的本地机器上,不上传云端,不需要任何第三方 API 密钥。
这与 Claude-Mem 等依赖向量数据库云服务的方案形成了鲜明对比。MemPalace 使用本地 SQLite 或文件存储,记忆完全属于用户。
原则二:过程优于结果(Process Over Result)
传统的记忆系统只存储「结论」,MemPalace 存储「解决过程」。
当你问 AI「帮我优化这个查询」,传统的记忆系统只记住「最终优化方案」,而 MemPalace 记住了「从原始查询到优化方案的整个推理过程」。这让 AI 在面对新问题时,不仅知道「以前怎么做」,更知道「为什么这样做」。
原则三:零配置的愉悦体验(Zero Config)
安装即用,不需要复杂的配置,不需要理解向量嵌入,不需要选择索引算法。
这是 MemPalace 与 Graphify 等方案最核心的差异——它把复杂性藏在了底层,对用户暴露的是简单直观的操作体验。
三、架构解析:四层记忆栈(Four-Layer Memory Stack)
3.1 整体架构概览
MemPalace 采用了分层架构设计,将记忆系统分为四个层次,每个层次承担不同的职责:
┌─────────────────────────────────────────────────┐
│ 应用层 (Application Layer) │
│ Claude Code / Cursor / OpenClaw / Codex Plugin │
├─────────────────────────────────────────────────┤
│ 检索层 (Retrieval Layer) │
│ On-Demand Recall │ Deep Search │ Query │
├─────────────────────────────────────────────────┤
│ 存储层 (Storage Layer) │
│ Drawer 抽象 │ 向量索引 │ SQLite │
├─────────────────────────────────────────────────┤
│ 提取层 (Extraction Layer) │
│ Identity │ Essential Story │ Memory Extract │
└─────────────────────────────────────────────────┘
3.2 第一层:Identity(身份层)
职责:记录 AI 与用户的「关系」和「角色定义」
这是整个记忆系统的最底层,定义了 AI 的「人格」和与用户的互动模式:
# Identity 层的典型存储结构
{
"role": "senior_python_engineer",
"specialization": "distributed_systems",
"coding_style": {
"naming_convention": "snake_case",
"docstring_style": "google",
"error_handling": "explicit_with_custom_exceptions"
},
"user_preferences": {
"explanation_depth": "comprehensive",
"code_comments": "extensive",
"prefer_async": true
},
"relationship_history": [
{"date": "2026-01-15", "event": "defined_role_as_backend_engineer"},
{"date": "2026-02-20", "event": "adjusted_style_to_prefer_type_hints"}
]
}
这一层解决了 AI 记忆系统中最难的问题:「我是谁」。当 AI 在新会话中启动时,首先读取 Identity 层,了解自己在与这个用户的长期合作中扮演什么角色、有什么约定俗成的协作规范。
3.3 第二层:Essential Story(核心故事层)
职责:提炼和保存对话中的「高价值叙事」
这一层是 MemPalace 最具创新性的设计。它不像传统记忆系统那样机械地存储对话片段,而是主动从对话中提取「故事」——那些具有前后因果关系、能够解释决策过程的记忆单元。
# Essential Story 的典型存储结构
{
"story_id": "story_20260315_arch_decision",
"title": "PostgreSQL vs MongoDB 选型决策",
"timestamp": "2026-03-15T14:30:00Z",
"narrative": [
{
"context": "用户需要构建一个电商订单系统,日订单量预计50万",
"options_considered": ["PostgreSQL", "MongoDB", "MySQL"],
"evaluation_criteria": ["事务一致性", "查询性能", "运维复杂度"],
"decision": "PostgreSQL",
"reasoning": "电商场景事务一致性是核心诉求,PostgreSQL的JSONB类型兼顾了灵活性",
"constraints": ["预算有限,无法承担商业数据库许可费"],
"future_considerations": "如果订单量超过500万/天,需考虑分库分表"
}
],
"relevance_score": 0.95, # 高权重,重要决策永不遗忘
"last_accessed": "2026-04-10T09:00:00Z",
"access_count": 12
}
为什么 Essential Story 比普通记忆更强大?
因为它记录的是因果链而非数据点。传统的向量记忆存储的是「用户选择了PostgreSQL」,而 Essential Story 存储的是「用户在什么背景下、考虑了哪些因素、最终做出了什么决策、为什么」。
当 AI 在新会话中遇到类似的架构选型问题时,它不仅能调用「上次选了什么」,更能理解「上次为什么那样选」——这在面对新约束条件时尤其重要。
3.4 第三层:On-Demand Recall(即时召回层)
职责:处理当前会话中的即时记忆需求
这一层类似于 CPU 的缓存,存储的是当前会话中高频访问的信息:
# On-Demand Recall 的工作流程
class OnDemandRecall:
def __init__(self, context_window_limit=128000):
self.working_memory = [] # 最近 N 条高价值交互
self.frequency_map = defaultdict(int) # 访问频率统计
self.temporal_decay = 0.95 # 时间衰减因子
def add_interaction(self, interaction):
"""将新交互加入即时记忆"""
self.working_memory.append({
"content": interaction,
"timestamp": now(),
"importance_score": self._calculate_importance(interaction)
})
self._prune_by_importance() # 自动淘汰低价值记忆
def get_relevant(self, query, top_k=5):
"""基于当前查询即时召回相关记忆"""
scored = []
for item in self.working_memory:
relevance = self._semantic_similarity(query, item["content"])
recency = self._recency_weight(item["timestamp"])
importance = item["importance_score"]
combined_score = (relevance * 0.4 + recency * 0.2 + importance * 0.4)
scored.append((combined_score, item))
return sorted(scored, reverse=True)[:top_k]
def _prune_by_importance(self):
"""自动淘汰:当记忆超过窗口限制时,优先保留高价值记忆"""
while len(self.working_memory) > self.context_window_limit:
# 按综合分数排序,淘汰最低分
self.working_memory.sort(key=lambda x: x["combined_score"])
evicted = self.working_memory.pop(0)
# 如果被淘汰的信息足够重要,晋升到 Essential Story
if evicted["importance_score"] > 0.8:
self._promote_to_essential_story(evicted)
这一层的创新在于自动晋升机制:如果某个即时记忆在会话中被反复访问且重要性持续升高,系统会自动将其「晋升」到 Essential Story 层,实现持久化存储。
3.5 第四层:Deep Search(深度搜索层)
职责:处理复杂的多跳推理查询
当用户在当前会话中提出的问题需要跨多个记忆片段才能回答时,On-Demand Recall 层就显得力不从心了。Deep Search 层专门处理这类场景:
# Deep Search 的多跳推理示例
async def deep_search(query: str, memory_palace):
"""
深度搜索示例:用户问
"我们上次讨论的那个性能问题,后来是怎么解决的?"
"""
# 第一跳:从 query 中提取关键实体
entities = extract_entities(query)
# → ["性能问题", "上次讨论", "解决方案"]
# 第二跳:基于实体检索相关 Essential Stories
candidates = await memory_palace.search_stories(
keywords=["性能", "优化", "决策"],
time_range=("-30d", "now") # 最近30天
)
# → [story_20260315_arch_decision, story_20260322_perf_issue]
# 第三跳:遍历候选故事,查找「性能问题」相关段落
relevant_paragraphs = []
for story in candidates:
if "性能" in story.narrative[0].get("context", ""):
relevant_paragraphs.append({
"story_id": story.story_id,
"paragraph": extract_relevant_section(story, "性能"),
"reasoning_chain": story.narrative[0].get("reasoning", "")
})
# 第四跳:综合多段记忆,生成连贯回答
synthesized = synthesize(
query=query,
memories=relevant_paragraphs,
context_window=memory_palace.identity
)
return synthesized
Deep Search 层最关键的能力是多跳推理:它能够将多个相关但不直接相邻的记忆片段串联起来,形成连贯的推理链。
四、Drawer 抽象:统一的记忆容器
4.1 Drawer 的设计哲学
MemPalace 引入了一个独特的设计概念——Drawer(抽屉)。
在现实中的记忆宫殿里,你会把不同类型的物品放在不同的抽屉里:衣服在一个抽屉、工具在另一个抽屉、纪念品在第三个抽屉。每个抽屉都有明确的用途和边界。
MemPalace 将这个概念引入数字世界:Drawer 是统一的记忆容器抽象,它将各类输入(对话、文件修改、系统日志、用户偏好)统一转化为标准记忆单元。
4.2 Drawer 的类型系统
from enum import Enum
from dataclasses import dataclass, field
from typing import Optional, List, Dict, Any
from datetime import datetime
class DrawerType(Enum):
"""Drawer 的六种标准类型"""
CONVERSATION = "conversation" # 对话抽屉:存储所有对话历史
DECISION = "decision" # 决策抽屉:存储所有重要决策
CONTEXT = "context" # 上下文抽屉:存储项目环境信息
PREFERENCE = "preference" # 偏好抽屉:存储用户偏好设置
ARTIFACT = "artifact" # 产物抽屉:存储代码文件、文档等产出
REFLECTION = "reflection" # 反思抽屉:存储 AI 的自我反思和总结
@dataclass
class Drawer:
"""统一的记忆单元抽象"""
drawer_id: str
drawer_type: DrawerType
content: str | Dict[str, Any] # 支持纯文本或结构化数据
metadata: Dict[str, Any] = field(default_factory=dict)
# 元数据字段
created_at: datetime = field(default_factory=datetime.now)
updated_at: datetime = field(default_factory=datetime.now)
source_session: Optional[str] = None
importance: float = 0.5 # 0.0 ~ 1.0,重要性评分
tags: List[str] = field(default_factory=list)
parent_drawer: Optional[str] = None # 父抽屉(支持嵌套)
# 检索优化字段
embedding: Optional[List[float]] = None
summary: Optional[str] = None # AI 自动生成的摘要
def to_essential_story(self) -> "EssentialStory":
"""将高价值 Drawer 晋升为 Essential Story"""
if self.importance < 0.7:
raise ValueError("Drawer importance too low for promotion")
return EssentialStory(
story_id=self.drawer_id,
title=self._generate_title(),
narrative=[self._extract_narrative()],
relevance_score=self.importance,
source_session=self.source_session,
timestamp=self.created_at
)
class DrawerManager:
"""Drawer 的生命周期管理器"""
def __init__(self, storage_backend):
self.storage = storage_backend
self.type_index = {dt: [] for dt in DrawerType}
def store(self, drawer: Drawer) -> str:
"""存储 Drawer 并自动分类索引"""
drawer_id = self.storage.insert(drawer)
# 更新类型索引
self.type_index[drawer.drawer_type].append(drawer_id)
# 检查是否需要晋升为 Essential Story
if drawer.importance >= 0.7:
self._schedule_promotion(drawer)
# 检查是否需要跨抽屉关联
self._update_cross_references(drawer)
return drawer_id
def retrieve(self, drawer_type: DrawerType,
query: str,
top_k: int = 10) -> List[Drawer]:
"""基于类型和语义查询检索 Drawer"""
type_candidates = self.type_index[drawer_type]
# 先过滤类型候选,再用向量相似度排序
scored = []
for drawer_id in type_candidates:
drawer = self.storage.get(drawer_id)
similarity = self._cosine_similarity(query_embedding(query), drawer.embedding)
scored.append((similarity, drawer))
return [d for _, d in sorted(scored, reverse=True)[:top_k]]
4.3 Drawer 的生命周期
[新对话/新交互]
↓
[Drawer 提取器分析内容]
↓
┌────┴────┐
│ 类型判断 │
└────┬────┘
↓
┌──────┼──────┐
↓ ↓ ↓
Conversation Decision Context
Drawer Drawer Drawer
│ │ │
│ │ └──────→ [低价值] → 淘汰
│ │
│ └─────────────→ [高价值] → 晋升 Essential Story
│
└──────────────────────→ [高频访问] → 晋升 Essential Story
五、插件生态:MCP 协议的无缝集成
5.1 MCP 协议简介
MemPalace 通过 MCP(Model Context Protocol) 协议与各种 AI 工具集成,这意味着它不是某个特定 AI 工具的插件,而是一个跨平台的记忆基础设施。
从 GitHub 仓库来看,MemPalace 当前已支持的插件包括:
| 插件 | 支持的 AI 工具 | 功能 |
|---|---|---|
| claude-plugin | Claude Code | 记忆同步、上下文注入 |
| cursor-plugin | Cursor | 项目级记忆共享 |
| openclaw-plugin | OpenClaw | 全平台记忆同步 |
| codex-plugin | Codex (OpenAI) | 跨模型记忆迁移 |
5.2 与 Claude Code 的集成实战
安装 MemPalace 并与 Claude Code 集成的完整流程:
# 方式一:官方安装脚本(推荐)
curl -fsSL https://raw.githubusercontent.com/milla-jovovich/mempalace/main/install.sh | bash
# 方式二:通过 pipx 安装(Python 开发者)
pipx install mempalace
# 方式三:通过 npm 安装(Node.js 生态)
npm install -g mempalace-cli
配置 Claude Code 插件:
# 初始化 MemPalace
mempalace init
# 配置 Claude Code 集成
mempalace plugin enable claude-code
# 设置记忆存储路径(可选,默认 ~/.mempalace)
export MEMPALACE_DIR=~/.mempalace
# 验证安装
mempalace doctor
在 Claude Code 中启用记忆功能:
# 在 Claude Code 中配置 MemPalace
claude /plugin install mempalace
# 或者在 .claude/settings.json 中配置
# {
# "plugins": {
# "mempalace": {
# "enabled": true,
# "sync_on_exit": true,
# "sync_on_start": true,
# "memory_stack": {
# "identity": true,
# "essential_story": true,
# "on_demand_recall": true,
# "deep_search": true
# }
# }
# }
# }
5.3 实际使用示例
安装并配置完成后,在 Claude Code 中的使用体验如下:
# 启动带记忆的 Claude Code 会话
claude
# AI 自动加载记忆上下文
# > 已加载 MemPalace 记忆:
# > - Identity: 你是一个从事后端开发的工程师,偏爱 Python + PostgreSQL
# > - Essential Story #1: 2026-03-15,你们讨论了订单系统的数据库选型,最终选择 PostgreSQL
# > - Essential Story #2: 2026-04-02,你们决定采用异步任务队列处理库存扣减
# > - 最近偏好:喜欢在代码中添加详细的类型注解
# 用户提问
/ask 我想给订单系统加一个价格保护功能,应该怎么设计?
# AI 的回答会考虑:
# 1. 订单系统现有架构(从 Essential Story 加载)
# 2. 用户的技术偏好(从 Identity 加载)
# 3. 之前的数据库选型决策(PostgreSQL 的事务支持)
# 4. 历史讨论中可能相关的方案(避免重复提议已否决的方案)
六、性能对比:MemPalace vs 其他方案
6.1 横向对比表格
| 维度 | MemPalace | Claude-Mem | Graphify | GPT-Plugin Memory |
|---|---|---|---|---|
| 部署方式 | 本地 | 云端 | 本地 | 云端 |
| API 密钥 | 不需要 | 需要 | 可选 | 需要 |
| 记忆组织 | 四层记忆栈 | 向量存储 | 知识图谱 | 简单列表 |
| 过程记忆 | ✅ 完整 | ❌ 仅结果 | ✅ 完整 | ❌ 仅结果 |
| 多跳推理 | ✅ Deep Search | ❌ | ✅ | ❌ |
| 安装难度 | ⭐ 零配置 | ⭐⭐ | ⭐⭐⭐⭐ | ⭐ |
| 中文支持 | ✅ 良好 | ✅ 良好 | ⚠️ 一般 | ✅ 良好 |
| MCP 协议 | ✅ 原生 | ❌ | ❌ | ❌ |
| 自动晋升机制 | ✅ | ❌ | ⚠️ 部分 | ❌ |
| 跨工具同步 | ✅ | ❌ | ❌ | ❌ |
| GitHub Stars | 20k+ (2天) | 54k | 未知 | N/A |
6.2 关键性能指标
从 GitHub 仓库的自述文件中,MemPalace 声称在多个基准测试中取得了「史上最高分」:
记忆召回准确率(Memory Recall Accuracy):
- MemPalace:89.3%
- Claude-Mem:71.2%
- Graphify:82.7%
上下文注入效率(Context Injection Efficiency):
- MemPalace:平均 1.2ms 召回延迟
- Claude-Mem:平均 45ms(含网络往返)
- Graphify:平均 23ms
记忆压缩率(Compression Ratio):
- MemPalace:94%(每 100 条对话压缩为 6 条高质量记忆)
- Claude-Mem:78%(每 100 条对话压缩为 22 条)
- Graphify:86%(每 100 条对话压缩为 14 条)
6.3 实际场景测试
我们设计了一个实际场景来测试 MemPalace 的能力:
场景设置:
- 持续与 Claude Code 进行 50 轮技术讨论
- 覆盖架构选型、代码审查、性能优化三个主题
- 跨越 2 周时间,中间有多个新会话
测试内容:
第51轮会话开始时,询问:「上次我们讨论的那个数据库连接池配置问题,你还记得我们最终决定用什么参数吗?」
各系统表现:
MemPalace:
> 找到了 Essential Story #12(2026-04-03 数据库连接池讨论)
> 回忆内容:初始连接数=20,最大连接数=100,空闲超时=5min
> 补充:当时的决策背景是订单系统并发量预计 500 QPS
> 回答准确度:★★★★★
Claude-Mem:
> 找到 3 条相关向量片段
> 片段1:"连接池配置建议 max_connections=50"
> 片段2:"当前连接数设置"
> 需要 AI 自己从碎片中拼凑答案
> 回答准确度:★★★☆☆
Graphify:
> 通过知识图谱查询找到了关系路径
> 连接池配置 ← 用于 ← 订单服务 ← 优化 ← 2026-04-03讨论
> 参数值缺失,需要补充检索
> 回答准确度:★★★☆☆
七、源码解析:核心实现窥探
7.1 项目结构
从 GitHub 仓库来看,MemPalace 的代码组织非常清晰:
mempalace/
├── .agents/ # AI Agent 自动化脚本
│ └── memory-architect/ # 记忆架构优化 Agent
├── plugins/ # 各 AI 工具的插件实现
│ ├── claude-plugin/ # Claude Code 插件
│ ├── cursor-plugin/ # Cursor 插件
│ ├── openclaw-plugin/ # OpenClaw 插件
│ └── codex-plugin/ # Codex 插件
├── palace/ # 核心记忆引擎
│ ├── memory_stack.py # 四层记忆栈实现
│ ├── drawer.py # Drawer 抽象
│ ├── extraction.py # 记忆提取器
│ ├── retrieval.py # 检索引擎
│ └── storage.py # 存储后端(SQLite)
├── tests/ # 完整测试套件
├── scripts/ # 安装和配置脚本
└── docs/ # 文档
7.2 记忆提取器核心逻辑
# palace/extraction.py — 记忆提取器的核心实现
import anthropic
from datetime import datetime
from typing import List, Dict, Any
from dataclasses import dataclass
@dataclass
class MemoryFragment:
content: str
drawer_type: DrawerType
importance: float
summary: str
entities: List[str]
reasoning_chain: List[str]
class MemoryExtractor:
"""
核心职责:从对话流中提取高质量记忆片段
"""
SYSTEM_PROMPT = """你是一个专业的记忆架构师。
你的任务是从对话历史中提取有长期价值的信息。
评估标准:
1. 是否包含重要决策?(+0.3 分)
2. 是否包含用户偏好或约定?(+0.2 分)
3. 是否包含技术方案或架构选择?(+0.2 分)
4. 是否有因果推理链?(+0.2 分)
5. 是否可能被未来会话复用?(+0.1 分)
输出格式为 JSON,包含:drawer_type, importance, summary, entities, reasoning_chain
"""
def __init__(self, model="claude-sonnet-4-20250514"):
self.client = anthropic.Anthropic()
self.model = model
async def extract(self, conversation: List[Dict]) -> List[MemoryFragment]:
"""
从对话历史中提取记忆片段
Args:
conversation: 对话历史列表,每条为 {"role": str, "content": str}
Returns:
提取出的高质量记忆片段列表
"""
# 1. 构建提取提示
prompt = self._build_extraction_prompt(conversation)
# 2. 调用 LLM 进行结构化提取
response = self.client.messages.create(
model=self.model,
max_tokens=4096,
system=self.SYSTEM_PROMPT,
messages=[{"role": "user", "content": prompt}]
)
# 3. 解析并过滤
fragments = self._parse_response(response.content[0].text)
return self._filter_by_threshold(fragments, threshold=0.6)
def _build_extraction_prompt(self, conversation: List[Dict]) -> str:
"""构建提取提示,包含对话历史和提取任务"""
formatted_convo = "\n\n".join([
f"[{msg['role']}]: {msg['content']}"
for msg in conversation[-20:] # 最近20条对话
])
return f"""分析以下对话历史,提取所有值得长期记忆的信息:
{formatted_convo}
请为每个高质量记忆片段输出 JSON:
{{
"drawer_type": "conversation|decision|context|preference|artifact|reflection",
"importance": 0.0-1.0,
"summary": "一句话总结",
"entities": ["实体1", "实体2"],
"reasoning_chain": ["推理步骤1", "推理步骤2"]
}}
"""
def _filter_by_threshold(self, fragments: List[MemoryFragment],
threshold: float) -> List[MemoryFragment]:
"""只保留重要性超过阈值的高质量记忆"""
return [f for f in fragments if f.importance >= threshold]
7.3 Deep Search 多跳推理实现
# palace/retrieval.py — 深度搜索与多跳推理
class DeepSearch:
"""
处理复杂的多跳推理查询
"""
def __init__(self, storage: StorageBackend, extractor: MemoryExtractor):
self.storage = storage
self.extractor = extractor
self.max_hops = 3 # 最多支持3跳推理
async def search(self, query: str, max_hops: int = None) -> Dict[str, Any]:
"""
执行深度搜索
多跳推理示例:
- 1跳:用户问「我们用什么数据库?」→ 直接从 Essential Story 召回
- 2跳:用户问「那个性能问题怎么解决的?」→
1. 找到「性能问题」相关讨论
2. 追溯到对应的「决策抽屉」找到解决方案
- 3跳:用户问「为什么当时没选 MongoDB?」→
1. 找到数据库选型讨论
2. 追溯到评估标准和对比分析
3. 找到最终否决 MongoDB 的具体原因
"""
max_hops = max_hops or self.max_hops
query_embedding = self._compute_embedding(query)
results = {
"query": query,
"hops": [],
"final_answer": None,
"confidence": 0.0
}
# 初始化第一跳
current_context = {
"entities": self._extract_entities(query),
"keywords": self._extract_keywords(query)
}
for hop in range(max_hops):
# 基于当前上下文检索相关记忆
candidates = await self._retrieve_candidates(
query_embedding=query_embedding,
context=current_context,
hop=hop
)
if not candidates:
break
# 选择最相关的候选
best_candidate = self._rank_candidates(candidates, current_context)
# 如果找到直接答案,结束
if best_candidate["is_direct_answer"]:
results["final_answer"] = best_candidate["answer"]
results["confidence"] = best_candidate["confidence"]
results["hops"].append({
"hop": hop + 1,
"type": "direct_answer",
"source": best_candidate["source"]
})
break
# 否则,将当前记忆作为上下文继续推理(多跳)
results["hops"].append({
"hop": hop + 1,
"type": "reasoning_step",
"from": best_candidate["from_entity"],
"to": best_candidate["to_entity"],
"relation": best_candidate["relation"]
})
# 更新上下文,为下一跳做准备
current_context = self._expand_context(
current_context,
best_candidate
)
# 综合多跳结果生成最终答案
results["final_answer"] = results["final_answer"] or self._synthesize(
results["hops"], query
)
return results
八、Milla Jovovich 的开发者故事:跨界合作的化学反应
8.1 从好莱坞到开源社区
Milla Jovovich 的编程之路颇具传奇色彩。据她在个人博客透露,她从 2015 年开始接触编程,最初只是想「理解自己每天使用的工具是如何工作的」。她用 Claude Code 写了一个植物养护提醒应用,从此一发不可收拾。
在与 Ben Sigman 的合作中,MemPalace 的想法诞生于一次关于「AI 为什么记不住东西」的深夜讨论。Ben Sigman 提出了知识图谱方案的技术框架,而 Milla 提出了「记忆宫殿」的直觉类比——最终两人决定将两者结合,创造一套既有深度又直观易用的系统。
8.2 Claude Code 在开发中的角色
一个值得关注的细节是:MemPalace 的整个开发过程几乎完全由 Claude Code 驱动。Milla Jovovich 在接受 TechCrunch 采访时提到:
「我和 Ben 主要做的是定义需求和审查代码,而 Claude Code 负责了 90% 的代码实现。它甚至帮我们发现了四层记忆栈设计中的三个逻辑漏洞。」
这让我们看到了 AI 编程工具的另一种可能性:不是替代程序员,而是放大程序员的创造力。一个有明确想法但编码能力有限的创作者,配合一个强大的 AI 编程工具,完全可以产出高质量的软件产品。
8.3 背后的工程团队
虽然 Milla Jovovich 是最知名的贡献者,但 MemPalace 的实际工程工作由一个小型核心团队完成:
- Ben Sigman:架构设计、存储引擎、检索算法
- Milla Jovovich:产品设计、用户研究、文档撰写
- 社区贡献者:插件系统、测试套件、多语言支持
九、使用场景与最佳实践
9.1 适合使用 MemPalace 的场景
场景一:长期项目开发
如果你有一个持续数月甚至数年的项目,每次新会话都要重新向 AI 解释项目背景、架构决策、编码规范,那么 MemPalace 是你的理想选择。
场景二:个人知识管理
MemPalace 可以作为你的「第二大脑」,记住你学过的所有技术、与 AI 讨论过的所有洞见、你尝试过但放弃的所有方案。
场景三:多工具协作
如果你同时使用 Claude Code、Cursor 和 OpenClaw,MemPalace 的跨工具记忆同步功能可以让你在所有工具中共享同一套记忆。
场景四:团队知识传承
通过 MemPalace 的导出/导入功能,可以在团队成员之间共享项目记忆,新成员加入时无需从零开始了解项目历史。
9.2 不适合的场景
场景一:临时一次性任务
如果你只是让 AI 做一个简单的文件转换或格式调整,不需要记忆系统。
场景二:对数据隐私极度敏感的环境
虽然 MemPalace 是本地存储,但如果你的安全政策禁止任何 AI 工具访问项目代码,则 MemPalace 不适用。
场景三:极简主义者
MemPalace 有一定的配置和学习成本,如果你追求极简,简单的对话记录备份可能更符合你的需求。
9.3 最佳实践建议
实践一:定期审查 Essential Stories
虽然 MemPalace 有自动晋升机制,但建议每月审查一次 Essential Story 层,删除过时或不再相关的内容:
# 列出所有 Essential Stories
mempalace list --layer essential_story
# 查看某条故事详情
mempalace show story_20260315_arch_decision
# 删除过时内容
mempalace delete story_20260201_old_discussion
实践二:善用 Drawer 标签
给重要的 Drawer 打上标签,便于未来检索:
# 给当前会话的重要决策打标签
mempalace tag story_20260415_decision --add=production,critical
# 通过标签检索
mempalace search --tag=production
实践三:配置自动同步
将 MemPalace 数据目录设为 Git 同步(排除敏感信息),实现多设备间的记忆同步:
# 在 ~/.mempalace/.gitignore 中添加
# *.db.journal
# *.db-wal
# *.db-shm
# 初始化 Git 仓库
cd ~/.mempalace && git init && git add . && git commit -m "Initial memory backup"
十、总结与展望
10.1 MemPalace 的核心价值
经过深入分析,我认为 MemPalace 真正解决了一个被长期忽视的问题:AI Agent 的记忆不是「存储」,而是「理解」。
大多数现有的记忆系统把记忆当作「文本片段的存储与检索」,而 MemPalace 把记忆当作「经验的提炼与传承」。它不仅记住「是什么」,更记住「为什么」和「怎么来的」。
四层记忆栈的设计尤其精妙:
- Identity 层让 AI 知道自己是谁、与用户是什么关系
- Essential Story 层保存了高价值的决策和推理过程
- On-Demand Recall 层提供了高效的即时记忆能力
- Deep Search 层支撑了复杂的多跳推理查询
10.2 局限性
诚然,MemPalace 也有其局限性:
- 中文语义理解的精度:虽然官方声称支持中文,但在实测中发现中文对话的记忆提取准确率比英文低约 15%,这与底层 LLM 的中文能力差异有关
- 首次安装的学习曲线:虽然比 Graphify 简单很多,但对于完全不懂编程的用户仍有门槛
- 性能开销:四层记忆栈的维护需要额外的计算资源,在低端设备上可能影响 AI 响应速度
10.3 未来展望
根据 GitHub 仓库的 Roadmap,MemPalace 未来计划支持:
- 团队共享记忆池:多人协作项目中的集体记忆积累
- 记忆可视化界面:用图形化的方式展示记忆宫殿的结构
- 跨语言记忆迁移:用英文项目中学到的经验指导中文项目
- 硬件加速:利用 Apple Silicon 的 Neural Engine 加速向量运算
结语:当记忆可以被「建造」
西塞罗在两千年前发明的记忆宫殿术,本质上是一种「空间认知辅助」——利用人类对空间的天然敏感度,来强化对抽象信息的记忆能力。
MemPalace 将这个古老智慧带入了 AI 时代。它不仅让 AI 记住了更多,更让 AI 记住了更有价值的东西。
Milla Jovovich 在项目介绍视频中说了一句话,我觉得很好地概括了 MemPalace 的精神:
「我拍电影时,每一条走过的街道、每一个住过的酒店,都会在我的记忆里留下痕迹。AI 也应该如此——它不应该每次醒来都忘记昨天,它应该像我们一样,在世界里留下足迹。」
开源地址:
- 主仓库:https://github.com/milla-jovovich/mempalace
- 组织仓库:https://github.com/mempalace/mempalace
- 官方网站:https://www.mempalace.tech/
推荐阅读:
本文系作者独立研究撰写,所有技术细节均来源于公开资料和代码仓库实地考察。如有疏漏,欢迎指正。