MemPalace:用記憶宮殿重新定義 AI 記憶層,一週狂攬 42K Stars 的開源專案深度解析

MemPalace:用記憶宮殿重新定義 AI 記憶層,一週狂攬 42K Stars 的開源專案深度解析

中文 EN

2026 年 4 月 5 日,一個叫 MemPalace 的 Python 套件悄悄上了 GitHub。一週後,它已經累積超過 42,000 顆星,成為近期成長最快的 AI 開源專案之一。

它解決的問題很直覺:LLM 沒有記憶。每次對話都從零開始。但它的解法,挑戰了整個 AI 記憶領域的主流假設。


主流方案的問題

現有的 AI 記憶方案(Mem0、Mastra、Supermemory)幾乎都遵循同一個模式:用 LLM 從對話中萃取結構化事實,再存進向量資料庫。

這個做法有三個根本問題:

  1. 昂貴 -- 每次寫入都要呼叫 LLM API
  2. 有損 -- 萃取過程必然丟失語境和細節
  3. 依賴外部 API -- 沒有 API key 就無法運作

MemPalace 的核心論點是:這個領域在記憶萃取這一步做了過度工程。原始逐字文本配上好的 embedding,就是比任何人意識到的都更強的 baseline -- 因為它不會丟失資訊。

數字說話:MemPalace 用零 API 呼叫在 LongMemEval 達到 96.6% R@5,擊敗所有需要付費 LLM API 的系統。加上可選的 Claude Haiku 重新排序(每次查詢約 $0.001),直接拉到 100%。


記憶宮殿:不只是比喻

MemPalace 的資料結構直接借鏡古希臘的「記憶宮殿」(Method of Loci)記憶術,這不只是行銷噱頭,而是真正影響了它的資料組織方式:

層級對應概念實際用途
Wing(翼)宮殿的側翼頂層分類:專案、人物、團隊
Room(房間)翼內的房間主題:後端、決策、規劃
Hall(廳)房間內的展廳記憶類型:事實、事件、發現、偏好、建議
Drawer(抽屜)展廳內的抽屜原子記憶單元:一段具體的文本
Closet(衣櫃)壓縮儲藏AAAK 壓縮摘要(實驗性功能)

這個層級結構讓語意搜尋可以在不同粒度上操作:你可以搜尋整座宮殿,也可以限定在某個 Wing 或 Room 內搜尋。


4 層記憶堆疊:600 Token 喚醒成本

這是 MemPalace 最精巧的設計之一。它把記憶分成四層,每層有不同的載入時機和 token 成本:

層名稱Token 成本載入時機
L0Identity~100永遠載入
L1Essential Story~500-800永遠載入
L2On-Demand~200-500/次話題相關時
L3Deep Search不限明確查詢時

L0 -- Identity 從 ~/.mempalace/identity.txt 載入「我是誰」的基本資訊,大約 100 個 token。

L1 -- Essential Story 從最高重要度的 Drawer 自動生成摘要,約 500-800 個 token。這兩層加起來就是 AI 的「醒來」成本:600-900 個 token,留下 95% 以上的 context window 給實際對話。

L2 -- On-Demand 當對話觸及特定主題時,按 Wing/Room 過濾做即時檢索。

L3 -- Deep Search 對所有 Drawer 做全語意搜尋,這是最完整但也最耗 token 的層級。

程式碼使用起來非常直覺:

from mempalace.layers import MemoryStack

stack = MemoryStack()

# 喚醒:L0 + L1,約 600-900 tokens
print(stack.wake_up())

# 按需檢索:L2
print(stack.recall(wing="my_app"))

# 深度搜尋:L3
print(stack.search("為什麼我們換成 GraphQL"))

時序知識圖譜:記憶不只是「是什麼」,還有「什麼時候」

純向量搜尋有一個根本缺陷:它無法區分「Max 現在在學游泳」和「Max 去年在學游泳」。MemPalace 用一個 SQLite-backed 的三元組儲存(triple store)解決這個問題,每個實體和關係都有 valid_from / valid_to 時間戳。

kg = KnowledgeGraph()

# 新增帶時間的三元組
kg.add_triple("Max", "child_of", "Alice", valid_from="2015-04-01")
kg.add_triple("Max", "does", "swimming", valid_from="2025-01-01")

# 當事實改變時,讓舊事實失效
kg.invalidate("Max", "has_injury", "ankle", ended="2026-02-15")

# 查詢特定時間點的事實
kg.query_entity("Max", as_of="2026-03-01", direction="both")

# 查看時間軸
kg.timeline("Max")  # 完整的事實年表

這讓 AI 能回答「Max 去年在做什麼」和「Max 現在在做什麼」這種時序性問題 -- 純 RAG 系統根本做不到。


19 個 MCP 工具:完整的記憶操作介面

MemPalace 透過 MCP(Model Context Protocol)暴露 19 個工具,讓任何支援 MCP 的 AI 客戶端都能直接操作記憶:

讀取類

  • status / list_wings / list_rooms / get_taxonomy -- 瀏覽宮殿結構
  • search / get_drawer / list_drawers -- 搜尋和讀取記憶
  • check_duplicate -- 去重檢查(cosine similarity 閾值 0.9)

寫入類

  • add_drawer / update_drawer / delete_drawer -- CRUD 操作

知識圖譜類

  • kg_query / kg_add / kg_invalidate / kg_timeline / kg_stats

圖導航類

  • traverse -- BFS 房間遍歷,發現關聯記憶
  • find_tunnels -- 跨 Wing 的橋接,找到意想不到的連結

