<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>上下文工程 on 老朱的赛博工位</title><link>https://blog.zjkun.top/tags/%E4%B8%8A%E4%B8%8B%E6%96%87%E5%B7%A5%E7%A8%8B/</link><description>Recent content in 上下文工程 on 老朱的赛博工位</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Thu, 22 Oct 2026 00:50:00 +0800</lastBuildDate><atom:link href="https://blog.zjkun.top/tags/%E4%B8%8A%E4%B8%8B%E6%96%87%E5%B7%A5%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>OpenClaw 记忆系统拆解：文件即记忆，附 memory_search 修了半年的实录</title><link>https://blog.zjkun.top/posts/openclaw-5-memory-system/</link><pubDate>Thu, 22 Oct 2026 00:50:00 +0800</pubDate><guid>https://blog.zjkun.top/posts/openclaw-5-memory-system/</guid><description>OpenClaw 的记忆不是黑盒：MEMORY.md + 每日日志 + 专项档案的文件层，加向量/关键词混合检索的索引层。这篇带我 6 月到 10 月的三次真实故障全录：JSON 反斜杠、检索瘫痪 48 天、根因缺 OPENAI_API_KEY 到 bge-m3 修复上线。</description><content:encoded><![CDATA[<p>我这套 OpenClaw 用了大半年，记忆是我用得最重的功能，也是坏得最多次的功能。这篇把设计和三次真实事故一起写干净。</p>
<h2 id="文件层记忆的第一现场">文件层：记忆的第一现场</h2>
<p>OpenClaw 的记忆本体就是一堆 Markdown，按热度分层：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>workspace/
</span></span><span style="display:flex;"><span>├── MEMORY.md            # 长期精炼记忆（画像/项目/待办/钦定规则）——主会话每次注入
</span></span><span style="display:flex;"><span>└── memory/
</span></span><span style="display:flex;"><span>    ├── daily/           # 每日原始日志 YYYY-MM-DD.md——当天事实随手写
</span></span><span style="display:flex;"><span>    ├── projects/        # 专项档案（某条业务线的完整历史）
</span></span><span style="display:flex;"><span>    ├── profiles/ contacts/ schedules/ context/   # 人物/日程/上下文档案
</span></span><span style="display:flex;"><span>    └── ── 结构化知识 → ~/.openclaw/wiki/main/（entities/concepts/syntheses/sources）
</span></span></code></pre></div><p>运转节奏：<strong>当天事写 daily，定期（我放在每天 23:56 的 cron 维护班）把 daily 提炼进 MEMORY.md，过时内容清理或迁 projects 档案</strong>。主人说&quot;记住这个&quot;，必须立刻落文件——没有&quot;心里记一下&quot;这回事，因为每次会话都是全新醒来。关联信息用 <code>[[双向链接]]</code>，这玩法直接抄 Obsidian。</p>
<p>这条路上我交过的学费是体积：这些文件每次会话都注入，就是持续的 token 成本。9/25 大瘦身，TOOLS.md 12.6KB→3.7KB、开机注入总量 42KB→20KB，手法就一招——<strong>细节全部下沉到 projects 档案，常驻只留指针</strong>。</p>
<h2 id="索引层坏过三次的位置">索引层：坏过三次的位置</h2>
<p>文件多了要找回来，靠内置 <code>memory_search</code>（向量语义+关键词两路并行，和我做 RAG 项目的混合检索同一个架构）。它的三次事故：</p>
<p><strong>事故一（6/19）：一个反斜杠消失在搜索里。</strong> 现象：前一天的发布记录搜不到。根因：<code>openclaw.json</code> 里 <code>memorySearch.extraPaths</code> 写了<strong>单反斜杠</strong>路径，JSON 未转义，自定义目录（profiles/projects 等）全部加载失败。修复：改双反斜杠 <code>\\</code>，重启网关。附带发现：session-memory hook 也没把旧会话落盘——从此我定了规矩：<strong>重要对话手动写 daily，不赌自动 hook</strong>。</p>
<p><strong>事故二（9/3 起，瘫了近 50 天）：语义那条腿断了。</strong> 现象：memory_search 持续不可用。当时定位到&quot;openai provider 无 API key&quot;，先拿 <code>qmd</code> CLI 和直接读文件兜底，业务照常跑——<strong>检索坏了不等于记忆丢了，文件才是事实源</strong>，这是这个架构最让我安心的一点。</p>
<p><strong>事故三（10/21 根治）：根因查实。</strong> 配置里只有 extraPaths 没写 embedding provider → 系统<strong>默认走 OpenAI 的 embeddings 接口要 <code>OPENAI_API_KEY</code></strong> → 本机没这个 key → 语义检索废了，qmd 也是同一个死因。当天修复：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-json" data-lang="json"><span style="display:flex;"><span><span style="color:#75715e">// agents.defaults.memorySearch
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">&#34;provider&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;openai-compatible&#34;</span><span style="color:#960050;background-color:#1e0010">,</span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">&#34;model&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;BAAI/bge-m3&#34;</span><span style="color:#960050;background-color:#1e0010">,</span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">&#34;remote&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> { <span style="color:#f92672">&#34;baseUrl&#34;</span>: <span style="color:#e6db74">&#34;https://api.siliconflow.cn/v1&#34;</span>, <span style="color:#f92672">&#34;apiKey&#34;</span>: <span style="color:#e6db74">&#34;&lt;复用我 .env 里的 SILICONFLOW key&gt;&#34;</span> }
</span></span></code></pre></div><p>然后 <code>openclaw memory index --force</code> 全量重建索引，<code>config validate</code> 通过，实测查询返回正常（vectorScore 有值了）。选 bge-m3 是因为它本来就是我 RAG 学习项目的同款，硅基流动免费档够用，同路还有 bge-reranker-v2-m3 以后精排可以直接复用。<strong>成本：零</strong>（key 现成，模型白嫖）。</p>
<h2 id="验收记忆是否真的在">验收记忆是否真的在</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>openclaw memory status      <span style="color:#75715e"># 索引状态</span>
</span></span><span style="display:flex;"><span>openclaw memory index --force  <span style="color:#75715e"># 重建</span>
</span></span><span style="display:flex;"><span>qmd update <span style="color:#f92672">&amp;&amp;</span> qmd embed --no-gpu  <span style="color:#75715e"># 备用 CLI 索引</span>
</span></span></code></pre></div><p>再加一条行为层的验收：隔几天新开一个会话，问它&quot;我 9 月干过什么&quot;——能从 daily 和 MEMORY.md 里答对，这套记忆才算活着。</p>
<hr>
<p><strong>「OpenClaw 实战」系列</strong>（随我用随更）：① <a href="/posts/openclaw-1-install-windows/">Windows 安装上线篇</a> · ② <a href="/posts/openclaw-2-architecture/">架构扫盲</a> · ③ <a href="/posts/openclaw-3-console-tips/">控制台与日常使用</a> · ④ <a href="/posts/openclaw-4-model-provider/">模型接入</a> · ⑤ <a href="/posts/openclaw-5-memory-system/">记忆系统</a> · ⑥ <a href="/posts/openclaw-6-cron-cost/">定时任务与降本</a> · ⑦ <a href="/posts/openclaw-7-plugins-deps/">增加依赖</a></p>
]]></content:encoded></item><item><title>OpenClaw 架构扫盲：一个网关加一堆 Markdown，凭什么叫数字分身</title><link>https://blog.zjkun.top/posts/openclaw-2-architecture/</link><pubDate>Thu, 22 Oct 2026 00:35:00 +0800</pubDate><guid>https://blog.zjkun.top/posts/openclaw-2-architecture/</guid><description>OpenClaw 的技术架构到底长什么样？网关、会话、工具、工作区文件四层，用我机器上的真实 session key、注入文件和目录结构拆开讲，顺便聊聊&amp;#39;文件即记忆&amp;#39;这种上下文工程设计的取舍。</description><content:encoded><![CDATA[<p>用了大半年 OpenClaw，这篇把它在我机器上真实的样子拆开。不是官方文档转述，是我对着自己的目录、会话 key、配置一条条核出来的。</p>
<h2 id="四层结构">四层结构</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>聊天渠道(微信/网页/…) ──&gt; Gateway(常驻网关进程) ──&gt; Agent(模型+工具) ──&gt; Workspace(Markdown 文件们)
</span></span></code></pre></div><p><strong>1. Gateway 网关。</strong> 本机常驻的 WebSocket 服务，一切的中枢：渠道消息进它，Agent 调用经它，定时任务、日志都归它管。CLI 里 <code>openclaw gateway</code> 一族负责起停查。我 5 月第一次升级时就是 CLI 升到 2026.5.18 后网关服务没对齐，重装服务才恢复——<strong>它是独立于 CLI 的常驻进程</strong>，这个认知能解释一大半&quot;明明改了为什么不生效&quot;（配置热改后多数要重启网关加载，我 9/25 那次 thinkingDefault 改完就是 15:56 重启才生效）。</p>
<p><strong>2. Sessions 会话。</strong> 每条聊天线都是一个持久会话，key 长这样（我自己的）：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>agent:main:openclaw-weixin:direct:o9cq…@im.wechat
</span></span></code></pre></div><p>读法：<code>哪个agent : 哪条渠道 : 私聊还是群聊 : 对方是谁</code>。每个会话有独立的历史与上下文，<code>openclaw sessions list</code>、<code>openclaw transcripts</code> 可以直接翻存储的会话和转录——透明，没有黑盒。</p>
<p><strong>3. Agent 与工具。</strong> 模型负责想，工具负责做：exec（shell）、read/write/edit、browser、cron、web_search 这些，按策略过滤后授权给会话。工具清单不是背出来的，是每次运行时注入的元数据——所以&quot;我的工具箱&quot;里我能干啥，取决于配置，不取决于传说。子 agent（sessions_spawn）用来把长任务丢后台，跑完把结果推回来，主会话不陪着卡死。</p>
<p><strong>4. Workspace 工作区。</strong> 这是 OpenClaw 最有味道的设计：<strong>人格和记忆全是 Markdown 文件</strong>。我的 <code>D:\openClaw\workspace</code> 根目录：</p>
<table>
	<thead>
			<tr>
					<th>文件</th>
					<th>作用</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>AGENTS.md</td>
					<td>工作区守则（记忆规则、红线、执行约定）</td>
			</tr>
			<tr>
					<td>SOUL.md</td>
					<td>性格与说话方式</td>
			</tr>
			<tr>
					<td>IDENTITY.md / USER.md</td>
					<td>它是谁 / 我是谁</td>
			</tr>
			<tr>
					<td>TOOLS.md</td>
					<td>本机工具操作笔记</td>
			</tr>
			<tr>
					<td>MEMORY.md</td>
					<td>长期记忆（精炼画像）</td>
			</tr>
			<tr>
					<td>memory/daily/</td>
					<td>每日原始日志 YYYY-MM-DD.md</td>
			</tr>
			<tr>
					<td>memory/projects/</td>
					<td>专项档案（按需读取，不常驻注入）</td>
			</tr>
	</tbody>
