<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>记忆系统 on Yison's Blog</title><link>https://blog.7ys.top/tags/%E8%AE%B0%E5%BF%86%E7%B3%BB%E7%BB%9F/</link><description>Recent content in 记忆系统 on Yison's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Sun, 17 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.7ys.top/tags/%E8%AE%B0%E5%BF%86%E7%B3%BB%E7%BB%9F/index.xml" rel="self" type="application/rss+xml"/><item><title>AI Agent 的记忆革命：MemPalace 如何用'宫殿隐喻'重构 LLM 记忆</title><link>https://blog.7ys.top/posts/mempalace-ai-memory-deep-dive/</link><pubDate>Sun, 17 May 2026 00:00:00 +0000</pubDate><guid>https://blog.7ys.top/posts/mempalace-ai-memory-deep-dive/</guid><description>&lt;img src="https://blog.7ys.top/" alt="Featured image of post AI Agent 的记忆革命：MemPalace 如何用'宫殿隐喻'重构 LLM 记忆" /&gt;&lt;h2 id="金鱼记忆的-ai-agent"&gt;金鱼记忆的 AI Agent
&lt;/h2&gt;&lt;p&gt;用 AI Agent 写代码的人，大概都有过这样的时刻：&lt;/p&gt;
&lt;p&gt;你花了三个小时跟 Agent 讨论架构方案，做了十几轮代码迭代，终于把认证模块从 OAuth 1.0 迁移到 OAuth 2.0。第二天打开新会话，Agent 一脸茫然：&amp;ldquo;请问您想实现什么功能？&amp;rdquo;&lt;/p&gt;
&lt;p&gt;三个小时的上下文，就这么蒸发了。&lt;/p&gt;
&lt;p&gt;这不是 Agent 笨——这是&lt;strong&gt;记忆系统&lt;/strong&gt;的根本性缺陷。当前所有主流方案（Mem0、Mastra、Supermemory）都在做同一件事：&lt;strong&gt;用 LLM 决定记什么&lt;/strong&gt;。它们提取事实、生成摘要、压缩上下文，然后把原始对话丢进垃圾桶。&lt;/p&gt;
&lt;p&gt;问题在于：当 LLM 提取出&amp;quot;用户喜欢 PostgreSQL&amp;quot;并丢弃原始对话时，它丢失了&lt;strong&gt;为什么&lt;/strong&gt;喜欢、考虑过哪些替代方案、讨论了哪些权衡。&lt;/p&gt;
&lt;p&gt;MemPalace 说：&lt;strong&gt;别提取了，把原文存下来。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个反直觉的方案，在 LongMemEval 基准上跑出了 &lt;strong&gt;96.6% 的检索召回率&lt;/strong&gt;——不需要任何 API，不需要云端，不需要 LLM。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一mempalace不只是另一个-rag"&gt;一、MemPalace：不只是另一个 RAG
&lt;/h2&gt;&lt;h3 id="11-核心理念"&gt;1.1 核心理念
&lt;/h3&gt;&lt;p&gt;MemPalace 的设计哲学可以用一句话概括：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;原始文本 &amp;gt; LLM 提取。简单的事情做对了，比复杂的事情做错了更好。&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;维度&lt;/th&gt;
 &lt;th&gt;传统方案（Mem0 等）&lt;/th&gt;
 &lt;th&gt;MemPalace&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;存储内容&lt;/td&gt;
 &lt;td&gt;LLM 提取的事实/摘要&lt;/td&gt;
 &lt;td&gt;原始对话文本（verbatim）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;信息损耗&lt;/td&gt;
 &lt;td&gt;高（提取过程丢失上下文）&lt;/td&gt;
 &lt;td&gt;零（原文存储）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;检索方式&lt;/td&gt;
 &lt;td&gt;向量语义搜索&lt;/td&gt;
 &lt;td&gt;BM25 + 向量 + Closet Boost 混合搜索&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;LLM 依赖&lt;/td&gt;
 &lt;td&gt;必须（提取和检索都需要）&lt;/td&gt;
 &lt;td&gt;可选（核心路径零 API）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;隐私性&lt;/td&gt;
 &lt;td&gt;数据通常上传云端&lt;/td&gt;
 &lt;td&gt;本地优先，数据不出机器&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="12-灵感来源"&gt;1.2 灵感来源
&lt;/h3&gt;&lt;p&gt;MemPalace 的架构灵感来自两个经典方法论：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;卢曼卡片笔记法（Zettelkasten）&lt;/strong&gt;：德国社会学家尼克拉斯·卢曼用小的、交叉引用的索引卡片管理知识。每张卡片是一个原子想法，通过链接形成知识网络。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;古希腊记忆宫殿法（Method of Loci）&lt;/strong&gt;：把需要记忆的内容&amp;quot;放置&amp;quot;在想象中的空间位置，通过&amp;quot;行走&amp;quot;回忆。MemPalace 的 Wings、Rooms、Drawers 就是这个隐喻的代码实现。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="二宫殿架构四层结构深度剖析"&gt;二、宫殿架构：四层结构深度剖析
&lt;/h2&gt;&lt;p&gt;MemPalace 的核心是一个&lt;strong&gt;四层递进的存储结构&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 A[🏰 Palace 宫殿] --&gt; B[🦋 Wing 翼楼]
 B --&gt; C[🚪 Room 房间]
 C --&gt; D[🗄️ Closet 衣柜]
 D --&gt; E[📄 Drawer 抽屉]
 
 B --&gt; |"人物/项目/主题"| B1["wing_kai&lt;br/&gt;wing_driftwood&lt;br/&gt;wing_auth-system"]
 C --&gt; |"主题/时间段"| C1["auth-migration&lt;br/&gt;graphql-switch&lt;br/&gt;ci-pipeline"]
 D --&gt; |"AAAK压缩索引"| D1["§ W-042/R-11/D-007&lt;br/&gt;@p noah~son.age=6&lt;br/&gt;@e birthday~party"]
 E --&gt; |"原始文本"| E1["完整的对话内容&lt;br/&gt;代码片段&lt;br/&gt;决策记录"]
 
 style A fill:#1e293b,stroke:#22d3ee,color:#e2e8f0
 style B fill:#1e3a5f,stroke:#38bdf8,color:#e2e8f0
 style C fill:#1e3a5f,stroke:#38bdf8,color:#e2e8f0
 style D fill:#1e3a5f,stroke:#38bdf8,color:#e2e8f0
 style E fill:#1e3a5f,stroke:#38bdf8,color:#e2e8f0&lt;/pre&gt;&lt;h3 id="21-wing翼楼-顶层组织单元"&gt;2.1 Wing（翼楼）—— 顶层组织单元
