2026 年 4 月 5 日,一個叫 MemPalace 的 Python 套件悄悄上了 GitHub。一週後,它已經累積超過 42,000 顆星,成為近期成長最快的 AI 開源專案之一。
它解決的問題很直覺:LLM 沒有記憶。每次對話都從零開始。但它的解法,挑戰了整個 AI 記憶領域的主流假設。
主流方案的問題
現有的 AI 記憶方案(Mem0、Mastra、Supermemory)幾乎都遵循同一個模式:用 LLM 從對話中萃取結構化事實,再存進向量資料庫。
這個做法有三個根本問題:
- 昂貴 -- 每次寫入都要呼叫 LLM API
- 有損 -- 萃取過程必然丟失語境和細節
- 依賴外部 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 成本 | 載入時機 |
|---|---|---|---|
| L0 | Identity | ~100 | 永遠載入 |
| L1 | Essential Story | ~500-800 | 永遠載入 |
| L2 | On-Demand | ~200-500/次 | 話題相關時 |
| L3 | Deep 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 如何使用記憶:
- 喚醒時:呼叫
mempalace_status載入總覽 - 回答關於人/專案/事件的問題前:先搜尋,絕不猜測
- 不確定事實時:說「讓我查一下」然後查詢
- 每次 session 結束時:寫一篇日記
- 事實改變時:讓舊事實失效,新增新事實
這個「先查再答」的協議讓 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% | 是 | 付費 |
| Mastra | 94.87% | 是 | 付費 |
| Hindsight | 91.4% | 是 | 付費 |
| Mem0 RAG | 30-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

