编程 四层记忆栈 + Drawer 抽象:深度解析 Milla Jovovich 开源的 MemPalace AI 记忆系统

2026-04-17 19:14:59 +0800 CST views 7

记忆宫殿走进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 层,实现持久化存储。

职责:处理复杂的多跳推理查询

当用户在当前会话中提出的问题需要跨多个记忆片段才能回答时,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-pluginClaude Code记忆同步、上下文注入
cursor-pluginCursor项目级记忆共享
openclaw-pluginOpenClaw全平台记忆同步
codex-pluginCodex (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 横向对比表格

维度MemPalaceClaude-MemGraphifyGPT-Plugin Memory
部署方式本地云端本地云端
API 密钥不需要需要可选需要
记忆组织四层记忆栈向量存储知识图谱简单列表
过程记忆✅ 完整❌ 仅结果✅ 完整❌ 仅结果
多跳推理✅ Deep Search
安装难度⭐ 零配置⭐⭐⭐⭐⭐⭐
中文支持✅ 良好✅ 良好⚠️ 一般✅ 良好
MCP 协议✅ 原生
自动晋升机制⚠️ 部分
跨工具同步
GitHub Stars20k+ (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 也有其局限性:

  1. 中文语义理解的精度:虽然官方声称支持中文,但在实测中发现中文对话的记忆提取准确率比英文低约 15%,这与底层 LLM 的中文能力差异有关
  2. 首次安装的学习曲线:虽然比 Graphify 简单很多,但对于完全不懂编程的用户仍有门槛
  3. 性能开销:四层记忆栈的维护需要额外的计算资源,在低端设备上可能影响 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/

推荐阅读


本文系作者独立研究撰写,所有技术细节均来源于公开资料和代码仓库实地考察。如有疏漏,欢迎指正。

推荐文章

一些实用的前端开发工具网站
2024-11-18 14:30:55 +0800 CST
liunx宝塔php7.3安装mongodb扩展
2024-11-17 11:56:14 +0800 CST
Vue3中如何处理组件间的动画?
2024-11-17 04:54:49 +0800 CST
地图标注管理系统
2024-11-19 09:14:52 +0800 CST
pip安装到指定目录上
2024-11-17 16:17:25 +0800 CST
js一键生成随机颜色:randomColor
2024-11-18 10:13:44 +0800 CST
Flet 构建跨平台应用的 Python 框架
2025-03-21 08:40:53 +0800 CST
程序员出海搞钱工具库
2024-11-18 22:16:19 +0800 CST
如何在Rust中使用UUID?
2024-11-19 06:10:59 +0800 CST
禁止调试前端页面代码
2024-11-19 02:17:33 +0800 CST
Python 基于 SSE 实现流式模式
2025-02-16 17:21:01 +0800 CST
Vue3中的自定义指令有哪些变化?
2024-11-18 07:48:06 +0800 CST
55个常用的JavaScript代码段
2024-11-18 22:38:45 +0800 CST
120个实用CSS技巧汇总合集
2025-06-23 13:19:55 +0800 CST
程序员茄子在线接单