&lt;/h3&gt;&lt;p&gt;每个 Wing 代表一个&lt;strong&gt;实体&lt;/strong&gt;：一个人、一个项目、或一个主题。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;wing_kai → 某个人的所有对话
wing_driftwood → 某个项目的所有记录
wing_auth-system → 认证系统相关的所有内容
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;设计意图&lt;/strong&gt;：当搜索&amp;quot;Kai 的认证方案&amp;quot;时，可以限定在 &lt;code&gt;wing_kai&lt;/code&gt; 范围内搜索，避免其他项目的噪音干扰。&lt;/p&gt;
&lt;h3 id="22-room房间-主题分组"&gt;2.2 Room（房间）—— 主题分组
&lt;/h3&gt;&lt;p&gt;每个 Wing 下有多个 Room，代表&lt;strong&gt;具体主题或时间段&lt;/strong&gt;：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;wing_kai/
 ├── room_auth-migration → OAuth 迁移相关
 ├── room_graphql-switch → GraphQL 切换相关
 └── room_ci-pipeline → CI 流水线相关
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Room 通常从文件夹结构自动检测，也可以手动创建。&lt;/p&gt;
&lt;h3 id="23-closet衣柜-aaak-压缩索引"&gt;2.3 Closet（衣柜）—— AAAK 压缩索引
&lt;/h3&gt;&lt;p&gt;这是 MemPalace 最精妙的设计。Closet 是一个&lt;strong&gt;压缩的索引层&lt;/strong&gt;，用一种叫 AAAK 的密集符号语言编写，LLM 可以一眼扫描数千条索引，精确定位到需要的 Drawer。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;§ W-042/R-11/D-007 &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 定位符：翼楼-042/房间-11/抽屉-007&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#ae81ff"&gt;p noah~son.age=6~dob=09-12&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 人物：Noah，儿子6岁，生日9月12日&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#ae81ff"&gt;l glebe-pt-rd.park &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 地点：Glebe Point Road 公园&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#ae81ff"&gt;e birthday~party(n≈8) &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 事件：生日派对，约8人&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#ae81ff"&gt;i therizinosaurus~claws &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 兴趣：镰刀龙的爪子&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@&lt;span style="color:#ae81ff"&gt;t 2026-04-14T09:41 &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 时间戳&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;§ ptr → D-007 (verbatim) &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 指针：指向抽屉-007的原始文本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;为什么需要 Closet？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;直接搜索所有 Drawer 效率太低。Closet 就像图书馆的目录卡片——先看目录，再去找书。LLM 扫描 Closet 可以瞬间知道&amp;quot;关于 Noah 生日的信息在 D-007&amp;quot;，然后直接读取那个 Drawer 的完整内容。&lt;/p&gt;
&lt;h3 id="24-drawer抽屉-原始文本存储"&gt;2.4 Drawer（抽屉）—— 原始文本存储
&lt;/h3&gt;&lt;p&gt;最底层，存储&lt;strong&gt;原始对话的完整文本&lt;/strong&gt;。不做任何摘要、压缩或改写。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Drawer D-007:
 &amp;#34;Noah&amp;#39;s birthday party was at the park on Glebe Point Road.
 About 8 kids came. He was really into therizinosaurus claws
 at the time, so the cake had a dinosaur theme...&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="25-hall大厅-概念分类"&gt;2.5 Hall（大厅）—— 概念分类
&lt;/h3&gt;&lt;p&gt;每个 Wing 内还有隐含的 &lt;strong&gt;Hall&lt;/strong&gt; 分类：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Hall&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;hall_facts&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;做出的决定、锁定的选择&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;hall_events&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;会话、里程碑、调试过程&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;hall_discoveries&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;突破、新洞察&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;hall_preferences&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;习惯、偏好、观点&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;hall_advice&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;建议和解决方案&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="26-tunnel隧道-跨翼楼连接"&gt;2.6 Tunnel（隧道）—— 跨翼楼连接
&lt;/h3&gt;&lt;p&gt;当两个 Wing 有相同的 Room 名称时，自动建立 &lt;strong&gt;Tunnel&lt;/strong&gt; 连接：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;wing_kai / hall_events / auth-migration → &amp;#34;Kai 调试了 OAuth token refresh&amp;#34;
wing_driftwood / hall_facts / auth-migration → &amp;#34;团队决定迁移到 Clerk&amp;#34;
wing_priya / hall_advice / auth-migration → &amp;#34;Priya 批准了 Clerk 而非 Auth0&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;搜索&amp;quot;auth-migration&amp;quot;时，可以通过 Tunnel 找到所有相关 Wing 的内容。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="三核心实现原理"&gt;三、核心实现原理
&lt;/h2&gt;&lt;h3 id="31-混合搜索算法"&gt;3.1 混合搜索算法
&lt;/h3&gt;&lt;p&gt;MemPalace 的搜索不是简单的向量检索，而是一个&lt;strong&gt;三阶段混合管道&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;sequenceDiagram
 participant U as 用户查询
 participant V as 向量搜索引擎
 participant B as BM25 关键词搜索
 participant C as Closet Boost
 participant R as 混合排序器
 participant N as 邻居扩展
 
 U-&gt;&gt;V: 语义相似度搜索
 V-&gt;&gt;R: 返回 Top-K 候选（cosine distance）
 
 U-&gt;&gt;B: 关键词匹配
 B-&gt;&gt;R: 返回 BM25 候选（Okapi-BM25）
 
 R-&gt;&gt;R: 合并候选集（Union Merge）
 R-&gt;&gt;R: 混合排序&lt;br/&gt;score = 0.6 × vector_sim + 0.4 × bm25_norm
 
 R-&gt;&gt;C: 查询 Closet 索引
 C-&gt;&gt;R: 返回 Boost 信号&lt;br/&gt;boost = [0.40, 0.25, 0.15, 0.08, 0.04]
 R-&gt;&gt;R: 应用 Boost&lt;br/&gt;effective_dist = max(0, raw_dist - boost)
 
 R-&gt;&gt;N: 对 Top 结果扩展 ±1 邻居
 N-&gt;&gt;U: 返回最终结果（含上下文）
 
 Note over U,N: 整个过程零 API 调用，纯本地执行&lt;/pre&gt;&lt;h4 id="bm25-实现细节"&gt;BM25 实现细节