Agent 日記類

  • diary_write / diary_read -- AI agent 的跨 session 日記

整合到 Claude Code 只需要一行:

claude mcp add mempalace -- python -m mempalace.mcp_server --palace /path/to/palace

Palace Protocol:讓 AI 主動使用記憶

光有記憶基礎設施不夠,MemPalace 還定義了一套嵌入 MCP server 的行為協議,指導 AI 如何使用記憶:

  1. 喚醒時:呼叫 mempalace_status 載入總覽
  2. 回答關於人/專案/事件的問題前:先搜尋,絕不猜測
  3. 不確定事實時:說「讓我查一下」然後查詢
  4. 每次 session 結束時:寫一篇日記
  5. 事實改變時:讓舊事實失效,新增新事實

這個「先查再答」的協議讓 AI 的行為從「可能幻覺」變成「有據可查」。


兩種資料挖掘模式

專案挖掘 (miner.py):讀取原始碼檔案,遵守 .gitignore,以段落為單位分塊(800 字元,100 字元重疊),從資料夾結構和關鍵字評分自動偵測所屬 Room。

對話挖掘 (convo_miner.py):匯入聊天記錄(Claude Code、ChatGPT、Slack 等),以問答對為單位分塊,支援 5 種格式正規化。

# 挖掘專案檔案
mempalace mine ~/projects/myapp

# 挖掘對話記錄
mempalace mine ~/exports/claude-chats --mode convos

Benchmark:誠實到令人敬佩

MemPalace 的 BENCHMARKS.md 有一個罕見的特質:極度透明。

系統LongMemEval R@5需要 API成本
MemPalace (raw)96.6%否$0
MemPalace (hybrid v4 + Haiku)100%可選~$0.001/query
Supermemory ASMR~99%是付費
Mastra94.87%是付費
Hindsight91.4%是付費
Mem0 RAG30-45%是付費

作者明確標註哪些分數涉及「teaching to the test」(hybrid v4 的修正是透過檢查具體失敗問題開發的),提供了保留驗證數據,並註記了 top-50 LoCoMo 的限制條件。這種自我修正的誠實程度在開源專案中非常少見。

不過也要注意目前的限制:

  • AAAK 壓縮模式只有 84.2% R@5(vs 原始模式的 96.6%)
  • MemBench 的「noisy」類別只有 43.4%(對抗性噪聲場景較弱)
  • 尚未支援多語言 embedding

技術選型的極簡主義

MemPalace 的依賴清單短到不可思議:

  • 核心依賴只有 2 個 -- chromadb 和 pyyaml
  • 向量資料庫 -- ChromaDB(本地、cosine similarity、HNSW 索引)
  • 知識圖譜 -- SQLite3 + WAL mode
  • 構建系統 -- Hatchling
  • 無 LLM SDK、無外部 API、無重型基礎設施

這不是偶然,而是刻意的設計選擇。當你的記憶層不依賴任何 LLM API,你就消除了延遲、成本和供應商鎖定三個問題。


AAAK 方言:實驗性的符號壓縮

MemPalace 還有一個有趣的實驗性功能:AAAK 方言(dialect.py),一種有損的符號壓縮格式:

FAM: ALC->JOR | 2D(kids): RIL(18,sports) MAX(11,chess+swimming) | BEN(contributor)
  • 3 字母實體代碼(ALC=Alice, JOR=Jordan)
  • 情感標記(warm, fierce, raw)
  • 管道分隔欄位,ISO 日期
  • 重要性量表:1-5 星

目前 AAAK 模式的 R@5 退化到 84.2%,所以它被標記為實驗性。但這個方向值得關注:如果能在壓縮率和準確率之間找到更好的平衡,長期記憶的 token 成本可以進一步降低。


為什麼這個專案值得關注

MemPalace 的價值不只在於它的技術實現,更在於它提出的核心問題:

我們真的需要 LLM 來做記憶萃取嗎?

當 96.6% 的準確率可以用零 API 呼叫達成,而那些需要付費 API 的方案大多還達不到這個水準時,這個問題的答案變得很明確。

這也呼應了 AI 工程中的一個更大趨勢:在你引入更多 AI 之前,先問問「簡單的工程解法夠不夠好」。ChromaDB 的預設 embedding 加上原始文本,就是一個極其強大的 baseline,很多複雜的架構可能只是在這個 baseline 上做邊際改進。

MemPalace 的 roadmap 也值得持續追蹤:v4.0-alpha 將支援可替換的儲存後端(PostgreSQL、LanceDB)、不需要 API 的本地 NLP 實體萃取、以及關鍵字匹配的搜尋 fallback。他們還計畫發表 arXiv 論文。


快速上手

# 安裝
pip install mempalace

# 初始化(建立 mempalace.yaml 設定檔)
mempalace init ~/projects/myapp

# 挖掘專案檔案
mempalace mine ~/projects/myapp

# 搜尋
mempalace search "為什麼我們改用 GraphQL"

# 整合到 Claude Code
claude mcp add mempalace -- python -m mempalace.mcp_server --palace ~/projects/myapp

對於想要深入了解的讀者,建議直接閱讀原始碼中的 layers.py(4 層堆疊)、knowledge_graph.py(時序三元組)和 mcp_server.py(19 個 MCP 工具定義)。這三個檔案就是 MemPalace 的靈魂。

GitHub: github.com/MemPalace/mempalace | License: MIT | Stars: 42K+ | Language: Python