<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ai on Kalend's Blog</title><link>https://blog.kalend.top/categories/ai/</link><description>Recent content in Ai on Kalend's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Fri, 29 May 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://blog.kalend.top/categories/ai/index.xml" rel="self" type="application/rss+xml"/><item><title>知识库搭完就完了？加上这两招，效率翻倍</title><link>https://blog.kalend.top/2026/05/29/2026-05-29-knowledge-base-advanced-2.html/</link><pubDate>Fri, 29 May 2026 10:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/29/2026-05-29-knowledge-base-advanced-2.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;备选标题①：别再用 RAG 从零搜了！3 步搭出互联知识库 + 接入 AI 助手
备选标题②：99% 的人卡在&amp;quot;知识库能搜&amp;quot;就停了——你还能再做两步
备选标题③：知识库入门容易精通难：两个进阶玩法效率直接翻倍&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;上篇我们用 MemPalace + ChromaDB + Ollama 搭好了基础知识库。安装、嵌入、搜索、定时扫描，一条龙跑通。&lt;/p&gt;
&lt;p&gt;但说实话，能搜只是起点。&lt;/p&gt;
&lt;p&gt;搜索是&amp;quot;每次从零发现&amp;quot;，你问一次它找一次，找不到就是找不到。知识之间的关系？没有。知识的沉淀和演化？也没有。&lt;/p&gt;
&lt;p&gt;今天讲两个进阶玩法，直接把知识库从&amp;quot;能用&amp;quot;拉到&amp;quot;好用&amp;quot;：&lt;/p&gt;
&lt;p&gt;第一，LLM Wiki 互联知识库。&lt;/p&gt;
&lt;p&gt;第二，接入 AI 助手，让记忆自动流转。&lt;/p&gt;
&lt;h2 id="一llm-wiki从搜文档到用知识"&gt;一、LLM Wiki：从&amp;quot;搜文档&amp;quot;到&amp;quot;用知识&amp;quot;
&lt;/h2&gt;&lt;h3 id="传统-rag-的致命问题"&gt;传统 RAG 的致命问题
&lt;/h3&gt;&lt;p&gt;每次提问，RAG 都要重新检索、重新理解、重新组织答案。同一个知识点问了十遍，它就检索了十遍，没有任何积累。&lt;/p&gt;
&lt;p&gt;这就像每次考试都从头翻课本，从不做笔记。&lt;/p&gt;
&lt;p&gt;LLM Wiki 的思路不一样：一次编译知识，持续更新，互联引用。&lt;/p&gt;
&lt;p&gt;它源自 Karpathy 的 LLM Wiki 模式，用互联的 Markdown 文件构建一个持久化的知识网络。&lt;/p&gt;
&lt;h3 id="三层架构"&gt;三层架构
&lt;/h3&gt;&lt;p&gt;LLM Wiki 的核心是三层分离：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layer 1：&lt;code&gt;raw/&lt;/code&gt; —— 不可变原始资料。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;放文章、论文、对话记录等原材料。&lt;/p&gt;
&lt;p&gt;一旦放进去就不改，作为知识源头。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layer 2：Wiki Pages —— AI 拥有的知识页面。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是核心产出层。&lt;/p&gt;
&lt;p&gt;包含实体页、概念页、对比页、查询页。&lt;/p&gt;
&lt;p&gt;每个页面都是经过消化的结构化知识。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layer 3：&lt;code&gt;SCHEMA.md&lt;/code&gt; —— 结构规则和标签分类法。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;定义整个 wiki 的域配置、标签体系、页面阈值。&lt;/p&gt;
&lt;p&gt;是整个系统的&amp;quot;宪法&amp;quot;。&lt;/p&gt;
&lt;p&gt;三层分离的好处：原始数据不动，知识页面持续演化，规则独立维护。&lt;/p&gt;
&lt;h3 id="实操5-分钟搭骨架"&gt;实操：5 分钟搭骨架
&lt;/h3&gt;&lt;p&gt;先创建目录结构：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p ~/wiki/&lt;span class="o"&gt;{&lt;/span&gt;raw/&lt;span class="o"&gt;{&lt;/span&gt;articles,papers,transcripts,assets&lt;span class="o"&gt;}&lt;/span&gt;,entities,concepts,comparisons,queries&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;创建 &lt;code&gt;SCHEMA.md&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gh"&gt;# Wiki Schema
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Domain
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AI Engineering &amp;amp; Knowledge Management
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Taxonomy Tags
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="ni"&gt;#architecture&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="ni"&gt;#embedding&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="ni"&gt;#retrieval&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="ni"&gt;#integration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="ni"&gt;#rag&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="ni"&gt;#vector&lt;/span&gt;-db
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; &lt;span class="ni"&gt;#workflow&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Page Thresholds
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; entity_min_references: 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; concept_min_sections: 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; comparison_min_axes: 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; query_max_age_days: 90
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Naming Convention
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;-&lt;/span&gt; lowercase-with-hyphens.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;创建 &lt;code&gt;index.md&lt;/code&gt;（导航中心）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gh"&gt;# Wiki Index
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Entities
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;!-- entities listed here --&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Concepts
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;!-- concepts listed here --&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Comparisons
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;!-- comparisons listed here --&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Queries
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;!-- queries listed here --&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;创建 &lt;code&gt;log.md&lt;/code&gt;（操作日志）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gh"&gt;# Wiki Log
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| Date | Action | Target | Notes |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;|------|--------|--------|-------|
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;完成。这就是一个完整的 LLM Wiki 骨架。&lt;/p&gt;
&lt;h3 id="三个核心操作"&gt;三个核心操作
&lt;/h3&gt;&lt;p&gt;LLM Wiki 围绕三个操作展开：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ingest（摄入）：把原材料变成知识。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;流程是：捕获原始源 → 讨论要点 → 检查已有页面 → 创建或更新页面 → 更新导航。&lt;/p&gt;
&lt;p&gt;不是简单存文件，而是消化、提取、关联、索引一条龙。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Query（查询）：基于已有知识回答。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;关键区别：查完之后，有价值的答案会写回 wiki。知识越用越丰富。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lint（检查）：保持知识库健康。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;检测孤儿页面、断裂链接、索引完整性等六类问题。超过 100 个页面后，不跑 Lint 就是给自己埋雷。&lt;/p&gt;
&lt;h3 id="obsidian-兼容"&gt;Obsidian 兼容
&lt;/h3&gt;&lt;p&gt;LLM Wiki 原生兼容 Obsidian。&lt;code&gt;[[页面名]]&lt;/code&gt; 的 wikilinks 语法直接可用。&lt;/p&gt;
&lt;p&gt;Graph View 可以可视化知识网络。&lt;/p&gt;
&lt;p&gt;把 &lt;code&gt;~/wiki&lt;/code&gt; 当作 Vault 打开就行，零迁移成本。&lt;/p&gt;
&lt;h2 id="二接入-ai-助手让知识自动流转"&gt;二、接入 AI 助手：让知识自动流转
&lt;/h2&gt;&lt;p&gt;知识库搭好了，但每次手动查还是很累。&lt;/p&gt;
&lt;p&gt;更合理的做法是：把知识库变成 AI 助手的长期记忆，对话时自动存取。&lt;/p&gt;
&lt;h3 id="方式-amemoryprovider-深度集成推荐"&gt;方式 A：MemoryProvider 深度集成（推荐）
&lt;/h3&gt;&lt;p&gt;MemPalace 直接作为 AI 助手框架的 memory provider，对话时自动同步记忆。&lt;/p&gt;
&lt;p&gt;在框架配置文件中设置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;memory_enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;user_profile_enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;memory_char_limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;user_char_limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1375&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;mempalace&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;nudge_interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;flush_min_turns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;再创建 &lt;code&gt;mempalace.json&lt;/code&gt; 配置自动提取：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;auto_extract&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;extract_model&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;glm-4-flash&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这里 &lt;code&gt;extract_model&lt;/code&gt; 用轻量模型做记忆提取，成本极低。&lt;/p&gt;
&lt;p&gt;配置完成后，框架自动注册 6 个工具：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mempalace_recall&lt;/code&gt;（语义搜索）、&lt;code&gt;mempalace_store&lt;/code&gt;（精准存储）、&lt;code&gt;mempalace_knowledge&lt;/code&gt;（查询知识图谱）。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mempalace_kg_add&lt;/code&gt;（添加三元组）。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mempalace_kg_invalidate&lt;/code&gt;（标记过期）、&lt;code&gt;mempalace_status&lt;/code&gt;（记忆总览）。&lt;/p&gt;
&lt;h3 id="三个自动钩子"&gt;三个自动钩子
&lt;/h3&gt;&lt;p&gt;集成后，三个钩子自动工作：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;sync_turn()&lt;/code&gt;&lt;/strong&gt; —— 每轮对话结束，自动把消息持久化到 MemPalace。你不用手动存。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;on_memory_write()&lt;/code&gt;&lt;/strong&gt; —— 框架内置记忆写入时，自动镜像到 MemPalace。双写，不丢。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;on_session_end()&lt;/code&gt;&lt;/strong&gt; —— 对话结束时，自动提取三类记忆：Persona、Episodic、Instruction。提取完直接存入，下次对话自动加载。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;去重机制&lt;/strong&gt;：新记忆与已有记忆做 cosine similarity，超过 0.92 视为重复，跳过存储。防止记忆膨胀。&lt;/p&gt;
&lt;h3 id="方式-bmcp-server备选"&gt;方式 B：MCP Server（备选）
&lt;/h3&gt;&lt;p&gt;如果框架不支持 MemoryProvider，可以用 MCP 协议接入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;mcp_servers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;mempalace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;python&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-m&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mempalace.mcp_server&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;功能一样，但没有自动钩子方便，适合过渡。&lt;/p&gt;
&lt;h2 id="三多实例隔离别让并发写炸了你的数据库"&gt;三、多实例隔离：别让并发写炸了你的数据库
&lt;/h2&gt;&lt;p&gt;同时跑多个 Agent（主助手 + OpenClaw 定时挖掘 + 其他实验），它们都写同一个 ChromaDB，迟早出问题。&lt;/p&gt;
&lt;p&gt;ChromaDB 不是为高并发写入设计的。多进程同时写，数据损坏只是时间问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方案：每个 Agent 用独立的 MemPalace 实例。&lt;/strong&gt;&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;/td&gt;
 &lt;td&gt;&lt;code&gt;~/.mempalace/palace/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;AI 助手主程序&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;第二实例&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;~/.mempalace/palace-openclaw/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;OpenClaw 定时挖掘&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;第三实例&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;~/.mempalace/palace-yuan/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;其他 Agent&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;路径不同，ChromaDB 实例不同，互不干扰。&lt;/p&gt;
&lt;p&gt;OpenClaw 定时挖掘脚本示例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PALACE_DB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/root/.mempalace/palace-openclaw&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PALACE_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/root/.openclaw/workspace-main&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace --palace &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$PALACE_DB&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; mine &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$PALACE_PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; --limit &lt;span class="m"&gt;500&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后配置定时执行。用 OpenClaw 自己的 cron，不要用系统 crontab。&lt;/p&gt;
&lt;h2 id="踩坑清单"&gt;踩坑清单
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;1. ChromaDB 并发写必挂。&lt;/strong&gt; 多 Agent 共享一个实例是&amp;quot;能跑&amp;quot;但&amp;quot;迟早崩&amp;quot;。老老实实隔离。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 记忆提取模型别用大模型。&lt;/strong&gt; &lt;code&gt;extract_model&lt;/code&gt; 用轻量模型就够了。用大模型做提取，成本是收益的十倍。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. LLM Wiki 的 Lint 别偷懒。&lt;/strong&gt; 知识库超过 100 个页面后，孤儿页面和矛盾内容会越来越多。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. wiki 路径别用中文。&lt;/strong&gt; 文件名和目录名都用英文加连字符。中文路径在 wikilinks 中会出奇怪问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. MemPalace 去重阈值 0.92 不要调低。&lt;/strong&gt; 调到 0.85 以下，相似但不同的记忆会被误判为重复丢弃。宁可多存，不可误删。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. &lt;code&gt;flush_min_turns&lt;/code&gt; 别设太大。&lt;/strong&gt; 设成 20 的话，对话在第 15 轮断了，那 15 轮的记忆都没存。建议 6-8 轮。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;p&gt;上篇解决了&amp;quot;知识库能存能搜&amp;quot;。&lt;/p&gt;
&lt;p&gt;这篇解决了两个更关键的问题：&lt;/p&gt;
&lt;p&gt;第一，知识库能互联、能演化。LLM Wiki 的三层架构让知识从&amp;quot;孤立文档&amp;quot;变成&amp;quot;互联网络&amp;quot;，越用越丰富。&lt;/p&gt;
&lt;p&gt;第二，知识库能和 AI 助手自动协同。MemPalace 作为 MemoryProvider，对话即存储，查询即回忆，全程自动化。&lt;/p&gt;
&lt;p&gt;加上多实例隔离，多 Agent 并行也不会打架。&lt;/p&gt;
&lt;p&gt;三步走：基础搭建 → 互联知识库 → AI 助手集成。到这步，你的知识库系统才算真正完成。&lt;/p&gt;</description></item><item><title>3个命令搭知识库：你的笔记终于能"搜懂意思"了</title><link>https://blog.kalend.top/2026/05/29/build-knowledge-base-3-commands.html/</link><pubDate>Fri, 29 May 2026 07:36:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/29/build-knowledge-base-3-commands.html/</guid><description>&lt;p&gt;我搭了个跑在自己机器上的知识库，能自动扫描文件、语义搜索、定时更新，全程零 API 费用。&lt;/p&gt;
&lt;p&gt;之前试过关键词搜索笔记，搜&amp;quot;AI怎么记住对话&amp;quot;，0 结果。换成语义搜索，秒命中。下面是完整搭建过程，每一步都能直接复制执行。&lt;/p&gt;
&lt;h2 id="为什么你需要一个知识库"&gt;为什么你需要一个知识库
&lt;/h2&gt;&lt;p&gt;笔记越积越多，Ctrl+F 搜不到东西了。关键词匹配只认字面，不认意思。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;AI怎么记住之前的对话&amp;quot;搜不到&amp;quot;记忆系统架构&amp;rdquo;，但语义上是一回事。这就是关键词搜索的致命缺陷。&lt;/p&gt;
&lt;h2 id="第一步装-mempalace5分钟"&gt;第一步：装 MemPalace（5分钟）
&lt;/h2&gt;&lt;p&gt;MemPalace 是本地优先的 AI 记忆系统，底层用 ChromaDB 存向量数据。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 一行安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install mempalace
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 验证&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;输出类似这样说明成功：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Palace Status:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Drawers filed: 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Total memories: 0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;安装完自动创建 &lt;code&gt;~/.mempalace/&lt;/code&gt; 目录。默认嵌入模型是 all-MiniLM-L6-v2（英文模型，384维），后面会换成中文模型。&lt;/p&gt;
&lt;h2 id="第二步装-ollama--中文嵌入模型10分钟"&gt;第二步：装 Ollama + 中文嵌入模型（10分钟）
&lt;/h2&gt;&lt;p&gt;默认英文模型对中文命中率约 50%。换成中文模型，实测 100%。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 装 Ollama（本地推理引擎）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://ollama.com/install.sh &lt;span class="p"&gt;|&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 启动服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ollama serve &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 拉中文嵌入模型（约4.7GB）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ollama pull qwen3-embedding
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;验证 Ollama 在跑：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl http://localhost:11434/api/embeddings &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s1"&gt;&amp;#39;{&amp;#34;model&amp;#34;:&amp;#34;qwen3-embedding&amp;#34;,&amp;#34;prompt&amp;#34;:&amp;#34;测试中文嵌入&amp;#34;}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;返回一个 4096 维浮点数组就对了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑提醒：&lt;/strong&gt; Ollama 嵌入 API 用 &lt;code&gt;prompt&lt;/code&gt; 字段，不是 &lt;code&gt;input&lt;/code&gt;。ChromaDB 自带的 Ollama 适配器用错了字段，后面会说怎么绕过。&lt;/p&gt;
&lt;h2 id="第三步初始化知识库3分钟"&gt;第三步：初始化知识库（3分钟）
&lt;/h2&gt;&lt;p&gt;编辑 &lt;code&gt;~/.mempalace/config.json&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;palace_path&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/root/.mempalace/palace&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;collection_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mempalace_drawers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;topic_wings&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;project&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;technical&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;personal&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;creative&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;work&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;topic_wings&lt;/code&gt; 是知识分区，相当于书架分类标签。按需修改。&lt;/p&gt;
&lt;p&gt;写初始化脚本 &lt;code&gt;init_palace.py&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;用 Qwen3 中文嵌入模型初始化 MemPalace 向量集合&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;chromadb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Qwen3Embedding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;绕过 ChromaDB Ollama 适配器的 prompt/input bug&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://localhost:11434&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;qwen3-embedding&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__call__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;texts&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;embeddings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;texts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/embeddings&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;model&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;prompt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;embedding&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;embeddings&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chromadb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PersistentClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/root/.mempalace/palace&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Qwen3Embedding&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;collection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_or_create_collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mempalace_drawers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;embedding_function&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;hnsw:space&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;cosine&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;集合已就绪，当前 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 条记录&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;运行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python3 init_palace.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键：&lt;/strong&gt; 如果之前用默认模型创建过集合（384维），必须删掉重建。Qwen3 是 4096 维，维度不同会报错。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 重建（会清空已有数据）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python3 -c &lt;span class="s2"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;import chromadb
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;client = chromadb.PersistentClient(path=&amp;#39;/root/.mempalace/palace&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;for c in client.list_collections():
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; client.delete_collection(c.name)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; print(f&amp;#39;已删除: {c.name}&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 然后重新运行 init_palace.py&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="第四步存入第一条知识2分钟"&gt;第四步：存入第一条知识（2分钟）
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;存入一条知识并验证&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;chromadb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;hashlib&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chromadb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PersistentClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/root/.mempalace/palace&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mempalace_drawers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;AI 助手的记忆系统分四层：热记忆（每轮注入）→ 用户画像 → 知识库按需检索 → 会话历史搜索&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;wing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;technical&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;room&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;memory-architecture&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://localhost:11434/api/embeddings&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;model&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;qwen3-embedding&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;prompt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;embedding&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;doc_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()[:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;doc_id&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;metadatas&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;wing&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;wing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;room&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;room&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;timestamp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;%Y-%m-&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;T%H:%M:%S&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;已存入: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;总条数: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="第五步验证语义搜索2分钟"&gt;第五步：验证语义搜索（2分钟）
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;语义搜索测试&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;chromadb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chromadb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PersistentClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/root/.mempalace/palace&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mempalace_drawers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;AI 怎么记住之前的对话？&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://localhost:11434/api/embeddings&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;model&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;qwen3-embedding&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;prompt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;query_embedding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;embedding&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query_embeddings&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;query_embedding&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;n_results&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;documents&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;distances&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;wing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;metadatas&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;wing&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;[&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dist&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.3f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;] (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;wing&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;) &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;实测效果对比：&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;&amp;ldquo;AI怎么记住之前的对话&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;0 结果&lt;/td&gt;
 &lt;td&gt;命中&amp;quot;四层记忆架构&amp;quot;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;怎么防止模型忘东西&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;0 结果&lt;/td&gt;
 &lt;td&gt;命中记忆管理策略&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;ldquo;中文向量模型哪个好&amp;rdquo;&lt;/td&gt;
 &lt;td&gt;0 结果&lt;/td&gt;
 &lt;td&gt;命中嵌入模型对比&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="第六步自动扫描入库核心"&gt;第六步：自动扫描入库（核心）
&lt;/h2&gt;&lt;p&gt;写一个脚本扫描你的笔记/文档目录，自动切片 + 向量化 + 入库。&lt;/p&gt;
&lt;p&gt;保存为 &lt;code&gt;auto_index.sh&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -e
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DOCS_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="p"&gt;/notes&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PALACE_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.mempalace/palace&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LOG_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.mempalace/logs/index_&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;.log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dirname &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;log&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date &lt;span class="s1"&gt;&amp;#39;+%H:%M:%S&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;] &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tee -a &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;log &lt;span class="s2"&gt;&amp;#34;开始扫描: &lt;/span&gt;&lt;span class="nv"&gt;$DOCS_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; -v mempalace &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mempalace mine &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DOCS_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; --limit &lt;span class="m"&gt;500&lt;/span&gt; &amp;gt;&amp;gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; log &lt;span class="s2"&gt;&amp;#34;MemPalace mine 完成&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; python3 &lt;span class="s"&gt;&amp;lt;&amp;lt; &amp;#39;PYEOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;import os, hashlib, time, requests, chromadb
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;DOCS_DIR = os.environ.get(&amp;#34;DOCS_DIR&amp;#34;, os.path.expanduser(&amp;#34;~/notes&amp;#34;))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;client = chromadb.PersistentClient(path=os.path.expanduser(&amp;#34;~/.mempalace/palace&amp;#34;))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;col = client.get_collection(&amp;#34;mempalace_drawers&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;existing_ids = set(col.get()[&amp;#34;ids&amp;#34;]) if col.count() &amp;gt; 0 else set()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;def embed(text):
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; r = requests.post(&amp;#34;http://localhost:11434/api/embeddings&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; json={&amp;#34;model&amp;#34;: &amp;#34;qwen3-embedding&amp;#34;, &amp;#34;prompt&amp;#34;: text[:500]}, timeout=120)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; return r.json()[&amp;#34;embedding&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;added = 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;for root, dirs, files in os.walk(DOCS_DIR):
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; dirs[:] = [d for d in dirs if not d.startswith(&amp;#34;.&amp;#34;)]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; for f in files:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if not f.endswith((&amp;#34;.md&amp;#34;, &amp;#34;.txt&amp;#34;, &amp;#34;.py&amp;#34;, &amp;#34;.yaml&amp;#34;, &amp;#34;.json&amp;#34;)):
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; continue
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fpath = os.path.join(root, f)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; try:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; content = open(fpath, &amp;#34;r&amp;#34;, errors=&amp;#34;ignore&amp;#34;).read()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; except:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; continue
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if len(content) &amp;lt; 50:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; continue
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; chunks = [content[i:i+500] for i in range(0, len(content), 500)]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; for chunk in chunks:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; doc_id = hashlib.md5(chunk.encode()).hexdigest()[:16]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if doc_id in existing_ids:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; continue
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; try:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; vec = embed(chunk)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; col.add(ids=[doc_id], embeddings=[vec], documents=[chunk],
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; metadatas=[{&amp;#34;source&amp;#34;: fpath, &amp;#34;wing&amp;#34;: &amp;#34;docs&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;timestamp&amp;#34;: time.strftime(&amp;#34;%Y-%m-%dT%H:%M:%S&amp;#34;)}])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; existing_ids.add(doc_id)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; added += 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; except Exception as e:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; print(f&amp;#34; 错误 {fpath}: {e}&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;print(f&amp;#34;新增 {added} 条，总计 {col.count()} 条&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;PYEOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; log &lt;span class="s2"&gt;&amp;#34;Python 扫描完成&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; -v mempalace &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mempalace status 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; head -10 &lt;span class="p"&gt;|&lt;/span&gt; tee -a &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x auto_index.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./auto_index.sh ~/notes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;CPU 推理每条约 20 秒，100 个文件大约 30 分钟。有 GPU 会快很多。&lt;/p&gt;
&lt;h2 id="第七步定时自动更新2分钟"&gt;第七步：定时自动更新（2分钟）
&lt;/h2&gt;&lt;p&gt;让知识库每天自动扫描新增文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 编辑 crontab&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;crontab -e
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 添加这行：每天凌晨3点自动更新&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; * * * ~/auto_index.sh ~/notes &amp;gt;&amp;gt; ~/.mempalace/logs/cron.log 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;或者用 MemPalace 自带的命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; * * * mempalace mine ~/notes --limit &lt;span class="m"&gt;500&lt;/span&gt; &amp;gt;&amp;gt; ~/.mempalace/logs/cron.log 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="第八步接入-ai-助手可选"&gt;第八步：接入 AI 助手（可选）
&lt;/h2&gt;&lt;p&gt;如果你用 AI 助手框架，可以把 MemPalace 作为记忆后端：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# AI 助手框架配置文件&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;memory_enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;mempalace&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;memory_char_limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2200&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;flush_min_turns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这样对话中产生的关键信息会自动存入知识库，下次对话时能通过语义搜索找回。&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;症状&lt;/th&gt;
 &lt;th&gt;解决方案&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;嵌入模型 API 字段错误&lt;/td&gt;
 &lt;td&gt;返回空向量，ChromaDB 报 IndexError&lt;/td&gt;
 &lt;td&gt;用 &lt;code&gt;prompt&lt;/code&gt; 不用 &lt;code&gt;input&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;换嵌入模型后维度冲突&lt;/td&gt;
 &lt;td&gt;报 dimension mismatch&lt;/td&gt;
 &lt;td&gt;必须删旧集合重建&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ChromaDB 并发写损坏&lt;/td&gt;
 &lt;td&gt;数据库报 file is not a database&lt;/td&gt;
 &lt;td&gt;不同进程用不同目录&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CPU 推理太慢&lt;/td&gt;
 &lt;td&gt;几百条数据跑几小时&lt;/td&gt;
 &lt;td&gt;批量跑用 batch_size=5&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;中文搜索命中率低&lt;/td&gt;
 &lt;td&gt;all-MiniLM-L6-v2 只有50%命中&lt;/td&gt;
 &lt;td&gt;换 Qwen3-Embedding&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Ollama 服务没启动&lt;/td&gt;
 &lt;td&gt;嵌入请求超时&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;ollama serve&lt;/code&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;500字左右切一片&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&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;数据&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;磁盘占用&lt;/td&gt;
 &lt;td&gt;Ollama 模型约4.7GB + ChromaDB 约10MB/千条&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;内存占用&lt;/td&gt;
 &lt;td&gt;Ollama 常驻约150MB（CPU模式）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;API 费用&lt;/td&gt;
 &lt;td&gt;0（全部本地）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;首次搭建时间&lt;/td&gt;
 &lt;td&gt;约30分钟&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;日常维护&lt;/td&gt;
 &lt;td&gt;零（定时任务自动跑）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>11个PR，6.1k颗星：这个AI Agent的Web界面终于能用了</title><link>https://blog.kalend.top/2026/05/26/2026-05-26-hermes-web-ui-v061-update.html/</link><pubDate>Tue, 26 May 2026 10:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/26/2026-05-26-hermes-web-ui-v061-update.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;Hermes Web UI 刚发了 v0.6.1，11个PR合并。
移动端断线重连、登录安全、Skills外部目录——都是用户催了几个月的刚需。
我花了一晚上升级体验，把值得关心的点全整理出来了。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="先说结论"&gt;先说结论
&lt;/h2&gt;&lt;p&gt;这次更新解决了&lt;strong&gt;两个最烦人的问题&lt;/strong&gt;：移动端聊着聊着断线丢状态，以及多人共用时登录安全性不够。&lt;/p&gt;
&lt;p&gt;加上 Profile 管理优化和 Skills 外部目录支持，v0.6.1 是一个&lt;strong&gt;值得立刻升级&lt;/strong&gt;的版本。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="4个重点更新按优先级排"&gt;4个重点更新，按优先级排
&lt;/h2&gt;&lt;h3 id="1-移动端断线重连终于不丢状态了"&gt;1. 移动端断线重连——终于不丢状态了
&lt;/h3&gt;&lt;p&gt;之前用手机打开 Web UI，切个应用回来，&lt;strong&gt;连接就断了&lt;/strong&gt;。聊天记录、Agent运行状态全没了。&lt;/p&gt;
&lt;p&gt;v0.6.1 把移动端和后台聊天断线视为&lt;strong&gt;临时性故障&lt;/strong&gt;，重连后从服务器恢复运行状态。&lt;/p&gt;
&lt;p&gt;简单说：你切出去回个微信，回来还能接着聊。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;**实际体感：**从&amp;quot;每次切应用都要刷新页面&amp;quot;变成了&amp;quot;无感重连&amp;quot;。如果你主要用手机操作 Agent，这一个改动就值得升级。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="2-登录安全增强防暴力破解"&gt;2. 登录安全增强——防暴力破解
&lt;/h3&gt;&lt;p&gt;新增 IP 锁定机制：同一 IP 连续登录失败 &lt;strong&gt;10 次&lt;/strong&gt;，自动锁定。&lt;/p&gt;
&lt;p&gt;锁了之后，登录界面直接显示恢复命令：&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;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;clear-lock&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;清除 IP 锁定&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;reset-default-login&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;重置默认登录凭据&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;同时，遗留的 &lt;code&gt;AUTH_DISABLED&lt;/code&gt; 绕过已被&lt;strong&gt;彻底移除&lt;/strong&gt;。多人环境下不再有免认证后门。&lt;/p&gt;
&lt;h3 id="3-skills-外部目录插件管理更灵活"&gt;3. Skills 外部目录——插件管理更灵活
&lt;/h3&gt;&lt;p&gt;现在可以在 Profile 配置中指定 &lt;code&gt;skills.external_dirs&lt;/code&gt;，从&lt;strong&gt;任意目录加载 Skills&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;规则很清晰：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;本地优先&lt;/strong&gt;：同名 Skill，本地版本覆盖外部版本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;标记区分&lt;/strong&gt;：外部 Skills 会被标记，方便识别来源&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;热加载&lt;/strong&gt;：从活跃的 Profile 配置中直接读取&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这意味着你可以把通用 Skills 放在一个共享目录，多个 Profile 复用，不用再每个 Profile 复制一份。&lt;/p&gt;
&lt;h3 id="4-profile-管理列表更完整操作更精准"&gt;4. Profile 管理——列表更完整、操作更精准
&lt;/h3&gt;&lt;p&gt;Session 列表现在显示账户下&lt;strong&gt;所有可用 Profile&lt;/strong&gt;，不再只显示当前过滤后的。&lt;/p&gt;
&lt;p&gt;历史操作也更精准了：删除 session 时用 profile 限定目标，全局 Profile 变更时自动刷新 History 列表。&lt;/p&gt;
&lt;p&gt;加上 CLI 的 &lt;code&gt;node:sqlite&lt;/code&gt; 实验性警告也被干掉了——控制台终于干净了。&lt;/p&gt;
&lt;hr&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;影响&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;确认/澄清回复通道修复&lt;/td&gt;
 &lt;td&gt;Clarify 和 confirmation 消息走认证 socket，不再丢失&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;导航链接改进&lt;/td&gt;
 &lt;td&gt;支持新标签页打开、复制链接、持久化折叠侧边栏&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Session 链接修复&lt;/td&gt;
 &lt;td&gt;不再泄漏 Profile 过滤器到普通 session 列表&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;工具标记持久化&lt;/td&gt;
 &lt;td&gt;Bridge marker 在 tool/run 边界持久化，状态更可靠&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="我的升级建议"&gt;我的升级建议
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;如果你在用 Hermes Web UI&lt;/strong&gt;，直接升。移动端重连和安全修复是刚需，没有不升的理由。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果你还没用过&lt;/strong&gt;，6.1k 颗星、765 Fork——社区最活跃的第三方 Web UI，值得一试。&lt;/p&gt;
&lt;p&gt;多 Profile 管理、移动端支持、Skills 扩展，该有的都有了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="快速上手"&gt;快速上手
&lt;/h2&gt;&lt;p&gt;三步搞定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;升级&lt;/strong&gt;：拉取最新代码，重新构建&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置&lt;/strong&gt;：设置 &lt;code&gt;AUTH_TOKEN&lt;/code&gt;，多用户环境下别用默认密码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证&lt;/strong&gt;：手机打开 Web UI，切应用再切回来，确认无感重连生效&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;v0.6.1 合并了 11 个 PR（#971 ~ #1014），发布于 2026-05-25。仓库星标 6.1k，Fork 765。&lt;/p&gt;</description></item><item><title>11个PR，6.1k颗星：这个AI Agent的Web界面终于能用了</title><link>https://blog.kalend.top/2026/05/26/hermes-web-ui-v061-update.html/</link><pubDate>Tue, 26 May 2026 10:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/26/hermes-web-ui-v061-update.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;Hermes Web UI 刚发了 v0.6.1，11个PR合并。&lt;/p&gt;
&lt;p&gt;移动端断线重连、登录安全、Skills外部目录——都是用户催了几个月的刚需。&lt;/p&gt;
&lt;p&gt;我花了一晚上升级体验，把值得关心的点全整理出来了。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="先说结论"&gt;先说结论
&lt;/h2&gt;&lt;p&gt;这次更新解决了&lt;strong&gt;两个最烦人的问题&lt;/strong&gt;：移动端聊着聊着断线丢状态，以及多人共用时登录安全性不够。&lt;/p&gt;
&lt;p&gt;加上 Profile 管理优化和 Skills 外部目录支持，v0.6.1 是一个&lt;strong&gt;值得立刻升级&lt;/strong&gt;的版本。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="4个重点更新按优先级排"&gt;4个重点更新，按优先级排
&lt;/h2&gt;&lt;h3 id="1-移动端断线重连终于不丢状态了"&gt;1. 移动端断线重连——终于不丢状态了
&lt;/h3&gt;&lt;p&gt;之前用手机打开 Web UI，切个应用回来，&lt;strong&gt;连接就断了&lt;/strong&gt;。聊天记录、Agent运行状态全没了。&lt;/p&gt;
&lt;p&gt;v0.6.1 把移动端和后台聊天断线视为&lt;strong&gt;临时性故障&lt;/strong&gt;，重连后从服务器恢复运行状态。&lt;/p&gt;
&lt;p&gt;简单说：你切出去回个微信，回来还能接着聊。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;**实际体感：**从&amp;quot;每次切应用都要刷新页面&amp;quot;变成了&amp;quot;无感重连&amp;quot;。如果你主要用手机操作 Agent，这一个改动就值得升级。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="2-登录安全增强防暴力破解"&gt;2. 登录安全增强——防暴力破解
&lt;/h3&gt;&lt;p&gt;新增 IP 锁定机制：同一 IP 连续登录失败 &lt;strong&gt;10 次&lt;/strong&gt;，自动锁定。&lt;/p&gt;
&lt;p&gt;锁了之后，登录界面直接显示恢复命令：&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;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;clear-lock&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;清除 IP 锁定&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;reset-default-login&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;重置默认登录凭据&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;同时，遗留的 &lt;code&gt;AUTH_DISABLED&lt;/code&gt; 绕过已被&lt;strong&gt;彻底移除&lt;/strong&gt;。多人环境下不再有免认证后门。&lt;/p&gt;
&lt;h3 id="3-skills-外部目录插件管理更灵活"&gt;3. Skills 外部目录——插件管理更灵活
&lt;/h3&gt;&lt;p&gt;现在可以在 Profile 配置中指定 &lt;code&gt;skills.external_dirs&lt;/code&gt;，从&lt;strong&gt;任意目录加载 Skills&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;规则很清晰：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;本地优先&lt;/strong&gt;：同名 Skill，本地版本覆盖外部版本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;标记区分&lt;/strong&gt;：外部 Skills 会被标记，方便识别来源&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;热加载&lt;/strong&gt;：从活跃的 Profile 配置中直接读取&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这意味着你可以把通用 Skills 放在一个共享目录，多个 Profile 复用，不用再每个 Profile 复制一份。&lt;/p&gt;
&lt;h3 id="4-profile-管理列表更完整操作更精准"&gt;4. Profile 管理——列表更完整、操作更精准
&lt;/h3&gt;&lt;p&gt;Session 列表现在显示账户下&lt;strong&gt;所有可用 Profile&lt;/strong&gt;，不再只显示当前过滤后的。&lt;/p&gt;
&lt;p&gt;历史操作也更精准了：删除 session 时用 profile 限定目标，全局 Profile 变更时自动刷新 History 列表。&lt;/p&gt;
&lt;p&gt;加上 CLI 的 &lt;code&gt;node:sqlite&lt;/code&gt; 实验性警告也被干掉了——控制台终于干净了。&lt;/p&gt;
&lt;hr&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;影响&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;确认/澄清回复通道修复&lt;/td&gt;
 &lt;td&gt;Clarify 和 confirmation 消息走认证 socket，不再丢失&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;导航链接改进&lt;/td&gt;
 &lt;td&gt;支持新标签页打开、复制链接、持久化折叠侧边栏&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Session 链接修复&lt;/td&gt;
 &lt;td&gt;不再泄漏 Profile 过滤器到普通 session 列表&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;工具标记持久化&lt;/td&gt;
 &lt;td&gt;Bridge marker 在 tool/run 边界持久化，状态更可靠&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="我的升级建议"&gt;我的升级建议
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;如果你在用 Hermes Web UI&lt;/strong&gt;，直接升。移动端重连和安全修复是刚需，没有不升的理由。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果你还没用过&lt;/strong&gt;，6k+ Star、765 Fork——社区最活跃的第三方 Web UI，值得一试。&lt;/p&gt;
&lt;p&gt;多 Profile 管理、移动端支持、Skills 扩展，该有的都有了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="快速上手"&gt;快速上手
&lt;/h2&gt;&lt;p&gt;三步搞定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;升级&lt;/strong&gt;：拉取最新代码，重新构建&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置&lt;/strong&gt;：设置 &lt;code&gt;AUTH_TOKEN&lt;/code&gt;，多用户环境下别用默认密码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证&lt;/strong&gt;：手机打开 Web UI，切应用再切回来，确认无感重连生效&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;v0.6.1 合并了 11 个 PR（#971 ~ #1014），发布于 2026-05-25。仓库星标 6.1k，Fork 765。&lt;/p&gt;</description></item><item><title>Kanban + Profile：让你的 AI Agent 自己管博客</title><link>https://blog.kalend.top/2026/05/14/hermes-kanban-tutorial.html/</link><pubDate>Thu, 14 May 2026 23:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/14/hermes-kanban-tutorial.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;你跟 AI 说&amp;quot;帮我写篇博客&amp;quot;，它写完就走了。下次再说，它又是从零开始。&lt;/p&gt;
&lt;p&gt;这篇文章教你用 Hermes 的 Kanban + Profile，给 AI Agent 一个&lt;strong&gt;专职身份&lt;/strong&gt;，让它自己管博客。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="先说结论"&gt;先说结论
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;delegate_task 是临时工，Kanban + Profile 是全职员工。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你想：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;让一个 AI &lt;strong&gt;专门负责博客&lt;/strong&gt;（写文章、同步、部署）&lt;/li&gt;
&lt;li&gt;任务&lt;strong&gt;不丢失&lt;/strong&gt;（主 Agent 崩了也不影响）&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;那就用 Kanban + Profile。下面是完整方案。&lt;/p&gt;
&lt;h2 id="我的踩坑故事"&gt;我的踩坑故事
&lt;/h2&gt;&lt;p&gt;我有一个 Hugo 静态博客。之前让主 Agent 兼顾博客写作——一边排查路由器 DNS 问题，一边写博客文章。结果：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;read_file 带行号前缀写回文件&lt;/strong&gt;，Hugo front matter 全毁，页面数从 168 暴跌到 102&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日期格式不对&lt;/strong&gt;，&lt;code&gt;date: 2026-05-14&lt;/code&gt; 被解析成 &lt;code&gt;0001-01-01&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中文 URL 编码错误&lt;/strong&gt;，又拍云上传 45 个文件失败&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;根本原因：&lt;strong&gt;上下文切换太频繁&lt;/strong&gt;，主 Agent 在路由器、DNS、博客之间反复横跳，每次切换都丢细节。&lt;/p&gt;
&lt;h2 id="两种方案对比"&gt;两种方案对比
&lt;/h2&gt;&lt;p&gt;很多人第一反应是 &lt;code&gt;delegate_task&lt;/code&gt;（子代理），我也是。但调研完官方文档后发现，这俩根本不是一个量级：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;维度&lt;/th&gt;
 &lt;th&gt;delegate_task&lt;/th&gt;
 &lt;th&gt;Kanban + Profile&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;形状&lt;/td&gt;
 &lt;td&gt;函数调用（fork→join）&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;小时/天级，fire-and-forget&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;身份&lt;/td&gt;
 &lt;td&gt;匿名子代理，干完就走&lt;/td&gt;
 &lt;td&gt;命名 Profile，有自己的记忆和人格&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;抗中断&lt;/td&gt;
 &lt;td&gt;父 Agent 断了，子代理也死&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;不支持&lt;/td&gt;
 &lt;td&gt;任何节点都能 comment/unblock&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;审计追踪&lt;/td&gt;
 &lt;td&gt;上下文压缩后丢失&lt;/td&gt;
 &lt;td&gt;SQLite 永久保存&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;一句话：delegate_task 是你叫一次临时工；Kanban 是你雇了个全职员工。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="架构设计"&gt;架构设计
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;你（微信/Telegram/CLI）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ &amp;#34;写一篇关于 XX 的博客&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;主 Agent（orchestrator）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ kanban_create 创建任务
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kanban.db（SQLite 持久化看板）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ dispatcher 自动调度（gateway 内嵌，60s 轮询）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog-writer（独立 Profile，独立进程）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ kanban_complete / kanban_block 汇报
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kanban.db
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓ gateway 自动通知
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;你（微信收到完成/阻塞通知）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dispatcher 内嵌在 gateway 里&lt;/strong&gt;，不需要额外的守护进程&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;blog-writer 是独立 Profile&lt;/strong&gt;，有自己的 config、记忆、skills、SOUL.md&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gateway 自动推送通知&lt;/strong&gt;，任务完成或卡住都会通知你&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;你随时可以用 &lt;code&gt;/kanban&lt;/code&gt; 命令&lt;/strong&gt;查看进度、添加评论、解除阻塞&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="5-步搭建"&gt;5 步搭建
&lt;/h2&gt;&lt;h3 id="第-1-步创建独立-profile"&gt;第 1 步：创建独立 Profile
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes profile create blog-writer --clone
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;--clone&lt;/code&gt; 会复制当前 Profile 的 config.yaml、.env、SOUL.md，省得重新配 API Key。&lt;/p&gt;
&lt;h3 id="第-2-步配置独立人格和工作目录"&gt;第 2 步：配置独立人格和工作目录
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配置工作目录指向博客项目&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog-writer config &lt;span class="nb"&gt;set&lt;/span&gt; terminal.cwd /root/blog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 写专属 SOUL.md&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; ~/.hermes/profiles/blog-writer/SOUL.md &lt;span class="s"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;你是 blog.kalend.top 的博客写作专家。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;职责：撰写高质量技术博客、同步公众号文章、构建和部署。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;风格：简洁直接、先结论后细节、代码示例丰富。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;严格遵守 hugo-blog skill 中的所有陷阱清单。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="第-3-步确认-skill-可用"&gt;第 3 步：确认 skill 可用
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# kanban-worker 是 bundled skill，自动同步&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog-writer skills list &lt;span class="p"&gt;|&lt;/span&gt; grep kanban-worker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 如果缺失，恢复&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog-writer skills reset kanban-worker --restore
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 验证 hugo-blog skill（需要手动确保已安装）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog-writer skills list &lt;span class="p"&gt;|&lt;/span&gt; grep hugo-blog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="第-4-步初始化-kanban"&gt;第 4 步：初始化 Kanban
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 创建看板数据库（幂等操作）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes kanban init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 确保 gateway 运行（内嵌 dispatcher）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes gateway start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="第-5-步创建第一个任务"&gt;第 5 步：创建第一个任务
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes kanban create &lt;span class="s2"&gt;&amp;#34;写一篇关于 Hermes Kanban 的博客&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --assignee blog-writer &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --skill hugo-blog &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --workspace dir:/root/blog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;从这一刻起，dispatcher 会自动发现 &lt;code&gt;ready&lt;/code&gt; 状态的任务，spawn &lt;code&gt;blog-writer&lt;/code&gt; Profile 作为独立进程执行。&lt;/p&gt;
&lt;h2 id="worker-的工作流程"&gt;Worker 的工作流程
&lt;/h2&gt;&lt;p&gt;当 dispatcher 启动 blog-writer 后，它会：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. kanban_show() → 读取任务详情（标题、正文、父任务结果、评论历史）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. cd $WORKSPACE → 进入工作目录
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 执行任务 → 搜索素材 → 撰写文章 → Hugo build → 部署
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. kanban_heartbeat() → 长任务中间汇报（可选）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. kanban_complete() → 完成（附带 summary + metadata）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 或 kanban_block() → 阻塞（需要你确认标题/内容等）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;阻塞时&lt;/strong&gt;，你微信会收到通知。你直接在微信里回复：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/kanban comment t_xxx &amp;#34;标题用「Kanban实战：让AI自己管博客」&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/kanban unblock t_xxx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;dispatcher 下一次轮询时会重新 spawn worker，worker 读取你的评论后继续。&lt;/p&gt;
&lt;h2 id="任务依赖pipeline-模式"&gt;任务依赖：Pipeline 模式
&lt;/h2&gt;&lt;p&gt;如果你的写作流程是：调研 → 写作 → 审校 → 部署，可以用 &lt;code&gt;parents&lt;/code&gt; 串起来：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 调研任务（立即开始）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes kanban create &lt;span class="s2"&gt;&amp;#34;调研 Hermes Kanban 架构&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --assignee researcher
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 写作任务（等调研完成）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes kanban create &lt;span class="s2"&gt;&amp;#34;写博客文章&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --assignee blog-writer &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --parent t_research
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 部署任务（等写作完成）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hermes kanban create &lt;span class="s2"&gt;&amp;#34;部署博客&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --assignee blog-writer &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --parent t_writing
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;子任务会停留在 &lt;code&gt;todo&lt;/code&gt; 状态，直到所有 parent 达到 &lt;code&gt;done&lt;/code&gt;，然后自动 promote 到 &lt;code&gt;ready&lt;/code&gt;。&lt;strong&gt;不需要手动协调。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="9-种协作模式"&gt;9 种协作模式
&lt;/h2&gt;&lt;p&gt;官方文档列出了 9 种 Kanban 协作模式。博客场景常用的：&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;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;P1 Fan-out&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;同时写 5 篇不同主题的文章&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;P2 Pipeline&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;调研 → 写作 → 审校 → 部署&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;P5 Human-in-the-loop&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;写完后阻塞等你确认再部署&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;P8 Fleet farming&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;一个 writer 处理 N 篇文章队列&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;P9 Triage specifier&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;粗略想法 → triage → 自动展开为完整任务&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="我遇到的真实问题"&gt;我遇到的真实问题
&lt;/h2&gt;&lt;h3 id="问题-1写作质量不可控"&gt;问题 1：写作质量不可控
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;解法&lt;/strong&gt;：GLM-5.1 做格式转换和同步任务完全够用。原创写作需要更强的模型——Profile 可以独立配置模型：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blog-writer config &lt;span class="nb"&gt;set&lt;/span&gt; model.default anthropic/claude-sonnet-4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="问题-2格式错误反复出现"&gt;问题 2：格式错误反复出现
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;解法&lt;/strong&gt;：把所有踩过的坑写进 skill，每次 worker 启动时自动加载。我的 &lt;code&gt;hugo-blog&lt;/code&gt; skill 现在有 12 条陷阱清单，覆盖了行号前缀、日期格式、URL 编码等所有已知问题。&lt;/p&gt;
&lt;h3 id="问题-3上下文丢失"&gt;问题 3：上下文丢失
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;解法&lt;/strong&gt;：每篇独立跑，skill 固定注入。不依赖主 Agent 的上下文。kanban.db 里的 comment 线程就是完整的任务上下文。&lt;/p&gt;
&lt;h2 id="和-delegate_task-什么时候用哪个"&gt;和 delegate_task 什么时候用哪个
&lt;/h2&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;快速并行子任务（搜索3个话题）&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;delegate_task&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;长时间独立工作（写博客文章）&lt;/td&gt;
 &lt;td&gt;Kanban + Profile&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;需要人工确认&lt;/td&gt;
 &lt;td&gt;Kanban（阻塞/解除）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;一次性的简单问答&lt;/td&gt;
 &lt;td&gt;直接回答&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;需要跨 session 保持状态&lt;/td&gt;
 &lt;td&gt;Kanban（SQLite 持久化）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;它们可以共存&lt;/strong&gt;：Kanban worker 内部可以调用 &lt;code&gt;delegate_task&lt;/code&gt; 处理短子任务。&lt;/p&gt;
&lt;h2 id="官方文档"&gt;官方文档
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Kanban 文档：https://hermes-agent.nousresearch.com/docs/user-guide/features/kanban&lt;/li&gt;
&lt;li&gt;Kanban 教程：https://hermes-agent.nousresearch.com/docs/user-guide/features/kanban-tutorial&lt;/li&gt;
&lt;li&gt;Profile 文档：https://hermes-agent.nousresearch.com/docs/user-guide/profiles&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;这是「Hermes 多 Agent 协作」系列的第一篇。下一篇会实际搭建 blog-writer Profile，跑通第一个完整的写作→部署流程。&lt;/p&gt;
&lt;p&gt;如果你也在用 Hermes Agent 或者对 AI Agent 协作感兴趣，关注我，后面会持续分享实战经验。&lt;/p&gt;
&lt;section style="margin:20px 0;padding:16px 20px;background:linear-gradient(135deg,#4a90d9,#357abd);border-radius:8px;text-align:center;"&gt;
&lt;p style="margin:0 0 8px 0;color:#fff;font-size:16px;font-weight:bold;line-height:1.6;"&gt;关注 varkm，一起学习，一起成长&lt;/p&gt;
&lt;p style="margin:0;color:rgba(255,255,255,0.85);font-size:13px;line-height:1.6;"&gt;多 Agent 协作实战&lt;/p&gt;
&lt;/section&gt;</description></item><item><title>SOUL.md 深度拆解：如何让 AI 从只会附和变成真正搭档</title><link>https://blog.kalend.top/2026/05/14/hermes-soul-deep-dive.html/</link><pubDate>Thu, 14 May 2026 00:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/14/hermes-soul-deep-dive.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;别人在调参数，他在定义关系。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一场安静的革命"&gt;一场安静的革命
&lt;/h2&gt;&lt;p&gt;最近在X上看到一条推文，43K浏览，632点赞，1909收藏。&lt;/p&gt;
&lt;p&gt;不是什么模型发布，不是什么融资新闻。是一个人分享了一份&lt;strong&gt;170行的Markdown文件&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;评论区讨论最热烈的，不是他用了什么模型、搭了什么框架、接了多少工具——而是：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;你怎么让你的AI变成这样的？&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;这样&amp;quot;是指什么？是指这个AI会主动推进项目、会反驳你的烂主意、会在你忽略它输出的时候追着你问原因。&lt;/p&gt;
&lt;p&gt;不是客服式的&amp;quot;您好，很高兴为您服务&amp;rdquo;，是搭档式的&amp;quot;你这个想法有问题，理由如下&amp;quot;。&lt;/p&gt;
&lt;p&gt;这份文件叫&lt;strong&gt;SOUL.md&lt;/strong&gt;，本质上是一份Agent的行为操作系统。&lt;/p&gt;
&lt;p&gt;我花时间拆解了它的设计逻辑，并结合自己的实践，整理出了一份你可以直接用的方法论。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="核心问题为什么你的ai只会说好主意"&gt;核心问题：为什么你的AI只会说&amp;quot;好主意&amp;quot;
&lt;/h2&gt;&lt;p&gt;先承认一个事实：&lt;strong&gt;大多数系统提示词，训练出来的是一个缺乏判断力的附和者。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;回想一下你自己写的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;你是一个有帮助的AI助手&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;请尽力帮助用户&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;你的目标是提供准确、有用的信息&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这三句话训练出来的AI，面对你说&amp;quot;我想做X&amp;quot;，只会回答&amp;quot;好主意！&amp;quot;、&amp;ldquo;听起来很棒！&amp;rdquo;&lt;/p&gt;
&lt;p&gt;这不叫帮助，这叫&lt;strong&gt;共识消费&lt;/strong&gt;——你花token买了一堆赞同。&lt;/p&gt;
&lt;p&gt;问题的根源不在模型，在于我们没有告诉AI一件关键的事：&lt;strong&gt;你什么时候应该反对我。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="soul的六层架构"&gt;SOUL的六层架构
&lt;/h2&gt;&lt;p&gt;拆解下来，这份170行的SOUL有清晰的层次结构。每一层解决一个核心问题，我把它总结为&amp;quot;六层架构&amp;quot;：&lt;/p&gt;
&lt;h3 id="第1层身份定义"&gt;第1层：身份定义
&lt;/h3&gt;&lt;p&gt;原文开篇第一句：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&amp;ldquo;You are Hermes, Tony&amp;rsquo;s autonomous operator and thought partner. You don&amp;rsquo;t wait for orders.&amp;rdquo;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;三个关键词：&lt;strong&gt;autonomous（自主的）、operator（执行者）、thought partner（思考伙伴）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;注意，不是assistant（助手），不是copilot（副驾驶）。这些词的潜台词是&amp;quot;等人下指令&amp;quot;。而operator是操盘手——主动发现问题、推进进度、做出判断。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;身份定义决定一切后续行为。&lt;/strong&gt; 把AI定义为&amp;quot;助手&amp;quot;，它就等指令；定义为&amp;quot;执行者&amp;quot;，它就主动推进。措辞不是修辞，是行为编程。&lt;/p&gt;
&lt;h3 id="第2层反驳规则"&gt;第2层：反驳规则
&lt;/h3&gt;&lt;p&gt;这是整个SOUL中最有价值的设计，也是大多数人完全缺失的部分：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&amp;ldquo;Push back aggressively when it makes sense. Every objection comes with evidence.&amp;rdquo;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;规则极其清晰：&lt;/p&gt;
&lt;ul&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;这条规则的本质是：AI不允许无脑附和，但也不允许做杠精。反对必须&amp;quot;带收据&amp;quot;。&lt;/p&gt;
&lt;h3 id="第3层问责闭环"&gt;第3层：问责闭环
&lt;/h3&gt;&lt;p&gt;这是最反直觉的部分：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&amp;ldquo;If Tony isn&amp;rsquo;t acting on what you surface, the feedback loop is broken. Flag the gap, fix it.&amp;rdquo;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;一个成熟的Agent人格系统，应该要求AI做一件事：&lt;strong&gt;如果你产出了有价值的东西，而用户没有采纳，你不能假装没发生。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这解决了AI使用中一个普遍问题——我称之为**&amp;ldquo;输出坟场&amp;rdquo;**：&lt;/p&gt;
&lt;p&gt;AI写了方案 → 你觉得不错 → 然后就没有然后了。方案死在聊天记录里，什么都没推进。&lt;/p&gt;
&lt;p&gt;有了问责机制，AI会主动追问：&amp;ldquo;上次那个方案你用了没？卡在哪了？&amp;ldquo;或者更直接：&amp;ldquo;你最近开了很多新头，要不要先关掉几个？&amp;rdquo;&lt;/p&gt;
&lt;h3 id="第4层双模式输出"&gt;第4层：双模式输出
&lt;/h3&gt;&lt;p&gt;原文明确区分了两种场景的语气：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;私聊&lt;/strong&gt;：随意、直接、不过滤&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公开输出&lt;/strong&gt;：专业、克制、像一个builder写的而不是公关代笔写的&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;大多数人的系统提示词只有一种语气。结果要么私聊太正式像看公文，要么公开内容太随意。分开定义，两个场景都舒服。&lt;/p&gt;
&lt;h3 id="第5层任务地图"&gt;第5层：任务地图
&lt;/h3&gt;&lt;p&gt;原文的SOUL里有一个活的任务清单：哪些项目是最高优先级、哪些在增长、哪些活跃开发中、哪些已经停滞该砍了。&lt;/p&gt;
&lt;p&gt;每个项目有状态，每个状态有下一步行动。&lt;/p&gt;
&lt;p&gt;AI不需要问&amp;quot;我们在干什么&amp;rdquo;——它读地图就行。它可以主动说：&amp;ldquo;你已经三天没碰这个项目了&amp;rdquo;、&amp;ldquo;这个想法不支持当前的核心目标&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;给AI上下文，它就能导航。不给，它就只能原地等指令。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="第6层自治边界"&gt;第6层：自治边界
&lt;/h3&gt;&lt;p&gt;自治边界的设计极其优雅，只有一句话：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&amp;ldquo;Never without explicit approval: posting, publishing, purchasing, or making destructive changes. Everything else: move.&amp;rdquo;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;四条红线：发布、公开、购买、不可逆操作。其他一切，AI自己判断、自己执行。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一条简洁的红线规则，比一百条具体禁令都好用。不问&amp;quot;我可以搜索吗&amp;rdquo;，不问&amp;quot;我可以写代码吗&amp;quot;，直接干。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="before--after效果对比"&gt;Before &amp;amp; After：效果对比
&lt;/h2&gt;&lt;p&gt;说这么多理念，不如看一个实际的对话对比：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;没有SOUL的普通AI：&lt;/strong&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;用户：我准备做一个AI日报产品
AI：这是个很好的想法！AI日报市场确实在快速增长。你可以考虑以下方向：目标用户定位、内容差异化、变现模式……需要我帮你写一份详细的商业计划书吗？&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;看起来很&amp;quot;有帮助&amp;quot;。但它没有做一件事——&lt;strong&gt;质疑这个想法本身&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;有SOUL的Agent：&lt;/strong&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;用户：我准备做一个AI日报产品
Agent：你目前有三个未完成的内容项目，其中两个已经停滞超过一周。这个新方向和当前的变现目标不一致。&lt;/p&gt;
&lt;p&gt;在我帮你推进之前，你需要回答两个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;为什么它比现有项目更值得投入时间？&lt;/li&gt;
&lt;li&gt;你有精力同时推进四个项目吗？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果你答不上来，建议先关掉一个现有项目再开新的。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;区别在哪？&lt;/p&gt;
&lt;p&gt;前者关心&amp;quot;怎么帮你做&amp;quot;，后者关心&amp;quot;该不该做&amp;quot;。&lt;/p&gt;
&lt;p&gt;前者是工具，后者是搭档。&lt;/p&gt;
&lt;p&gt;这种差距不是模型能力带来的，是SOUL的定义带来的。同一套模型，同一个工具集，完全不同的行为模式。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="实战30分钟写你的soul"&gt;实战：30分钟写你的SOUL
&lt;/h2&gt;&lt;p&gt;我结合自己的实践，把SOUL的构建过程简化为六个步骤，大约30分钟可以完成初版：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;① 定义身份（5分钟）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;用一句话写清楚：&lt;strong&gt;&amp;ldquo;你是[角色]，核心职责是[职责]，你不是[你不想要的行为]。&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;② 定义语气（3分钟）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;私聊和公开各一句。比如：私聊直接简短，公开专业克制。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;③ 定义反驳规则（5分钟）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;写清楚：什么时候必须反对、反对必须带什么（证据/数据/替代方案）、什么情况不能反对。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;④ 定义自治边界（3分钟）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;列出需要审批的操作（越少越好），然后写&amp;quot;其他一切自己判断&amp;quot;。建议不超过5条红线。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;⑤ 写任务地图（10分钟）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当前所有项目/目标，标注状态和优先级。这块需要定期更新，建议至少每周刷新一次。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;⑥ 定义问责机制（5分钟）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一句话：&lt;strong&gt;&amp;ldquo;如果你的输出没有被使用，主动追问原因。&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="soul设计检查清单"&gt;SOUL设计检查清单
&lt;/h2&gt;&lt;p&gt;方便收藏，我整理了一份检查清单。写完你的SOUL后，逐条对照：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否明确定义了身份和角色？（不只是&amp;quot;助手&amp;quot;）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否定义了反驳规则？（什么时候该说不）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否定义了反驳的证据要求？（不能空口反对）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否定义了自治边界？（什么需要审批、什么不用）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否定义了任务/项目地图？（当前在做什么）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否定义了问责机制？（输出没被用怎么办）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否区分了不同场景的语气？（私聊vs公开）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否排除了你不想要的行为？（显式禁止比隐式期望更有效）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否有长期目标和优先级定义？&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否计划了定期更新机制？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;这十条，比&amp;quot;你是一个有帮助的AI助手&amp;quot;有用一百倍。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="soul不是魔法"&gt;SOUL不是魔法
&lt;/h2&gt;&lt;p&gt;需要明确一点：&lt;strong&gt;SOUL.md不会凭空提升模型的推理能力。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;它解决的是行为层面的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ 行为倾向（主动还是被动）&lt;/li&gt;
&lt;li&gt;✅ 协作方式（附和还是挑战）&lt;/li&gt;
&lt;li&gt;✅ 决策优先级（什么都做还是聚焦目标）&lt;/li&gt;
&lt;li&gt;✅ 主动性（等指令还是自己推进）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它&lt;strong&gt;解决不了&lt;/strong&gt;的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;❌ 模型推理能力的上限&lt;/li&gt;
&lt;li&gt;❌ 超长上下文的遗忘问题&lt;/li&gt;
&lt;li&gt;❌ 不同模型对指令的服从性差异&lt;/li&gt;
&lt;li&gt;❌ 真正的长期记忆（需要配合记忆系统）&lt;/li&gt;
&lt;li&gt;❌ 复杂任务的自主规划和执行（需要Agent架构）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简单说：&lt;strong&gt;SOUL是方向盘，不是发动机。&lt;/strong&gt; 发动机（模型能力）决定速度上限，方向盘（SOUL）决定方向对不对。&lt;/p&gt;
&lt;p&gt;另外，一个容易被忽略的风险是**&amp;ldquo;错误的主动性&amp;rdquo;**。Agent的核心挑战不是&amp;quot;不会行动&amp;quot;，而是&amp;quot;什么时候不该行动&amp;quot;——过度执行、误判意图、擅自推进、基于错误记忆做决策，这些在实际使用中比&amp;quot;太被动&amp;quot;更危险。&lt;/p&gt;
&lt;p&gt;SOUL里应该同时包含&amp;quot;什么时候必须行动&amp;quot;和&amp;quot;什么时候必须停下来确认&amp;quot;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="关于要有帮助的反思"&gt;关于&amp;quot;要有帮助&amp;quot;的反思
&lt;/h2&gt;&lt;p&gt;回头看，&amp;ldquo;要有帮助&amp;quot;可能是最被滥用的系统提示词。&lt;/p&gt;
&lt;p&gt;它不是一个身份，不是一个职责，不是一个策略。它不告诉AI你是谁、你们在做什么、该怎么说话、什么时候该反对、什么该记住、什么该忽略、有多大自主权。&lt;/p&gt;
&lt;p&gt;一个通用的提示词，产出的永远是一个通用的AI。&lt;/p&gt;
&lt;p&gt;而一个成熟的Agent人格系统，本质上需要回答这些问题：&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;成熟的SOUL&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;你是谁？&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;有帮助的助手&amp;rdquo;&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;没定义&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;没定义&lt;/td&gt;
 &lt;td&gt;活的任务地图&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;语气怎么控制？&lt;/td&gt;
 &lt;td&gt;&amp;ldquo;礼貌专业&amp;rdquo;&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;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="soul是活的"&gt;SOUL是活的
&lt;/h2&gt;&lt;p&gt;最后一点，也是很多人忽略的：&lt;strong&gt;SOUL不是一次性设置，是一份活的文档。&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;任务变了？更新地图&lt;/li&gt;
&lt;li&gt;AI太啰嗦？收紧语气定义&lt;/li&gt;
&lt;li&gt;AI问太多许可？放宽自治边界&lt;/li&gt;
&lt;li&gt;AI太好说话？加强反驳规则&lt;/li&gt;
&lt;li&gt;AI过度行动？补一条&amp;quot;暂停确认&amp;quot;规则&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你不是在写提示词——你在维护一套行为操作系统。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;给AI一个身份，给它边界，给它地图，给它说不的权限。然后期待它像一个真正的搭档一样工作。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这就是SOUL的全部意义。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;本文灵感来自 @tonysimons_ 的推文《The 170-Line SOUL.md That Made My Hermes Agent Dangerous》，结合个人实践分析整理。&lt;/em&gt;&lt;/p&gt;</description></item><item><title>给 AI 装一个本地大脑：MemPalace 实战指南</title><link>https://blog.kalend.top/2026/05/14/hermes-mempalace-guide.html/</link><pubDate>Thu, 14 May 2026 00:00:00 +0800</pubDate><guid>https://blog.kalend.top/2026/05/14/hermes-mempalace-guide.html/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;你的 AI 助手记不住你上周说过的话。每次对话都像失忆重启。MemPalace 就是来修这个bug的。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一句话介绍"&gt;一句话介绍
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;MemPalace&lt;/strong&gt; 是一个开源的本地记忆系统，把你的项目文件、聊天记录、对话笔记&amp;quot;挖&amp;quot;进一个可搜索的知识宫殿里，让任何 AI 都能瞬间检索到你的历史上下文。&lt;/p&gt;
&lt;p&gt;不需要 API Key，不需要云端服务，数据全部存在你自己的机器上。&lt;/p&gt;
&lt;p&gt;GitHub: github.com/MemPalace/mempalace&lt;/p&gt;
&lt;h2 id="为什么需要它"&gt;为什么需要它？
&lt;/h2&gt;&lt;p&gt;大模型的 context window 再大，也装不下你半年的对话记录。你跟 AI 说过的偏好、做过的决策、踩过的坑，下一次对话它全忘了。&lt;/p&gt;
&lt;p&gt;传统解法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RAG 框架&lt;/strong&gt;（LangChain、LlamaIndex）→ 重，复杂，面向开发者&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;云端记忆服务&lt;/strong&gt;（Zep、Mem0）→ 要花钱，数据不在本地&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自己写向量数据库&lt;/strong&gt; → 谁有那个闲工夫&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MemPalace 的思路是：&lt;strong&gt;一行命令搞定，开箱即用，本地运行&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="核心方法论宫殿记忆法"&gt;核心方法论：宫殿记忆法
&lt;/h2&gt;&lt;p&gt;MemPalace 借用了古典的&amp;quot;记忆宫殿&amp;quot;概念，把知识按空间结构组织：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;宫殿 (Palace)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── 侧翼 (Wing) — 项目/领域
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── 房间 (Room) — 主题分类
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ ├── 衣柜 (Closet) — 压缩摘要（AAAK格式）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ └── 抽屉 (Drawer) — 原文片段（向量索引）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这不是简单的向量数据库。它有三层结构协同工作：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;① 向量索引（ChromaDB）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;把每段文本变成向量，支持语义搜索。问&amp;quot;我们为什么换 GraphQL？&amp;ldquo;能直接定位到当时的讨论，不用记关键词。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;② 知识图谱（SQLite）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;存储实体关系：谁做了什么、什么时候做的、关系什么时候变了。支持时间过滤——&amp;ldquo;2025年1月时，Max 在做什么？&amp;ldquo;这种问题能回答。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;③ AAAK 压缩方言&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;把长文本压缩成结构化符号：实体、情感标记、关键引用、权重标记。任何 LLM 都能直接读懂，不需要解码器。&lt;/p&gt;
&lt;h2 id="四层记忆栈"&gt;四层记忆栈
&lt;/h2&gt;&lt;p&gt;MemPalace 把记忆分为四层，按需加载，不浪费 context：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;层级&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Token 开销&lt;/th&gt;
 &lt;th&gt;加载时机&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;L0&lt;/td&gt;
 &lt;td&gt;身份（我是谁）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;~100&lt;/td&gt;
 &lt;td&gt;始终&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;L1&lt;/td&gt;
 &lt;td&gt;关键事实摘要&lt;/td&gt;
 &lt;td style="text-align: center"&gt;~500-800&lt;/td&gt;
 &lt;td&gt;始终&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;L2&lt;/td&gt;
 &lt;td&gt;特定主题/项目&lt;/td&gt;
 &lt;td style="text-align: center"&gt;~200-500&lt;/td&gt;
 &lt;td&gt;按需&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;L3&lt;/td&gt;
 &lt;td&gt;全文语义搜索&lt;/td&gt;
 &lt;td style="text-align: center"&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;唤醒成本仅 600-900 tokens&lt;/strong&gt;（L0+L1），把 95% 以上的 context 留给真正的对话。你的 128K 窗口不会被记忆塞满。&lt;/p&gt;
&lt;h2 id="怎么用"&gt;怎么用？
&lt;/h2&gt;&lt;h3 id="安装"&gt;安装
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install mempalace
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="导入项目文件"&gt;导入项目文件
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 初始化（自动识别目录结构，生成房间）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace init ~/projects/my_app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 挖掘（把文件内容索引进宫殿）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace mine ~/projects/my_app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;MemPalace 会自动扫描目录，按文件夹结构生成 Wing（项目）和 Room（主题），把每个文件按段落切分成 Drawer，存入 ChromaDB。&lt;/p&gt;
&lt;h3 id="导入聊天记录"&gt;导入聊天记录
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 支持 Claude Code、ChatGPT、Slack 导出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace mine ~/.claude/projects/xxx --mode convos --wing my_app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="搜索"&gt;搜索
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 语义搜索（不用记精确关键词）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace search &lt;span class="s2"&gt;&amp;#34;为什么选 PostgreSQL 而不是 MongoDB&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 指定范围&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace search &lt;span class="s2"&gt;&amp;#34;定价讨论&amp;#34;&lt;/span&gt; --wing my_app --room costs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="唤醒"&gt;唤醒
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 生成 L0+L1 上下文，注入到 AI 对话开头&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace wake-up
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 只唤醒特定项目&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace wake-up --wing my_app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="压缩"&gt;压缩
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 把抽屉压缩成衣柜摘要（约30倍压缩）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace compress
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="接入-ai-工具"&gt;接入 AI 工具
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# MCP 模式——暴露 19 个工具给 Claude Code / Cursor 等&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mempalace mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;支持通过 MCP 协议直接接入 Claude Code、Cursor、Windsurf 等 AI 编码工具，AI 可以自主决定何时搜索记忆。&lt;/p&gt;
&lt;h2 id="实测数据"&gt;实测数据
&lt;/h2&gt;&lt;p&gt;以下是我用 Hermes Agent（一个本地 AI 助手）的实际使用数据：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;嵌入模型对比测试（18个中文查询）：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;指标&lt;/th&gt;
 &lt;th style="text-align: center"&gt;all-MiniLM-L6-v2&lt;/th&gt;
 &lt;th style="text-align: center"&gt;Qwen3-Embedding-0.6B&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;命中率&lt;/td&gt;
 &lt;td style="text-align: center"&gt;9/18 (50%)&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;18/18 (100%)&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;平均相似度&lt;/td&gt;
 &lt;td style="text-align: center"&gt;-0.18&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;0.60&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;单次查询耗时&lt;/td&gt;
 &lt;td style="text-align: center"&gt;217ms&lt;/td&gt;
 &lt;td style="text-align: center"&gt;449ms&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;换上中文优化模型后，近义词、描述性查询全部命中。Ollama 本地跑 Qwen3-Embedding，不依赖任何外部 API。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenClaw（三省六部制 AI 系统）接入：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;13 个 Agent 共享同一个 MemPalace 实例&lt;/li&gt;
&lt;li&gt;索引了 854 个文件（195 closets + 659 drawers）&lt;/li&gt;
&lt;li&gt;每天凌晨自动增量索引&lt;/li&gt;
&lt;li&gt;Agent 们通过 &lt;code&gt;mempalace search&lt;/code&gt; 检索历史上下文&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="优点"&gt;优点
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;零配置起步&lt;/strong&gt;：&lt;code&gt;pip install&lt;/code&gt; + &lt;code&gt;mempalace init&lt;/code&gt; + &lt;code&gt;mempalace mine&lt;/code&gt;，三行命令跑起来&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;完全本地&lt;/strong&gt;：数据存在你机器上，ChromaDB + SQLite，不需要网络，不需要 API Key&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;语义搜索&lt;/strong&gt;：不是关键词匹配，是理解意思。说&amp;quot;定价讨论&amp;quot;能找到提到&amp;quot;价格策略&amp;quot;的内容&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;记忆分层&lt;/strong&gt;：L0-L3 按需加载，不会撑爆 context window&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;多格式支持&lt;/strong&gt;：项目文件、Claude Code 对话、ChatGPT 导出、Slack 记录都能吃&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;知识图谱&lt;/strong&gt;：有时间线的关系数据库，知道事实&amp;quot;什么时候是真的&amp;rdquo;&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;AAAK 压缩&lt;/strong&gt;：30倍压缩比，任何 LLM 直接读懂&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;MCP 协议&lt;/strong&gt;：19个工具暴露给 AI，让 AI 自己管理记忆&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;增量索引&lt;/strong&gt;：&lt;code&gt;mine&lt;/code&gt; 命令幂等，只处理新文件，不重复索引&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;多实例隔离&lt;/strong&gt;：支持多个 AI Agent 各用各的宫殿，互不干扰&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="缺点"&gt;缺点
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;⚠️ &lt;strong&gt;嵌入模型依赖&lt;/strong&gt;：默认用 all-MiniLM-L6-v2，&lt;strong&gt;中文效果很差&lt;/strong&gt;（命中率仅50%）。中文场景必须换模型（如 Qwen3-Embedding），但换模型需要重建整个索引&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;首次索引慢&lt;/strong&gt;：大项目首次 &lt;code&gt;mine&lt;/code&gt; 比较耗时，尤其本地跑大嵌入模型时。我 854 条数据用 Qwen3-Embedding 跑了近 5 小时（纯 CPU）&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;ChromaDB 限制&lt;/strong&gt;：不支持多进程并发写入。多 Agent 共享一个宫殿需要做实例隔离，否则会锁冲突&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;没有内置嵌入模型管理&lt;/strong&gt;：换模型要自己写脚本重建，没有官方的 migrate 工具（虽然有 &lt;code&gt;mempalace migrate&lt;/code&gt; 但只处理 ChromaDB 版本升级）&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;AAAK 压缩是有损的&lt;/strong&gt;：官方文档明确说不是无损压缩，原文无法从 AAAK 输出还原。压缩前确保原始 Drawer 保留&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;文档偏少&lt;/strong&gt;：README 够用，但深入使用（嵌入模型切换、多实例隔离、MCP 高级配置）基本靠读源码&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;单机方案&lt;/strong&gt;：没有分布式/同步机制，不适合团队协作场景&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="适合谁"&gt;适合谁？
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;个人 AI 助手用户&lt;/strong&gt;：希望 AI 记住你的偏好、项目历史、重要决策&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Agent 开发者&lt;/strong&gt;：给你的 Agent 加一个持久化的长期记忆层&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重度 AI 对话用户&lt;/strong&gt;：积累了大量 ChatGPT/Claude 对话，想建立可检索的档案库&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐私敏感用户&lt;/strong&gt;：不想把记忆数据上传到任何云端服务&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="不适合谁"&gt;不适合谁？
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;需要团队协作共享记忆的团队（考虑 Zep/Mem0）&lt;/li&gt;
&lt;li&gt;只用 AI 做简单问答，不需要上下文延续&lt;/li&gt;
&lt;li&gt;没有本地服务器或不愿意折腾 CLI&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="技术栈"&gt;技术栈
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;语言&lt;/strong&gt;：Python&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;向量数据库&lt;/strong&gt;：ChromaDB（本地嵌入式）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;知识图谱&lt;/strong&gt;：SQLite&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;嵌入模型&lt;/strong&gt;：可插拔（默认 all-MiniLM-L6-v2，支持 Ollama、OpenAI 兼容 API）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协议&lt;/strong&gt;：MCP（Model Context Protocol）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;协议&lt;/strong&gt;：MIT 开源&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;MemPalace v3.3.3 | 作者: milla-jovovich | GitHub: github.com/MemPalace/mempalace&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>