&lt;/h4&gt;&lt;p&gt;MemPalace 使用 &lt;strong&gt;Okapi-BM25&lt;/strong&gt; 算法，参数经过精心调优：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# BM25 参数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;k1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.5&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 词频饱和度（term-frequency saturation）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;b &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.75&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 长度归一化（length normalization）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# IDF 计算：使用 Lucene/BM25+ 平滑公式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 避免除零错误，对罕见词给予更高权重&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;idf &lt;span style="color:#f92672"&gt;=&lt;/span&gt; log(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; (N &lt;span style="color:#f92672"&gt;-&lt;/span&gt; n &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; (n &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 最终分数归一化到 [0, 1]，与向量分数可比较&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bm25_norm &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (score &lt;span style="color:#f92672"&gt;-&lt;/span&gt; min_score) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; (max_score &lt;span style="color:#f92672"&gt;-&lt;/span&gt; min_score)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="closet-boost-机制"&gt;Closet Boost 机制
&lt;/h4&gt;&lt;p&gt;Closet 不是搜索的&amp;quot;门&amp;quot;，而是&amp;quot;助推器&amp;quot;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CLOSET_RANK_BOOSTS &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;0.40&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.25&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.15&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.08&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.04&lt;/span&gt;] &lt;span style="color:#75715e"&gt;# 基于排名的 Boost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CLOSET_DISTANCE_CAP &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.5&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 距离 &amp;gt; 1.5 的 Closet 信号太弱，忽略&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 有效距离 = max(0, min(2, 原始距离 - boost))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 效果：匹配 Closet 的 Drawer 被拉到更前面&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键设计决策&lt;/strong&gt;：Closet 只是排序信号，不是过滤器。即使 Closet 没命中，直接搜索 Drawer 也能找到结果。这避免了&amp;quot;Closet 质量差导致搜不到&amp;quot;的问题。&lt;/p&gt;
&lt;h4 id="邻居扩展"&gt;邻居扩展
&lt;/h4&gt;&lt;p&gt;当找到一个匹配的 Drawer 时，自动扩展其&lt;strong&gt;前后各 1 个 Drawer&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;expand_with_neighbors&lt;/span&gt;(drawers_col, matched_doc, matched_meta, radius&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;扩展匹配的 Drawer，包含 ±radius 的兄弟块。&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 解决&amp;#34;对话被切断&amp;#34;的问题&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 例如：Drawer 5 讨论了方案 A，Drawer 6 讨论了方案 B&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 搜索&amp;#34;方案 A&amp;#34;时，返回 Drawer 5 + 6，提供完整上下文&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="bm25-only-降级方案"&gt;BM25-Only 降级方案
&lt;/h4&gt;&lt;p&gt;当 HNSW 索引损坏时，自动降级到纯 BM25 搜索：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bm25_only_via_sqlite&lt;/span&gt;(query, palace_path, &lt;span style="color:#f92672"&gt;...&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&amp;#34;BM25-only 搜索，直接从 chroma.sqlite3 读取。&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 绕过 ChromaDB 的 Python 客户端&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 使用 ChromaDB 内部的 FTS5 三元组索引&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 当 HNSW 段损坏或不可加载时自动触发&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="32-知识图谱时间感知的实体关系"&gt;3.2 知识图谱：时间感知的实体关系
&lt;/h3&gt;&lt;p&gt;MemPalace 内置了一个&lt;strong&gt;时间感知的实体关系图谱&lt;/strong&gt;，用 SQLite 实现（不是 Neo4j）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 实体表
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; entities (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id TEXT &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;, &lt;span style="color:#75715e"&gt;-- 规范化名称（小写，下划线）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name TEXT &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;, &lt;span style="color:#75715e"&gt;-- 原始名称
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; TEXT &lt;span style="color:#66d9ef"&gt;DEFAULT&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;unknown&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;-- person, project, tool, concept
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; properties TEXT &lt;span style="color:#66d9ef"&gt;DEFAULT&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;{}&amp;#39;&lt;/span&gt;, &lt;span style="color:#75715e"&gt;-- JSON 元数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; created_at TEXT &lt;span style="color:#66d9ef"&gt;DEFAULT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;CURRENT_TIMESTAMP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- 关系三元组表
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; triples (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; id TEXT &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; subject TEXT &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;, &lt;span style="color:#75715e"&gt;-- FK → entities.id
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; predicate TEXT &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;, &lt;span style="color:#75715e"&gt;-- 关系类型
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;object&lt;/span&gt; TEXT &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;, &lt;span style="color:#75715e"&gt;-- FK → entities.id
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; valid_from TEXT, &lt;span style="color:#75715e"&gt;-- 生效时间
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; valid_to TEXT, &lt;span style="color:#75715e"&gt;-- 失效时间（NULL = 仍有效）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; confidence REAL &lt;span style="color:#66d9ef"&gt;DEFAULT&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;.&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#75715e"&gt;-- 置信度
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; source_closet TEXT, &lt;span style="color:#75715e"&gt;-- 链接到原始记忆
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; source_drawer_id TEXT &lt;span style="color:#75715e"&gt;-- 溯源信息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;使用示例&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; mempalace.knowledge_graph &lt;span style="color:#f92672"&gt;import&lt;/span&gt; KnowledgeGraph
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kg &lt;span style="color:#f92672"&gt;=&lt;/span&gt; KnowledgeGraph()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 添加事实（带时间窗口）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;add_triple(&lt;span style="color:#e6db74"&gt;&amp;#34;Kai&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;works_on&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Orion&amp;#34;&lt;/span&gt;, valid_from&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;2025-06-01&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;add_triple(&lt;span style="color:#e6db74"&gt;&amp;#34;Maya&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;assigned_to&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;auth-migration&amp;#34;&lt;/span&gt;, valid_from&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;2026-01-15&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 查询：Kai 的所有关系&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;query_entity(&lt;span style="color:#e6db74"&gt;&amp;#34;Kai&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 时间旅行查询：2026年1月的事实&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;query_entity(&lt;span style="color:#e6db74"&gt;&amp;#34;Maya&amp;#34;&lt;/span&gt;, as_of&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;2026-01-20&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 时间线：Orion 项目的历史&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;timeline(&lt;span style="color:#e6db74"&gt;&amp;#34;Orion&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 失效旧事实&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;invalidate(&lt;span style="color:#e6db74"&gt;&amp;#34;Kai&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;works_on&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Orion&amp;#34;&lt;/span&gt;, ended&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;2026-03-01&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="33-hook-系统零-token-的自动保存"&gt;3.3 Hook 系统：零 Token 的自动保存
&lt;/h3&gt;&lt;p&gt;MemPalace 的 Hook 系统是&lt;strong&gt;零 Token 消耗&lt;/strong&gt;的自动保存机制：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;sequenceDiagram
 participant U as 用户
 participant A as AI Agent
 participant H as Hook 系统
 participant P as Palace 存储
 
 U-&gt;&gt;A: 发送消息（第15条）
 A-&gt;&gt;A: 正常处理消息
 
 Note over H: Stop Hook 触发&lt;br/&gt;（每15条消息）
 H-&gt;&gt;A: 注入提示词：&lt;br/&gt;"保存关键话题/决策/引用到 Palace"
 A-&gt;&gt;P: 调用 mempalace_add_drawer&lt;br/&gt;保存本次会话内容
 P--&gt;&gt;A: 确认保存
 A-&gt;&gt;U: 继续正常对话
 
 Note over H: PreCompact Hook 触发&lt;br/&gt;（上下文压缩前）
 H-&gt;&gt;A: 紧急保存提示：&lt;br/&gt;"上下文即将压缩，保存所有内容"
 A-&gt;&gt;P: 批量保存所有未保存内容
 P--&gt;&gt;A: 确认保存
 
 Note over U,P: Hook 是本地 bash 脚本&lt;br/&gt;不消耗 API Token&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Hook 配置&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;.claude/settings.local.json&lt;/code&gt; 中配置（详见第六章安装指南）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;性能指标&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stop Hook 执行时间：&amp;lt; 500ms&lt;/li&gt;
&lt;li&gt;PreCompact Hook 执行时间：&amp;lt; 500ms&lt;/li&gt;
&lt;li&gt;启动注入（wake-up）：&amp;lt; 100ms&lt;/li&gt;
&lt;li&gt;测试规模：150K+ Drawers&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="四mcp-工具生态30-个工具全景"&gt;四、MCP 工具生态：30 个工具全景
&lt;/h2&gt;&lt;p&gt;MemPalace 通过 MCP（Model Context Protocol）暴露了 &lt;strong&gt;30 个工具&lt;/strong&gt;，覆盖记忆系统的完整生命周期：&lt;/p&gt;
&lt;h3 id="41-读取工具7-个"&gt;4.1 读取工具（7 个）
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;工具&lt;/th&gt;
 &lt;th&gt;功能&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_status&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;宫殿概览：总 Drawer 数、Wing/Room 计数、AAAK 规范&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_list_wings&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;列出所有 Wing 及其 Drawer 数量&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_list_rooms&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;列出指定 Wing 下的 Room&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_get_taxonomy&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;完整的 Wing → Room → Drawer 数量树&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_search&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;语义搜索&lt;/strong&gt;：返回原始 Drawer 内容 + 相似度分数&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_check_duplicate&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;检查内容是否已存在（阈值 0.85-0.87）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_get_aaak_spec&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;返回 AAAK 索引规范&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="42-写入工具6-个"&gt;4.2 写入工具（6 个）
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;工具&lt;/th&gt;
 &lt;th&gt;功能&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_add_drawer&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;将原始内容存入 Palace&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_delete_drawer&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;删除 Drawer（不可逆）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_sync&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;清理已删除/移动的源文件对应的 Drawer&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_get_drawer&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;获取单个 Drawer 的完整内容&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_list_drawers&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;分页列出 Drawer&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_update_drawer&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;更新 Drawer 内容/元数据&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="43-知识图谱工具5-个"&gt;4.3 知识图谱工具（5 个）
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;工具&lt;/th&gt;
 &lt;th&gt;功能&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_kg_query&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;查询实体关系（支持时间过滤）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_kg_add&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;添加事实三元组&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_kg_invalidate&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;标记事实失效&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_kg_timeline&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;实体的时间线&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_kg_stats&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;图谱概览&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="44-导航工具7-个"&gt;4.4 导航工具（7 个）
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;工具&lt;/th&gt;
 &lt;th&gt;功能&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_traverse&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;从某个 Room 开始遍历，找到跨 Wing 的关联内容&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_find_tunnels&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;找到连接两个 Wing 的 Tunnel&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_graph_stats&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;宫殿图概览：节点、隧道、边、连通性&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_create_tunnel&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;创建跨 Wing 的 Tunnel&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_list_tunnels&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;列出所有 Tunnel&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_delete_tunnel&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;删除 Tunnel&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_follow_tunnels&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;跟踪 Tunnel 到达其他 Wing&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="45-agent-日记工具2-个"&gt;4.5 Agent 日记工具（2 个）
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;工具&lt;/th&gt;
 &lt;th&gt;功能&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_diary_write&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;写入 Agent 个人日记&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_diary_read&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;读取最近的日记条目&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="46-系统工具3-个"&gt;4.6 系统工具（3 个）
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;工具&lt;/th&gt;
 &lt;th&gt;功能&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_hook_settings&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;获取/设置自动保存 Hook 行为&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_memories_filed_away&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;检查最近的 Palace 检查点是否已保存&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mempalace_reconnect&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;强制重连 Palace 数据库&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="五性能基准966-的真实含义"&gt;五、性能基准：96.6% 的真实含义
&lt;/h2&gt;&lt;h3 id="51-longmemeval-结果"&gt;5.1 LongMemEval 结果
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;模式&lt;/th&gt;
 &lt;th style="text-align: center"&gt;R@5&lt;/th&gt;
 &lt;th style="text-align: center"&gt;是否需要 LLM&lt;/th&gt;
 &lt;th style="text-align: center"&gt;成本&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Raw（纯语义搜索）&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;96.6%&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;td style="text-align: center"&gt;$0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Hybrid v4（held-out 450题）&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;98.4%&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;❌&lt;/td&gt;
 &lt;td style="text-align: center"&gt;$0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Hybrid v4 + Haiku rerank&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅ Haiku&lt;/td&gt;
 &lt;td style="text-align: center"&gt;~$0.001/次&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Hybrid v4 + Sonnet rerank&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;✅ Sonnet&lt;/td&gt;
 &lt;td style="text-align: center"&gt;~$0.003/次&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;重要说明&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;96.6% 是&lt;strong&gt;检索召回率&lt;/strong&gt;（R@5），不是 QA 准确率&lt;/li&gt;
&lt;li&gt;100% 的最后 0.6% 是通过检查 3 个特定错误答案达到的（属于&amp;quot;教学生应付考试&amp;quot;）&lt;/li&gt;
&lt;li&gt;诚实的泛化数字是 held-out 450 题的 98.4%&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="52-与其他系统对比"&gt;5.2 与其他系统对比
&lt;/h3&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;系统&lt;/th&gt;
 &lt;th style="text-align: center"&gt;分数&lt;/th&gt;
 &lt;th style="text-align: center"&gt;指标类型&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;MemPalace (raw)&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;96.6%&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;R@5 召回率&lt;/td&gt;
 &lt;td&gt;零 API，纯本地&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Mastra&lt;/td&gt;
 &lt;td style="text-align: center"&gt;94.87%&lt;/td&gt;
 &lt;td style="text-align: center"&gt;QA 准确率&lt;/td&gt;
 &lt;td&gt;不同指标，不可直接比较&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Supermemory ASMR&lt;/td&gt;
 &lt;td style="text-align: center"&gt;~99%&lt;/td&gt;
 &lt;td style="text-align: center"&gt;QA 准确率&lt;/td&gt;
 &lt;td&gt;实验性，8-12 Agent 集成&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Hindsight&lt;/td&gt;
 &lt;td style="text-align: center"&gt;91.4%&lt;/td&gt;
 &lt;td style="text-align: center"&gt;未验证&lt;/td&gt;
 &lt;td&gt;需要检查方法论&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Mem0&lt;/td&gt;
 &lt;td style="text-align: center"&gt;~66.9%&lt;/td&gt;
 &lt;td style="text-align: center"&gt;QA 准确率（LoCoMo）&lt;/td&gt;
 &lt;td&gt;不同基准&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;关键洞察&lt;/strong&gt;：Mem0 在 ConvoMem 基准上只有 30-45%，而 MemPalace 是 92.9%——&lt;strong&gt;2 倍以上的差距&lt;/strong&gt;。原因是 Mem0 用 LLM 提取记忆，提取错了记忆就丢了；MemPalace 存原始文本，什么都不丢。&lt;/p&gt;
&lt;h3 id="53-社区争议"&gt;5.3 社区争议
&lt;/h3&gt;&lt;p&gt;Hacker News 上对 MemPalace 的基准分数有质疑：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;100% 分数被揭穿&lt;/strong&gt;：GitHub issues #27、#29、#39、#125、#242 有详细的揭穿记录&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LoCoMo 100% 有问题&lt;/strong&gt;：使用 top-k=50 超过了会话数量；诚实的 top-10 无 rerank 是 88.9%&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;名人效应&lt;/strong&gt;：作者是演员 Milla Jovovich，带来了关注度但也带来了质疑&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全警告&lt;/strong&gt;：相关域名被发现传播恶意软件（GitHub issue #326）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;客观来看&lt;/strong&gt;：基准分数有水分，但核心理念（原始文本 &amp;gt; LLM 提取）是成立的。96.6% 的 raw 分数仍然很亮眼——不需要任何 API 就能达到这个水平，说明&amp;quot;简单的事情做对了&amp;quot;这个思路是对的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="六安装与使用指南"&gt;六、安装与使用指南
&lt;/h2&gt;&lt;h3 id="61-安装"&gt;6.1 安装
&lt;/h3&gt;&lt;p&gt;推荐使用 &lt;code&gt;uv&lt;/code&gt; 安装（Python 包管理器）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 安装 uv（如果没有）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -LsSf https://astral.sh/uv/install.sh | sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 安装 MemPalace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv tool install mempalace
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 或者用 pip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install mempalace
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装完成后，&lt;code&gt;mempalace&lt;/code&gt; CLI 就可以直接使用了。&lt;/p&gt;
&lt;h3 id="62-初始化与挖掘"&gt;6.2 初始化与挖掘
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 初始化项目记忆（交互式，会自动检测实体）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mempalace init ~/projects/myapp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 非交互式初始化（适合脚本）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mempalace init --yes ~/projects/myapp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 挖掘项目文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mempalace mine ~/projects/myapp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 挖掘 Claude Code 会话历史&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mempalace mine ~/.claude/projects/ --mode convos
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 挖掘时指定 Wing（按项目分组）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mempalace mine ~/.claude/projects/myapp --mode convos --wing myapp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="63-搜索模式"&gt;6.3 搜索模式
&lt;/h3&gt;&lt;p&gt;MemPalace 提供三种搜索模式，按需选择：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;模式&lt;/th&gt;
 &lt;th&gt;命令&lt;/th&gt;
 &lt;th&gt;特点&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Raw（默认）&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;mempalace search &amp;quot;查询内容&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;纯向量语义搜索，零 API，96.6% R@5&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Hybrid&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;mempalace search --mode hybrid &amp;quot;查询内容&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;BM25 + 向量混合搜索，98.4% R@5&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Hybrid + Rerank&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;mempalace search --mode hybrid --llm-rerank &amp;quot;查询内容&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;混合搜索 + LLM 重排，≥99% R@5&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 基础语义搜索&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mempalace search &lt;span style="color:#e6db74"&gt;&amp;#34;为什么选择 GraphQL 而不是 REST&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 混合搜索（推荐，效果最好）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mempalace search --mode hybrid &lt;span style="color:#e6db74"&gt;&amp;#34;OAuth 迁移遇到的问题&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 限定 Wing 范围搜索&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mempalace search --wing myapp &lt;span style="color:#e6db74"&gt;&amp;#34;认证方案设计&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 限定 Room 范围搜索&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mempalace search --wing myapp --room auth-migration &lt;span style="color:#e6db74"&gt;&amp;#34;token 刷新逻辑&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="64-配置-claude-code-hook"&gt;6.4 配置 Claude Code Hook
&lt;/h3&gt;&lt;p&gt;在项目的 &lt;code&gt;.claude/settings.local.json&lt;/code&gt; 中添加 Hook，实现自动保存：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;hooks&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;Stop&amp;#34;&lt;/span&gt;: [{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;matcher&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;hooks&amp;#34;&lt;/span&gt;: [{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;mempalace-hook-stop&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;PreCompact&amp;#34;&lt;/span&gt;: [{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;matcher&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;hooks&amp;#34;&lt;/span&gt;: [{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;mempalace-hook-precompact&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stop Hook&lt;/strong&gt;：每 15 条用户消息自动触发，保存关键内容&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PreCompact Hook&lt;/strong&gt;：上下文压缩前紧急保存，防止记忆丢失&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="65-唤醒上下文"&gt;6.5 唤醒上下文
&lt;/h3&gt;&lt;p&gt;在新会话开始前，用 &lt;code&gt;wake-up&lt;/code&gt; 注入历史记忆：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 自动注入相关历史上下文&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mempalace wake-up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;执行后，Agent 会自动获得最近的项目记忆，不再&amp;quot;失忆&amp;quot;。&lt;/p&gt;
&lt;h3 id="66-知识图谱操作"&gt;6.6 知识图谱操作
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 查看知识图谱统计&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mempalace kg stats
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 通过 Python API 操作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python3 -c &lt;span style="color:#e6db74"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;from mempalace.knowledge_graph import KnowledgeGraph
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;kg = KnowledgeGraph()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;kg.add_triple(&amp;#39;Kai&amp;#39;, &amp;#39;works_on&amp;#39;, &amp;#39;Orion&amp;#39;, valid_from=&amp;#39;2025-06-01&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;print(kg.query_entity(&amp;#39;Kai&amp;#39;))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="七实际应用场景"&gt;七、实际应用场景
&lt;/h2&gt;&lt;h3 id="71-代码开发跨会话的项目记忆"&gt;7.1 代码开发：跨会话的项目记忆
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;效果&lt;/strong&gt;：Agent 可以回忆起三个月前讨论的技术选型理由、考虑过的替代方案、以及最终决策的上下文。&lt;/p&gt;
&lt;h3 id="72-知识管理个人知识图谱"&gt;7.2 知识管理：个人知识图谱
&lt;/h3&gt;&lt;p&gt;用知识图谱记录学到的知识和关系，支持时间旅行查询——&amp;ldquo;这个知识是怎么积累的&amp;rdquo;。&lt;/p&gt;
&lt;h3 id="73-团队协作共享记忆库"&gt;7.3 团队协作：共享记忆库
&lt;/h3&gt;&lt;p&gt;每个团队成员有自己的 Wing，通过 Tunnel 连接相关工作。搜索时可以跨 Wing 找到所有相关内容。&lt;/p&gt;
&lt;h3 id="74-私有化部署数据不出机器"&gt;7.4 私有化部署：数据不出机器
&lt;/h3&gt;&lt;p&gt;MemPalace 的&lt;strong&gt;本地优先&lt;/strong&gt;设计特别适合私有化场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;所有数据存储在本地 SQLite + ChromaDB&lt;/li&gt;
&lt;li&gt;核心路径零 API 调用&lt;/li&gt;
&lt;li&gt;可选的 LLM rerank 可以用本地模型（Ollama）&lt;/li&gt;
&lt;li&gt;适合对数据安全要求高的企业环境&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="八启发与未来展望"&gt;八、启发与未来展望
&lt;/h2&gt;&lt;h3 id="81-ai-记忆系统的设计思路"&gt;8.1 AI 记忆系统的设计思路
&lt;/h3&gt;&lt;p&gt;MemPalace 给我们最大的启发是：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;不要让 AI 决定记什么。存原始文本，让搜索算法决定找什么。&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;这个思路可以应用到很多场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;代码审查记录&lt;/strong&gt;：存完整的 diff 和讨论，而不是摘要&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;需求文档&lt;/strong&gt;：存原始的用户对话，而不是需求分析师的理解&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;故障排查&lt;/strong&gt;：存完整的日志和排查过程，而不是事后总结&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;会议记录&lt;/strong&gt;：存原始的发言内容，而不是会议纪要&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简单的事情做对了，比复杂的事情做错了更好——这个工程哲学值得每一个系统设计者铭记。&lt;/p&gt;
&lt;h3 id="82-从搜索到记忆组织"&gt;8.2 从搜索到记忆组织
&lt;/h3&gt;&lt;p&gt;MemPalace 的四层结构（Wing → Room → Closet → Drawer）暗示了一个更大的趋势：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;AI 需要的不是更好的搜索，而是更好的记忆组织。&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;当前的 RAG 系统大多是&amp;quot;扁平&amp;quot;的——所有文档扔进一个向量库，搜索时暴力匹配。MemPalace 的分层结构让搜索可以&lt;strong&gt;限定范围&lt;/strong&gt;，就像在图书馆里先找到对应楼层、对应书架，再找具体那本书。&lt;/p&gt;
&lt;p&gt;未来的记忆系统可能会：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自动学习用户的记忆模式（哪些信息关联在一起）&lt;/li&gt;
&lt;li&gt;主动推送相关记忆（&amp;ldquo;你三个月前讨论过类似的问题&amp;rdquo;）&lt;/li&gt;
&lt;li&gt;支持记忆的&amp;quot;遗忘&amp;quot;（过时信息自动降权）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="83-记忆系统的标准化"&gt;8.3 记忆系统的标准化
&lt;/h3&gt;&lt;p&gt;当前 AI 记忆系统处于&amp;quot;战国时代&amp;quot;——每个项目都有自己的架构和接口。未来可能会出现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;统一的记忆协议&lt;/strong&gt;（类似 MCP 之于工具调用）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可互操作的记忆后端&lt;/strong&gt;（MemPalace 的可插拔后端是好的开始）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;记忆交换格式&lt;/strong&gt;（让不同 Agent 共享记忆）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="84-记忆的隐私与所有权"&gt;8.4 记忆的隐私与所有权
&lt;/h3&gt;&lt;p&gt;MemPalace 的本地优先设计提出了一个重要问题：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;AI 的记忆应该归谁所有？&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;用户的对话记忆应该存储在用户控制的地方&lt;/li&gt;
&lt;li&gt;企业内部的知识记忆应该有访问控制&lt;/li&gt;
&lt;li&gt;记忆的&amp;quot;删除权&amp;quot;应该被尊重&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这不仅是技术问题，更是产品伦理问题。当 AI 越来越了解我们，谁拥有这些&amp;quot;了解&amp;quot;，将成为一个绕不开的议题。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="参考资料"&gt;参考资料
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;MemPalace GitHub&lt;/strong&gt;: &lt;a class="link" href="https://github.com/MemPalace/mempalace" target="_blank" rel="noopener"
 &gt;https://github.com/MemPalace/mempalace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;官方文档&lt;/strong&gt;: &lt;a class="link" href="https://mempalaceofficial.com" target="_blank" rel="noopener"
 &gt;https://mempalaceofficial.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LongMemEval 基准&lt;/strong&gt;: &lt;a class="link" href="https://github.com/MemPalace/mempalace/tree/main/benchmarks" target="_blank" rel="noopener"
 &gt;https://github.com/MemPalace/mempalace/tree/main/benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hacker News 讨论&lt;/strong&gt;: &lt;a class="link" href="https://news.ycombinator.com/item?id=43554262" target="_blank" rel="noopener"
 &gt;https://news.ycombinator.com/item?id=43554262&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mem0 Research&lt;/strong&gt;: &lt;a class="link" href="https://mem0.ai/research" target="_blank" rel="noopener"
 &gt;https://mem0.ai/research&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mastra Observational Memory&lt;/strong&gt;: &lt;a class="link" href="https://mastra.ai/research/observational-memory" target="_blank" rel="noopener"
 &gt;https://mastra.ai/research/observational-memory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;卢曼卡片笔记法&lt;/strong&gt;: &lt;a class="link" href="https://zettelkasten.de/" target="_blank" rel="noopener"
 &gt;https://zettelkasten.de/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;本文基于 MemPalace v3.3.5（2026-05-09）版本分析。项目仍在活跃开发中，部分细节可能随版本更新而变化。&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Claude Code 的记忆系统是怎么工作的？源码级拆解</title><link>https://blog.7ys.top/posts/claude-code-%E7%9A%84%E8%AE%B0%E5%BF%86%E7%B3%BB%E7%BB%9F%E6%98%AF%E6%80%8E%E4%B9%88%E5%B7%A5%E4%BD%9C%E7%9A%84%E6%BA%90%E7%A0%81%E7%BA%A7%E6%8B%86%E8%A7%A3/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://blog.7ys.top/posts/claude-code-%E7%9A%84%E8%AE%B0%E5%BF%86%E7%B3%BB%E7%BB%9F%E6%98%AF%E6%80%8E%E4%B9%88%E5%B7%A5%E4%BD%9C%E7%9A%84%E6%BA%90%E7%A0%81%E7%BA%A7%E6%8B%86%E8%A7%A3/</guid><description>&lt;img src="https://blog.7ys.top/" alt="Featured image of post Claude Code 的记忆系统是怎么工作的？源码级拆解" /&gt;&lt;h1 id="claude-code-的记忆系统是怎么工作的源码级拆解"&gt;Claude Code 的记忆系统是怎么工作的？源码级拆解
&lt;/h1&gt;
 &lt;blockquote&gt;
 &lt;p&gt;你周五用 Claude Code 调 bug 到凌晨两点，周一打开新会话，它张嘴就说：&amp;ldquo;上次那个 auth 模块的 bug 修好了吗？测试记得起 Redis。&amp;ldquo;你愣住了——你没告诉过它这些。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一一个细思极恐的瞬间"&gt;一、一个细思极恐的瞬间
&lt;/h2&gt;&lt;p&gt;用过 Claude Code 的开发者大概都经历过这个瞬间：&lt;/p&gt;
&lt;p&gt;你关掉终端，第二天重新打开，开始一个新对话。Claude 什么都没问，直接开始干活。它知道你的项目用 pnpm 而不是 npm，知道测试需要本地 Redis，知道你讨厌 verbose 的输出。&lt;/p&gt;
&lt;p&gt;你仔细回想：&lt;strong&gt;我什么时候告诉它这些的？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;答案是：你没有直接告诉它。是它自己&amp;quot;记住&amp;quot;的。&lt;/p&gt;
&lt;p&gt;Claude Code 每次启动都是一个全新的上下文窗口，不携带任何历史对话。所有它&amp;quot;知道&amp;quot;的东西，都必须在第一轮对话之前从磁盘加载。&lt;/p&gt;
&lt;p&gt;我花了一周时间读 Claude Code 的 TypeScript 源码（是的，它是开源的），发现它的记忆系统比官方文档描述的复杂得多。今天来拆解一下。&lt;/p&gt;
&lt;h2 id="二两套记忆系统你写的-vs-ai-写的"&gt;二、两套记忆系统：你写的 vs AI 写的
&lt;/h2&gt;&lt;p&gt;Claude Code 有两套完全独立的记忆系统，各司其职：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TB
 subgraph "Claude Code 记忆全景"
 subgraph "CLAUDE.md（你写的）"
 A1[手动维护]
 A2[指令/规则/偏好]
 A3[通过 git 同步]
 A4[加载后不变化]
 end
 
 subgraph "Auto Memory（AI 写的）"
 B1[自动提取]
 B2[用户画像/行为纠正]
 B3[项目状态/外部引用]
 B4[每轮对话可能更新]
 end
 
 A1 --&gt; C[启动时加载到上下文]
 B1 --&gt; C
 end
 
 style A1 fill:#0f3460,stroke:#e94560,color:#fff
 style A2 fill:#0f3460,stroke:#e94560,color:#fff
 style A3 fill:#0f3460,stroke:#e94560,color:#fff
 style A4 fill:#0f3460,stroke:#e94560,color:#fff
 style B1 fill:#533483,stroke:#e94560,color:#fff
 style B2 fill:#533483,stroke:#e94560,color:#fff
 style B3 fill:#533483,stroke:#e94560,color:#fff
 style B4 fill:#533483,stroke:#e94560,color:#fff
 style C fill:#e94560,stroke:#fff,color:#fff&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;关键区别：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;维度&lt;/th&gt;
 &lt;th&gt;CLAUDE.md&lt;/th&gt;
 &lt;th&gt;Auto Memory&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;谁写的&lt;/td&gt;
 &lt;td&gt;你手动写&lt;/td&gt;
 &lt;td&gt;Claude 自动写&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;存储位置&lt;/td&gt;
 &lt;td&gt;项目目录 / 用户目录&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;~/.claude/projects/&lt;/code&gt; 下&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;同步方式&lt;/td&gt;
 &lt;td&gt;Git（可提交）&lt;/td&gt;
 &lt;td&gt;本地（不同步）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;更新频率&lt;/td&gt;
 &lt;td&gt;你改才变&lt;/td&gt;
 &lt;td&gt;每轮对话可能更新&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;大小限制&lt;/td&gt;
 &lt;td&gt;40KB（建议）&lt;/td&gt;
 &lt;td&gt;索引 200 行 / 25KB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;加载方式&lt;/td&gt;
 &lt;td&gt;启动时全部加载&lt;/td&gt;
 &lt;td&gt;索引全加载，topic 按需&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="21-claudemd-的加载链"&gt;2.1 CLAUDE.md 的加载链
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;优先级（高→低）：

1. 管理级 /etc/claude-code/CLAUDE.md ← IT 管理员写的，无法覆盖
2. 用户级 ~/.claude/CLAUDE.md ← 你的个人偏好
3. 项目级 ./CLAUDE.md 或 ./.claude/CLAUDE.md ← 团队共享（git 提交）
4. 本地级 ./CLAUDE.local.md ← 你的个人覆盖（不提交）

加载顺序：
 工作目录 → 向上遍历目录树 → 加载沿途所有 CLAUDE.md
 离工作目录近的优先级高
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;一个细节：&lt;/strong&gt; &lt;code&gt;CLAUDE.local.md&lt;/code&gt; 不在官方文档里，但源码中存在。它在项目 CLAUDE.md 之后、Auto Memory 之前加载。适合放个人的数据库密码、调试开关之类的——不提交到 git，但本地有效。&lt;/p&gt;
&lt;h3 id="22-auto-memory-的四种类型"&gt;2.2 Auto Memory 的四种类型
&lt;/h3&gt;&lt;p&gt;Auto Memory 不是随意的笔记，而是有严格的分类：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TB
 subgraph "四种记忆类型"
 subgraph "user（用户画像）"
 U1[角色/偏好/知识水平]
 U2[始终私有]
 end
 
 subgraph "feedback（行为纠正）"
 F1[验证过的模式]
 F2[默认私有]
 end
 
 subgraph "project（项目状态）"
 P1[工作进展/决策]
 P2[倾向团队共享]
 end
 
 subgraph "reference（外部引用）"
 R1[系统指针]
 R2[通常团队共享]
 end
 end
 
 style U1 fill:#0f3460,stroke:#e94560,color:#fff
 style U2 fill:#0f3460,stroke:#e94560,color:#fff
 style F1 fill:#533483,stroke:#e94560,color:#fff
 style F2 fill:#533483,stroke:#e94560,color:#fff
 style P1 fill:#16213e,stroke:#e94560,color:#fff
 style P2 fill:#16213e,stroke:#e94560,color:#fff
 style R1 fill:#1a1a2e,stroke:#e94560,color:#fff
 style R2 fill:#1a1a2e,stroke:#e94560,color:#fff&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;为什么这样分？&lt;/strong&gt; 因为团队协作时，你的编码偏好（user）不应该泄露给队友，但项目进度（project）应该共享。这种分类直接影响记忆的加载和同步策略。&lt;/p&gt;
&lt;h2 id="三三个时间尺度实时--会话--梦境"&gt;三、三个时间尺度：实时 / 会话 / 梦境
&lt;/h2&gt;&lt;p&gt;这是整套系统最精妙的部分。Auto Memory 不是&amp;quot;Claude 注意到什么就随手记下来&amp;rdquo;，而是有三个独立的后台进程，在不同时间尺度上提取信息：&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph LR
 subgraph "时间轴"
 A[Per-Turn&lt;br/&gt;实时提取] --&gt;|每轮对话| B[Per-Session&lt;br/&gt;会话记忆]
 B --&gt;|每个会话| C[autoDream&lt;br/&gt;梦境整合]
 end
 
 subgraph "成本"
 D[极低&lt;br/&gt;共享cache] 
 E[低&lt;br/&gt;偶尔触发]
 F[中&lt;br/&gt;24h+5会话门槛]
 end
 
 A --- D
 B --- E
 C --- F
 
 style A fill:#e94560,stroke:#fff,color:#fff
 style B fill:#533483,stroke:#fff,color:#fff
 style C fill:#0f3460,stroke:#fff,color:#fff
 style D fill:transparent,stroke:#e94560,color:#e94560
 style E fill:transparent,stroke:#533483,color:#533483
 style F fill:transparent,stroke:#0f3460,color:#0f3460&lt;/pre&gt;&lt;h3 id="31-per-turn实时提取每轮对话后"&gt;3.1 Per-Turn：实时提取（每轮对话后）
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;触发：每次完整查询循环结束
方式：fork 一个子 Agent 在后台运行
成本：极低（共享父 Agent 的 prompt cache）
权限：只读项目文件，只写记忆目录
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;一个细节：&lt;/strong&gt; 如果主 Agent 在本轮已经写过记忆（你明确说&amp;quot;记住这个&amp;rdquo;），提取步骤会跳过那个范围，避免重复。&lt;/p&gt;
&lt;h3 id="32-per-session会话记忆上下文增长时"&gt;3.2 Per-Session：会话记忆（上下文增长时）
&lt;/h3&gt;&lt;p&gt;这是一个独立于 Auto Memory 的系统，目的是让当前会话的上下文&lt;strong&gt;在压缩后还能保留&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;触发条件（三个同时满足）：&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;✅ 总上下文 ≥ 10,000 tokens
✅ 上下文增长 ≥ 5,000 tokens（自上次提取后）
✅ 工具调用 ≥ 3 次
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;提取的结构化笔记：&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;┌─────────────────────────────────────────┐
│ Session Memory 模板 │
├─────────────────────────────────────────┤
│ ## Current State │
│ 当前正在做什么，进展到哪一步 │
│ （上限 ~2000 tokens） │
├─────────────────────────────────────────┤
│ ## Files and Functions │
│ 涉及的文件、函数、关键代码位置 │
│ （上限 ~2000 tokens） │
├─────────────────────────────────────────┤
│ ## Errors &amp;amp; Corrections │
│ 遇到的错误、尝试过的方案、最终解决方案 │
│ （上限 ~2000 tokens） │
├─────────────────────────────────────────┤
│ ## Worklog │
│ 工作日志：做了什么、还剩什么 │
│ （上限 ~2000 tokens） │
└─────────────────────────────────────────┘
总计上限 ~12,000 tokens
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;为什么需要这个？&lt;/strong&gt; 当对话太长需要压缩时，有这些结构化笔记，auto-compact 可以复用它们，而不是从头重新摘要整个对话。效果好很多——因为笔记是增量提取的，上下文还完整时就记录了关键信息。&lt;/p&gt;
&lt;h3 id="33-autodream梦境整合每天每几天"&gt;3.3 autoDream：梦境整合（每天/每几天）
&lt;/h3&gt;&lt;p&gt;这是最让人惊讶的部分。源码中明确把这叫做 &lt;strong&gt;&amp;ldquo;DreamTask&amp;rdquo;&lt;/strong&gt;，UI 中会显示进度条。&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TB
 subgraph "autoDream 触发条件"
 G1[Gate 1: 时间检查&lt;br/&gt;≥ 24小时] --&gt;|✅| G2[Gate 2: 会话检查&lt;br/&gt;≥ 5个会话修改]
 G2 --&gt;|✅| G3[Gate 3: 锁检查&lt;br/&gt;.consolidate-lock 未占用]
 G3 --&gt;|✅| EXEC[执行整合]
 
 G1 --&gt;|❌| SKIP[跳过]
 G2 --&gt;|❌| SKIP
 G3 --&gt;|❌| SKIP
 end
 
 style G1 fill:#0f3460,stroke:#e94560,color:#fff
 style G2 fill:#0f3460,stroke:#e94560,color:#fff
 style G3 fill:#0f3460,stroke:#e94560,color:#fff
 style EXEC fill:#e94560,stroke:#fff,color:#fff
 style SKIP fill:#1a1a2e,stroke:#533483,color:#533483&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;整合流程（四阶段）：&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Phase 1: 定向
 ├── 读取 MEMORY.md 索引
 └── 浏览现有 topic 文件
 目的：了解当前记忆状态

Phase 2: 发现
 └── 搜索日志和会话记录中的新知识
 目的：找到需要整合的信息

Phase 3: 写入
 ├── 写入/更新 topic 文件
 ├── 合并新信号到现有文件
 └── 相对日期 → 绝对日期（&amp;#34;昨天&amp;#34; → &amp;#34;2026-05-11&amp;#34;）
 目的：持久化新知识

Phase 4: 清理
 ├── 修剪 MEMORY.md 至 200 行以下
 ├── 移除过期指针
 └── 解决新旧事实矛盾
 目的：保证记忆质量
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;一个有趣的细节：&lt;/strong&gt; 如果你杀掉整合进程，锁的修改时间会回滚，让下一个会话可以重试。这个错误处理很体贴。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;它什么时候运行？&lt;/strong&gt; 不是等你关掉电脑或睡觉，而是在一次对话结束时——只要满足那三个 Gate。只是因为 24 小时和 5 个会话的门槛，大多数时候不会触发。&lt;/p&gt;
&lt;h2 id="四记忆召回sonnet-替你选"&gt;四、记忆召回：Sonnet 替你选
&lt;/h2&gt;&lt;p&gt;记忆存下来了，但怎么在需要的时候找到正确的记忆？&lt;/p&gt;
&lt;p&gt;Claude Code 的方案是：&lt;strong&gt;让 Sonnet 替你选，不是关键词匹配。&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TB
 subgraph "记忆召回流程"
 START[启动时] --&gt; A[读取 MEMORY.md 索引&lt;br/&gt;前 200 行]
 A --&gt; B[扫描 topic 文件 frontmatter]
 B --&gt; C[构建 manifest&lt;br/&gt;filename + description]
 
 C --&gt; D[每轮对话]
 D --&gt; E[用户输入 + 工具结果]
 E --&gt; F[调用 Sonnet 选择相关文件&lt;br/&gt;最多 5 个]
 F --&gt; G[读取选中文件&lt;br/&gt;每文件 4KB 限制]
 G --&gt; H[注入到 prompt]
 end
 
 subgraph "限制"
 L1[每轮最多 5 个文件]
 L2[每文件 4KB]
 L3[每轮预算 20KB]
 L4[会话累计 60KB]
 end
 
 style START fill:#e94560,stroke:#fff,color:#fff
 style A fill:#0f3460,stroke:#e94560,color:#fff
 style B fill:#0f3460,stroke:#e94560,color:#fff
 style C fill:#0f3460,stroke:#e94560,color:#fff
 style D fill:#533483,stroke:#fff,color:#fff
 style E fill:#533483,stroke:#fff,color:#fff
 style F fill:#533483,stroke:#fff,color:#fff
 style G fill:#533483,stroke:#fff,color:#fff
 style H fill:#e94560,stroke:#fff,color:#fff
 style L1 fill:transparent,stroke:#e94560,color:#e94560
 style L2 fill:transparent,stroke:#e94560,color:#e94560
 style L3 fill:transparent,stroke:#e94560,color:#e94560
 style L4 fill:transparent,stroke:#e94560,color:#e94560&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;为什么用 Sonnet 而不是关键词？&lt;/strong&gt; 因为语义理解更好。比如用户问&amp;quot;怎么跑测试&amp;quot;，关键词匹配可能找不到 &lt;code&gt;feedback_testing.md&lt;/code&gt;，但 Sonnet 能理解这个意图。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但这里有一个结构性缺陷：&lt;/strong&gt; 没有向量搜索，没有语义索引。如果 MEMORY.md 中的描述写得不好，或者 topic 文件太多（最多扫描 200 个，按修改时间排序），记忆就可能被&amp;quot;遗忘&amp;quot;。&lt;/p&gt;
&lt;h2 id="五什么能活过压缩"&gt;五、什么能活过压缩？
&lt;/h2&gt;&lt;p&gt;长对话会被压缩。压缩后，什么能保留？&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TB
 subgraph "压缩后存活分析"
 subgraph "✅ 能活过的（从磁盘重新加载）"
 A1[CLAUDE.md 文件]
 A2[Auto Memory 文件]
 A3[Session Memory 文件]
 end
 
 subgraph "❌ 活不过的"
 B1[只在对话中说过&lt;br/&gt;没有保存到记忆系统的内容]
 end
 end
 
 style A1 fill:#0f3460,stroke:#e94560,color:#fff
 style A2 fill:#0f3460,stroke:#e94560,color:#fff
 style A3 fill:#0f3460,stroke:#e94560,color:#fff
 style B1 fill:#1a1a2e,stroke:#e94560,color:#e94560&lt;/pre&gt;&lt;p&gt;源码中的清理代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 压缩时，强制清除所有缓存，从磁盘重新加载
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;getUserContext&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;cache&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;clear&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;resetGetMemoryFilesCache&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;compact&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;clearSystemPromptSections&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;教训：&lt;/strong&gt; 如果你在对话中告诉 Claude 什么重要的东西，确保它写入了记忆。否则压缩后就没了。&lt;/p&gt;
&lt;h2 id="六与其他工具的对比"&gt;六、与其他工具的对比
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;维度&lt;/th&gt;
 &lt;th&gt;Claude Code&lt;/th&gt;
 &lt;th&gt;Aider&lt;/th&gt;
 &lt;th&gt;Cursor&lt;/th&gt;
 &lt;th&gt;DeepSeek-TUI&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;记忆系统&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;✅ 三层架构&lt;/td&gt;
 &lt;td&gt;❌ 无&lt;/td&gt;
 &lt;td&gt;⚠️ 简单 rules&lt;/td&gt;
 &lt;td&gt;✅ 基础记忆&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;自动提取&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;✅ per-turn&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;⚠️ 手动&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;梦境整合&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;✅ autoDream&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;记忆分类&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;✅ 4 种类型&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;模型辅助召回&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;✅ Sonnet 选择&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;团队同步&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;⚠️ feature flag&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;记忆持久化&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;✅ 文件系统&lt;/td&gt;
 &lt;td&gt;❌&lt;/td&gt;
 &lt;td&gt;⚠️ 配置文件&lt;/td&gt;
 &lt;td&gt;✅ 文件系统&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;结论：&lt;/strong&gt; Claude Code 的记忆系统是目前 AI 编程工具中最完善的。Aider 完全没有记忆，Cursor 只有简单的 rules 文件，DeepSeek-TUI 有基础记忆但没有自动提取和整合。&lt;/p&gt;
&lt;h2 id="七这套系统的局限"&gt;七、这套系统的局限
&lt;/h2&gt;&lt;p&gt;读完源码，我认为有几个结构性局限：&lt;/p&gt;
&lt;h3 id="71-记忆是-per-repo-的"&gt;7.1 记忆是 per-repo 的
&lt;/h3&gt;&lt;p&gt;你在项目 A 教 Claude 的偏好，不会自动带到项目 B。用户级的 &lt;code&gt;~/.claude/CLAUDE.md&lt;/code&gt; 可以处理一部分，但它是静态的——Claude 不能在会话中自动更新它。&lt;/p&gt;
&lt;h3 id="72-记忆是-machine-local-的"&gt;7.2 记忆是 machine-local 的
&lt;/h3&gt;&lt;p&gt;项目目录名经过 sanitize（非字母数字替换为连字符），但不同机器、不同用户名、不同挂载点会产生不同的目录名。同一项目，不同机器，不同记忆。&lt;/p&gt;
&lt;h3 id="73-没有记忆衰减"&gt;7.3 没有记忆衰减
&lt;/h3&gt;&lt;p&gt;所有记忆都是平等的。一个月前的偏好和今天的偏好权重一样。没有&amp;quot;热度&amp;quot;概念，没有自动遗忘机制。&lt;/p&gt;
&lt;h3 id="74-依赖-sonnet-的选择能力"&gt;7.4 依赖 Sonnet 的选择能力
&lt;/h3&gt;&lt;p&gt;如果 Sonnet 选错了记忆文件，或者描述写得不好，记忆就&amp;quot;丢了&amp;quot;。没有 fallback 机制。&lt;/p&gt;
&lt;h2 id="八对我们的启示"&gt;八、对我们的启示
&lt;/h2&gt;&lt;p&gt;这套系统给我们什么启发？&lt;/p&gt;
&lt;h3 id="81-记忆是-ai-工具的核心差异化"&gt;8.1 记忆是 AI 工具的核心差异化
&lt;/h3&gt;&lt;p&gt;目前市面上的开源 AI 编程工具（Aider、OpenCode、Continue），没有一个有真正意义上的记忆系统。这是差异化机会。&lt;/p&gt;
&lt;h3 id="82-梦境整合是一个优雅的设计"&gt;8.2 梦境整合是一个优雅的设计
&lt;/h3&gt;&lt;p&gt;不是每次对话都提取记忆（太频繁，噪音多），也不是完全不提取（会丢失）。三个时间尺度的设计——实时、会话、梦境——是一个很好的平衡。&lt;/p&gt;
&lt;h3 id="83-模型辅助召回比关键词匹配更好"&gt;8.3 模型辅助召回比关键词匹配更好
&lt;/h3&gt;&lt;p&gt;让 Sonnet 选择相关的记忆文件，而不是 grep 关键词。这在语义理解上好很多，但成本也更高。&lt;/p&gt;
&lt;p&gt;对于开源工具，可以考虑一个折中方案：先用关键词过滤缩小范围，再用小模型选择。&lt;/p&gt;
&lt;h3 id="84-记忆质量--记忆数量"&gt;8.4 记忆质量 &amp;gt; 记忆数量
&lt;/h3&gt;&lt;p&gt;Claude Code 严格限制记忆的大小（200 行索引、4KB 单文件、60KB 会话累计）。这不是偷懒，而是有意为之——太多记忆反而会干扰。&lt;/p&gt;
&lt;h2 id="九写在最后"&gt;九、写在最后
&lt;/h2&gt;&lt;p&gt;读完 Claude Code 的记忆系统源码，我最大的感受是：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;好的 AI 工具不是模型能力的比拼，而是工程设计的比拼。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;同样的 Claude 模型，有记忆系统和没有记忆系统，用户体验天差地别。记忆系统本身不需要更强大的模型，它需要的是精心的工程设计——什么时候提取、怎么存储、如何召回、何时整合。&lt;/p&gt;
&lt;p&gt;这些工程细节，才是真正的壁垒。&lt;/p&gt;
&lt;hr&gt;

 &lt;blockquote&gt;
 &lt;p&gt;本文基于 Claude Code TypeScript 源码分析。
源码地址：&lt;a class="link" href="https://github.com/anthropics/claude-code" target="_blank" rel="noopener"
 &gt;github.com/anthropics/claude-code&lt;/a&gt;
参考文章：&lt;a class="link" href="https://db0.ai/blog/how-claude-code-memory-works" target="_blank" rel="noopener"
 &gt;How Claude Code memory actually works&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;</description></item></channel></rss>