</table>
<p>每次会话开始，这几个文件被<strong>注入</strong>进上下文——所以&quot;每次都是全新醒来，文件即记忆&quot;。会话之间它什么都不记得，但读完文件它就知道我是谁、进度到哪、哪些事不能干。</p>
<h2 id="两个值得聊的设计取舍">两个值得聊的设计取舍</h2>
<p><strong>取舍一：记忆在文件，也在索引。</strong> 注入的只有那几份 bootstrap 文件（我 9/25 降本时把这块从 42KB 瘦到 20KB，因为每次会话都背着它们跑 token）。历史日志靠 <code>memory_search</code> 语义检索按需捞回，另有 wiki 知识库目录（<code>~\.openclaw\wiki\</code>）。文件是事实源，索引是加速层——索引坏了数据不丢，这个架构对我这种要长期攒记忆的人很关键，具体故事见系列第五篇。</p>
<p><strong>取舍二：上下文是成本，也是纪律。</strong> 大模型按 token 计费，注入越多越贵越慢。所以我把&quot;详细操作手册&quot;都沉到 projects 档案里，常驻的只留高频守则和指针；心跳（heartbeat，每 30 分钟自动唤醒跑一轮模型）直接禁用，用便宜的 cron + 纯脚本接管。这套账算下来是第六篇的主题。</p>
<h2 id="架构层自查命令">架构层自查命令</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>openclaw status          <span style="color:#75715e"># 网关/渠道/模型/最近会话总览</span>
</span></span><span style="display:flex;"><span>openclaw sessions list   <span style="color:#75715e"># 存量会话</span>
</span></span><span style="display:flex;"><span>openclaw agents list     <span style="color:#75715e"># 隔离 agent（工作区+路由）</span>
</span></span><span style="display:flex;"><span>openclaw channels list   <span style="color:#75715e"># 接了哪些聊天渠道</span>
</span></span><span style="display:flex;"><span>openclaw config get      <span style="color:#75715e"># 当前配置</span>
</span></span></code></pre></div><p>一句话总结架构：<strong>网关是身体，会话是神经，工具是手，Markdown 文件是记忆</strong>。搞清楚这四层，后面装模型、接微信、修记忆、排任务都是按图索骥。</p>
<hr>
<p><strong>「OpenClaw 实战」系列</strong>（随我用随更）：① <a href="/posts/openclaw-1-install-windows/">Windows 安装上线篇</a> · ② <a href="/posts/openclaw-2-architecture/">架构扫盲</a> · ③ <a href="/posts/openclaw-3-console-tips/">控制台与日常使用</a> · ④ <a href="/posts/openclaw-4-model-provider/">模型接入</a> · ⑤ <a href="/posts/openclaw-5-memory-system/">记忆系统</a> · ⑥ <a href="/posts/openclaw-6-cron-cost/">定时任务与降本</a> · ⑦ <a href="/posts/openclaw-7-plugins-deps/">增加依赖</a></p>
]]></content:encoded></item></channel></rss>