<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>万术海</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://haies.cn/</id>
  <link href="https://haies.cn/" rel="alternate"/>
  <link href="https://haies.cn/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, 万术海</rights>
  <subtitle>众里寻码千百度，那段却在github处。</subtitle>
  <title>一本码簿</title>
  <updated>2026-10-22T06:14:13.000Z</updated>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="开发" scheme="https://haies.cn/categories/dev/"/>
    <category term="实用" scheme="https://haies.cn/tags/utils/"/>
    <category term="AI" scheme="https://haies.cn/tags/ai/"/>
    <content>
      <![CDATA[<blockquote><p><strong>版本标注</strong>：本文已对照 DSH v0.1.5-rc.1 修订（初稿基于 v0.1.2-alpha.4）。DSH 处于 pre-stable 阶段（官方口径：”Public APIs are pre-stable”），破坏兼容性变更不可避免，使用前请核对当前版本。涉及社区插件的能力均标注”社区插件”，非 DSH 原生功能。</p></blockquote><h2 id="引子"><a href="#引子" class="headerlink" title="引子"></a>引子</h2><p>DSH 不是工具，是新同事。</p><p>新同事需要 onboarding——你要告诉他项目是什么、约束是什么、禁区是什么。没人 onboarding，新同事就靠猜，猜错了就要么”顺手重构”要么”夹带私货”。</p><p>本文不讲理论，只讲”在 DSH Web 界面里能做什么、怎么做”。</p><p>6 件事（另有第 8 章工程规范补充 + 附录 A 速查表）：</p><ol><li><strong>5 分钟最小工作流</strong>（第 0 章）——先跑通一个闭环，再回头搭文档</li><li><strong>项目文档怎么搭</strong>（第 1 章）——从 DSH 开发视角，区分核心必需 &#x2F; 推荐 &#x2F; 条件必需</li><li><strong>4 种 agent 模式 + 运行基础</strong>（第 2 章）——模型选择 + 界面里所有 slash 命令 + sandbox 权限</li><li><strong>工作流决策树</strong>（第 3 章）——什么时候走哪条路</li><li><strong>场景实操</strong>（第 4~6 章）——标准模式 7 个（4.4 起含组合形态）+ 其他模式 3 个 + 高级工具 2 个</li><li><strong>plan&#x2F;spec 自动检查</strong>（第 7 章）——原生 hooks 方案 + 社区插件增强 + CI 门禁</li></ol><p>假设你是 3~8 人中型项目的主程，用 DSH <code>web</code> 模式，长期使用<strong>标准模式</strong>。</p><h2 id="第-0-章：5-分钟最小工作流"><a href="#第-0-章：5-分钟最小工作流" class="headerlink" title="第 0 章：5 分钟最小工作流"></a>第 0 章：5 分钟最小工作流</h2><blockquote><p>目的：在搭文档之前，先亲手跑通一个 DSH 闭环。</p></blockquote><p>如果你是第一次用 DSH，不要从第 1 章的文档结构开始。先做这件事：</p><ol><li>打开 DSH Web（<code>npx @deepseek-ai/dsh web</code>）</li><li>确认顶栏模式为<strong>标准模式</strong></li><li>在 chat 里粘贴：</li></ol><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Bug: src/utils/format.ts 的 formatDate 对 null 输入返回 &quot;NaN&quot;</span><br><span class="line">复现: npx jest tests/format.test.ts</span><br><span class="line">期望: 返回空字符串</span><br><span class="line">实际: 返回 &quot;NaN&quot;</span><br></pre></td></tr></table></figure><ol start="4"><li>观察 DSH 执行序列：<code>read</code> → <code>bash</code>（复现）→ <code>read</code>（定位）→ <code>edit</code>（修复）→ <code>bash</code>（验证）→ <code>bash</code>（commit）</li><li>全程不调 <code>/plan</code>、不派 subagent。这就是最简单的任务路径。</li></ol><p>跑通之后，你就能理解本文后面所有场景的”最小单元”。再回头看第 1 章搭文档，会更有方向感。</p><h2 id="第-1-章：项目文档与协作基建"><a href="#第-1-章：项目文档与协作基建" class="headerlink" title="第 1 章：项目文档与协作基建"></a>第 1 章：项目文档与协作基建</h2><blockquote><p>目的：从 DSH 开发视角，明确哪些文档是<strong>核心必需</strong>、哪些是<strong>推荐</strong>、哪些是<strong>条件必需</strong>。<br>核心原则：<strong>“必需”不等于”启动时就必须存在”，而是”在 DSH 工作流触发到它时，它必须已经存在”。</strong></p></blockquote><h3 id="1-1-核心必需（2-个）"><a href="#1-1-核心必需（2-个）" class="headerlink" title="1.1 核心必需（2 个）"></a>1.1 核心必需（2 个）</h3><p>DSH 官方仓库的 <code>AGENTS.md</code> 中明确写着：</p><blockquote><p><strong>Read <code>docs/architecture.md</code> before changing <code>packages/</code>; follow <code>docs/AGENTS.md</code> for documentation.</strong></p></blockquote><p>这是 DSH 官方仓库对<strong>自身</strong>的约定，也揭示了可复用的机制。注意区分两层：<strong>DSH 产品只自动注入 <code>AGENTS.md</code></strong>（首个请求时注入用户全局 <code>$DSH_HOME/AGENTS.md</code> + 项目根到工作目录的 <code>AGENTS.md</code>&#x2F;<code>CLAUDE.md</code> 链，约 64KB 预算）；architecture 文档<strong>不会自动加载</strong>，要靠 <code>AGENTS.md</code> 里写明规则、驱动 Agent 去读（见 1.5 模板）——这正是 DSH 官方仓库自己的做法。在此机制上，对任何 DSH 项目，<strong>核心必需</strong>只有两个：</p><table><thead><tr><th>文件</th><th>为什么核心必需</th><th>核心内容</th></tr></thead><tbody><tr><td><strong><code>AGENTS.md</code></strong></td><td>DSH <strong>自动注入上下文</strong>的唯一项目文档（见上），是 Agent 全程遵守的持久化长期指令。它定义了项目的硬规则和禁区。</td><td>项目约束、命令约定、禁止事项、协作流程。</td></tr><tr><td><strong><code>docs/architecture/overview.md</code> + <code>decisions.md</code></strong></td><td>在 <code>AGENTS.md</code> 中约定后，成为 Agent 修改核心代码前的<strong>必读材料</strong>（DSH 官方仓库即采用此模式，其入口为单文件 <code>docs/architecture.md</code>）。提供系统上下文，避免破坏架构完整性。</td><td>系统图谱、模块职责、非功能性要求、所有 ADR。</td></tr></tbody></table><p><strong>缺失后果</strong>：</p><ul><li>缺 <code>AGENTS.md</code> → DSH 可能违反项目规则，做出未授权的修改或操作。</li><li>缺 <code>architecture/</code> → DSH 在不理解系统全貌的情况下修改代码，可能引入架构性错误。</li></ul><h3 id="1-2-推荐文档（1-个）"><a href="#1-2-推荐文档（1-个）" class="headerlink" title="1.2 推荐文档（1 个）"></a>1.2 推荐文档（1 个）</h3><table><thead><tr><th>文件</th><th>为什么推荐</th><th>何时创建</th></tr></thead><tbody><tr><td><strong><code>README.md</code></strong></td><td>DSH 启动时的项目入口。缺失不影响协作，但降低效率——DSH 需要从 <code>AGENTS.md</code> 和 <code>architecture.md</code> 中反推项目入口。</td><td>项目启动时。</td></tr></tbody></table><h3 id="1-3-条件必需（1-个）"><a href="#1-3-条件必需（1-个）" class="headerlink" title="1.3 条件必需（1 个）"></a>1.3 条件必需（1 个）</h3><table><thead><tr><th>文件</th><th>必需条件</th><th>为什么</th></tr></thead><tbody><tr><td><strong><code>docs/specs/</code></strong></td><td>当项目进入<strong>多任务并行阶段</strong>（&gt;1 天的复杂任务、跨模块重构、性能优化）后，变为必需。</td><td>DSH 调用 <code>exit_plan_mode</code> 时提交的 plan 必须写入 <code>docs/specs/</code>，这是 DSH 工作流的核心落点。</td></tr></tbody></table><p><strong>判定标准</strong>：</p><ul><li><strong>要进 <code>docs/specs/</code></strong>：工作量 &gt; 1 天、跨模块、需要设计决策、影响接口或数据。</li><li><strong>不进</strong>：工作量 &lt; 1 天的简单任务，PR 描述里写清 AC 即可。</li></ul><h3 id="1-4-按需扩展（其余文件）"><a href="#1-4-按需扩展（其余文件）" class="headerlink" title="1.4 按需扩展（其余文件）"></a>1.4 按需扩展（其余文件）</h3><table><thead><tr><th>文件</th><th>何时新建</th></tr></thead><tbody><tr><td><code>CHANGELOG.md</code></td><td>第一次发版前</td></tr><tr><td><code>docs/runbooks.md</code></td><td>第一次线上事故后</td></tr><tr><td><code>docs/postmortems/</code></td><td>第一次故障复盘时</td></tr><tr><td><code>docs/instructions.md</code></td><td>团队觉得”每次都要翻 AGENTS.md 找流程”时</td></tr></tbody></table><h3 id="1-5-AGENTS-md-模板（最小版）"><a href="#1-5-AGENTS-md-模板（最小版）" class="headerlink" title="1.5 AGENTS.md 模板（最小版）"></a>1.5 <code>AGENTS.md</code> 模板（最小版）</h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># DSH 协作守则</span></span><br><span class="line"></span><br><span class="line"><span class="section">## 项目</span></span><br><span class="line"><span class="bullet">-</span> 业务: &lt;一句话&gt;</span><br><span class="line"><span class="bullet">-</span> 关键约束: &lt;性能 / 合规 / 技术栈&gt;</span><br><span class="line"></span><br><span class="line"><span class="section">## 启动规则</span></span><br><span class="line">启动任何任务前：</span><br><span class="line"><span class="bullet">1.</span> read AGENTS.md</span><br><span class="line"><span class="bullet">2.</span> read docs/architecture/overview.md</span><br><span class="line"><span class="bullet">3.</span> read docs/architecture/decisions.md</span><br><span class="line"><span class="bullet">4.</span> 涉及已有功能 → read 对应 docs/specs/<span class="emphasis">*.md</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">## 任务规则</span></span><br><span class="line"><span class="emphasis">- AC / 边界 / 约束不全 → ask_user_question</span></span><br><span class="line"><span class="emphasis">- 简单 bug → 直接执行（确保 sandbox = workspace-write）</span></span><br><span class="line"><span class="emphasis">- 重构 / 新功能 / 复杂优化 → /plan → write docs/specs/ → exit_plan_mode</span></span><br><span class="line"><span class="emphasis">- 跨多轮任务 → /goal <span class="language-xml"><span class="tag">&lt;<span class="name">objective</span>&gt;</span></span></span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">## 自动检查规则（可选，见第 7 章）</span></span><br><span class="line"><span class="emphasis">- plan 提交前必须包含：目标、验收标准、实施步骤、风险与回滚</span></span><br><span class="line"><span class="emphasis">- docs/specs/*</span>.md 必须包含：背景、验收标准、实施步骤、风险与回滚</span><br><span class="line"><span class="bullet">-</span> 每个实施步骤必须声明「指令」和「验证」字段</span><br><span class="line"></span><br><span class="line"><span class="section">## 交付规则</span></span><br><span class="line"><span class="bullet">-</span> edit plan &quot;最终结果&quot;段</span><br><span class="line"><span class="bullet">-</span> edit CHANGELOG.md</span><br><span class="line"></span><br><span class="line"><span class="section">## 禁止</span></span><br><span class="line"><span class="bullet">-</span> ❌ 重构 commit 夹带 feat</span><br><span class="line"><span class="bullet">-</span> ❌ 改 src/legacy/</span><br><span class="line"><span class="bullet">-</span> ❌ 引入新依赖不写理由到 decisions.md</span><br></pre></td></tr></table></figure><p><strong>两条铁律</strong>：</p><ol><li><strong>每条规则必须映射到具体 DSH 指令&#x2F;命令</strong>——否则就是空话</li><li><strong>AGENTS.md 跟随项目演进</strong>——团队踩的坑必须反馈回来</li></ol><h3 id="1-6-docs-specs-模板（plan-文件归宿）"><a href="#1-6-docs-specs-模板（plan-文件归宿）" class="headerlink" title="1.6 docs/specs/ 模板（plan 文件归宿）"></a>1.6 <code>docs/specs/</code> 模板（plan 文件归宿）</h3><p>按”类型 + 名称”命名：</p><table><thead><tr><th>类型</th><th>文件命名</th><th>判定标准</th></tr></thead><tbody><tr><td>feature</td><td><code>feature-&lt;name&gt;.md</code></td><td>&gt; 1 天、跨模块、有设计决策</td></tr><tr><td>refactor</td><td><code>refactor-&lt;title&gt;.md</code></td><td>跨模块重构、行为不变</td></tr><tr><td>perf</td><td><code>perf-&lt;topic&gt;.md</code></td><td>需量化对比、有基线</td></tr><tr><td>bugfix</td><td><code>bugfix-&lt;id&gt;.md</code></td><td>涉及设计&#x2F;多模块的 bug</td></tr></tbody></table><p>通用模板：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># &lt;标题&gt;</span></span><br><span class="line"><span class="bullet">-</span> 类型: feature / refactor / perf / bugfix</span><br><span class="line"><span class="bullet">-</span> 状态: 🟡 草案 / 🟢 批准 / 🚧 执行中 / ✅ 完成</span><br><span class="line"></span><br><span class="line"><span class="section">## 背景</span></span><br><span class="line">&lt;为什么做&gt;</span><br><span class="line"></span><br><span class="line"><span class="section">## 目标（可度量）</span></span><br><span class="line"><span class="bullet">-</span> ✅ &lt;目标&gt;</span><br><span class="line"></span><br><span class="line"><span class="section">## 验收标准</span></span><br><span class="line"><span class="bullet">-</span> [ ] AC-1: ...</span><br><span class="line"><span class="bullet">-</span> [ ] 测试: 全量绿</span><br><span class="line"></span><br><span class="line"><span class="section">## 实施步骤（= DSH 指令序列）</span></span><br><span class="line"><span class="bullet">-</span> [ ] Step 1: &lt;任务&gt;</span><br><span class="line"><span class="bullet">  -</span> 指令: <span class="code">`bash`</span> 测基线 → <span class="code">`read`</span> 确认</span><br><span class="line"><span class="bullet">  -</span> 验证: 全量绿</span><br><span class="line"><span class="bullet">  -</span> commit: <span class="code">`&lt;type&gt;(scope): ...`</span></span><br><span class="line"><span class="bullet">-</span> [ ] Step 2: ...</span><br><span class="line"></span><br><span class="line"><span class="section">## 风险与回滚</span></span><br><span class="line">| 风险 | 缓解 | 回滚指令 |</span><br><span class="line">|---|---|---|</span><br><span class="line">| ... | ... | <span class="code">`git revert &lt;commit&gt;`</span> |</span><br><span class="line"></span><br><span class="line"><span class="section">## 进展记录</span></span><br><span class="line">&lt;!-- DSH 追加 --&gt;</span><br><span class="line"></span><br><span class="line"><span class="section">## 最终结果</span></span><br><span class="line">&lt;!-- 完成后填 --&gt;</span><br></pre></td></tr></table></figure><p><strong>DSH 校验约束</strong>：plan 参数<strong>必须 markdown + <code>#</code> 标题开头</strong>，否则 <code>exit_plan_mode</code> 调用失败。</p><h3 id="1-7-维护节奏"><a href="#1-7-维护节奏" class="headerlink" title="1.7 维护节奏"></a>1.7 维护节奏</h3><table><thead><tr><th>时点</th><th>必做</th></tr></thead><tbody><tr><td>项目启动</td><td>写 <code>AGENTS.md</code> + <code>docs/architecture/overview.md</code> + <code>decisions.md</code>（+ 推荐 <code>README.md</code>）</td></tr><tr><td>每个 &gt; 1 天任务</td><td>提前写 <code>docs/specs/feature-&lt;name&gt;.md</code></td></tr><tr><td>每个架构决策</td><td>追加 <code>decisions.md</code></td></tr><tr><td>每次发版</td><td>更新 <code>CHANGELOG.md</code></td></tr><tr><td>每次事故</td><td>48h 内写 <code>postmortems/</code> + 更新 <code>runbooks.md</code></td></tr><tr><td>团队踩坑</td><td>反馈回 <code>AGENTS.md</code></td></tr></tbody></table><h2 id="第-2-章：DSH-运行基础"><a href="#第-2-章：DSH-运行基础" class="headerlink" title="第 2 章：DSH 运行基础"></a>第 2 章：DSH 运行基础</h2><blockquote><p>目的：4 种 agent 模式 + 模型选择 + slash 命令 + sandbox 权限，一次讲清。</p></blockquote><h3 id="2-1-4-种-agent-模式与选择建议"><a href="#2-1-4-种-agent-模式与选择建议" class="headerlink" title="2.1 4 种 agent 模式与选择建议"></a>2.1 4 种 agent 模式与选择建议</h3><p>DSH 内置四种 Agent Preset——极简（Minimal）、标准（Standard）、PTC、创造（Cordis）——每个 Preset 是一份 <code>agent.cordis.yml</code> 组装文件，决定当前会话拥有哪些工具、提示词段落和 Skill。不同 Preset 的会话在同一进程中隔离运行。</p><table><thead><tr><th>模式</th><th>工具集</th><th>中型项目建议</th></tr></thead><tbody><tr><td><strong>标准模式</strong></td><td>文件编辑、Shell、网页检索、Skills、计划、目标、子代理、工作流</td><td>✅ <strong>90% 时间用这个</strong></td></tr><tr><td><strong>PTC 模式</strong></td><td>标准模式全部能力 + <code>run_code</code>（TypeScript SDK），<strong>无 workflow</strong>（自 v0.1.2-alpha.4 起）</td><td>需要编程化组合工具时切换</td></tr><tr><td><strong>极简模式</strong></td><td>仅持久 PTY Shell <strong>一个工具</strong>（POSIX 为 <code>bash</code>，Windows 为 <code>pwsh</code>），无文件编辑工具、无网页检索、无子 Agent、无规划模式、无目标、无上下文压缩</td><td>训练 &#x2F; 基准测试 &#x2F; 单文件轻量任务</td></tr><tr><td><strong>创造模式</strong></td><td>标准模式 + <code>cordis_*</code> 运行时自检工具</td><td>写自定义 preset &#x2F; 二次开发 DSH</td></tr></tbody></table><p>PTC 模式在标准模式全部能力基础上增加 <code>run_code</code> 工具，模型不再每步发出一个 tool-call，而是写一段 TypeScript 程序一次性提交，由沙箱运行时执行，把原本需要五次往返的操作压缩为一次。极简模式的 shell 是<strong>持久 PTY 版本</strong>，状态在多次调用之间保持，不随每次调用重置工作目录和变量；改文件只能用 <code>sed</code>、<code>cat</code> 等 shell 命令，且 shell 后端仍受宿主 sandbox policy 约束。极简模式无上下文压缩，<strong>不适合长任务</strong>。</p><blockquote><p><strong>PTC 模式 workflow 移除的官方来源</strong>：v0.1.2-alpha.4 发布说明中明确记录——“Web PTC Mode 默认不再向模型提供通用 workflow 工具”。</p></blockquote><p><strong>两个常见误区</strong>：</p><ol><li><strong>“切到 PTC 看起来很酷”</strong>——PTC 缺 workflow 工具，多数中型项目用不上。</li><li><strong>“切到创造模式更强大”</strong>——创造模式是为二次开发 DSH 设计的，日常编码反而引入不必要的工具噪音。</li></ol><p><strong>模式锁定规则</strong>：Preset 在会话启动后无法更换，一旦发出了第一条消息，Preset 就锁定了。<strong>但可以开一个新会话选不同的 Preset。</strong></p><p><strong>验证当前模式</strong>：看 Web GUI 顶栏的状态指示区。</p><h3 id="2-2-模型选择"><a href="#2-2-模型选择" class="headerlink" title="2.2 模型选择"></a>2.2 模型选择</h3><p>DSH 中模型可在 4 个层级指定：</p><table><thead><tr><th>层级</th><th>配置位置</th><th>适用</th></tr></thead><tbody><tr><td>Profile 默认模型</td><td>profile 配置</td><td>整个部署</td></tr><tr><td>Session 级别</td><td>session 设置</td><td>当前会话</td></tr><tr><td>Subagent</td><td><code>subagent</code>（spawn）的调用参数 <code>provider</code> + <code>model</code>（可选 <code>reasoning_effort</code>；先用 <code>list_subagent_models</code> 查可用目录）；<code>subagent_fork</code> 锁定父路由、<strong>不可选模型</strong>（见 4.7）</td><td>派生子 agent</td></tr><tr><td>Workflow</td><td>workflow 脚本的 <code>phase.model</code></td><td>workflow 各阶段</td></tr></tbody></table><p><strong>任务分级</strong>：</p><table><thead><tr><th>任务特征</th><th>推荐</th></tr></thead><tbody><tr><td>短上下文 + 简单任务 + 大量重复</td><td>弱模型</td></tr><tr><td>跨文件推理 + 架构设计 + 性能优化</td><td>强模型</td></tr><tr><td>安全相关 + 算法核心</td><td>强模型</td></tr></tbody></table><p><strong>一句话原则</strong>：模型选择是<strong>性价比</strong>，不是越强越好。错的 AC，再强的模型也救不了；写好的 plan + specs，弱模型也能干出 80 分的活。</p><h3 id="2-3-slash-命令"><a href="#2-3-slash-命令" class="headerlink" title="2.3 slash 命令"></a>2.3 slash 命令</h3><table><thead><tr><th>命令</th><th>作用</th><th>关键约束</th></tr></thead><tbody><tr><td><code>/plan</code> &#x2F; <code>/plan &lt;msg&gt;</code></td><td>进入计划模式</td><td>可附文件&#x2F;图片</td></tr><tr><td><code>/plan off</code></td><td>退出计划模式</td><td>—</td></tr><tr><td><code>/compact</code></td><td>手动压缩历史</td><td><strong>idle-only</strong>、<strong>不接受参数</strong>、不消耗模型回合</td></tr><tr><td><code>/goal</code> &#x2F; <code>/goal &lt;obj&gt;</code></td><td>创建长期目标</td><td>4 阶段（active&#x2F;paused&#x2F;blocked&#x2F;complete），默认 <strong>256 轮</strong>上限</td></tr><tr><td><code>/goal edit &lt;obj&gt;</code></td><td>改目标</td><td>阶段不变</td></tr><tr><td><code>/goal pause</code></td><td>暂停 + disarm</td><td>—</td></tr><tr><td><code>/goal resume</code></td><td>恢复 &#x2F; 重新武装</td><td>受轮次上限约束</td></tr><tr><td><code>/goal clear</code></td><td>清除当前目标</td><td>历史保留在 session log</td></tr><tr><td><code>/permission</code></td><td>切换权限预设</td><td>配合 sandbox 模式</td></tr><tr><td><code>/feedback &lt;text&gt;</code></td><td>记录会话反馈</td><td><strong>必须带文本</strong>；不进入模型历史、不打断模型工作</td></tr><tr><td><code>/export</code></td><td>下载当前会话日志为 ZIP</td><td>Web-only、<strong>不接受参数</strong>、不进入模型历史</td></tr></tbody></table><p>以上即当前 Web 界面的全部内建 slash 命令（安装社区插件可能追加，如 dsh-plan-doc 的 <code>/plan-doc</code>）。</p><p><strong>关键事实</strong>：命令输出<strong>不进入模型历史</strong>——DSH 渲染给用户看，不污染上下文。命令和参数严格按字面解析——<code>/goal pause after verification</code> 会创建目标”pause after verification”，不是暂停。</p><p><strong><code>/goal</code> 状态机</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">     create</span><br><span class="line">─────────────→ active ⇄ paused</span><br><span class="line">     edit        │      ↑</span><br><span class="line">                │      resume</span><br><span class="line">                ↓</span><br><span class="line">           blocked / complete / clear</span><br></pre></td></tr></table></figure><ul><li><code>active</code> 状态<strong>才</strong>能续推（自动武装）</li><li><code>paused</code> &#x2F; <code>blocked</code> 会 disarm——<code>/goal resume</code> 重新武装；<code>complete</code> 是<strong>终态</strong>（不可 resume），<code>clear</code> 后目标已删除无从 resume</li><li><strong>session resume &#x2F; fork 后默认 disarmed</strong>——必须 <code>/goal resume</code> 才会继续推进</li><li>人类消息<strong>不增加 Round 数</strong>，只有目标驱动的工作轮次才计数</li></ul><h3 id="2-4-sandbox-与权限"><a href="#2-4-sandbox-与权限" class="headerlink" title="2.4 sandbox 与权限"></a>2.4 sandbox 与权限</h3><p>DSH 通过 <code>@deepseek-ai/dsh-bash-sandbox</code> 和 <code>@deepseek-ai/dsh-permission-presets</code> 提供文件访问隔离。</p><table><thead><tr><th>模式</th><th>文件效果</th><th>推荐场景</th></tr></thead><tbody><tr><td><code>read-only</code>（fail-safe 默认）</td><td>拒绝写入，必需 sink（如 <code>/dev/null</code>）除外</td><td>探索、纯调研式 plan（不落盘 spec）</td></tr><tr><td><code>workspace-write</code></td><td>允许写入工作区根目录及后端定义的临时区域</td><td>编码、重构、性能优化</td></tr><tr><td><code>danger-full-access</code></td><td>绕过隔离</td><td>系统运维（慎用）</td></tr></tbody></table><p><strong>关于默认模式的精确说明</strong>：<code>read-only</code> 是 sandbox 的 <strong>fail-safe 默认模式</strong>（包级兜底）。预设表要区分两层：插件代码级默认只有 <code>workspace-write</code>（workspace-write + ask）和 <code>danger-full-access</code>（danger-full-access + never）两个预设，但<strong>发货的 Web 组合覆盖了整张表，实际 <code>/permission</code> 可选三个预设</strong>（另含 <code>read-only</code> + ask）。一个全新会话创建时，<code>permission/preset</code> 会被固定为 <code>workspace-write</code>。这意味着<strong>通过 <code>/permission</code> 切换预设后，当前会话的 sandbox 模式随所选预设生效</strong>。</p><p><strong>关键机制</strong>：被 sandbox 拒绝的命令，结果里携带 <code>sandbox: {mode, denied: true}</code>，DSH <strong>不静默重试</strong>——失败就是失败，模型看到结果自己调整。模型可在工具调用中加 <code>sandbox_permissions: &quot;workspace-write&quot;</code> + <code>justification</code>，系统弹出审批提示给用户，<strong>一次批准只对被问的那一次操作生效</strong>。</p><p><strong>与 plan mode 的协同</strong>（关键事实）：</p><p>plan mode <strong>不限制工具</strong>——它只是”在 plan 阶段不写代码”的<strong>软性提示词指导</strong>。官方文档明确说明：”计划模式是软性指引。沙箱模式与审批策略分别强制限制；两者都不读写计划状态，因此部署需要分别配置它们。”<code>exit_plan_mode</code> 在计划模式未激活时仍保持注册，进入或离开计划模式<strong>只改变提示词段落，绝不改变请求的工具目录</strong>。要强制限制，必须配合 sandbox：</p><ul><li>探索&#x2F;调研：<code>/plan</code> + <code>read-only</code> sandbox</li><li>落地编码：审批后切 <code>workspace-write</code></li><li><strong>注意</strong>：第 4 章的 plan 场景要在 plan 阶段把 spec 落盘到 <code>docs/specs/</code>，<code>read-only</code> 下 <code>write</code> 会被拒——这类任务直接保持 <code>workspace-write</code>（见 4.2 前置权限），<code>read-only</code> 只配纯调研。</li></ul><p><strong>简单 bug 的 sandbox 前提</strong>：即便不调 <code>/plan</code>，也需确认 sandbox 为 <code>workspace-write</code>，否则 <code>edit</code> 会被拒绝。</p><h2 id="第-3-章：工作流决策与纪律"><a href="#第-3-章：工作流决策与纪律" class="headerlink" title="第 3 章：工作流决策与纪律"></a>第 3 章：工作流决策与纪律</h2><blockquote><p>目的：一张决策树 + 一张纪律表，告诉你”什么场景走哪条路”。</p></blockquote><h3 id="3-1-主决策树"><a href="#3-1-主决策树" class="headerlink" title="3.1 主决策树"></a>3.1 主决策树</h3><blockquote><p><strong>嵌套优先级</strong>：多个分支同时命中时，按<strong>外层 → 内层</strong>组装而不是二选一——跨多轮？最外层套 <code>/goal</code>；单个里程碑复杂？内层走 <code>/plan</code>；里程碑内有独立子任务？执行层派 subagent；token 压力大是<strong>全程状态</strong>，任何分支里都随时 <code>/compact</code>（先落盘）。完整的组合案例见 4.5（跨天项目标准栈）。</p></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">任务来了</span><br><span class="line">  │</span><br><span class="line">  ├─ 简单 bug（&lt; 半天、根因清晰）？</span><br><span class="line">  │    └─ 是 → 确认 sandbox = workspace-write</span><br><span class="line">  │            → read → bash 复现 → edit → bash 测 → bash commit</span><br><span class="line">  │            （不调 /plan、不派 subagent）</span><br><span class="line">  │</span><br><span class="line">  ├─ 重构 / 新功能 / 复杂优化？</span><br><span class="line">  │    └─ 是 → 用户输 /plan</span><br><span class="line">  │              → read 上下文 → ask_user_question 澄清</span><br><span class="line">  │              → write plan 到 docs/specs/&lt;name&gt;.md</span><br><span class="line">  │              → exit_plan_mode 等审批</span><br><span class="line">  │              → 批准后: todo_write 拆 3~7 步 → 循环执行</span><br><span class="line">  │</span><br><span class="line">  ├─ 跨多轮 / 跨天任务？</span><br><span class="line">  │    └─ 是 → /goal &lt;objective&gt; 创建目标（标准组合见 4.5）</span><br><span class="line">  │</span><br><span class="line">  ├─ 长会话 token 压力大？</span><br><span class="line">  │    └─ 是 → 用户在 chat 输 /compact（idle-only）</span><br><span class="line">  │</span><br><span class="line">  ├─ 多个独立子任务可并行？</span><br><span class="line">  │    └─ 是 → subagent 工具（maxDepth=3）</span><br><span class="line">  │</span><br><span class="line">  ├─ 多阶段 / 多角度 / 跨很多文件？</span><br><span class="line">  │    └─ 是 → workflow 工具（见 6.1 案例）</span><br><span class="line">  │</span><br><span class="line">  └─ 用户明确说&quot;每轮全新 agent&quot;？</span><br><span class="line">       └─ 是 → ralph 工具（见 6.2 案例）</span><br></pre></td></tr></table></figure><h3 id="3-2-纪律速查表"><a href="#3-2-纪律速查表" class="headerlink" title="3.2 纪律速查表"></a>3.2 纪律速查表</h3><table><thead><tr><th>触发</th><th>必用</th><th>禁止</th></tr></thead><tbody><tr><td>启动任何任务</td><td>read AGENTS.md + architecture</td><td>直接动手</td></tr><tr><td>AC 歧义 &gt; 2 处</td><td><code>ask_user_question</code></td><td>自己脑补</td></tr><tr><td>复杂任务</td><td>chat 输 <code>/plan</code> + <code>exit_plan_mode</code></td><td>只口头”我会先 plan”</td></tr><tr><td>任务 ≥ 3 步</td><td><code>todo_write</code>（<strong>整列表替换</strong>）</td><td>一口气干完不勾选</td></tr><tr><td>跨多轮</td><td><code>/goal &lt;obj&gt;</code></td><td>单轮能做完的事硬上 goal</td></tr><tr><td>长会话</td><td>用户 <code>/compact</code></td><td>回合中调（busy）</td></tr><tr><td>改架构</td><td>edit decisions.md</td><td>默默改了不记录</td></tr><tr><td>出事故</td><td>48h 内 write postmortems</td><td>拖延或跳过</td></tr><tr><td>子 agent 问用户</td><td>把问题写进最终结果</td><td>子 agent 调 <code>ask_user_question</code></td></tr><tr><td>派子代理</td><td>任务决策完备再派；能自包含就 spawn，离不开上下文就 fork</td><td>指望子代理来问人澄清</td></tr><tr><td>跨轮记忆</td><td>AC &#x2F; 进展 &#x2F; 决策落盘到 specs &#x2F; decisions.md</td><td>只靠对话记录当跨轮记忆</td></tr><tr><td>goal 自动轮次</td><td>只执行已批准的 plan</td><td>无人值守轮次里等 <code>exit_plan_mode</code> 审批</td></tr><tr><td>sandbox 写文件</td><td>确认当前会话 preset（发货默认 workspace-write，可直接写）；只读调研切 read-only</td><td>上来就 danger-full-access</td></tr><tr><td>workflow &#x2F; ralph</td><td>仅在用户明确要求时使用</td><td>普通任务硬上</td></tr></tbody></table><h2 id="第-4-章：标准模式场景实操"><a href="#第-4-章：标准模式场景实操" class="headerlink" title="第 4 章：标准模式场景实操"></a>第 4 章：标准模式场景实操</h2><blockquote><p>目的：7 个场景——4.1~4.3 为单机制场景，4.4 起进入组合形态（4.5 跨天标准栈、4.7 委派选型范式）。每场景给”用户消息 + 指令序列 + 真实约束”。<br>统一模板：适用条件 → 前置权限 → 用户消息 → 指令序列 → 验收 → 回滚 → 常见坑。<br>示例中的测试命令（jest &#x2F; pytest）仅为示意，实操时替换为项目实际命令。</p></blockquote><h3 id="4-1-修复-Bug（无-plan）"><a href="#4-1-修复-Bug（无-plan）" class="headerlink" title="4.1 修复 Bug（无 plan）"></a>4.1 修复 Bug（无 plan）</h3><p><strong>适用</strong>：单文件改、AC 清晰、根因明确。</p><p><strong>前置权限</strong>：<code>workspace-write</code>（必须，否则 <code>edit</code> 被拒）</p><p><strong>用户消息</strong>：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Bug: &lt;一句话&gt;</span><br><span class="line">复现: &lt;可执行命令&gt;</span><br><span class="line">期望: &lt;...&gt;</span><br><span class="line">实际: &lt;...&gt;</span><br><span class="line">日志: &lt;paste&gt;</span><br></pre></td></tr></table></figure><p><strong>指令序列</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">read 源文件</span><br><span class="line">read 相关测试</span><br><span class="line">bash pytest tests/xxx -k &quot;复现条件&quot;  # 复现失败（红灯）</span><br><span class="line">read 定位根因</span><br><span class="line">edit 最小修复</span><br><span class="line">edit 补回归测试</span><br><span class="line">bash pytest 全量                       # 绿灯</span><br><span class="line">bash git add + commit -m &quot;fix(scope): ...&quot;</span><br></pre></td></tr></table></figure><p><strong>关键纪律</strong>：</p><ul><li><strong>先写失败测试，再改</strong>——避免”修了一个 bug 引入另一个”</li><li><strong>最小修改</strong>——不改无关代码，不”顺手重构”</li><li><strong>一次 PR 只修一个 bug</strong></li></ul><p><strong>验收</strong>：全量测试绿灯 + 回归测试覆盖原 bug。</p><p><strong>回滚</strong>：<code>git revert &lt;commit&gt;</code>。</p><p><strong>常见坑</strong>：sandbox 为 <code>read-only</code> 时 <code>edit</code> 被拒——先 <code>/permission</code> 切 <code>workspace-write</code>。</p><h3 id="4-2-开发新功能（plan-mode）"><a href="#4-2-开发新功能（plan-mode）" class="headerlink" title="4.2 开发新功能（plan mode）"></a>4.2 开发新功能（plan mode）</h3><p><strong>适用</strong>：新功能 + 需要设计 + 跨多个文件。</p><p><strong>对应文件</strong>：<code>docs/specs/feature-&lt;name&gt;.md</code></p><p><strong>前置权限</strong>：<code>workspace-write</code>（plan 阶段就要落盘 spec 文件，<code>read-only</code> 下 <code>write</code> 会被 sandbox 拒绝；plan mode 软约束 + <code>exit_plan_mode</code> 人工审批已构成双保险。<code>read-only</code> 仅用于不写文件的纯调研，见 2.4）</p><p><strong>用户消息</strong>：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/plan 新功能: &lt;一句话&gt;</span><br><span class="line">用户故事: 作为 &lt;角色&gt;，我希望 &lt;动作&gt;，以便 &lt;价值&gt;</span><br></pre></td></tr></table></figure><p><strong>指令序列</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">用户输 /plan → 进入 plan mode</span><br><span class="line">↓</span><br><span class="line">read docs/architecture/overview.md</span><br><span class="line">read 已有 docs/specs/*.md（防重复设计）</span><br><span class="line">read 相关模块 docstring</span><br><span class="line">ask_user_question 澄清 AC / 边界 / 约束（3 个关键问题）</span><br><span class="line">write plan 到 docs/specs/feature-&lt;name&gt;.md</span><br><span class="line">  （必 markdown + # 标题，否则 exit_plan_mode 失败）</span><br><span class="line">exit_plan_mode → 提交评审</span><br><span class="line">↓</span><br><span class="line">用户审批 → plan mode 关闭</span><br><span class="line">↓</span><br><span class="line">todo_write 拆 3~7 步</span><br><span class="line">可选: subagent (run_in_background: true) × N 并行写独立模块</span><br><span class="line">循环: edit 改码 → bash 测 → edit plan checkbox → bash commit</span><br><span class="line">edit 填 plan &quot;最终结果&quot; 段</span><br><span class="line">edit CHANGELOG.md</span><br></pre></td></tr></table></figure><p><strong>关键约束</strong>：</p><ul><li>plan 参数<strong>必 markdown + <code>#</code> 标题</strong></li><li>子 agent <strong>不能调 <code>ask_user_question</code></strong>——必须把问题写进最终结果</li><li>subagent 嵌套 ≤ 3 层（<code>maxDepth</code> 默认 3）</li></ul><p><strong>验收</strong>：plan 中所有 AC 勾选 + 全量测试绿 + CHANGELOG 更新。</p><p><strong>回滚</strong>：按 plan 中每步独立 commit 逐个 revert。</p><p><strong>常见坑</strong>：plan 文件缺少 <code>#</code> 标题导致 <code>exit_plan_mode</code> 失败。</p><h3 id="4-3-实施重构（plan-mode）"><a href="#4-3-实施重构（plan-mode）" class="headerlink" title="4.3 实施重构（plan mode）"></a>4.3 实施重构（plan mode）</h3><p><strong>适用</strong>：跨模块重构、行为不变、需要分步执行。</p><p><strong>对应文件</strong>：<code>docs/specs/refactor-&lt;title&gt;.md</code></p><p><strong>前置权限</strong>：<code>workspace-write</code>（理由同 4.2：plan 阶段需落盘 spec 文件）</p><p><strong>用户消息</strong>：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/plan 重构: &lt;bad smell 一句话&gt;</span><br><span class="line">按 AGENTS.md 流程</span><br></pre></td></tr></table></figure><p><strong>指令序列</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">用户输 /plan → 进入 plan mode</span><br><span class="line">↓</span><br><span class="line">read 上下文</span><br><span class="line">ask_user_question 澄清: 重构范围 / 兼容性 / 性能底线</span><br><span class="line">write plan 到 docs/specs/refactor-&lt;title&gt;.md</span><br><span class="line">  plan 必含:</span><br><span class="line">  - 动机 + 证据</span><br><span class="line">  - &quot;行为 100% 不变&quot;承诺 + 测试基线</span><br><span class="line">  - 分步方案（每步独立可回滚）</span><br><span class="line">  - 风险 + 回滚方式</span><br><span class="line">exit_plan_mode → 提交评审</span><br><span class="line">↓</span><br><span class="line">todo_write 拆 N 步</span><br><span class="line">// 每步: edit → bash pytest 全量 → edit 勾选 plan → bash commit</span><br><span class="line">// 关键：每步独立 commit</span><br><span class="line">↓</span><br><span class="line">edit 填 plan &quot;最终结果&quot; 段</span><br></pre></td></tr></table></figure><p><strong>关键约束</strong>：</p><ul><li>plan 必含”行为不变”承诺 + 测试基线（覆盖率数字写明）</li><li><strong>每步独立 commit</strong>——失败可单独 revert</li><li>禁止夹带 feat——<code>refactor:</code> 和 <code>feat:</code> 必须拆 PR</li></ul><p><strong>验收</strong>：全量测试绿 + 行为不变 + 覆盖率不降。</p><p><strong>回滚</strong>：<code>git revert &lt;step-commit&gt;</code> 单独回滚任一步。</p><h3 id="4-4-优化性能（plan-mode-subagent-并行）"><a href="#4-4-优化性能（plan-mode-subagent-并行）" class="headerlink" title="4.4 优化性能（plan mode + subagent 并行）"></a>4.4 优化性能（plan mode + subagent 并行）</h3><p><strong>适用</strong>：需量化对比 + 多方案实验。</p><p><strong>对应文件</strong>：<code>docs/specs/perf-&lt;topic&gt;.md</code></p><p><strong>前置权限</strong>：<code>workspace-write</code>（理由同 4.2：plan 阶段需落盘 spec 文件与基线数字）</p><p><strong>用户消息</strong>：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">/plan 优化: &lt;指标 + 现状&gt;</span><br><span class="line">目标: &lt;具体数值&gt;</span><br><span class="line">约束: &lt;不改 API 协议 / 不引入新依赖&gt;</span><br></pre></td></tr></table></figure><p><strong>指令序列</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">用户输 /plan → 进入 plan mode</span><br><span class="line">↓</span><br><span class="line">read docs/architecture/ + 相关 specs/decisions</span><br><span class="line">ask_user_question 澄清目标 / 约束 / 可接受风险</span><br><span class="line">bash python bench/xxx.py            # 跑基线</span><br><span class="line">数字写入 docs/specs/perf-&lt;topic&gt;.md</span><br><span class="line">write plan（含候选方案对比表 + 验证方法）</span><br><span class="line">exit_plan_mode → 提交评审</span><br><span class="line">↓</span><br><span class="line">用户审批</span><br><span class="line">↓</span><br><span class="line">subagent × N 并行试方案（run_in_background: true）</span><br><span class="line">  每个子 agent: 独立改一份 → 输出 &#123;diff, benchmark 结果&#125;</span><br><span class="line">主代理: 等子 agent 完成通知（必要时 send_message 追问）→ 选最优</span><br><span class="line">↓</span><br><span class="line">edit 落地（用最优方案）→ bash 测 → bash commit</span><br><span class="line">// 保留回滚开关: feature flag</span><br><span class="line">edit 填 plan &quot;最终结果&quot; 段</span><br></pre></td></tr></table></figure><p><strong>关键约束</strong>：</p><ul><li>每个 subagent 任务必须<strong>足够独立</strong>——避免整合成本 &gt; 收益</li><li>后台 subagent 的结果靠<strong>完成通知</strong>收集（<code>job_output</code>&#x2F;<code>job_kill</code> 只适用于 <code>bash</code> 后台任务，不适用于 subagent）</li><li>保留回滚开关（feature flag &#x2F; 配置项）</li><li><strong>落地前后必有数字对比</strong>——没基线就不算”优化”</li></ul><p><strong>验收</strong>：实际指标 ≤ 目标 + benchmark 数字记录在 plan。</p><p><strong>回滚</strong>：关闭 feature flag 或 <code>git revert</code>。</p><h3 id="4-5-跨天项目标准栈：goal-plan-specs"><a href="#4-5-跨天项目标准栈：goal-plan-specs" class="headerlink" title="4.5 跨天项目标准栈：goal + plan + specs"></a>4.5 跨天项目标准栈：goal + plan + specs</h3><p><strong>适用</strong>：一个目标跨多轮会话 &#x2F; 跨多天才能完成——这是中型项目最常见的大任务形态，也是 goal、plan、specs 三者的<strong>标准组合</strong>，而非三个孤立功能。</p><p><strong>分层职责</strong>：</p><ul><li><code>/goal</code> 是<strong>跨轮总线</strong>——记住”最终要什么”，持久化到 session log，默认 256 轮预算；</li><li><code>/plan</code> 是<strong>单里程碑交付单元</strong>——每次有人值守时交付一个可审批、可回滚的里程碑；</li><li><code>docs/specs/</code> 文件是<strong>跨轮记忆</strong>——会话会关、历史会被 <code>/compact</code> 折叠，只有落盘的进展可靠。</li></ul><p><strong>用户消息</strong>：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/goal 完成订单模块重构：拆 3 个里程碑，行为不变，全量测试保持绿</span><br></pre></td></tr></table></figure><p><strong>完整流程</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">用户: /goal &lt;obj&gt; → 创建 active 目标（持久化到 session log）</span><br><span class="line">↓</span><br><span class="line">// Day 1（有人值守）:</span><br><span class="line">用户: /plan 里程碑 1</span><br><span class="line">DSH: ask_user_question 澄清 AC → plan 写入 docs/specs/refactor-order.md</span><br><span class="line">用户: 审批通过（plan mode 关闭）</span><br><span class="line">DSH: todo_write 拆步 → 执行 → 全量绿 → commit</span><br><span class="line">     → edit spec &quot;进展记录&quot; 段: 已完成什么 / 下一步 / 已知的坑   ← 下一轮的恢复点</span><br><span class="line">→ 收工（目标保持 active，会话可关）</span><br><span class="line">↓</span><br><span class="line">// Day 2:</span><br><span class="line">session resume → 目标 active 但默认 disarmed</span><br><span class="line">用户: /goal resume → 重新武装（受 256 轮上限约束）</span><br><span class="line">DSH: read docs/specs/refactor-order.md 的&quot;进展记录&quot;段</span><br><span class="line">用户: /plan 里程碑 2 → 同 Day 1 循环</span><br><span class="line">↓</span><br><span class="line">// 长会话中随时:</span><br><span class="line">用户: /compact（先确认 AC / 进展 / 决策已落盘到 specs 或 decisions.md）</span><br><span class="line">↓</span><br><span class="line">// 阻塞时:</span><br><span class="line">goal 进入 blocked 阶段（带 lower-kebab-case policy code，如 provider-limit / budget-exhausted）</span><br><span class="line">↓</span><br><span class="line">// 完成（注意：/goal 没有 complete 子命令，complete 只能由模型经 update_goal 完成）:</span><br><span class="line">DSH: update_goal complete → edit spec &quot;最终结果&quot; 段</span><br><span class="line">用户: /goal clear（历史保留在 session log）</span><br></pre></td></tr></table></figure><p><strong>组合纪律</strong>（每条都对应一个真实机制约束）：</p><ol><li><strong><code>/compact</code> 前先落盘</strong>——折叠只保留总结，细节只能靠 session log 重放找回；AC、进展、决策先写进 specs &#x2F; decisions.md 再压。</li><li><strong>无人值守的轮次不碰 <code>exit_plan_mode</code></strong>——plan 审批走 user-questions 通道、必须等人回答，会成为自动轮次的阻塞点；plan 审批安排在有人值守的里程碑边界，自动轮次内只执行已批准的 plan。</li><li><strong>澄清完再派子代理</strong>——子代理不能调 <code>ask_user_question</code>（调用会收到错误，问题只能写进最终结果）；AC 澄清在主代理 plan 阶段完成，派出去的子任务必须决策完备。</li><li><strong>每会话一个当前 goal</strong>——<code>active</code> 目标在新建前必须 pause &#x2F; complete &#x2F; clear；session resume &#x2F; fork 后默认 disarmed，必须 <code>/goal resume</code>；人类消息<strong>不增加 Round 数</strong>。</li></ol><p><strong>验收</strong>：目标 complete + spec”最终结果”段更新 + 全量测试绿。</p><p><strong>常见坑</strong>：resume 后忘记 <code>/goal resume</code>，以为目标还在推进；只靠聊天记录当跨轮记忆，<code>/compact</code> 后细节丢失。</p><h3 id="4-6-管理长会话（-compact）"><a href="#4-6-管理长会话（-compact）" class="headerlink" title="4.6 管理长会话（/compact）"></a>4.6 管理长会话（<code>/compact</code>）</h3><p><strong>适用</strong>：上下文接近 token 上限、或模型开始”忘事”。</p><p><strong>用户消息</strong>：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/compact</span><br></pre></td></tr></table></figure><p><strong>完整流程</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">// 会话上下文变长</span><br><span class="line">用户评估: 接近 token 上限 / 模型表现下降</span><br><span class="line">↓</span><br><span class="line">/compact（无参数）</span><br><span class="line">  DSH 检查: idle 且无待处理 compact → 执行</span><br><span class="line">  行为:</span><br><span class="line">    - 把&quot;较老一段历史&quot;折叠为一条 user 角色总结</span><br><span class="line">    - 保留最近历史</span><br><span class="line">    - 原事件保留在 session log（重放可还原）</span><br><span class="line">  报告: 压缩了多少条目、节省了多少 token</span><br><span class="line">↓</span><br><span class="line">继续工作</span><br></pre></td></tr></table></figure><p><strong>与自动压缩的关系</strong>：DSH 默认带 <code>dsh-compaction-basic</code> 后端，token 压力到阈值时<strong>自动</strong>触发（默认阈值是 context window 的 0.8）。<code>/compact</code> 是”提前手动”。</p><p><strong>关键约束</strong>：</p><ul><li><strong>idle-only</strong>——模型回合中调用返回 <code>busy</code></li><li><strong>不接受参数</strong>——<code>/compact &lt;anything&gt;</code> 会被拒</li><li><strong>不消耗模型回合</strong>——但会做一次辅助请求生成总结</li><li><strong>可重复</strong>——压完觉得还长，可以再 <code>/compact</code> 一次</li></ul><h3 id="4-7-组合范式：subagent-还是-subagent-fork"><a href="#4-7-组合范式：subagent-还是-subagent-fork" class="headerlink" title="4.7 组合范式：subagent 还是 subagent_fork"></a>4.7 组合范式：subagent 还是 subagent_fork</h3><p>标准模式注册了<strong>两个</strong>委派工具，一句话选型：<strong>任务能脱离当前对话说清楚就 spawn，说不清楚就 fork</strong>。</p><table><thead><tr><th></th><th><code>subagent</code>（spawn）</th><th><code>subagent_fork</code></th></tr></thead><tbody><tr><td>上下文</td><td>全新，只看到 prompt</td><td><strong>继承父会话全部历史</strong></td></tr><tr><td>模型</td><td>可选 <code>provider</code> &#x2F; <code>model</code> &#x2F; <code>reasoning_effort</code></td><td>锁定父路由（保留 KV cache 复用）</td></tr><tr><td>典型用途</td><td>隔离执行：并行写独立模块、并行试方案（见 4.4）</td><td>上下文内委派：”就刚才这堆改动做一次评审””基于当前讨论查一个分支问题”</td></tr><tr><td>代价</td><td>prompt 要自带完整上下文，写不清就做歪</td><td>继承冗余历史，token 成本高</td></tr></tbody></table><p><strong>通用原则</strong>：这等同于团队里的交接决策——能写成自包含 ticket 的活交给陌生人，离不开现场讨论的活拉人结对。无论哪种，<strong>子代理都不能问人，派单即终稿</strong>（见 4.5 组合纪律 3）。</p><p><strong>约束沿用</strong>：<code>maxDepth=3</code>；后台模式（<code>run_in_background: true</code>）结果靠完成通知回收，<code>send_message</code> 可继续 steer。</p><h2 id="第-5-章：其他模式实操"><a href="#第-5-章：其他模式实操" class="headerlink" title="第 5 章：其他模式实操"></a>第 5 章：其他模式实操</h2><blockquote><p>目的：补齐 PTC &#x2F; 极简 &#x2F; 创造模式的最小案例。如果你只用标准模式，可跳过本章。</p></blockquote><h3 id="5-1-PTC-模式：用-TypeScript-程序批量组合工具调用"><a href="#5-1-PTC-模式：用-TypeScript-程序批量组合工具调用" class="headerlink" title="5.1 PTC 模式：用 TypeScript 程序批量组合工具调用"></a>5.1 PTC 模式：用 TypeScript 程序批量组合工具调用</h3><p><strong>适用</strong>：需要把 5~10 个工具调用串成一次操作，减少往返。</p><p><strong>核心机制</strong>：PTC 模式在标准模式全部工具之外增加 <code>run_code</code> 工具，模型不再每步发 tool-call，而是写一段 TypeScript 程序一次性提交，由沙箱运行时执行。</p><p><strong>最小案例</strong>：批量读取 3 个文件并汇总关键信息。</p><p>用户消息（<strong>新建 PTC preset 会话后</strong>输入——preset 在会话创建时锁定，见 2.1；不要在现有标准会话里发这条）：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">用 PTC 模式：读取 src/api/auth.ts、src/api/user.ts、src/api/order.ts，</span><br><span class="line">分别提取每个文件的 export 函数名和它们调用的外部依赖，</span><br><span class="line">汇总成一个表格。</span><br></pre></td></tr></table></figure><p>预期 DSH 行为：调用 <code>run_code</code>，提交一段 TypeScript 程序，一次性完成 3 次 <code>read</code> + 3 次分析，返回结构化汇总。而不是标准模式下的 6 次往返 tool-call。</p><p><strong>关键约束</strong>：</p><ul><li>PTC 模式<strong>无 workflow 工具</strong>（自 v0.1.2-alpha.4 起）</li><li>模式在会话启动时锁定，发出第一条消息后无法切换——<strong>但可以开一个新会话选不同的 Preset</strong></li><li><code>run_code</code> 在沙箱 worker thread 中执行</li></ul><p><strong>验收</strong>：返回结构化汇总 + 工具调用次数显著少于标准模式。</p><h3 id="5-2-极简模式：最小环境下的单文件操作"><a href="#5-2-极简模式：最小环境下的单文件操作" class="headerlink" title="5.2 极简模式：最小环境下的单文件操作"></a>5.2 极简模式：最小环境下的单文件操作</h3><p><strong>适用</strong>：训练 &#x2F; 基准测试 &#x2F; 单文件快速修改。</p><p><strong>工具清单</strong>：仅持久 PTY Shell <strong>一个工具</strong>（POSIX 为 <code>bash</code>，Windows 为 <code>pwsh</code>）。无文件编辑工具、无网页检索、无 Skill、无子 Agent、无规划模式、无目标、无上下文压缩。</p><p><strong>最小案例</strong>：修改一个配置文件并验证。</p><p>用户消息（<strong>新建极简 preset 会话后</strong>输入）：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">把 config/env.json 的 apiTimeout 从 30000 改成 60000，</span><br><span class="line">然后运行 node -e &quot;console.log(require(&#x27;./config/env.json&#x27;).apiTimeout)&quot;</span><br><span class="line">验证结果。</span><br></pre></td></tr></table></figure><p>预期 DSH 行为：<code>bash</code> 用 <code>sed -i &#39;s/&quot;apiTimeout&quot;: 30000/&quot;apiTimeout&quot;: 60000/&#39; config/env.json</code> 改文件 → <code>bash</code> 执行验证。两步完成，全部通过 shell。</p><blockquote><p>⚠️ <code>sed -i</code> 在 GNU sed（Linux）与 BSD sed（macOS）上语法不同：BSD&#x2F;macOS 必须写成 <code>sed -i &#39;&#39; &#39;s/.../.../&#39; file</code>，否则 <code>-i</code> 后的 <code>s/.../.../</code> 会被当作备份文件后缀。跨平台项目建议改用 Node 或 <code>perl -pi -e</code> 改写。</p></blockquote><p><strong>关键约束</strong>：</p><ul><li>持久 shell：状态在多次调用间保持，工作目录和变量不重置</li><li>没有 <code>edit</code>&#x2F;<code>write</code> 工具——一切文件改动都走 shell 命令，模型需自己保证替换的精确性</li><li>shell 后端仍消费宿主 sandbox policy——写文件受当前 sandbox 模式约束，<code>read-only</code> 下 <code>sed -i</code> 同样会被拒</li><li><strong>无上下文压缩，不适合长任务</strong>——长会话会超出模型窗口</li></ul><p><strong>验收</strong>：验证命令输出 <code>60000</code>。</p><h3 id="5-3-创造模式：运行时自检与-preset-创作"><a href="#5-3-创造模式：运行时自检与-preset-创作" class="headerlink" title="5.3 创造模式：运行时自检与 preset 创作"></a>5.3 创造模式：运行时自检与 preset 创作</h3><p><strong>适用</strong>：写自定义 preset &#x2F; 二次开发 DSH。</p><p><strong>工具清单</strong>：标准模式 + <code>cordis_*</code> 运行时自检工具集，让模型直接读写自身运行的 Harness 组装。</p><p><strong>最小案例</strong>：创建一个自定义 preset，继承标准模式但移除 <code>web_search</code> 和 <code>web_fetch</code>。</p><p>用户消息（<strong>新建创造 preset 会话后</strong>输入）：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">用创造模式：创建一个名为 &quot;no-web&quot; 的 preset，</span><br><span class="line">继承标准模式的全部工具，但移除 web_search 和 web_fetch。</span><br><span class="line">写到 .agent-presets/no-web/ 目录。</span><br></pre></td></tr></table></figure><p>预期 DSH 行为：调用 <code>cordis_*</code> 工具检查当前运行时工具注册表 → 复制标准模式的组装并删去 web 工具行 → 在 <code>${DSH_HOME:-$HOME/.dsh}/.agent-presets/no-web/</code> 下生成 <code>agent.cordis.yml</code> + <code>preset.yml</code>（<strong>一个 preset 一个目录</strong>，不是单个 yml 文件）。<strong>不要改动 shipped preset 的安装目录</strong>——升级会被覆盖，应复制后改副本。</p><p><strong>关键约束</strong>：</p><ul><li>创造模式的 <code>cordis_*</code> 工具<strong>等同于 shell 级访问权限</strong>（<code>cordis_mount</code> 会对 live 运行时执行模型写的 JavaScript）——谨慎使用</li><li>preset 是 <code>agent.cordis.yml</code> 组装文件，不同 preset 的会话在同一进程中隔离运行</li><li>新 preset 需要<strong>新开会话</strong>才能在 UI 选择器中看到</li></ul><h2 id="第-6-章：高级工具——workflow-与-ralph"><a href="#第-6-章：高级工具——workflow-与-ralph" class="headerlink" title="第 6 章：高级工具——workflow 与 ralph"></a>第 6 章：高级工具——workflow 与 ralph</h2><blockquote><p><strong>本章说明</strong>：workflow 和 ralph 是<strong>工具而非模式</strong>，在标准模式下即可使用。之所以独立成章，是因为其复杂度高于日常场景，<strong>仅在用户明确要求时使用</strong>。</p></blockquote><h3 id="6-1-workflow：多阶段-多角度编排"><a href="#6-1-workflow：多阶段-多角度编排" class="headerlink" title="6.1 workflow：多阶段 &#x2F; 多角度编排"></a>6.1 workflow：多阶段 &#x2F; 多角度编排</h3><p><strong>适用</strong>：跨多个文件的审计、一次迁移、多角度研究。一两项委派应使用普通 subagent。</p><p><strong>核心机制</strong>：模型运行 JavaScript 编排脚本，把工作委派给多个 subagent，并返回脚本的最终 JSON 值。脚本可用 <code>agent()</code>、<code>parallel()</code>、<code>pipeline()</code>、<code>phase()</code> 和 <code>log()</code>。</p><p><strong>最小案例</strong>：并行审查 3 个文件的正确性。</p><p>用户消息：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">用 workflow 并行审查 src/a.ts、src/b.ts、src/c.ts 的正确性问题。</span><br><span class="line">每个文件一个 subagent，最后汇总。</span><br></pre></td></tr></table></figure><p>预期 DSH 行为：提交 workflow 工具调用，script 中包含：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> reviews = <span class="keyword">await</span> <span class="title function_">parallel</span>([</span><br><span class="line">  <span class="function">() =&gt;</span> <span class="title function_">agent</span>(<span class="string">&#x27;Review src/a.ts for correctness&#x27;</span>),</span><br><span class="line">  <span class="function">() =&gt;</span> <span class="title function_">agent</span>(<span class="string">&#x27;Review src/b.ts for correctness&#x27;</span>),</span><br><span class="line">  <span class="function">() =&gt;</span> <span class="title function_">agent</span>(<span class="string">&#x27;Review src/c.ts for correctness&#x27;</span>),</span><br><span class="line">]);</span><br><span class="line"><span class="keyword">return</span> &#123; reviews &#125;;</span><br></pre></td></tr></table></figure><p><strong>关键约束</strong>：</p><ul><li>父级轮次<strong>等待所有委派结束</strong>；取消或异常返回错误，不报部分成功</li><li>模型<strong>只看到最终结果</strong>，永远看不到中间子 agent 消息</li><li><code>maxResultChars</code> 默认 <strong>50000</strong>，更长 JSON 被截断</li></ul><h3 id="6-2-ralph：每轮全新-agent-迭代"><a href="#6-2-ralph：每轮全新-agent-迭代" class="headerlink" title="6.2 ralph：每轮全新 agent 迭代"></a>6.2 ralph：每轮全新 agent 迭代</h3><p><strong>适用</strong>：用户<strong>明确要求</strong>“每轮全新 agent 迭代”。普通长任务用 <code>/goal</code>，有界委派用 subagent &#x2F; workflow。</p><p><strong>核心机制</strong>：固定前台循环——每轮一个全新子 agent 针对同一个不可变目标工作，只传递上一轮的 bounded structured report 和共享工作区状态。</p><p><strong>最小案例</strong>：一个需要多轮迭代才能稳定的算法优化。</p><p>用户消息：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">用 ralph 迭代优化 src/algo.ts 的性能，</span><br><span class="line">目标：benchmark 从 120ms 降到 80ms 以下。</span><br><span class="line">最多 10 轮。</span><br></pre></td></tr></table></figure><p>预期 DSH 行为：调用 <code>ralph({ objective: &quot;...&quot;, maxRounds: 10 })</code>，阻塞直到整个运行结束。每轮新 agent 读上一轮报告继续推进。</p><p><strong>关键约束</strong>：</p><ul><li>子 agent 的 <code>complete</code> &#x2F; <code>blocked</code> 报告<strong>不经过独立验证</strong>——worker 自报完成</li><li>父对话和之前子会话<strong>永远不复制到新一轮</strong></li><li><code>maxRounds</code> 的配置值既是默认也是单次调用的上限：包级默认 <strong>256</strong>，但 shipped 的 standard &#x2F; PTC preset 均配为 <strong>64</strong>——Web GUI 里实际默认与上限是 64（需更高上限要改 preset 配置）</li><li>返回 <code>complete</code> &#x2F; <code>blocked</code> &#x2F; <code>budget-limited</code>，携带最后一轮报告和轮数</li></ul><h2 id="第-7-章：plan-spec-自动检查"><a href="#第-7-章：plan-spec-自动检查" class="headerlink" title="第 7 章：plan&#x2F;spec 自动检查"></a>第 7 章：plan&#x2F;spec 自动检查</h2><blockquote><p><strong>重要说明</strong>：plan&#x2F;spec 章节完整性检查不是 DSH 内建功能，但自 v0.1.5 起发行版<strong>原生内置</strong> Claude Code 兼容 hooks 桥（<code>@deepseek-ai/dsh-hooks-claude-code</code>），可直接在 <code>PreToolUse</code> 拦截 <code>exit_plan_mode</code> 实现检查，无需第三方插件；社区插件在此之上提供项目层自动发现等增强。CI 门禁为另一独立方案。</p></blockquote><h3 id="7-1-方案总览"><a href="#7-1-方案总览" class="headerlink" title="7.1 方案总览"></a>7.1 方案总览</h3><table><thead><tr><th>方案</th><th>实现方式</th><th>拦截时机</th><th>适用阶段</th></tr></thead><tbody><tr><td><strong>A：原生 hooks 拦截</strong></td><td>官方 <code>@deepseek-ai/dsh-hooks-claude-code</code>（随发行版内置）</td><td><code>PreToolUse</code> 匹配 <code>exit_plan_mode</code></td><td>会话内，plan 提交时</td></tr><tr><td><strong>A+：社区 hooks 增强</strong></td><td>社区插件 <code>@dennisrongo/dsh-hooks</code></td><td>同上</td><td>同上（要项目层自动发现时选它）</td></tr><tr><td><strong>B：CI 门禁</strong></td><td>GitHub Actions job</td><td>PR 提交时</td><td>代码提交后</td></tr><tr><td><strong>C：专用插件</strong></td><td>社区插件 <code>@hilariouhiss/dsh-plan-doc</code></td><td><code>exit_plan_mode</code> 时渲染侧边面板</td><td>会话内，人工审查</td></tr></tbody></table><h3 id="7-2-方案-A：原生-hooks-拦截-plan-提交"><a href="#7-2-方案-A：原生-hooks-拦截-plan-提交" class="headerlink" title="7.2 方案 A：原生 hooks 拦截 plan 提交"></a>7.2 方案 A：原生 hooks 拦截 plan 提交</h3><p>官方桥 <code>dsh-hooks-claude-code</code> 复用 Claude Code 的 hooks 协议，把事件接到 DSH 的生命周期缝上。关键事件：</p><table><thead><tr><th>事件</th><th>DSH 事件缝</th><th>能力</th></tr></thead><tbody><tr><td><code>PreToolUse</code></td><td><code>tools/pre-execute</code></td><td>工具执行前允许&#x2F;拒绝&#x2F;询问</td></tr><tr><td><code>PostToolUse</code></td><td><code>tools/post-execute</code></td><td>阻断已结算结果或附加上下文</td></tr><tr><td><code>UserPromptSubmit</code></td><td><code>agent/pre-step</code></td><td>拒绝步骤或附加上下文</td></tr></tbody></table><p><strong>落地步骤</strong>：</p><ol><li>在 profile 的 cordis 组合中挂载官方桥（在 <code>$DSH_HOME/profiles/web/cordis.patch.yml</code> 追加一行），<strong>显式</strong>指定配置文件（原生桥无自动发现）：</li></ol><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">&#x27;@deepseek-ai/dsh-hooks-claude-code&#x27;</span></span><br><span class="line">  <span class="attr">config:</span></span><br><span class="line">    <span class="attr">configPath:</span> <span class="string">./hooks.json</span>   <span class="comment"># 也接受&quot;hooks 键持有配置&quot;的 settings 文件</span></span><br><span class="line">    <span class="attr">projectDir:</span> <span class="string">.</span></span><br></pre></td></tr></table></figure><ol start="2"><li>创建 <code>hooks.json</code>：</li></ol><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;PreToolUse&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;matcher&quot;</span><span class="punctuation">:</span> <span class="string">&quot;exit_plan_mode&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;hooks&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;command&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;command&quot;</span><span class="punctuation">:</span> <span class="string">&quot;node \&quot;$&#123;CLAUDE_PROJECT_DIR&#125;/scripts/check-plan-sections.mjs\&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;timeout&quot;</span><span class="punctuation">:</span> <span class="number">10</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><ol start="3"><li>编写检查脚本 <code>scripts/check-plan-sections.mjs</code>：</li></ol><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 从 stdin 读取 JSON payload</span></span><br><span class="line"><span class="keyword">let</span> input = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">process.<span class="property">stdin</span>.<span class="title function_">on</span>(<span class="string">&#x27;data&#x27;</span>, <span class="function">(<span class="params">chunk</span>) =&gt;</span> &#123; input += chunk; &#125;);</span><br><span class="line">process.<span class="property">stdin</span>.<span class="title function_">on</span>(<span class="string">&#x27;end&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">const</span> payload = <span class="title class_">JSON</span>.<span class="title function_">parse</span>(input);</span><br><span class="line">  <span class="keyword">const</span> plan = payload.<span class="property">tool_input</span>?.<span class="property">plan</span> || <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">  <span class="keyword">const</span> required = [<span class="string">&#x27;## 目标&#x27;</span>, <span class="string">&#x27;## 验收标准&#x27;</span>, <span class="string">&#x27;## 实施步骤&#x27;</span>, <span class="string">&#x27;## 风险与回滚&#x27;</span>];</span><br><span class="line">  <span class="keyword">const</span> missing = required.<span class="title function_">filter</span>(<span class="function">(<span class="params">s</span>) =&gt;</span> !plan.<span class="title function_">includes</span>(s));</span><br><span class="line">  <span class="keyword">if</span> (missing.<span class="property">length</span> &gt; <span class="number">0</span>) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">`Plan 缺少章节：<span class="subst">$&#123;missing.join(<span class="string">&#x27;、&#x27;</span>)&#125;</span>。请补齐后重新提交。`</span>);</span><br><span class="line">    process.<span class="title function_">exit</span>(<span class="number">2</span>); <span class="comment">// Exit 2 = 阻断，stderr 作为反馈交给模型</span></span><br><span class="line">  &#125;</span><br><span class="line">  process.<span class="title function_">exit</span>(<span class="number">0</span>);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p><strong>工作原理</strong>：钩子脚本从 <strong>stdin</strong> 接收 JSON payload（含 <code>tool_input</code>），取 plan 内容检查必需章节。缺失时以 <strong>Exit 2</strong> 返回，<strong>stderr</strong> 中的提示信息作为反馈交给模型，模型自动修订 plan 后重新调用 <code>exit_plan_mode</code>，钩子重新校验。</p><p><strong>路径两个坑</strong>：</p><ul><li>钩子命令的<strong>工作目录是会话 cwd，不是 <code>projectDir</code></strong>——<code>projectDir</code> 只喂 <code>${CLAUDE_PROJECT_DIR}</code> 变量替换和同名环境变量，所以脚本路径要用 <code>${CLAUDE_PROJECT_DIR}</code> 锚定（如上例），裸写相对路径在会话目录 ≠ 项目根时找不到脚本。</li><li><code>configPath: ./hooks.json</code> 的相对基准是 <strong>dsh 宿主进程的启动目录</strong>，多工作区混用时建议写绝对路径。</li></ul><p><strong>原生桥的两个边界</strong>：<code>PreToolUse</code> 的 <code>deny</code> &#x2F; <code>ask</code> 生效，但 <code>allow</code> <strong>不预批准</strong>、<code>updatedInput</code> 不生效；payload 中 <code>transcript_path</code> 恒为空字符串。钩子超时默认 600 秒，可用条目级 <code>timeout</code>（秒）覆盖。</p><h3 id="7-3-方案-A-：社区插件增强"><a href="#7-3-方案-A-：社区插件增强" class="headerlink" title="7.3 方案 A+：社区插件增强"></a>7.3 方案 A+：社区插件增强</h3><p>上述 JSON 配置与检查脚本对社区插件 <code>@dennisrongo/dsh-hooks</code> <strong>同样适用</strong>（同一 Claude Code 协议）。需要以下增强时改装它：</p><ul><li><strong>项目层自动发现</strong>：<code>&lt;workspace&gt;/.dsh/hooks.json</code> 随仓库提交即生效，无需改 profile 组合；</li><li><strong>双层叠加</strong>：用户层（<code>$DSH_HOME/settings.yaml</code> 的 <code>dsh-hooks</code> 命名空间）与项目层同时生效；</li><li><strong><code>failClosed</code></strong>：条目加 <code>&quot;failClosed&quot;: true</code> 后，钩子崩溃&#x2F;超时按阻断处理（原生桥无此字段）；</li><li>支持 8 种事件（另含 <code>SessionStart</code>&#x2F;<code>SessionEnd</code>&#x2F;<code>Stop</code>&#x2F;<code>SubagentStop</code>&#x2F;<code>Notification</code>）与 skill hints。</li></ul><p>安装：<code>dsh plugin add @dennisrongo/dsh-hooks</code>（或 <code>dsh plugin --profile web add ...</code>），装完重启 profile。</p><h3 id="7-4-方案-B：CI-门禁"><a href="#7-4-方案-B：CI-门禁" class="headerlink" title="7.4 方案 B：CI 门禁"></a>7.4 方案 B：CI 门禁</h3><p>将 spec 完整性检查写成 GitHub Actions job，作为 PR 的必需检查项。核心逻辑：解析 <code>docs/specs/*.md</code> 的 markdown 结构，验证必需章节是否存在且非空。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># .github/workflows/spec-check.yml</span></span><br><span class="line"><span class="attr">name:</span> <span class="string">Spec</span> <span class="string">Completeness</span> <span class="string">Check</span></span><br><span class="line"><span class="attr">on:</span> [<span class="string">pull_request</span>]</span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">check-spec:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Check</span> <span class="string">spec</span> <span class="string">sections</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          shopt -s nullglob  # specs 是条件必需（见 1.3）；无文件时跳过而非误杀</span></span><br><span class="line"><span class="string">          for f in docs/specs/*.md; do</span></span><br><span class="line"><span class="string">            for section in &quot;## 背景&quot; &quot;## 验收标准&quot; &quot;## 实施步骤&quot; &quot;## 风险与回滚&quot;; do</span></span><br><span class="line"><span class="string">              if ! grep -q &quot;$section&quot; &quot;$f&quot;; then</span></span><br><span class="line"><span class="string">                echo &quot;::error file=$f::$section 缺失&quot;</span></span><br><span class="line"><span class="string">                exit 1</span></span><br><span class="line"><span class="string">              fi</span></span><br><span class="line"><span class="string">            done</span></span><br><span class="line"><span class="string">          done</span></span><br></pre></td></tr></table></figure><h3 id="7-5-方案-C：专用插件人工审查"><a href="#7-5-方案-C：专用插件人工审查" class="headerlink" title="7.5 方案 C：专用插件人工审查"></a>7.5 方案 C：专用插件人工审查</h3><p><code>@hilariouhiss/dsh-plan-doc</code> 是社区插件，拦截 <code>exit_plan_mode</code> 并将 markdown plan 渲染在右侧抽屉中，供你预览和编辑。面板底部有”确认实施”和”交由模型修改”两个按钮。点击后者时，修改意见作为反馈交回模型，<strong>plan mode 保持激活</strong>，模型修订后的新稿自动重新打开面板。</p><p><strong>能力边界</strong>：<code>/plan-doc</code> 只接收面板的 <code>approve</code> &#x2F; <code>reject</code> 决策，面板<strong>仅在拦截 <code>exit_plan_mode</code> 时出现</strong>——它不能对任意文件发起审查。因此 spec 审查的可行约定是：在 <code>AGENTS.md</code> 中约定 <code>docs/specs/</code> 文件的创建或重大修改必须伴随一次 plan mode 流程，把 spec 内容作为 plan 经 <code>exit_plan_mode</code> 提交评审（面板自然渲染该稿），而不是”写完文件再 <code>/plan-doc</code> 审查”。</p><h3 id="7-6-规则清单与-AGENTS-md-的对应"><a href="#7-6-规则清单与-AGENTS-md-的对应" class="headerlink" title="7.6 规则清单与 AGENTS.md 的对应"></a>7.6 规则清单与 AGENTS.md 的对应</h3><p>自动检查的规则必须与 <code>AGENTS.md</code> 中定义的模板章节一一对应。建议在 <code>AGENTS.md</code> 中新增”自动检查规则”一节（见 1.5 节模板），明确列出：</p><ul><li><code>exit_plan_mode</code> 的 plan <strong>必须包含</strong>：目标、验收标准、实施步骤、风险与回滚。</li><li><code>docs/specs/*.md</code> <strong>必须包含</strong>：背景、验收标准、实施步骤、风险与回滚。</li><li>实施步骤中<strong>每个 Step</strong> 必须声明 <code>指令</code> 和 <code>验证</code> 字段。</li></ul><p>把这份规则同时写入 <code>AGENTS.md</code> 和钩子脚本，DSH 在修订 plan 时会主动对照规则补全。</p><h2 id="第-8-章：项目工程规范（按需）"><a href="#第-8-章：项目工程规范（按需）" class="headerlink" title="第 8 章：项目工程规范（按需）"></a>第 8 章：项目工程规范（按需）</h2><blockquote><p><strong>本章说明</strong>：本章不属于 DSH 功能，是对中型团队有价值的项目管理建议，按需阅读。</p></blockquote><h3 id="8-1-CI-守卫"><a href="#8-1-CI-守卫" class="headerlink" title="8.1 CI 守卫"></a>8.1 CI 守卫</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># ⚠️ 项目自身的 CI 守卫（GitHub Actions 通用写法）</span><br><span class="line">- 改了 src/api/** → 必动 docs/architecture/overview.md 或 specs/</span><br><span class="line">- decisions.md 数量不能减少（防误删）</span><br><span class="line">- AGENTS.md 至少 30 行</span><br><span class="line">- specs/*.md 改了 → 必动 src/ 相关文件</span><br></pre></td></tr></table></figure><h3 id="8-2-其他文件维护"><a href="#8-2-其他文件维护" class="headerlink" title="8.2 其他文件维护"></a>8.2 其他文件维护</h3><p><code>runbooks.md</code> &#x2F; <code>postmortems/</code> &#x2F; <code>CHANGELOG.md</code> &#x2F; <code>README.md</code> 较简单，按需维护即可。</p><h2 id="附录-A：速查表"><a href="#附录-A：速查表" class="headerlink" title="附录 A：速查表"></a>附录 A：速查表</h2><h3 id="A-1-全部-slash-命令"><a href="#A-1-全部-slash-命令" class="headerlink" title="A.1 全部 slash 命令"></a>A.1 全部 slash 命令</h3><table><thead><tr><th>命令</th><th>作用</th><th>关键约束</th></tr></thead><tbody><tr><td><code>/plan</code> &#x2F; <code>/plan &lt;msg&gt;</code></td><td>进入计划模式</td><td>可附文件&#x2F;图片</td></tr><tr><td><code>/plan off</code></td><td>退出计划模式</td><td>—</td></tr><tr><td><code>/compact</code></td><td>手动压缩历史</td><td>idle-only、不接受参数</td></tr><tr><td><code>/goal</code> &#x2F; <code>/goal &lt;obj&gt;</code></td><td>创建长期目标</td><td>4 阶段，默认 256 轮</td></tr><tr><td><code>/goal edit &lt;obj&gt;</code></td><td>改目标</td><td>阶段不变</td></tr><tr><td><code>/goal pause</code></td><td>暂停 + disarm</td><td>—</td></tr><tr><td><code>/goal resume</code></td><td>恢复 &#x2F; 重新武装</td><td>受轮次上限约束</td></tr><tr><td><code>/goal clear</code></td><td>清除当前目标</td><td>历史保留</td></tr><tr><td><code>/permission</code></td><td>切换权限预设</td><td>配合 sandbox 模式</td></tr><tr><td><code>/feedback &lt;text&gt;</code></td><td>记录会话反馈</td><td>必须带文本；不进模型历史</td></tr><tr><td><code>/export</code></td><td>下载会话日志 ZIP</td><td>Web-only、不接受参数</td></tr></tbody></table><h3 id="A-2-主用工具"><a href="#A-2-主用工具" class="headerlink" title="A.2 主用工具"></a>A.2 主用工具</h3><table><thead><tr><th>类别</th><th>工具</th><th>关键约束</th></tr></thead><tbody><tr><td>文件</td><td><code>read</code> &#x2F; <code>write</code> &#x2F; <code>edit</code></td><td>默认编辑工具</td></tr><tr><td></td><td><code>grep</code> &#x2F; <code>glob</code></td><td>搜索</td></tr><tr><td>Shell</td><td><code>bash</code></td><td>走 sandbox</td></tr><tr><td>网络</td><td><code>web_search</code> &#x2F; <code>web_fetch</code></td><td>抓公开 HTTP(S)</td></tr><tr><td>任务</td><td><code>todo_write</code></td><td><strong>整列表替换</strong>，单 owner</td></tr><tr><td></td><td><code>exit_plan_mode</code></td><td>plan 必 markdown + <code>#</code> 标题</td></tr><tr><td></td><td><code>ask_user_question</code></td><td><strong>子 agent 不能调</strong></td></tr><tr><td>协作</td><td><code>subagent</code> &#x2F; <code>subagent_fork</code></td><td><code>maxDepth=3</code>、<code>run_in_background</code>；fork 继承父会话历史</td></tr><tr><td></td><td><code>workflow</code></td><td>JS 脚本，<code>agent/parallel/pipeline/phase/log</code></td></tr></tbody></table><h3 id="A-3-高级工具"><a href="#A-3-高级工具" class="headerlink" title="A.3 高级工具"></a>A.3 高级工具</h3><table><thead><tr><th>工具</th><th>何时用</th><th>关键约束</th></tr></thead><tbody><tr><td><code>create_goal</code> &#x2F; <code>get_goal</code> &#x2F; <code>update_goal</code></td><td>跨多轮目标</td><td>CAS 带 revision</td></tr><tr><td><code>ralph</code></td><td>用户明确要求”每轮全新 agent”</td><td>报告无独立验证；maxRounds 包级默认 256，Web preset 实为 64</td></tr><tr><td><code>send_message</code> &#x2F; <code>interrupt_agent</code> &#x2F; <code>list_agents</code></td><td>continuable 子 agent 通信</td><td>—</td></tr><tr><td><code>job_output</code> &#x2F; <code>job_kill</code> &#x2F; <code>job_list</code></td><td>后台任务管理</td><td>配合 <code>run_in_background: true</code></td></tr><tr><td><code>skill</code></td><td>按需加载 skill</td><td>—</td></tr><tr><td><code>present</code></td><td>标记可交付文件</td><td>—</td></tr></tbody></table><h3 id="A-4-sandbox-模式"><a href="#A-4-sandbox-模式" class="headerlink" title="A.4 sandbox 模式"></a>A.4 sandbox 模式</h3><table><thead><tr><th>模式</th><th>文件效果</th><th>推荐场景</th></tr></thead><tbody><tr><td><code>read-only</code>（fail-safe 默认）</td><td>拒绝写入，必需 sink 除外</td><td>探索、纯调研式 plan（不落盘）</td></tr><tr><td><code>workspace-write</code></td><td>工作区 + 临时区域可写</td><td>编码、重构</td></tr><tr><td><code>danger-full-access</code></td><td>无隔离</td><td>系统运维（慎用）</td></tr></tbody></table><h3 id="A-5-4-种-agent-模式一句话选择指南"><a href="#A-5-4-种-agent-模式一句话选择指南" class="headerlink" title="A.5 4 种 agent 模式一句话选择指南"></a>A.5 4 种 agent 模式一句话选择指南</h3><table><thead><tr><th>场景</th><th>选什么</th></tr></thead><tbody><tr><td>日常开发</td><td><strong>标准模式</strong></td></tr><tr><td>编程化组合工具</td><td><strong>PTC 模式</strong></td></tr><tr><td>训练 &#x2F; 单文件脚本</td><td><strong>极简模式</strong></td></tr><tr><td>二次开发 DSH</td><td><strong>创造模式</strong></td></tr><tr><td>跨多日任务中途</td><td><strong>不要切</strong>（preset 随会话锁定，切换 &#x3D; 开新会话，当前会话的 goal 与上下文带不走）</td></tr></tbody></table><h2 id="收尾"><a href="#收尾" class="headerlink" title="收尾"></a>收尾</h2><p>一句话：<strong>模式选对（90% 标准模式）+ 文档到位（AGENTS.md + architecture + README + 条件 specs）+ 指令纪律（决策树 + 真实约束）&#x3D; 80% 的稳定性。</strong></p><p>剩下 20%——靠团队踩坑反馈、持续更新文档、复杂任务用 plan mode 走流程。</p>]]>
    </content>
    <id>https://haies.cn/dsh-best-practices/</id>
    <link href="https://haies.cn/dsh-best-practices/"/>
    <published>2026-09-19T07:48:32.000Z</published>
    <summary>DeepSeek Harness 编程最佳实践，覆盖上下文管理、并行委派与任务编排。</summary>
    <title>DeepSeek Harness 编程最佳实践</title>
    <updated>2026-10-22T06:14:13.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="笔记" scheme="https://haies.cn/categories/note/"/>
    <category term="实用" scheme="https://haies.cn/tags/utils/"/>
    <category term="AI" scheme="https://haies.cn/tags/ai/"/>
    <category term="记录" scheme="https://haies.cn/tags/record/"/>
    <content>
      <![CDATA[<h2 id="问题现象"><a href="#问题现象" class="headerlink" title="问题现象"></a>问题现象</h2><p>启动 <code>dsh web</code>（<code>@deepseek-ai/dsh</code>）后，浏览器访问 <code>http://127.0.0.1:3080</code> 新建会话并提交消息，对话框返回错误：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">clientTimeZone must be UTC or a valid IANA Area/Location name</span><br></pre></td></tr></table></figure><p>服务端响应 <code>{ ok: false, error: { code: &quot;invalid-time-zone&quot;, details: { value: &quot;Asia/Beijing&quot; } } }</code>。</p><p>API 直连复现：</p><table><thead><tr><th>clientTimeZone</th><th>结果</th></tr></thead><tbody><tr><td><code>Asia/Beijing</code></td><td><code>invalid-time-zone</code></td></tr><tr><td><code>Asia/Shanghai</code></td><td>OK</td></tr></tbody></table><h2 id="原因分析"><a href="#原因分析" class="headerlink" title="原因分析"></a>原因分析</h2><h3 id="请求链路"><a href="#请求链路" class="headerlink" title="请求链路"></a>请求链路</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">浏览器 → POST /api/session.prompt →  canonicalClientTimeZone() 校验 → Agent</span><br></pre></td></tr></table></figure><h3 id="客户端取时区"><a href="#客户端取时区" class="headerlink" title="客户端取时区"></a>客户端取时区</h3><p><code>dsh-client-runtime/lib/client.js:7009</code>：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">resolvedClientTimeZone</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> timeZone = <span class="keyword">new</span> <span class="title class_">Intl</span>.<span class="title class_">DateTimeFormat</span>().<span class="title function_">resolvedOptions</span>().<span class="property">timeZone</span>;</span><br><span class="line">  <span class="keyword">if</span> (<span class="keyword">typeof</span> timeZone !== <span class="string">&quot;string&quot;</span> || timeZone.<span class="property">length</span> === <span class="number">0</span>)</span><br><span class="line">    <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">Error</span>(<span class="string">&quot;browser time zone is unavailable&quot;</span>);</span><br><span class="line">  <span class="keyword">return</span> timeZone;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>浏览器从 OS 读取时区。本机 <code>/etc/timezone = Asia/Beijing</code>，所以浏览器上报 <code>&quot;Asia/Beijing&quot;</code>。</p><h3 id="服务端校验"><a href="#服务端校验" class="headerlink" title="服务端校验"></a>服务端校验</h3><p><code>dsh-host-apiproxy/lib/types/api-proxy.js:115-134</code>：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="variable constant_">IANA_TIME_ZONE</span> = <span class="regexp">/^[A-Za-z][A-Za-z0-9_+.-]*(?:\/[A-Za-z0-9_+.-]+)+$/</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">canonicalClientTimeZone</span>(<span class="params">value</span>) &#123;</span><br><span class="line">  <span class="keyword">if</span> (value.<span class="property">length</span> === <span class="number">0</span> || value.<span class="title function_">trim</span>() !== value</span><br><span class="line">      || (value !== <span class="string">&#x27;UTC&#x27;</span> &amp;&amp; !<span class="variable constant_">IANA_TIME_ZONE</span>.<span class="title function_">test</span>(value)))</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">undefined</span>;</span><br><span class="line">  <span class="keyword">try</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> canonical = <span class="keyword">new</span> <span class="title class_">Intl</span>.<span class="title class_">DateTimeFormat</span>(<span class="string">&#x27;en-US&#x27;</span>, &#123; <span class="attr">timeZone</span>: value &#125;)</span><br><span class="line">      .<span class="title function_">resolvedOptions</span>().<span class="property">timeZone</span>;</span><br><span class="line">    <span class="keyword">if</span> (canonical !== <span class="string">&#x27;UTC&#x27;</span> &amp;&amp; !<span class="variable constant_">IANA_TIME_ZONE</span>.<span class="title function_">test</span>(canonical))</span><br><span class="line">      <span class="keyword">return</span> <span class="literal">undefined</span>;</span><br><span class="line">    <span class="keyword">return</span> canonical;</span><br><span class="line">  &#125; <span class="keyword">catch</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">undefined</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>校验两关：</p><ol><li>字面必须为 <code>&quot;UTC&quot;</code> 或匹配 IANA Area&#x2F;Location 正则（必须含 <code>/</code>）。</li><li><code>Intl.DateTimeFormat({ timeZone })</code> 必须接受，并且 <code>resolvedOptions().timeZone</code> 回写也通过同样校验。</li></ol><h3 id="根因：ICU-78-移除了-Asia-Beijing-别名"><a href="#根因：ICU-78-移除了-Asia-Beijing-别名" class="headerlink" title="根因：ICU 78 移除了 Asia&#x2F;Beijing 别名"></a>根因：ICU 78 移除了 Asia&#x2F;Beijing 别名</h3><table><thead><tr><th>项</th><th>值</th></tr></thead><tbody><tr><td>Node</td><td>v22.23.2</td></tr><tr><td>ICU</td><td>78.2</td></tr><tr><td>支持的时区数</td><td>418</td></tr></tbody></table><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$ node -e <span class="string">&#x27;console.log(Intl.supportedValuesOf(&quot;timeZone&quot;).filter(z =&gt; z.startsWith(&quot;Asia/&quot;)).length)&#x27;</span></span><br><span class="line">71</span><br><span class="line"></span><br><span class="line">$ node -e <span class="string">&#x27;console.log([&quot;Asia/Beijing&quot;,&quot;Asia/Shanghai&quot;,&quot;Asia/Chongqing&quot;].map(z =&gt; [z, Intl.supportedValuesOf(&quot;timeZone&quot;).includes(z)]))&#x27;</span></span><br><span class="line">[ [ <span class="string">&#x27;Asia/Beijing&#x27;</span>, <span class="literal">false</span> ], [ <span class="string">&#x27;Asia/Shanghai&#x27;</span>, <span class="literal">true</span> ], [ <span class="string">&#x27;Asia/Chongqing&#x27;</span>, <span class="literal">false</span> ] ]</span><br></pre></td></tr></table></figure><p>服务端 ICU 78 不再认识 <code>Asia/Beijing</code>，于是 <code>Intl.DateTimeFormat({ timeZone: &#39;Asia/Beijing&#39; })</code> 抛错，<code>canonicalClientTimeZone</code> 返回 <code>undefined</code>，最终被映射成 <code>invalid-time-zone</code>。</p><p>注意：在 tzdata 中，<code>Asia/Beijing</code> 是历史遗留名称，<strong>部分较新的发行版已不再提供该文件</strong>（Debian&#x2F;Ubuntu 的 tzdata 仅保留 <code>Asia/Shanghai</code>，而 <code>Asia/Chongqing</code>、<code>Asia/Harbin</code> 等仍作为软链指向 <code>Shanghai</code>）。因此：</p><ul><li>若 <code>/usr/share/zoneinfo/Asia/Beijing</code> <strong>不存在</strong>，错误完全发生在 ICU 名称解析层，与系统 tzdata 文件无关；</li><li>若该文件<strong>存在</strong>，它与 <code>Asia/Shanghai</code> 指向同一套时区规则，系统层面行为等价，只是名字在 ICU 列表中已被规范化。</li></ul><p>无论哪种情况，正确的做法都是统一改用 <code>Asia/Shanghai</code>。</p><h2 id="解决方法"><a href="#解决方法" class="headerlink" title="解决方法"></a>解决方法</h2><h3 id="根本修复：改系统时区"><a href="#根本修复：改系统时区" class="headerlink" title="根本修复：改系统时区"></a>根本修复：改系统时区</h3><p>把已被 ICU 移除的 <code>Asia/Beijing</code> 改为仍受支持的 <code>Asia/Shanghai</code>（二者指向同一 tzdata 文件，行为等价）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> <span class="built_in">ln</span> -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;Asia/Shanghai&quot;</span> | <span class="built_in">sudo</span> <span class="built_in">tee</span> /etc/timezone</span><br><span class="line"><span class="built_in">date</span></span><br></pre></td></tr></table></figure><p>然后<strong>重启浏览器</strong>（让浏览器重新读取系统时区），刷新 <code>http://127.0.0.1:3080</code> 再提交即可。</p><h3 id="临时方案（不动系统时区）"><a href="#临时方案（不动系统时区）" class="headerlink" title="临时方案（不动系统时区）"></a>临时方案（不动系统时区）</h3><p>Chrome DevTools → ⋮ → More tools → <strong>Sensors</strong> → Override timezone 选 <code>Asia/Shanghai</code>。仅对当前 tab 生效，刷新或新开 tab 即失效。</p><h3 id="其他常见易踩坑的非法值"><a href="#其他常见易踩坑的非法值" class="headerlink" title="其他常见易踩坑的非法值"></a>其他常见易踩坑的非法值</h3><p>服务端正则 <code>^[A-Za-z][A-Za-z0-9_+.-]*(?:\/[A-Za-z0-9_+.-]+)+$</code> 要求 Area&#x2F;Location 形式，以下值都会被拒绝：</p><table><thead><tr><th>输入</th><th>结果</th><th>原因</th></tr></thead><tbody><tr><td><code>&quot;&quot;</code></td><td>拒绝</td><td>空</td></tr><tr><td><code>&quot; Asia/Shanghai &quot;</code></td><td>拒绝</td><td>首尾空白</td></tr><tr><td><code>&quot;CST&quot;</code></td><td>拒绝</td><td>缩写，无 <code>/</code></td></tr><tr><td><code>&quot;GMT+8&quot;</code></td><td>拒绝</td><td>偏移写法，无 <code>/</code></td></tr><tr><td><code>&quot;+08:00&quot;</code></td><td>拒绝</td><td>偏移写法，无 <code>/</code></td></tr></tbody></table><h2 id="经验小结"><a href="#经验小结" class="headerlink" title="经验小结"></a>经验小结</h2><ul><li>Web 应用跨 ICU&#x2F;浏览器上报时区时，<strong>系统时区字符串与 ICU canonical name 不一致</strong> 是常见坑。</li><li>本机 OS 虽保留 <code>Asia/Beijing</code> 的 tzdata 别名（指向 PRC），但运行时的 ICU 已统一为 <code>Asia/Shanghai</code>。</li><li>排查类似 <code>invalid-time-zone</code> 类问题，先在 Node 端跑一次 <code>Intl.supportedValuesOf(&quot;timeZone&quot;)</code> 看是否包含浏览器上报值，能快速定位。</li></ul>]]>
    </content>
    <id>https://haies.cn/dsh-web-timezone-bug/</id>
    <link href="https://haies.cn/dsh-web-timezone-bug/"/>
    <published>2026-08-28T07:48:43.000Z</published>
    <summary>deepseek harness 在统信 UOS 下报 invalid-time-zone 的排查与修复记录。</summary>
    <title>deepseek harness 在 UOS 下报 invalid-time-zone 的排查与修复</title>
    <updated>2026-10-22T06:14:13.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="笔记" scheme="https://haies.cn/categories/note/"/>
    <category term="技术栈" scheme="https://haies.cn/tags/stack/"/>
    <category term="OS" scheme="https://haies.cn/tags/os/"/>
    <category term="信创" scheme="https://haies.cn/tags/xc/"/>
    <content>
      <![CDATA[<blockquote><p>基于 deepin 15 &#x2F; Debian 10 buster 的国产化桌面发行版全方位兼容性评估</p></blockquote><h2 id="操作系统识别"><a href="#操作系统识别" class="headerlink" title="操作系统识别"></a>操作系统识别</h2><table><thead><tr><th>项目</th><th>详情</th></tr></thead><tbody><tr><td><strong>发行版</strong></td><td>统信 UOS 桌面专业版 V20（UnionTech OS Desktop 20 Professional）</td></tr><tr><td><strong>家族</strong></td><td>类 Debian 桌面发行版</td></tr><tr><td><strong>基础来源</strong></td><td>基于 <strong>deepin 15.x &#x2F; Debian 10 (buster)</strong> 深度定制</td></tr><tr><td><strong>内核</strong></td><td>Linux 4.19.0-amd64-desktop（Deepin 构建，gcc 8.3.0 编译）</td></tr><tr><td><strong>架构</strong></td><td>x86_64 (amd64)</td></tr><tr><td><strong>版本号</strong></td><td>UOS 20（<code>VERSION_ID=20</code>）</td></tr><tr><td><strong>编译器</strong></td><td>GCC 8.3.0（Uos 8.3.0.13-deepin1）</td></tr><tr><td><strong>C 标准库</strong></td><td>glibc 2.28.35-deepin1</td></tr><tr><td><strong>默认桌面</strong></td><td>DDE（Deepin Desktop Environment，运行于 X11）</td></tr></tbody></table><p>UOS（统信操作系统）由 deepin 团队与统信软件技术有限公司联合开发，定位党政、央企、金融、能源等”信创”市场。本版本对应 deepin 15 SP3&#x2F;20 同期主线内核，主要面向国产化 PC 平台。</p><h2 id="系统技术栈总览"><a href="#系统技术栈总览" class="headerlink" title="系统技术栈总览"></a>系统技术栈总览</h2><h3 id="核心运行时栈"><a href="#核心运行时栈" class="headerlink" title="核心运行时栈"></a>核心运行时栈</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">┌─────────────────────────────────────┐</span><br><span class="line">│  Linux Kernel 4.19.0-amd64-desktop │  ← LTS 分支（Deepin 移植）</span><br><span class="line">├─────────────────────────────────────┤</span><br><span class="line">│  glibc 2.28.35 / GCC 8.3.0 / binutils 2.31.1  ← ABI 基线</span><br><span class="line">├─────────────────────────────────────┤</span><br><span class="line">│  libstdc++ GLIBCXX_3.4.25          │  ← C++ ABI</span><br><span class="line">└─────────────────────────────────────┘</span><br></pre></td></tr></table></figure><h3 id="GUI-应用栈"><a href="#GUI-应用栈" class="headerlink" title="GUI &#x2F; 应用栈"></a>GUI &#x2F; 应用栈</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">┌────────────────────────────────────────┐</span><br><span class="line">│  DDE (KWin 5.x)  │  GTK 3.24.5        │  ← 默认桌面与原生应用</span><br><span class="line">├────────────────────────────────────────┤</span><br><span class="line">│  Qt 5.11.3 (Core/Gui/Widgets/...)     │  ← deepin / WPS / 部分国产应用</span><br><span class="line">├────────────────────────────────────────┤</span><br><span class="line">│  GLib / GObject                       │  ← C 工具库</span><br><span class="line">└────────────────────────────────────────┘</span><br></pre></td></tr></table></figure><h3 id="显示-图形栈"><a href="#显示-图形栈" class="headerlink" title="显示 &#x2F; 图形栈"></a>显示 &#x2F; 图形栈</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">┌────────────────────────────────────────┐</span><br><span class="line">│  X11 / Xorg 1.20.4  │  Wayland 1.21    │  ← X11 主用</span><br><span class="line">├────────────────────────────────────────┤</span><br><span class="line">│  libGL 1.1.0.3 (Nvidia) │ Mesa 19.2.6 │</span><br><span class="line">├────────────────────────────────────────┤</span><br><span class="line">│  NVIDIA Quadro P1000 4 GB (GLX 4.6)   │  ← 独显</span><br><span class="line">└────────────────────────────────────────┘</span><br></pre></td></tr></table></figure><h2 id="核心组件版本详解"><a href="#核心组件版本详解" class="headerlink" title="核心组件版本详解"></a>核心组件版本详解</h2><h3 id="核心运行时"><a href="#核心运行时" class="headerlink" title="核心运行时"></a>核心运行时</h3><table><thead><tr><th>组件</th><th>版本</th><th>说明</th></tr></thead><tbody><tr><td><strong>Kernel</strong></td><td>4.19.0-amd64-desktop（构建 #7602，2026-06-24）</td><td>Deepin 维护的内核，已带国产化补丁链（<code>useclinux=1</code>、<code>ima_appraise=off</code> 等）</td></tr><tr><td><strong>GCC</strong></td><td>8.3.0（Uos 8.3.0.13-deepin1）</td><td>支持 C++17（部分）&#x2F; 不支持 C++20</td></tr><tr><td><strong>glibc</strong></td><td>2.28.35-deepin1</td><td>LTSC 段，落后 Debian 11 一个大版本</td></tr><tr><td><strong>binutils</strong></td><td>2.31.1（Uos 打包）</td><td>GNU ld &#x2F; as &#x2F; objcopy</td></tr><tr><td><strong>libstdc++</strong></td><td>8.3.0.13-deepin1</td><td>C++ ABI 标签 <code>GLIBCXX_3.4.25</code></td></tr><tr><td><strong>Python（系统默认）</strong></td><td>3.7.3</td><td>另有 uv 安装的 3.11.15 在 <code>~/.local</code></td></tr><tr><td><strong>Make</strong></td><td>(随 Debian 10)</td><td>4.2.1 量级</td></tr><tr><td><strong>systemd</strong></td><td>PID 1（<code>/sbin/init -&gt; /lib/systemd/systemd</code>）</td><td>用户与系统服务均由 systemd 管理</td></tr></tbody></table><h3 id="GUI-工具包"><a href="#GUI-工具包" class="headerlink" title="GUI 工具包"></a>GUI 工具包</h3><table><thead><tr><th>工具包</th><th>版本</th><th>备注</th></tr></thead><tbody><tr><td><strong>GLib</strong></td><td>(随 deepin)</td><td></td></tr><tr><td><strong>GTK 2</strong></td><td>❌ 未单独打包</td><td>DDE 默认不走 GTK 2</td></tr><tr><td><strong>GTK 3</strong></td><td>3.24.5.26-deepin26</td><td>当前主用；deepin 26 号补丁</td></tr><tr><td><strong>GTK 4</strong></td><td>❌ 未安装</td><td></td></tr><tr><td><strong>Qt 5</strong></td><td>5.11.3.78-1+dde</td><td>Core &#x2F; Gui &#x2F; Widgets &#x2F; DBus &#x2F; Network &#x2F; Multimedia</td></tr><tr><td><strong>Qt 6</strong></td><td>❌ 未安装</td><td></td></tr><tr><td><strong>KWin</strong></td><td>5.x（<code>kwin_x11</code> &#x2F; <code>kwin_no_scale</code>）</td><td>DDE 默认窗口管理器</td></tr></tbody></table><h3 id="显示与图形"><a href="#显示与图形" class="headerlink" title="显示与图形"></a>显示与图形</h3><table><thead><tr><th>组件</th><th>版本 &#x2F; 状态</th></tr></thead><tbody><tr><td><strong>X11（Xorg）</strong></td><td>1.20.4（主用，会话 <code>DISPLAY=:0</code>）</td></tr><tr><td><strong>Wayland 协议库</strong></td><td>1.21.0.9-deepin9（client&#x2F;cursor&#x2F;server&#x2F;egl 全套）</td></tr><tr><td><strong>xcb</strong></td><td>(随 Xorg)</td></tr><tr><td><strong>libGL</strong></td><td>1.1.0.3-deepin1（Nvidia 厂商层）</td></tr><tr><td><strong>Mesa</strong></td><td>19.2.6.15-1（DRI &#x2F; EGL &#x2F; GLX 实现）</td></tr><tr><td><strong>EGL</strong></td><td>1.1.0.3-deepin1 + Mesa 19.2.6</td></tr><tr><td><strong>Vulkan 加载层</strong></td><td>libvulkan 1.1.97-2+sign；<code>vulkaninfo</code> 未装</td></tr><tr><td><strong>字体</strong></td><td>Noto CJK &#x2F; Noto Core &#x2F; 文泉驿微米黑 &#x2F; 文泉驿正黑 &#x2F; CESI &#x2F; GB</td></tr></tbody></table><h3 id="硬件采样"><a href="#硬件采样" class="headerlink" title="硬件采样"></a>硬件采样</h3><table><thead><tr><th>组件</th><th>详情</th></tr></thead><tbody><tr><td><strong>CPU</strong></td><td>Hygon C86 3250 8-core（1 socket × 8 core × 2 thread &#x3D; 16 逻辑 CPU），主频 1.6 ~ 2.8 GHz，海光 C86（Zen1 授权）</td></tr><tr><td><strong>内存</strong></td><td>62 GiB DDR（已用 4.1 GiB，可用 57 GiB），Swap 15 GiB</td></tr><tr><td><strong>GPU</strong></td><td>NVIDIA Quadro P1000（驱动 550.120），GL 4.6，4 GiB 显存</td></tr><tr><td><strong>启动</strong></td><td>UEFI，<code>/boot</code> 1.5 GiB（已用 28%），<code>/</code> 201 GiB（已用 7%）</td></tr><tr><td><strong>数据盘</strong></td><td><code>/data</code> 7.3 TiB（已用 1.5 TiB）</td></tr></tbody></table><h3 id="本机环境关键结论"><a href="#本机环境关键结论" class="headerlink" title="本机环境关键结论"></a>本机环境关键结论</h3><ul><li><strong>编译器能力</strong>：GCC 8.3 → C++17 完整支持，C++20 仅实验性；缺 C++23。</li><li><strong>GUI 开发建议</strong>：<ul><li>GTK 应用：使用 <strong>GTK 3.24</strong>；本机缺 GTK 2&#x2F;4，跨发行版时注意 GTK 2 兼容路径</li><li>Qt 应用：使用 <strong>Qt 5.11</strong>（Deepin 改版）；如需 Qt 6 需自行编译或添加 backports 源</li></ul></li><li><strong>缺失开发头文件</strong>：未安装 <code>*-dev</code> 包，仅运行时库；编译需 <code>apt install libgtk-3-dev qtbase5-dev</code> 等。</li><li><strong>图形栈</strong>：<strong>X11 主用 + Wayland 协议栈就绪</strong>；NVIDIA 专有驱动 550.120 已就位（GL 4.6），Vulkan 仅加载层待补 ICD。</li><li><strong>国产化护城河</strong>：内核携带 <code>useclinux=1</code> &#x2F; <code>ima_appraise=off</code> &#x2F; 海光 C86 优化等 Deepin 自研补丁链。</li></ul><h2 id="与主流发行版横向对比"><a href="#与主流发行版横向对比" class="headerlink" title="与主流发行版横向对比"></a>与主流发行版横向对比</h2><h3 id="核心组件对比"><a href="#核心组件对比" class="headerlink" title="核心组件对比"></a>核心组件对比</h3><table><thead><tr><th>组件</th><th>当前系统</th><th>Debian 10 buster</th><th>Debian 11 bullseye</th><th>Debian 12 bookworm</th><th>Ubuntu 20.04 focal</th><th>Ubuntu 22.04 jammy</th><th>Ubuntu 24.04 noble</th></tr></thead><tbody><tr><td><strong>Kernel</strong></td><td><strong>4.19.0-desktop</strong></td><td>4.19</td><td>5.10</td><td>6.1 LTS</td><td>5.4 &#x2F; 5.15 HWE</td><td>5.15 &#x2F; 5.19</td><td>6.8 (HWE)</td></tr><tr><td><strong>GCC</strong></td><td><strong>8.3.0</strong></td><td>8.3.0</td><td>10.2.1</td><td>12.2</td><td>9.3</td><td>11.2</td><td>13.x</td></tr><tr><td><strong>glibc</strong></td><td><strong>2.28</strong></td><td>2.28</td><td>2.31</td><td>2.36</td><td>2.31</td><td>2.35</td><td>2.39</td></tr><tr><td><strong>binutils</strong></td><td><strong>2.31.1</strong></td><td>2.31.1</td><td>2.35.2</td><td>2.40</td><td>2.34</td><td>2.38</td><td>2.42</td></tr><tr><td><strong>libstdc++ ABI</strong></td><td><strong>GLIBCXX_3.4.25</strong></td><td>3.4.25</td><td>3.4.28</td><td>3.4.30</td><td>3.4.28</td><td>3.4.29</td><td>3.4.32</td></tr><tr><td><strong>Python</strong></td><td><strong>3.7.3</strong></td><td>3.7.3</td><td>3.9</td><td>3.11</td><td>3.8</td><td>3.10</td><td>3.12</td></tr><tr><td><strong>C++ 标准上限</strong></td><td>C++17</td><td>C++17</td><td>C++20 (部分)</td><td>C++23</td><td>C++17</td><td>C++20</td><td>C++23</td></tr></tbody></table><h3 id="GUI-工具包对比"><a href="#GUI-工具包对比" class="headerlink" title="GUI 工具包对比"></a>GUI 工具包对比</h3><table><thead><tr><th>组件</th><th>当前系统</th><th>Debian 10</th><th>Debian 11</th><th>Debian 12</th><th>Ubuntu 20.04</th><th>Ubuntu 22.04</th></tr></thead><tbody><tr><td><strong>GLib</strong></td><td>(deepin)</td><td>2.58</td><td>2.66</td><td>2.74</td><td>2.63</td><td>2.72</td></tr><tr><td><strong>GTK 2</strong></td><td>❌</td><td>2.24.32</td><td>2.24.33</td><td>2.24.33</td><td>2.24.32</td><td>2.24.33</td></tr><tr><td><strong>GTK 3</strong></td><td><strong>3.24.5</strong></td><td>3.24.2</td><td>3.24.24</td><td>3.24.38</td><td>3.24.18</td><td>3.24.33</td></tr><tr><td><strong>GTK 4</strong></td><td>❌</td><td>❌</td><td>❌</td><td>4.8</td><td>❌</td><td>❌</td></tr><tr><td><strong>Qt 5</strong></td><td><strong>5.11.3</strong></td><td>5.11.3</td><td>5.15.2</td><td>5.15.8</td><td>5.12.8</td><td>5.15.3</td></tr><tr><td><strong>Qt 6</strong></td><td>❌</td><td>❌</td><td>❌</td><td>6.4</td><td>❌</td><td>6.2</td></tr><tr><td><strong>默认 DE</strong></td><td>DDE</td><td>任意</td><td>任意</td><td>任意</td><td>GNOME</td><td>GNOME</td></tr></tbody></table><h3 id="显示与图形对比"><a href="#显示与图形对比" class="headerlink" title="显示与图形对比"></a>显示与图形对比</h3><table><thead><tr><th>组件</th><th>当前系统</th><th>Debian 10</th><th>Debian 11</th><th>Debian 12</th><th>Ubuntu 20.04</th><th>Ubuntu 22.04</th></tr></thead><tbody><tr><td><strong>Xorg</strong></td><td><strong>1.20.4</strong></td><td>1.20.4</td><td>1.20.11</td><td>21.1</td><td>1.20.8</td><td>21.1</td></tr><tr><td><strong>Wayland 协议</strong></td><td><strong>1.21</strong></td><td>1.16</td><td>1.18</td><td>1.21</td><td>1.18</td><td>1.20</td></tr><tr><td><strong>Mesa</strong></td><td><strong>19.2.6</strong></td><td>18.3</td><td>20.3</td><td>22.3</td><td>20.0 &#x2F; 21.2</td><td>22.0</td></tr><tr><td><strong>libGL（厂商）</strong></td><td>1.1.0.3 (Nvidia)</td><td>1.1.0</td><td>1.3.4</td><td>1.6</td><td>1.3.4</td><td>1.4</td></tr><tr><td><strong>默认协议</strong></td><td>X11</td><td>X11</td><td>X11&#x2F;Wayland</td><td>Wayland</td><td>X11</td><td>Wayland</td></tr></tbody></table><h3 id="综合匹配度评分（越接近-100-越相似）"><a href="#综合匹配度评分（越接近-100-越相似）" class="headerlink" title="综合匹配度评分（越接近 100% 越相似）"></a>综合匹配度评分（越接近 100% 越相似）</h3><table><thead><tr><th>对比目标</th><th>内核</th><th>GCC</th><th>glibc</th><th>GTK</th><th>Qt</th><th>X11</th><th><strong>综合</strong></th></tr></thead><tbody><tr><td><strong>Debian 10 buster</strong></td><td>✅ 4.19 一致</td><td>✅ 完全一致</td><td>✅ 完全一致</td><td>✅ 3.24 一致</td><td>✅ 5.11.3 一致</td><td>✅ 完全一致</td><td><strong>~98%</strong></td></tr><tr><td><strong>Ubuntu 18.04 bionic</strong></td><td>✅ 4.15&#x2F;5.x 接近</td><td>✅ 7.5&#x2F;8.x 接近</td><td>⚠️ 2.27 (旧)</td><td>✅ 3.24 一致</td><td>⚠️ 5.9&#x2F;5.12</td><td>✅ 一致</td><td><strong>~92%</strong></td></tr><tr><td><strong>Debian 11 bullseye</strong></td><td>⚠️ 4.19 vs 5.10 (旧)</td><td>⚠️ 8.3 vs 10.2 (旧)</td><td>⚠️ 2.28 vs 2.31 (旧)</td><td>✅ 3.24 接近</td><td>⚠️ 5.11 vs 5.15</td><td>✅ 接近</td><td><strong>~82%</strong></td></tr><tr><td><strong>Ubuntu 20.04 focal</strong></td><td>⚠️ 4.19 vs 5.4 (旧)</td><td>⚠️ 8.3 vs 9.3 (旧)</td><td>⚠️ 2.28 vs 2.31 (旧)</td><td>✅ 3.24 接近</td><td>⚠️ 5.11 vs 5.12</td><td>✅ 接近</td><td><strong>~80%</strong></td></tr><tr><td><strong>Ubuntu 22.04 jammy</strong></td><td>❌ 4.19 vs 5.15 (旧)</td><td>❌ 8.3 vs 11.2 (旧)</td><td>❌ 2.28 vs 2.35 (旧)</td><td>⚠️ 3.24.5 vs 3.24.33</td><td>⚠️ 5.11 vs 5.15</td><td>✅ 接近</td><td><strong>~65%</strong></td></tr><tr><td><strong>Debian 12 bookworm</strong></td><td>❌ 4.19 vs 6.1 (旧)</td><td>❌ 8.3 vs 12.2 (旧)</td><td>❌ 2.28 vs 2.36 (旧)</td><td>⚠️ 3.24 旧</td><td>⚠️ 5.11 vs 5.15</td><td>⚠️ 1.20 vs 21.1 (旧)</td><td><strong>~55%</strong></td></tr><tr><td><strong>Ubuntu 24.04 noble</strong></td><td>❌ 4.19 vs 6.8 (旧)</td><td>❌ 8.3 vs 13 (旧)</td><td>❌ 2.28 vs 2.39 (旧)</td><td>⚠️ 3.24 旧</td><td>⚠️ 5.11 vs 5.15</td><td>⚠️ 1.20 vs 21.1 (旧)</td><td><strong>~50%</strong></td></tr></tbody></table><h3 id="发行版匹配关键结论"><a href="#发行版匹配关键结论" class="headerlink" title="发行版匹配关键结论"></a>发行版匹配关键结论</h3><p><strong>🎯 最接近的发行版：Debian 10 buster (≈98% 匹配)</strong></p><ul><li>内核 4.19、GCC 8.3、glibc 2.28、Qt 5.11.3、GTK 3.24 <strong>完全一致</strong></li><li>唯一差异：UOS 用了 Deepin 自维护的 4.19 分支（带国产化补丁链）</li><li>兼容性结论：<strong>二进制级 ABI 兼容</strong>，可直接复用 Debian 10 仓库与 <code>.deb</code> 包</li></ul><p><strong>次接近：Ubuntu 18.04 bionic (≈92%)</strong></p><ul><li>glibc 2.27 旧于本机 2.28，<strong>反向兼容</strong>——本机可借 bionic 仓库用，但反过来不行</li><li>兼容性结论：<strong>可运行 bionic 二进制</strong>，但本机 ABI 更新，覆盖其上生态</li></ul><p><strong>Debian 11 &#x2F; Ubuntu 20.04 (~80%)</strong></p><ul><li>仅基础栈接近，glibc 2.31 高于本机 2.28</li><li>兼容性结论：<strong>本机无法直接运行其二进制</strong>（<code>GLIBC_2.31 not found</code>），需 chroot &#x2F; Docker &#x2F; linglong</li></ul><p><strong>Debian 12+ &#x2F; Ubuntu 22.04+ (&lt;70%)</strong></p><ul><li>GCC 11+、glibc 2.35+、Mesa 22+ 全部高于本机</li><li>兼容性结论：<strong>无法运行其二进制</strong>，需容器或升级</li></ul><h3 id="重要-ABI-兼容性提示"><a href="#重要-ABI-兼容性提示" class="headerlink" title="重要 ABI 兼容性提示"></a>重要 ABI 兼容性提示</h3><p>由于本机 <strong>glibc 2.28</strong>，以下限制需注意：</p><table><thead><tr><th>发行版</th><th>能否运行其二进制</th><th>说明</th></tr></thead><tbody><tr><td>Debian 10 buster</td><td>✅ 完美运行</td><td>glibc ≤ 2.28</td></tr><tr><td>Ubuntu 18.04 bionic</td><td>✅ 完美运行</td><td>glibc 2.27 ≤ 本机 2.28</td></tr><tr><td>Debian 11 &#x2F; Ubuntu 20.04</td><td>❌ glibc 2.31 要求</td><td>需 chroot &#x2F; 容器 &#x2F; linglong</td></tr><tr><td>Ubuntu 22.04 &#x2F; Debian 12</td><td>❌ glibc 2.35+ 要求</td><td>需容器或升级</td></tr><tr><td>Qt 官方安装包</td><td>⚠️ 仅 Qt 5.11.x 系列兼容</td><td>Qt 5.15+ 官方需 glibc 2.31+</td></tr></tbody></table><h2 id="兼容情况"><a href="#兼容情况" class="headerlink" title="兼容情况"></a>兼容情况</h2><h3 id="二进制兼容等级"><a href="#二进制兼容等级" class="headerlink" title="二进制兼容等级"></a>二进制兼容等级</h3><table><thead><tr><th>兼容等级</th><th>发行版</th><th>说明</th></tr></thead><tbody><tr><td>🟢 <strong>完全兼容</strong></td><td><strong>Debian 10 buster</strong></td><td>ABI 一致，可直接复用 <code>.deb</code> 包与 apt 源</td></tr><tr><td>🟢 <strong>高度兼容</strong></td><td><strong>Ubuntu 18.04 bionic</strong></td><td>glibc &#x2F; 内核主线接近，反向兼容运行</td></tr><tr><td>🟡 <strong>基本兼容</strong></td><td>Deepin 15.x（同源）</td><td>同 ABI，deepin 仓库可作为首选主源</td></tr><tr><td>🟡 <strong>受限兼容</strong></td><td>Debian 11 &#x2F; Ubuntu 20.04</td><td>仅个别组件新；glibc 2.31 高于本机 2.28，反向不兼容</td></tr><tr><td>🔴 <strong>不兼容</strong></td><td>Debian 12 &#x2F; Ubuntu 22.04+</td><td>glibc 2.35+、GCC 11+ 全部高于本机</td></tr></tbody></table><h3 id="软件包兼容矩阵"><a href="#软件包兼容矩阵" class="headerlink" title="软件包兼容矩阵"></a>软件包兼容矩阵</h3><table><thead><tr><th>软件类型</th><th>兼容来源</th><th>备注</th></tr></thead><tbody><tr><td><code>.deb</code> 软件包</td><td>Debian 10 &#x2F; Deepin 15</td><td>直接安装可用</td></tr><tr><td>apt 源</td><td><code>deb.debian.org/debian buster</code> + <code>repo.deepin.com</code></td><td>推荐主源；UOS 自有源优先</td></tr><tr><td>apt 源</td><td><code>archive.ubuntu.com bionic</code></td><td>备用，PPA 需谨慎</td></tr><tr><td>Qt 官方安装包</td><td>Qt 5.11.x（Linux x64）</td><td>Qt 5.15+ 官方需 glibc 2.31+</td></tr><tr><td>PyPI 包</td><td>Python 3.7 wheels</td><td>cp37 通用轮子可用；cp39&#x2F;cp311 需另行处理</td></tr><tr><td>npm &#x2F; Node.js</td><td>Node 14&#x2F;16 LTS</td><td>与 glibc 2.28 兼容</td></tr><tr><td>Docker 镜像</td><td>buster &#x2F; bionic</td><td>二进制级兼容</td></tr><tr><td>Docker 镜像</td><td>bullseye &#x2F; focal</td><td>⚠️ 镜像内运行无碍，但宿主工具链不一致</td></tr><tr><td>Docker 镜像</td><td>bookworm &#x2F; jammy &#x2F; noble</td><td>❌ 镜像内基于较新 glibc，部分场景可能触发宿主兼容问题（一般 OK）</td></tr><tr><td>linglong 沙箱</td><td>玲珑仓（<code>repo.linglong.dev</code>）</td><td>国产化沙箱主推，可绕过 ABI 限制</td></tr><tr><td>Flatpak</td><td>Flatpak 1.2.5</td><td>备用沙箱</td></tr></tbody></table><h3 id="编译兼容等级"><a href="#编译兼容等级" class="headerlink" title="编译兼容等级"></a>编译兼容等级</h3><table><thead><tr><th>编译工具链</th><th>能力</th><th>说明</th></tr></thead><tbody><tr><td><strong>GCC 8.3</strong></td><td>C17 &#x2F; C++17 &#x2F; 部分 C++20</td><td>主流语言标准全支持</td></tr><tr><td><strong>GLIBCXX_3.4.25</strong></td><td>C++ ABI</td><td>对应 libstdc++ from GCC 8</td></tr><tr><td><strong>glibc 2.28</strong></td><td>POSIX 高级特性</td><td>含 statx、getrandom 等；缺较新版 epoll_pwait2</td></tr></tbody></table><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p><strong>当前系统 ≈ Debian 10 buster + Deepin 国产化适配层 + DDE 桌面栈</strong></p><ul><li>✅ 软件生态：<strong>完全兼容 Debian 10 buster</strong>，可直接 apt 复用其仓库；Deepin 同源仓库是首选</li><li>✅ GUI 编程：<strong>GTK 3.24 &#x2F; Qt 5.11</strong> 完整支持，可开发现代桌面应用；Qt 5.15 &#x2F; Qt 6 需自行编译或走沙箱</li><li>⚠️ 内核：<strong>4.19 LTS</strong> 已脱离上游官方支持，靠 Deepin 自维护；国产化补丁链（<code>useclinux</code> &#x2F; IMA &#x2F; 海光 C86 优化）是 UOS 的护城河</li><li>⚠️ ABI 边界：<strong>glibc 2.28 是关键上限</strong>，无法运行 Debian 11+ &#x2F; Ubuntu 20.04+ 二进制；引入新版生态需 Docker &#x2F; linglong</li><li>💡 升级建议：<ul><li>短期：通过 <strong>linglong &#x2F; flatpak &#x2F; Docker</strong> 解决新生态兼容问题</li><li>长期：评估 UOS 主版本升级路径（V20 → V25 &#x2F; 1050 &#x2F; 1060 等），跨主版本升级 ABI 与内核基线会跳一档</li><li>选型：如仅需 GNOME &#x2F; KDE 而非 DDE，建议直接评估 <strong>Debian 11 &#x2F; Ubuntu 22.04</strong> 本家发行版</li></ul></li></ul>]]>
    </content>
    <id>https://haies.cn/os-uos-report/</id>
    <link href="https://haies.cn/os-uos-report/"/>
    <published>2026-08-27T08:30:00.000Z</published>
    <summary>统信 UOS 桌面操作系统 V20 当前环境技术栈解析：发行版基线、编译与内核版本分析。</summary>
    <title>统信 UOS 桌面操作系统 V20 当前环境技术栈解析</title>
    <updated>2026-10-21T00:56:24.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="重点" scheme="https://haies.cn/categories/mark/"/>
    <category term="技术栈" scheme="https://haies.cn/tags/stack/"/>
    <category term="OS" scheme="https://haies.cn/tags/os/"/>
    <category term="信创" scheme="https://haies.cn/tags/xc/"/>
    <content>
      <![CDATA[<h2 id="背景与定位"><a href="#背景与定位" class="headerlink" title="背景与定位"></a>背景与定位</h2><p>最近接触了一台国产化 PC，搭载的是<strong>方德桌面操作系统 V5.0-G240H</strong>（NFSChina Desktop OS）。从内核到 GUI 全套看了一遍，发现它本质是 <strong>Debian 11 bullseye 的国产化定制版</strong>，主要差异在内核主版本和驱动层。</p><p>作为开发者，最关心的是：在这台机器上编译的应用能不能跑？Debian&#x2F;Ubuntu 上的 <code>.deb</code> 能不能直接装？本文做一次系统性的兼容性盘点。</p><blockquote><p><strong>一句话结论</strong>：当作 <strong>Debian 11 bullseye</strong> 或 <strong>Ubuntu 20.04 focal</strong> 环境使用最稳妥。</p></blockquote><h2 id="一、操作系统识别"><a href="#一、操作系统识别" class="headerlink" title="一、操作系统识别"></a>一、操作系统识别</h2><table><thead><tr><th>项目</th><th>详情</th></tr></thead><tbody><tr><td><strong>发行版</strong></td><td>方德桌面操作系统 V5.0-G240H（NFSChina Desktop OS）</td></tr><tr><td><strong>家族</strong></td><td>类 Debian 桌面发行版</td></tr><tr><td><strong>基础来源</strong></td><td>基于 <strong>Debian 11 (bullseye)</strong> 定制</td></tr><tr><td><strong>内核</strong></td><td>Linux 5.4.0-100-generic（Debian 构建）</td></tr><tr><td><strong>架构</strong></td><td>x86_64 (amd64)</td></tr><tr><td><strong>版本号</strong></td><td>Debian 11.3</td></tr><tr><td><strong>编译器</strong></td><td>GCC 10.2.1</td></tr><tr><td><strong>C 标准库</strong></td><td>glibc 2.31</td></tr><tr><td><strong>默认桌面</strong></td><td>GNOME（推测，发行版默认）</td></tr></tbody></table><p>方德（FS、NFSChina）是国内操作系统厂商，主攻党政机关、央企、关键行业等信创市场。本版本 G240H 属于桌面端 V5.0 系列，针对国产化 PC 平台优化。</p><h2 id="二、系统技术栈总览"><a href="#二、系统技术栈总览" class="headerlink" title="二、系统技术栈总览"></a>二、系统技术栈总览</h2><h3 id="2-1-核心运行时栈"><a href="#2-1-核心运行时栈" class="headerlink" title="2.1 核心运行时栈"></a>2.1 核心运行时栈</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">┌─────────────────────────────────────────┐</span><br><span class="line">│  Linux Kernel 5.4.0-100-generic        │  ← LTS 分支</span><br><span class="line">├─────────────────────────────────────────┤</span><br><span class="line">│  glibc 2.31 / GCC 10.2 / binutils 2.35  │  ← ABI 基线</span><br><span class="line">├─────────────────────────────────────────┤</span><br><span class="line">│  libstdc++ GLIBCXX_3.4.28               │  ← C++ ABI</span><br><span class="line">└─────────────────────────────────────────┘</span><br></pre></td></tr></table></figure><h3 id="2-2-GUI-应用栈"><a href="#2-2-GUI-应用栈" class="headerlink" title="2.2 GUI &#x2F; 应用栈"></a>2.2 GUI &#x2F; 应用栈</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">┌───────────────────────────────────────────┐</span><br><span class="line">│  GTK 3.24.24 (主)  │  GTK 2.24.33 (老)    │  ← GNOME 应用</span><br><span class="line">├───────────────────────────────────────────┤</span><br><span class="line">│  Qt 5.15.2 (Core/Gui/Widgets/Quick/...)   │  ← KDE/Qt 应用</span><br><span class="line">├───────────────────────────────────────────┤</span><br><span class="line">│  GLib 2.66.8                             │  ← C 工具库</span><br><span class="line">└───────────────────────────────────────────┘</span><br></pre></td></tr></table></figure><h3 id="2-3-显示-图形栈"><a href="#2-3-显示-图形栈" class="headerlink" title="2.3 显示 &#x2F; 图形栈"></a>2.3 显示 &#x2F; 图形栈</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">┌───────────────────────────────────────────┐</span><br><span class="line">│  Wayland 1.18  │  X11 1.7.5  │  xcb 1.14  │  ← 双显示协议</span><br><span class="line">├───────────────────────────────────────────┤</span><br><span class="line">│  NVIDIA T400 4GB (GLX 1.4)               │  ← 独显</span><br><span class="line">└───────────────────────────────────────────┘</span><br></pre></td></tr></table></figure><h2 id="三、核心组件版本详解"><a href="#三、核心组件版本详解" class="headerlink" title="三、核心组件版本详解"></a>三、核心组件版本详解</h2><h3 id="3-1-核心组件"><a href="#3-1-核心组件" class="headerlink" title="3.1 核心组件"></a>3.1 核心组件</h3><table><thead><tr><th>组件</th><th>版本</th><th>说明</th></tr></thead><tbody><tr><td><strong>Kernel</strong></td><td>5.4.0-100-generic</td><td>LTS 内核（Debian 构建）</td></tr><tr><td><strong>GCC</strong></td><td>10.2.1 (20210110)</td><td>支持 C++17&#x2F;部分 C++20</td></tr><tr><td><strong>Glibc</strong></td><td>2.31 (Debian 2.31-13+deb11u3)</td><td></td></tr><tr><td><strong>Binutils</strong></td><td>GNU ld 2.35.2</td><td></td></tr><tr><td><strong>libstdc++</strong></td><td>GLIBCXX_3.4.28 (GCC 10.x)</td><td></td></tr><tr><td><strong>Python</strong></td><td>3.9.2</td><td></td></tr><tr><td><strong>Make</strong></td><td>4.3</td><td></td></tr><tr><td><strong>pkg-config</strong></td><td>0.29.2</td><td></td></tr></tbody></table><h3 id="3-2-GUI-工具包"><a href="#3-2-GUI-工具包" class="headerlink" title="3.2 GUI 工具包"></a>3.2 GUI 工具包</h3><table><thead><tr><th>工具包</th><th>版本</th><th>备注</th></tr></thead><tbody><tr><td><strong>GLib</strong></td><td>2.66.8</td><td></td></tr><tr><td><strong>GTK 2</strong></td><td>2.24.33</td><td>旧版兼容</td></tr><tr><td><strong>GTK 3</strong></td><td>3.24.24</td><td>当前主用</td></tr><tr><td><strong>GTK 4</strong></td><td>❌ 未安装</td><td></td></tr><tr><td><strong>Qt 5</strong></td><td>5.15.2</td><td>含 Core&#x2F;Gui&#x2F;Widgets&#x2F;Quick&#x2F;Qml&#x2F;Multimedia&#x2F;WebEngine 等</td></tr><tr><td><strong>Qt 6</strong></td><td>❌ 未安装</td><td></td></tr></tbody></table><h3 id="3-3-显示与图形"><a href="#3-3-显示与图形" class="headerlink" title="3.3 显示与图形"></a>3.3 显示与图形</h3><table><thead><tr><th>组件</th><th>版本&#x2F;状态</th></tr></thead><tbody><tr><td><strong>X11 (libx11)</strong></td><td>1.7.5</td></tr><tr><td><strong>xcb</strong></td><td>1.14</td></tr><tr><td><strong>Wayland</strong></td><td>1.18.0（客户端&#x2F;服务端均可用）</td></tr><tr><td><strong>OpenGL</strong></td><td>NVIDIA T400 4GB（GLX 1.4）</td></tr><tr><td><strong>OpenGL ES &#x2F; Vulkan</strong></td><td>未检测</td></tr></tbody></table><h3 id="3-4-关键结论"><a href="#3-4-关键结论" class="headerlink" title="3.4 关键结论"></a>3.4 关键结论</h3><ul><li><strong>编译器能力</strong>：GCC 10.2 → C++20 完整支持，C++23 处于实验性。</li><li><strong>GUI 开发建议</strong>：<ul><li>GTK 应用：使用 <strong>GTK 3.24</strong>（推荐）或 GTK 2（兼容旧程序）</li><li>Qt 应用：使用 <strong>Qt 5.15 LTS</strong>；如需 Qt 6 需自行编译或添加 backports 源</li></ul></li><li><strong>缺失开发头文件</strong>：未安装 <code>*-dev</code> 包，仅有运行时库。如需编译需 <code>apt install libgtk-3-dev qtbase5-dev</code> 等。</li><li><strong>图形栈</strong>：X11 + Wayland 双栈，NVIDIA 专有驱动已就位（GLX 1.4）。</li></ul><h2 id="四、与主流发行版的详细对比"><a href="#四、与主流发行版的详细对比" class="headerlink" title="四、与主流发行版的详细对比"></a>四、与主流发行版的详细对比</h2><h3 id="4-1-核心组件对比"><a href="#4-1-核心组件对比" class="headerlink" title="4.1 核心组件对比"></a>4.1 核心组件对比</h3><table><thead><tr><th>组件</th><th>当前系统</th><th>Debian 11</th><th>Ubuntu 20.04</th><th>Ubuntu 22.04</th><th>Debian 12</th><th>Ubuntu 24.04</th></tr></thead><tbody><tr><td><strong>Kernel</strong></td><td><strong>5.4.0-100</strong></td><td>5.10 系列</td><td>5.4 (GA) &#x2F; 5.15 (HWE)</td><td>5.15 &#x2F; 5.17 (OEM)</td><td>6.1 LTS</td><td>6.8 (HWE)</td></tr><tr><td><strong>GCC</strong></td><td><strong>10.2.1</strong></td><td>10.2</td><td>9.3 (default)</td><td>11.2</td><td>12.2</td><td>13.x</td></tr><tr><td><strong>glibc</strong></td><td><strong>2.31</strong></td><td>2.31</td><td>2.31</td><td>2.35</td><td>2.36</td><td>2.39</td></tr><tr><td><strong>binutils</strong></td><td><strong>2.35.2</strong></td><td>2.35.2</td><td>2.34</td><td>2.38</td><td>2.40</td><td>2.42</td></tr><tr><td><strong>Python</strong></td><td><strong>3.9.2</strong></td><td>3.9</td><td>3.8</td><td>3.10</td><td>3.11</td><td>3.12</td></tr><tr><td><strong>Make</strong></td><td><strong>4.3</strong></td><td>4.3</td><td>4.2.1</td><td>4.3</td><td>4.3</td><td>4.3</td></tr></tbody></table><h3 id="4-2-GUI-工具包对比"><a href="#4-2-GUI-工具包对比" class="headerlink" title="4.2 GUI 工具包对比"></a>4.2 GUI 工具包对比</h3><table><thead><tr><th>组件</th><th>当前系统</th><th>Debian 11</th><th>Ubuntu 20.04</th><th>Ubuntu 22.04</th><th>Debian 12</th></tr></thead><tbody><tr><td><strong>GLib</strong></td><td><strong>2.66.8</strong></td><td>2.66.8</td><td>2.63</td><td>2.72</td><td>2.74</td></tr><tr><td><strong>GTK 2</strong></td><td><strong>2.24.33</strong></td><td>2.24.33</td><td>2.24.32</td><td>2.24.33</td><td>2.24.33</td></tr><tr><td><strong>GTK 3</strong></td><td><strong>3.24.24</strong></td><td>3.24.24</td><td>3.24.18</td><td>3.24.33</td><td>3.24.38</td></tr><tr><td><strong>GTK 4</strong></td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>❌</td></tr><tr><td><strong>Qt 5</strong></td><td><strong>5.15.2</strong></td><td>5.15.2</td><td>5.12.8</td><td>5.15.3</td><td>5.15.8</td></tr><tr><td><strong>Qt 6</strong></td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>6.4</td></tr></tbody></table><h3 id="4-3-显示与图形对比"><a href="#4-3-显示与图形对比" class="headerlink" title="4.3 显示与图形对比"></a>4.3 显示与图形对比</h3><table><thead><tr><th>组件</th><th>当前系统</th><th>Debian 11</th><th>Ubuntu 20.04</th><th>Ubuntu 22.04</th><th>Debian 12</th></tr></thead><tbody><tr><td><strong>X11 (libx11)</strong></td><td><strong>1.7.5</strong></td><td>1.7.2</td><td>1.6.9</td><td>1.7.5</td><td>1.8.4</td></tr><tr><td><strong>xcb</strong></td><td><strong>1.14</strong></td><td>1.14</td><td>1.14</td><td>1.14</td><td>1.15</td></tr><tr><td><strong>Wayland</strong></td><td><strong>1.18</strong></td><td>1.18</td><td>1.18</td><td>1.20</td><td>1.21</td></tr><tr><td><strong>OpenGL</strong></td><td>GLX 1.4</td><td>GLX 1.4</td><td>GLX 1.4</td><td>GLX 1.4</td><td>GLX 1.4</td></tr><tr><td><strong>GNOME</strong></td><td>-</td><td>3.38</td><td>3.36</td><td>42</td><td>43</td></tr></tbody></table><h3 id="4-4-综合匹配度评分"><a href="#4-4-综合匹配度评分" class="headerlink" title="4.4 综合匹配度评分"></a>4.4 综合匹配度评分</h3><blockquote><p>越接近 100% 表示技术栈越相似，二进制&#x2F;源码级兼容性越好。</p></blockquote><table><thead><tr><th>对比目标</th><th>内核</th><th>GCC</th><th>glibc</th><th>GTK</th><th>Qt</th><th>X11</th><th><strong>综合</strong></th></tr></thead><tbody><tr><td><strong>Debian 11 bullseye</strong></td><td>⚠️ 5.4 vs 5.10</td><td>✅ 完全一致</td><td>✅ 完全一致</td><td>✅ 完全一致</td><td>✅ 完全一致</td><td>⚠️ 1.7.5 vs 1.7.2</td><td><strong>~92%</strong></td></tr><tr><td><strong>Ubuntu 20.04 focal</strong></td><td>✅ 内核 5.4 一致</td><td>⚠️ 10.2 vs 9.3</td><td>✅ 一致</td><td>⚠️ 3.24.24 vs 3.24.18</td><td>⚠️ 5.15.2 vs 5.12.8</td><td>⚠️ 1.7.5 vs 1.6.9</td><td><strong>~88%</strong></td></tr><tr><td><strong>Ubuntu 22.04 jammy</strong></td><td>⚠️ 5.4 vs 5.15 (旧)</td><td>⚠️ 10.2 vs 11.2 (旧)</td><td>⚠️ 2.31 vs 2.35 (旧)</td><td>⚠️ 3.24.24 vs 3.24.33 (旧)</td><td>⚠️ 5.15.2 vs 5.15.3</td><td>✅ 1.7.5 一致</td><td><strong>~75%</strong></td></tr><tr><td><strong>Debian 12 bookworm</strong></td><td>❌ 5.4 vs 6.1 (旧)</td><td>❌ 10.2 vs 12.2 (旧)</td><td>❌ 2.31 vs 2.36 (旧)</td><td>⚠️ 3.24.24 vs 3.24.38 (旧)</td><td>⚠️ 5.15.2 vs 5.15.8</td><td>❌ 1.7.5 vs 1.8.4 (旧)</td><td><strong>~55%</strong></td></tr></tbody></table><h3 id="4-5-关键结论"><a href="#4-5-关键结论" class="headerlink" title="4.5 关键结论"></a>4.5 关键结论</h3><p><strong>🎯 最接近的发行版：Debian 11 bullseye（≈92% 匹配）</strong></p><ul><li>编译器（GCC 10.2.1）、glibc 2.31、GTK 3.24.24、Qt 5.15.2 <strong>完全一致</strong></li><li>唯一差异：内核主版本 5.4 vs 5.10（方德用了更早的 5.4 LTS 分支）</li><li>兼容性结论：<strong>二进制级 ABI 兼容</strong>，可直接使用 Debian 11 仓库</li></ul><p><strong>次接近：Ubuntu 20.04 focal（≈88%）</strong></p><ul><li>glibc、GTK 2、内核主线一致</li><li>Qt5（5.15 vs 5.12）和 X11（1.7 vs 1.6）略新</li><li>兼容性结论：<strong>运行 Ubuntu 20.04 二进制安全</strong>，可直接借用其 PPA</li></ul><p><strong>Ubuntu 22.04 jammy（≈75%）</strong></p><ul><li>仅 X11 一致，其他组件比当前系统都新</li><li>兼容性结论：<strong>当前系统无法直接运行 jammy 二进制</strong>（glibc 2.35 要求高于本机 2.31）</li></ul><h3 id="4-6-重要-ABI-兼容性提示"><a href="#4-6-重要-ABI-兼容性提示" class="headerlink" title="4.6 重要 ABI 兼容性提示"></a>4.6 重要 ABI 兼容性提示</h3><p>由于当前系统 <strong>glibc 2.31</strong>，以下限制需注意：</p><table><thead><tr><th>发行版</th><th>能否运行其二进制</th><th>说明</th></tr></thead><tbody><tr><td>Debian 11 &#x2F; Ubuntu 20.04</td><td>✅ 完美运行</td><td>glibc ≤ 2.31</td></tr><tr><td>Ubuntu 22.04</td><td>❌ glibc 2.35 要求</td><td>需 chroot&#x2F;容器</td></tr><tr><td>Debian 12</td><td>❌ glibc 2.36 要求</td><td>需容器或升级</td></tr><tr><td>Qt 官方包</td><td>✅ Debian 11 是 Qt 6 官方支持平台</td><td>GCC 10 + glibc 2.31</td></tr></tbody></table><blockquote><p>最终建议：<strong>当作 Debian 11 bullseye 或 Ubuntu 20.04 focal 环境使用最稳妥</strong>，可直接使用对应的 <code>.deb</code> 软件包与 apt 源。Ubuntu 22.04 及以后的二进制需要 Docker&#x2F;chroot 运行。</p></blockquote><h2 id="五、兼容情况"><a href="#五、兼容情况" class="headerlink" title="五、兼容情况"></a>五、兼容情况</h2><h3 id="5-1-二进制兼容等级"><a href="#5-1-二进制兼容等级" class="headerlink" title="5.1 二进制兼容等级"></a>5.1 二进制兼容等级</h3><table><thead><tr><th>兼容等级</th><th>发行版</th><th>说明</th></tr></thead><tbody><tr><td>🟢 <strong>完全兼容</strong></td><td><strong>Debian 11 bullseye</strong></td><td>ABI 一致，可直接复用 <code>.deb</code> 包与 apt 源</td></tr><tr><td>🟢 <strong>高度兼容</strong></td><td><strong>Ubuntu 20.04 focal</strong></td><td>内核主线、glibc 一致，Qt5&#x2F;X11 微新，兼容运行</td></tr><tr><td>🟡 <strong>基本兼容</strong></td><td>Ubuntu 18.04 bionic</td><td>glibc 2.27 旧于本机，反向兼容运行</td></tr><tr><td>🟡 <strong>受限兼容</strong></td><td>Ubuntu 22.04 jammy</td><td>仅个别组件新；glibc 2.35 高于本机 2.31，反向不兼容</td></tr><tr><td>🔴 <strong>不兼容</strong></td><td>Debian 12 bookworm &#x2F; Ubuntu 24.04</td><td>glibc 2.36+、GCC 12+ 全部高于本机</td></tr></tbody></table><h3 id="5-2-软件包兼容矩阵"><a href="#5-2-软件包兼容矩阵" class="headerlink" title="5.2 软件包兼容矩阵"></a>5.2 软件包兼容矩阵</h3><table><thead><tr><th>软件类型</th><th>兼容来源</th><th>备注</th></tr></thead><tbody><tr><td><code>.deb</code> 软件包</td><td>Debian 11 &#x2F; Ubuntu 20.04</td><td>直接安装可用</td></tr><tr><td>apt 源</td><td><code>deb.debian.org/debian bullseye</code></td><td>推荐主源</td></tr><tr><td>apt 源</td><td><code>archive.ubuntu.com focal</code></td><td>备用，PPA 需谨慎</td></tr><tr><td>Qt 官方安装包</td><td>Qt 5.15 (Linux x64)</td><td>官方支持本机环境</td></tr><tr><td>PyPI 包</td><td>Python 3.9 wheels</td><td>cp39 通用轮子可用</td></tr><tr><td>npm&#x2F;Node.js</td><td>Node 14&#x2F;16 LTS</td><td>与 glibc 2.31 兼容</td></tr><tr><td>Docker 镜像</td><td>bullseye &#x2F; focal</td><td>二进制级兼容</td></tr><tr><td>Docker 镜像</td><td>bookworm &#x2F; noble</td><td>❌ 无法运行（需 qemu-user）</td></tr></tbody></table><h3 id="5-3-编译兼容等级"><a href="#5-3-编译兼容等级" class="headerlink" title="5.3 编译兼容等级"></a>5.3 编译兼容等级</h3><table><thead><tr><th>编译工具链</th><th>能力</th><th>说明</th></tr></thead><tbody><tr><td><strong>GCC 10.2</strong></td><td>C17 &#x2F; C++17 &#x2F; 部分 C++20</td><td>主流语言标准全支持</td></tr><tr><td><strong>GLIBCXX_3.4.28</strong></td><td>C++ ABI</td><td>对应 libstdc++ from GCC 10</td></tr><tr><td><strong>glibc 2.31</strong></td><td>POSIX 高级特性</td><td>含 epoll_pwait2、statx 等</td></tr></tbody></table><h2 id="六、总结"><a href="#六、总结" class="headerlink" title="六、总结"></a>六、总结</h2><p><strong>当前系统 ≈ Debian 11 bullseye + 国产化适配层</strong></p><ul><li>✅ <strong>软件生态</strong>：完全兼容 Debian 11，可用 apt 源直接扩展</li><li>✅ <strong>GUI 编程</strong>：GTK 3.24 &#x2F; Qt 5.15 完整支持，可开发现代桌面应用</li><li>⚠️ <strong>内核</strong>：5.4 LTS 偏旧，但稳定可靠，足够支撑桌面与服务器场景</li><li>⚠️ <strong>ABI 边界</strong>：<strong>glibc 2.31 是关键上限</strong>，不能运行更新的发行版二进制</li><li>💡 <strong>升级建议</strong>：若需运行新版生态，可通过 <strong>Docker</strong> 解决；若需大规模生产部署，建议直接以 <strong>Debian 11 &#x2F; Ubuntu 20.04</strong> 为目标</li></ul><blockquote><p>选型核心只有一句话：<strong>glibc ≤ 2.31 的世界就是这台机器的舒适区</strong>。</p></blockquote>]]>
    </content>
    <id>https://haies.cn/os-nfs-report/</id>
    <link href="https://haies.cn/os-nfs-report/"/>
    <published>2026-08-26T09:05:09.000Z</published>
    <summary>方德桌面操作系统 V5.0 技术栈解析与发行版兼容分析。</summary>
    <title>方德桌面操作系统 V5.0 技术栈解析与发行版兼容分析</title>
    <updated>2026-10-21T00:56:24.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="重点" scheme="https://haies.cn/categories/mark/"/>
    <category term="技术栈" scheme="https://haies.cn/tags/stack/"/>
    <category term="实用" scheme="https://haies.cn/tags/utils/"/>
    <content>
      <![CDATA[<h2 id="背景与场景"><a href="#背景与场景" class="headerlink" title="背景与场景"></a>背景与场景</h2><p>三维重建是测绘、GIS、影视、游戏、VR 等多个行业的底层技术。近两年”3D 高斯飞溅（3D Gaussian Splatting，下文简称 3D-GS）”凭借惊艳的视觉效果迅速走红，让很多人开始重新评估自己的技术路线：传统”倾斜摄影测量”是不是要被取代了？</p><p>答案没那么简单。两者定位完全不同 —— 一个是<strong>测量级</strong>工具，输出可量测的几何模型；一个是<strong>渲染级</strong>工具，输出可实时显示的辐射场。把它们当作”新旧替代关系”是典型误读。本文从原理、输出、精度、应用四个维度做一次系统梳理，帮你按需选型。</p><h2 id="一、技术原理"><a href="#一、技术原理" class="headerlink" title="一、技术原理"></a>一、技术原理</h2><h3 id="1-1-倾斜摄影测量（Oblique-Photogrammetry）"><a href="#1-1-倾斜摄影测量（Oblique-Photogrammetry）" class="headerlink" title="1.1 倾斜摄影测量（Oblique Photogrammetry）"></a>1.1 倾斜摄影测量（Oblique Photogrammetry）</h3><p>倾斜摄影测量是摄影测量学的成熟分支：通过无人机搭载多镜头相机（通常五镜头），从多个角度对同一地物拍摄大量带有重叠度的照片，再借助特征点匹配（SIFT &#x2F; SFM）和多视密集匹配（MVS），反算出每个像素对应的空间坐标，最终生成带真实纹理的三角网格（Mesh）和纹理贴图。</p><table><thead><tr><th>项</th><th>内容</th></tr></thead><tbody><tr><td>输入</td><td>多角度重叠航拍照片（一般 70%–80% 重叠度）</td></tr><tr><td>核心算法</td><td>SFM（Structure-from-Motion） + MVS（Multi-View Stereo） + 三角化</td></tr><tr><td>输出</td><td>Mesh + 纹理、可选点云、正射影像、DSM&#x2F;DTM</td></tr><tr><td>代表软件</td><td>ContextCapture（原 Smart3D）、Pix4D、大疆智图、PhotoScan、超图</td></tr></tbody></table><h3 id="1-2-3D-高斯飞溅（3D-Gaussian-Splatting）"><a href="#1-2-3D-高斯飞溅（3D-Gaussian-Splatting）" class="headerlink" title="1.2 3D 高斯飞溅（3D Gaussian Splatting）"></a>1.2 3D 高斯飞溅（3D Gaussian Splatting）</h3><p>3D-GS 是 2023 年由 INRIA 提出的新型神经渲染方法。它把场景表示为海量可微分的 3D 高斯椭球（每个椭球带位置、协方差、颜色、透明度），通过 SfM 初始化后用 GPU 迭代优化，最终在任意视角下通过”飞溅投影”实时合成图像。</p><table><thead><tr><th>项</th><th>内容</th></tr></thead><tbody><tr><td>输入</td><td>多角度照片&#x2F;视频（也支持 NeRF 风格数据集）</td></tr><tr><td>核心算法</td><td>可微分高斯渲染 + 梯度下降优化</td></tr><tr><td>输出</td><td>高斯场文件（.ply &#x2F; .splat），可实时渲染</td></tr><tr><td>代表项目&#x2F;产品</td><td>3D-GS 原版、NeRFStudio、Luma AI、GaussianEditor、PostShot</td></tr></tbody></table><h2 id="二、核心区别"><a href="#二、核心区别" class="headerlink" title="二、核心区别"></a>二、核心区别</h2><table><thead><tr><th>维度</th><th>倾斜摄影测量</th><th>3D-GS</th></tr></thead><tbody><tr><td>定位</td><td>测量级 &#x2F; 测绘</td><td>渲染级 &#x2F; 视觉</td></tr><tr><td>输出格式</td><td>Mesh + 纹理 &#x2F; 点云</td><td>高斯辐射场</td></tr><tr><td>几何精度</td><td>厘米级，可量测</td><td>视觉级，不能直接量测</td></tr><tr><td>实时渲染</td><td>❌ 较慢，需客户端渲染</td><td>✅ 实时（&gt;30 FPS）</td></tr><tr><td>可编辑性</td><td>一般</td><td>较强（可拆分、编辑、组合场景）</td></tr><tr><td>硬件门槛</td><td>普通 CPU&#x2F;GPU 即可</td><td>训练需中高端 GPU（≥16 GB 显存）</td></tr><tr><td>成熟度</td><td>成熟商用 10+ 年</td><td>2023 起快速迭代</td></tr></tbody></table><blockquote><p><strong>关键差异</strong>：倾斜摄影测量输出的 Mesh 在 GIS 软件里可以直接量距离、面积、体积，3D-GS 输出在视觉上很美但”几何是隐式的”，无法直接拿到准确尺寸。</p></blockquote><h2 id="三、典型应用场景"><a href="#三、典型应用场景" class="headerlink" title="三、典型应用场景"></a>三、典型应用场景</h2><h3 id="3-1-倾斜摄影测量"><a href="#3-1-倾斜摄影测量" class="headerlink" title="3.1 倾斜摄影测量"></a>3.1 倾斜摄影测量</h3><table><thead><tr><th>行业</th><th>场景</th></tr></thead><tbody><tr><td>测绘地理</td><td>地形图测绘、等高线生成、权属调查、地籍测量</td></tr><tr><td>智慧城市</td><td>城市三维建模、CIM 平台、数字孪生底座</td></tr><tr><td>建筑房产</td><td>不动产测绘、工程验收、建筑形变监测</td></tr><tr><td>应急管理</td><td>灾害现场建模、灾后评估、应急指挥</td></tr><tr><td>交通&#x2F;电力</td><td>道路桥梁建模、电力线巡检、隧道监测</td></tr></tbody></table><h3 id="3-2-3D-高斯飞溅"><a href="#3-2-3D-高斯飞溅" class="headerlink" title="3.2 3D 高斯飞溅"></a>3.2 3D 高斯飞溅</h3><table><thead><tr><th>行业</th><th>场景</th></tr></thead><tbody><tr><td>游戏 &#x2F; 元宇宙</td><td>真实场景资产快速导入、虚拟世界构建</td></tr><tr><td>影视 &#x2F; 特效</td><td>数字场景重建、虚拟拍摄（LED 墙）、演员复刻</td></tr><tr><td>VR &#x2F; AR</td><td>沉浸式体验、空间扫描、空间计算</td></tr><tr><td>电商</td><td>商品 3D 展示、虚拟试穿、AR 预览</td></tr><tr><td>文化遗产</td><td>文物高精度数字化、虚拟博物馆</td></tr><tr><td>自动驾驶</td><td>场景重建、NeRF&#x2F;GS 仿真测试闭环</td></tr></tbody></table><h2 id="四、技术选型建议"><a href="#四、技术选型建议" class="headerlink" title="四、技术选型建议"></a>四、技术选型建议</h2><table><thead><tr><th>需求</th><th>推荐方案</th></tr></thead><tbody><tr><td>需要厘米级可量测模型</td><td>倾斜摄影测量</td></tr><tr><td>重点是视觉效果&#x2F;实时渲染</td><td>3D-GS</td></tr><tr><td>既要测量又要好看</td><td>倾斜摄影测量建模 + 3D-GS 渲染（业界已有 hybrid 方案）</td></tr><tr><td>大范围地形&#x2F;城市底图</td><td>倾斜摄影测量</td></tr><tr><td>小物体&#x2F;室内精细还原</td><td>两者皆可，3D-GS 视觉效果更佳</td></tr></tbody></table><h2 id="五、代表产品速览"><a href="#五、代表产品速览" class="headerlink" title="五、代表产品速览"></a>五、代表产品速览</h2><table><thead><tr><th>技术类别</th><th>代表产品</th></tr></thead><tbody><tr><td>倾斜摄影测量</td><td>ContextCapture、Pix4D、大疆智图、PhotoScan、超图 GIS</td></tr><tr><td>3D-GS</td><td>Luma AI（消费级 App）、NeRFStudio（研究框架）、GaussianEditor（编辑）、PostShot、BrushGS</td></tr></tbody></table><h2 id="六、总结"><a href="#六、总结" class="headerlink" title="六、总结"></a>六、总结</h2><p>两种技术不是替代关系，而是<strong>互补关系</strong>：</p><ul><li><strong>倾斜摄影测量</strong> → 测绘、工程、政府项目、可量测场景的标准答案；</li><li><strong>3D 高斯飞溅</strong> → 视觉表现、实时渲染、消费级体验的更优解。</li></ul><p>如果项目对”几何精度”敏感，就老老实实用倾斜摄影测量；如果项目对”画面真实感和实时性”敏感，3D-GS 是 2024 年以来的最优解。预算充足、要求高的话，可以把两者结合 —— 用倾斜摄影测量保证几何骨架，用 3D-GS 渲染贴层做视觉增强。</p><blockquote><p>选型核心只有一句话：<strong>你的项目到底是”要测”还是”要看”？</strong></p></blockquote>]]>
    </content>
    <id>https://haies.cn/3d-reconstruction-tech-comparison/</id>
    <link href="https://haies.cn/3d-reconstruction-tech-comparison/"/>
    <published>2026-08-26T08:45:46.000Z</published>
    <summary>从技术原理、输出产物、精度与应用四个维度对比倾斜摄影测量与 3D 高斯飞溅：一个是测量级工具输出可量测几何模型，一个是渲染级工具输出实时辐射场，二者定位不同而非替代关系。</summary>
    <title>倾斜摄影测量与 3D 高斯飞溅技术对比</title>
    <updated>2026-10-21T02:31:08.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="开发" scheme="https://haies.cn/categories/dev/"/>
    <category term="技术栈" scheme="https://haies.cn/tags/stack/"/>
    <category term="AI" scheme="https://haies.cn/tags/ai/"/>
    <category term="教程" scheme="https://haies.cn/tags/manual/"/>
    <content>
      <![CDATA[<h2 id="前言：为什么必须锁定-2-1-153"><a href="#前言：为什么必须锁定-2-1-153" class="headerlink" title="前言：为什么必须锁定 2.1.153"></a>前言：为什么必须锁定 2.1.153</h2><p>Claude Code 在近期版本迭代中，对第三方自定义模型做了强制封杀，版本分界线非常明确：</p><ul><li><strong>≤ 2.1.153</strong>：完全原生支持 <code>ANTHROPIC_BASE_URL</code> 自定义接口，兼容所有国产 Anthropic 协议模型，无请求篡改、无强制登录、无报错。</li><li><strong>2.1.154 ~ 2.1.155</strong>：强制插入非法 system 字段，第三方模型全部 400 报错。</li><li><strong>≥ 2.1.156</strong>：底层彻底移除自定义接口能力，完全无法使用第三方模型。</li></ul><p><strong>结论</strong>：2.1.153 是目前国内开发者使用第三方模型的唯一终点版本。原本使用的 2.1.146 可直接平滑升级，稳定性大幅提升且完全保留第三方兼容性。</p><h2 id="一、定点安装-升级至-2-1-153"><a href="#一、定点安装-升级至-2-1-153" class="headerlink" title="一、定点安装 &#x2F; 升级至 2.1.153"></a>一、定点安装 &#x2F; 升级至 2.1.153</h2><p>使用官方原生安装脚本定点安装指定版本，无需卸载旧版本，直接覆盖升级，保留用户目录配置。</p><h3 id="macOS-Linux-WSL"><a href="#macOS-Linux-WSL" class="headerlink" title="macOS &#x2F; Linux &#x2F; WSL"></a>macOS &#x2F; Linux &#x2F; WSL</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -fsSL https://claude.ai/install.sh | bash -s 2.1.153</span><br></pre></td></tr></table></figure><h3 id="Windows-PowerShell（管理员）"><a href="#Windows-PowerShell（管理员）" class="headerlink" title="Windows PowerShell（管理员）"></a>Windows PowerShell（管理员）</h3><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&amp; ([<span class="type">scriptblock</span>]::Create((<span class="built_in">irm</span> https://claude.ai/install.ps1))) <span class="number">2.1</span>.<span class="number">153</span></span><br></pre></td></tr></table></figure><h3 id="版本校验"><a href="#版本校验" class="headerlink" title="版本校验"></a>版本校验</h3><p>安装完成后重启终端，执行如下命令确认版本锁定成功：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">claude --version</span><br></pre></td></tr></table></figure><p>正常输出：<code>Claude Code 2.1.153</code></p><h2 id="二、永久锁定版本，彻底禁用自动更新"><a href="#二、永久锁定版本，彻底禁用自动更新" class="headerlink" title="二、永久锁定版本，彻底禁用自动更新"></a>二、永久锁定版本，彻底禁用自动更新</h2><p>这是最重要步骤。不锁版本会被后台静默升级至失效版本，导致第三方模型彻底无法使用。采用「配置文件+系统环境变量」双重兜底方案。</p><h3 id="2-1-全局配置文件锁定"><a href="#2-1-全局配置文件锁定" class="headerlink" title="2.1 全局配置文件锁定"></a>2.1 全局配置文件锁定</h3><p>编辑配置文件：</p><ul><li>macOS &#x2F; Linux：<code>~/.claude/settings.json</code></li><li>Windows：<code>%USERPROFILE%\.claude\settings.json</code></li></ul><p>写入以下完整配置：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;autoUpdates&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;autoUpdatesChannel&quot;</span><span class="punctuation">:</span> <span class="string">&quot;stable&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;minimumVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;2.1.153&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;env&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;DISABLE_AUTOUPDATER&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>配置说明：</p><ul><li><strong>关闭客户端自动更新</strong>：禁止客户端主动检测、下载、升级新版本</li><li><strong>禁用官方更新进程</strong>：通过官方环境变量彻底杀死更新服务</li><li><strong>关闭非必要遥测</strong>：减少国内网络无效请求，降低卡顿与延迟</li></ul><h3 id="2-2-系统环境变量兜底加固"><a href="#2-2-系统环境变量兜底加固" class="headerlink" title="2.2 系统环境变量兜底加固"></a>2.2 系统环境变量兜底加固</h3><h4 id="macOS-Linux（zsh-bash）"><a href="#macOS-Linux（zsh-bash）" class="headerlink" title="macOS &#x2F; Linux（zsh&#x2F;bash）"></a>macOS &#x2F; Linux（zsh&#x2F;bash）</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;export DISABLE_AUTOUPDATER=1&#x27;</span> &gt;&gt; ~/.zshrc</span><br><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br></pre></td></tr></table></figure><h4 id="Windows-PowerShell"><a href="#Windows-PowerShell" class="headerlink" title="Windows PowerShell"></a>Windows PowerShell</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[<span class="type">Environment</span>]::SetEnvironmentVariable(<span class="string">&quot;DISABLE_AUTOUPDATER&quot;</span>, <span class="string">&quot;1&quot;</span>, <span class="string">&quot;User&quot;</span>)</span><br></pre></td></tr></table></figure><h2 id="三、国内环境专属优化方案"><a href="#三、国内环境专属优化方案" class="headerlink" title="三、国内环境专属优化方案"></a>三、国内环境专属优化方案</h2><ul><li><strong>精简 MCP 服务</strong>：未使用 MCP 工具链时，清空所有 MCP 服务，减少后台常驻占用<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">claude mcp list</span><br><span class="line">claude mcp remove 服务名</span><br></pre></td></tr></table></figure></li><li><strong>定期压缩上下文</strong>：长对话卡顿、上下文冗余，在 Claude 终端输入 <code>/compact</code> 一键精简会话</li><li><strong>管控后台任务</strong>：避免大量并行 <code>/bg</code> 后台任务，防止守护进程残留卡死</li><li><strong>清理缓存</strong>：定期删除 <code>~/.claude/cache</code> 缓存目录，不影响配置与密钥</li></ul><h2 id="四、macOS-Linux-一键终极部署脚本"><a href="#四、macOS-Linux-一键终极部署脚本" class="headerlink" title="四、macOS &#x2F; Linux 一键终极部署脚本"></a>四、macOS &#x2F; Linux 一键终极部署脚本</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">curl -fsSL https://claude.ai/install.sh | bash -s 2.1.153</span><br><span class="line"><span class="built_in">cat</span> &gt; ~/.claude/settings.json &lt;&lt; <span class="string">&#x27;EOF&#x27;</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="string">&quot;autoUpdates&quot;</span>: <span class="literal">false</span>,</span><br><span class="line">  <span class="string">&quot;autoUpdatesChannel&quot;</span>: <span class="string">&quot;stable&quot;</span>,</span><br><span class="line">  <span class="string">&quot;minimumVersion&quot;</span>: <span class="string">&quot;2.1.153&quot;</span>,</span><br><span class="line">  <span class="string">&quot;env&quot;</span>: &#123;</span><br><span class="line">    <span class="string">&quot;DISABLE_AUTOUPDATER&quot;</span>: <span class="string">&quot;1&quot;</span>,</span><br><span class="line">    <span class="string">&quot;CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC&quot;</span>: <span class="string">&quot;1&quot;</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line">EOF</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;export DISABLE_AUTOUPDATER=1&#x27;</span> &gt;&gt; ~/.zshrc</span><br><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br><span class="line">claude --version</span><br></pre></td></tr></table></figure><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>目前 Claude Code 官方持续收紧第三方模型权限，<strong>2.1.153 是国内免费自定义模型的最后窗口期版本</strong>。</p>]]>
    </content>
    <id>https://haies.cn/ai-claude-code-third-party-model-guide/</id>
    <link href="https://haies.cn/ai-claude-code-third-party-model-guide/"/>
    <published>2026-06-02T04:00:00.000Z</published>
    <summary>Claude Code 国内接入第三方模型（OpenRouter、DeepSeek 等）的完整配置实践，含版本锁定、环境变量、模型映射与常见报错排查。</summary>
    <title>Claude Code 国内接入第三方模型终极最佳实践</title>
    <updated>2026-10-21T02:31:08.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="笔记" scheme="https://haies.cn/categories/note/"/>
    <category term="AI" scheme="https://haies.cn/tags/ai/"/>
    <content>
      <![CDATA[<p>大语言模型的规模增长面临算力与存储的双重约束。如何在保持模型能力的前提下降低推理成本，已成为工业落地的核心命题。MoE（混合专家模型）、稀疏参数与知识蒸馏三项技术从不同维度破解这一困境：MoE通过动态激活部分参数实现稀疏化，稀疏参数释放了规模化的潜力，知识蒸馏则将大模型能力迁移至小模型。三者协同，代表了大模型从”大而强”走向”大而轻”的主流技术路径。</p><h2 id="MoE：稀疏激活的神经网络架构"><a href="#MoE：稀疏激活的神经网络架构" class="headerlink" title="MoE：稀疏激活的神经网络架构"></a>MoE：稀疏激活的神经网络架构</h2><p>MoE的核心思想是”分而治之”。传统神经网络对所有输入执行相同的计算路径，而MoE将模型分解为多个并行的专家网络（Expert Networks），由一个门控网络（Gating Network）根据输入内容动态选择激活哪些专家。</p><p>具体而言，门控网络为每个输入token输出一组权重分布，决定各专家的参与程度。推理时，只有权重较高的少数专家被实际调用，其余专家的计算被跳过。以DeepSeek-R1-671B为例，其总参数规模为671B，但推理时每次仅激活约1&#x2F;10的专家，单步计算量等价于一个67B的稠密模型。这意味着模型在拥有超大规模参数的同时，将实际计算成本控制在远低于总参数的量级。</p><p>MoE的优势在于：相同算力预算下可以容纳更多参数，从而突破稠密模型的规模瓶颈；不同专家可专注于不同类型的任务或知识领域，实现隐式的专业化分工。</p><h2 id="稀疏参数：规模与效率的重新平衡"><a href="#稀疏参数：规模与效率的重新平衡" class="headerlink" title="稀疏参数：规模与效率的重新平衡"></a>稀疏参数：规模与效率的重新平衡</h2><p>稀疏参数并非MoE独有，但MoE是其最典型的工程实现。稀疏的含义是：总参数量巨大，但任意时刻只有部分参数被实际使用。</p><p>这一特性带来三方面价值。首先是规模突破：在相同的算力和显存约束下，稀疏模型可以拥有10-100倍于稠密模型的参数量，因为大部分参数无需同时参与计算。其次是推理成本降低：激活参数少意味着每次前向传播的FLOPs大幅减少，部署成本随之下降。第三是专业化分工：不同专家可学习不同领域的知识，形成隐式的任务路由，避免单一模型试图同时掌握所有能力导致的表达冲突。</p><p>稀疏参数的本质是用”参数冗余”换取”计算高效”——存储的是大规模知识，执行时只调用与当前输入相关的部分。</p><h2 id="知识蒸馏：从大模型到小模型的能力迁移"><a href="#知识蒸馏：从大模型到小模型的能力迁移" class="headerlink" title="知识蒸馏：从大模型到小模型的能力迁移"></a>知识蒸馏：从大模型到小模型的能力迁移</h2><p>知识蒸馏（Knowledge Distillation）是将大模型（教师模型）能力迁移至小模型（学生模型）的技术。其核心机制是让小模型不仅学习硬标签（真实标签），还学习软标签（教师模型输出的概率分布）。</p><p>软标签包含的信息远多于硬标签。硬标签只告诉模型”正确答案是什么”，而软标签还携带了”错误答案之间的相对关系”——模型认为”猫”和”狗”的相似度高于”猫”和”汽车”，这种隐含的相似结构正是知识蒸馏希望传递的”暗知识”。</p><p>以DeepSeek-R1-Distill系列为例，教师模型为DeepSeek-R1-671B（MoE架构），学生模型则包括Qwen系（1.5B&#x2F;7B&#x2F;14B&#x2F;32B）和Llama系（8B&#x2F;70B）等多个规模的稠密模型。蒸馏后的小模型在保持极小参数量的同时，复现了教师模型在推理任务上的核心能力。</p><h2 id="三者协同：技术飞轮的运转逻辑"><a href="#三者协同：技术飞轮的运转逻辑" class="headerlink" title="三者协同：技术飞轮的运转逻辑"></a>三者协同：技术飞轮的运转逻辑</h2><p>三项技术的协同构建了一个高效的技术飞轮。</p><p>MoE提供了”超强教师”的可能——凭借稀疏激活，MoE模型可以在总参数极大的同时保持推理效率，这意味着教师模型可以拥有前所未有的知识容量和多样性。知识蒸馏则充当”能力搬运工”，将教师从海量参数中习得的知识以软标签的形式传递给轻量的学生模型。稀疏参数是连接两者的桥梁——它既是MoE的实现基础，也是蒸馏得以可行的前提，因为只有稀疏架构才能在保持大规模知识的同时具备足够的推理效率来完成蒸馏过程。</p><p>最终实现的效果是”高性能+低成本”的落地：教师模型负责知识生产和能力探索，学生模型负责实际部署和服务。这种分工在保持能力上限的同时，大幅降低了端侧部署的门槛。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>MoE通过稀疏激活打破了”参数量&#x3D;计算量”的等式约束，为大规模模型的训练提供了新的可行路径。稀疏参数将这一优势工程化，实现规模与效率的重新平衡。知识蒸馏则在不损失核心能力的前提下，将大模型的优势迁移到可部署的轻量模型。三项技术共同推动了大模型从”大而强”向”大而轻”的关键演进，为AI能力的广泛落地扫清了算力壁垒。</p>]]>
    </content>
    <id>https://haies.cn/llm-moe-sparse-distillation/</id>
    <link href="https://haies.cn/llm-moe-sparse-distillation/"/>
    <published>2026-05-26T09:30:00.000Z</published>
    <summary>大模型技术演进：MoE、稀疏参数与蒸馏模型的协同。</summary>
    <title>大模型技术演进：MoE、稀疏参数与蒸馏模型的协同革命</title>
    <updated>2026-10-21T00:56:24.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="笔记" scheme="https://haies.cn/categories/note/"/>
    <category term="AI" scheme="https://haies.cn/tags/ai/"/>
    <category term="教程" scheme="https://haies.cn/tags/manual/"/>
    <content>
      <![CDATA[<blockquote><p>通义千问 Qwen3.6-35B-A3B + 视觉能力，8G 显存、32G 内存，Windows 部署</p></blockquote><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>大模型常被认为是高端显卡的专属，动辄 24G、48G 显存门槛劝退普通玩家。但随着 <strong>llama.cpp 高性能推理 + GGUF 量化 + MoE 混合专家架构</strong> 的成熟，<strong>8G 消费级显卡</strong>也能跑 35B 级大模型，甚至带视觉能力。</p><p>本文全程基于 <strong>RTX 4060 8G + 32G 内存 + Windows</strong>，手把手部署 <strong>Qwen3.6-35B-A3B MoE（含视觉）</strong>，无编译、无高门槛、可直接照抄操作。</p><hr><h2 id="一、硬件与模型选型"><a href="#一、硬件与模型选型" class="headerlink" title="一、硬件与模型选型"></a>一、硬件与模型选型</h2><h3 id="1-1-硬件配置（真实消费级）"><a href="#1-1-硬件配置（真实消费级）" class="headerlink" title="1.1 硬件配置（真实消费级）"></a>1.1 硬件配置（真实消费级）</h3><ul><li><p><strong>显卡</strong>：NVIDIA RTX 4060 8GB（GDDR6）</p></li><li><p><strong>CPU</strong>：Intel i9-11900KB @ 3.30GHz</p></li><li><p><strong>内存</strong>：32GB DDR4（双通道，关键！）</p></li><li><p><strong>系统</strong>：Windows 11 64 位</p></li></ul><h3 id="1-2-选用模型详解"><a href="#1-2-选用模型详解" class="headerlink" title="1.2 选用模型详解"></a>1.2 选用模型详解</h3><p>本次部署 <strong>通义千问 35B MoE 量化版 + 视觉投影</strong>：</p><ul><li><p>主模型：<code>Qwen3.6-35B-A3B-UD-Q4_K_M.gguf</code>（4-bit 量化，平衡速度 &#x2F; 效果）</p></li><li><p>视觉投影：<code>mmproj-BF16.gguf</code>（支持图文对话、图片理解）</p></li></ul><h4 id="1-2-1-模型命名解析（A3B-与-UD）"><a href="#1-2-1-模型命名解析（A3B-与-UD）" class="headerlink" title="1.2.1 模型命名解析（A3B 与 UD）"></a>1.2.1 模型命名解析（A3B 与 UD）</h4><table><thead><tr><th>字段</th><th>全称</th><th>核心含义</th></tr></thead><tbody><tr><td><strong>Qwen3.6</strong></td><td>-</td><td>通义千问 3.6 系列大模型</td></tr><tr><td><strong>35B</strong></td><td>35 Billion</td><td>模型总参数数量（MoE 架构）</td></tr><tr><td><strong>A3B</strong></td><td><strong>Activated 3 Billion</strong></td><td>推理时每个 token 仅激活约 3B 参数，实际计算量接近 3B 模型</td></tr><tr><td><strong>UD</strong></td><td><strong>Unsloth Dynamic</strong></td><td>Unsloth 团队优化的动态量化方案，兼顾高压缩率与推理质量</td></tr><tr><td><strong>Q4_K_M</strong></td><td>4-bit K-quant Medium</td><td>4 比特分层量化，对关键层保留更高精度</td></tr><tr><td><strong>GGUF</strong></td><td>-</td><td>llama.cpp 专用高效推理格式</td></tr></tbody></table><h4 id="1-2-2-选择理由"><a href="#1-2-2-选择理由" class="headerlink" title="1.2.2 选择理由"></a>1.2.2 选择理由</h4><ul><li><p><strong>MoE 架构优势</strong>：总参数 35B，推理只激活少量专家，显存占用远低于同规模稠密模型</p></li><li><p><strong>UD-Q4_K_M 量化</strong>：动态量化 + 混合精度，显存大幅下降，适配 8G+32G 配置</p></li><li><p><strong>原生视觉能力</strong>：内置视觉编码器，开箱即用图文对话</p></li><li><p><strong>开源生态成熟</strong>：Unsloth 提供 GGUF 版本，兼容性好、社区支持完善</p></li></ul><hr><h2 id="二、环境安装（Windows，一键到位）"><a href="#二、环境安装（Windows，一键到位）" class="headerlink" title="二、环境安装（Windows，一键到位）"></a>二、环境安装（Windows，一键到位）</h2><h3 id="2-1-安装-CUDA-12-4（必须，13-2-有兼容问题）"><a href="#2-1-安装-CUDA-12-4（必须，13-2-有兼容问题）" class="headerlink" title="2.1 安装 CUDA 12.4（必须，13.2 有兼容问题）"></a>2.1 安装 CUDA 12.4（必须，13.2 有兼容问题）</h3><p>管理员 PowerShell 执行：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">winget install NVIDIA.CUDA.<span class="number">12.4</span></span><br></pre></td></tr></table></figure><p>安装完成后<strong>重启电脑</strong>。</p><h3 id="2-2-下载预编译-llama-cpp（免编译）"><a href="#2-2-下载预编译-llama-cpp（免编译）" class="headerlink" title="2.2 下载预编译 llama.cpp（免编译）"></a>2.2 下载预编译 llama.cpp（免编译）</h3><ol><li><p>发布页：<a href="https://github.com/ggerganov/llama.cpp/releases">https://github.com/ggerganov/llama.cpp/releases</a></p></li><li><p>下载：<code>llama-b9305-bin-win-cuda-12.4-x64.zip</code></p></li><li><p>解压到目录，例如：<code>D:\llama.cpp</code></p></li></ol><h3 id="2-3-安装-uv-huggingface-hub（uv-tool）"><a href="#2-3-安装-uv-huggingface-hub（uv-tool）" class="headerlink" title="2.3 安装 uv + huggingface-hub（uv tool）"></a>2.3 安装 uv + huggingface-hub（uv tool）</h3><h4 id="2-3-1-安装-uv"><a href="#2-3-1-安装-uv" class="headerlink" title="2.3.1 安装 uv"></a>2.3.1 安装 uv</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">powershell <span class="literal">-c</span> <span class="string">&quot;irm https://astral.sh/uv/install.ps1 | iex&quot;</span></span><br></pre></td></tr></table></figure><h4 id="2-3-2-安装-huggingface-hub"><a href="#2-3-2-安装-huggingface-hub" class="headerlink" title="2.3.2 安装 huggingface-hub"></a>2.3.2 安装 huggingface-hub</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv tool install huggingface<span class="literal">-hub</span></span><br></pre></td></tr></table></figure><p>验证：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hf <span class="literal">--version</span></span><br></pre></td></tr></table></figure><h3 id="2-4-永久配置-HF-国内镜像（hf-mirror）"><a href="#2-4-永久配置-HF-国内镜像（hf-mirror）" class="headerlink" title="2.4 永久配置 HF 国内镜像（hf-mirror）"></a>2.4 永久配置 HF 国内镜像（hf-mirror）</h3><p>镜像地址：<code>https://hf-mirror.com</code></p><p>管理员 PowerShell 执行：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">setx HF_ENDPOINT <span class="string">&quot;https://hf-mirror.com&quot;</span> /M</span><br></pre></td></tr></table></figure><p>或手动添加系统环境变量，<strong>重启终端</strong>生效。</p><h3 id="2-5-下载模型（hf-mirror-加速）"><a href="#2-5-下载模型（hf-mirror-加速）" class="headerlink" title="2.5 下载模型（hf-mirror 加速）"></a>2.5 下载模型（hf-mirror 加速）</h3><p>进入 llama.cpp 目录，创建文件夹：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mkdir models/Qwen3.<span class="number">6</span><span class="literal">-35B-A3B-UD-Q4_K_M</span></span><br></pre></td></tr></table></figure><p>下载命令：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hf download unsloth/Qwen3.<span class="number">6</span><span class="literal">-35B-A3B-GGUF</span> Qwen3.<span class="number">6</span><span class="literal">-35B-A3B-UD-Q4_K_M</span>.gguf mmproj<span class="literal">-BF16</span>.gguf <span class="literal">--local-dir</span> ./models/Qwen3.<span class="number">6</span><span class="literal">-35B-A3B-UD-Q4_K_M</span></span><br></pre></td></tr></table></figure><hr><h2 id="三、启动脚本与参数详解（8G-最优配置）"><a href="#三、启动脚本与参数详解（8G-最优配置）" class="headerlink" title="三、启动脚本与参数详解（8G 最优配置）"></a>三、启动脚本与参数详解（8G 最优配置）</h2><p>在 llama.cpp 目录新建 <code>start.bat</code>：</p><figure class="highlight batch"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">@<span class="built_in">echo</span> off</span><br><span class="line"><span class="built_in">chcp</span> <span class="number">65001</span> &gt;<span class="built_in">nul</span></span><br><span class="line"><span class="built_in">title</span> Qwen3.<span class="number">6</span>-<span class="number">35</span>B-A3B MoE + 视觉模型</span><br><span class="line"><span class="built_in">echo</span> ======================================================</span><br><span class="line"><span class="built_in">echo</span>        通义千问<span class="number">35</span>B MoE + 视觉模型 稳定加速版</span><br><span class="line"><span class="built_in">echo</span>           硬件：RTX4060 <span class="number">8</span>G + <span class="number">32</span>G 内存</span><br><span class="line"><span class="built_in">echo</span> ======================================================</span><br><span class="line"><span class="built_in">echo</span>.</span><br><span class="line"></span><br><span class="line"><span class="built_in">cd</span> /d &quot;%~dp0&quot;</span><br><span class="line"></span><br><span class="line">llama-server.exe ^</span><br><span class="line">-m &quot;./models/Qwen3.<span class="number">6</span>-<span class="number">35</span>B-A3B-UD-Q4_K_M/Qwen3.<span class="number">6</span>-<span class="number">35</span>B-A3B-UD-Q4_K_M.gguf&quot; ^</span><br><span class="line">--mmproj &quot;./models/Qwen3.<span class="number">6</span>-<span class="number">35</span>B-A3B-UD-Q4_K_M/mmproj-BF16.gguf&quot; ^</span><br><span class="line">-ngl <span class="number">99</span> ^</span><br><span class="line">--n-cpu-moe <span class="number">32</span> ^</span><br><span class="line">-np <span class="number">1</span> ^</span><br><span class="line">--flash-attn on ^</span><br><span class="line">--jinja ^</span><br><span class="line">-c <span class="number">32768</span> ^</span><br><span class="line">-t <span class="number">16</span> ^</span><br><span class="line">-b <span class="number">1024</span> ^</span><br><span class="line">-ub <span class="number">256</span> ^</span><br><span class="line">--split-<span class="built_in">mode</span> layer ^</span><br><span class="line">--cache-<span class="built_in">type</span>-k q4_0 ^</span><br><span class="line">--cache-<span class="built_in">type</span>-v q4_0 ^</span><br><span class="line">--no-mmap ^</span><br><span class="line">--host <span class="number">127</span>.<span class="number">0</span>.<span class="number">0</span>.<span class="number">1</span> ^</span><br><span class="line">--port <span class="number">8080</span> ^</span><br><span class="line">--metrics</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span>.</span><br><span class="line"><span class="built_in">echo</span> 启动成功！浏览器访问：http://<span class="number">127</span>.<span class="number">0</span>.<span class="number">0</span>.<span class="number">1</span>:<span class="number">8080</span></span><br><span class="line"><span class="built_in">pause</span></span><br></pre></td></tr></table></figure><h3 id="关键参数解析"><a href="#关键参数解析" class="headerlink" title="关键参数解析"></a>关键参数解析</h3><table><thead><tr><th>参数</th><th>作用</th><th>适配说明</th></tr></thead><tbody><tr><td><code>-ngl 99</code></td><td>99 层全部上 GPU</td><td>最大化利用 4060 算力</td></tr><tr><td><code>--n-cpu-moe 32</code></td><td>MoE 专家放 CPU &#x2F; 内存</td><td>显存不够、内存来补</td></tr><tr><td><code>--flash-attn on</code></td><td>注意力加速 + 省显存</td><td>8G 必备优化</td></tr><tr><td><code>-c 32768</code></td><td>32K 上下文</td><td>支持长文本对话</td></tr><tr><td><code>--split-mode layer</code></td><td>分层放显存 &#x2F; 内存</td><td>防止爆显存</td></tr><tr><td><code>--cache-type-k/v q4_0</code></td><td>KV 缓存 4-bit 量化</td><td>显存占用减少 75%</td></tr></tbody></table><hr><h2 id="四、运行效果（8G-显卡真实表现）"><a href="#四、运行效果（8G-显卡真实表现）" class="headerlink" title="四、运行效果（8G 显卡真实表现）"></a>四、运行效果（8G 显卡真实表现）</h2><h3 id="4-1-启动与访问"><a href="#4-1-启动与访问" class="headerlink" title="4.1 启动与访问"></a>4.1 启动与访问</h3><ol><li><p>双击 <code>start.bat</code></p></li><li><p>首次加载约 1–2 分钟</p></li><li><p>浏览器打开：<a href="http://127.0.0.1:8080/"><strong>http://127.0.0.1:8080</strong></a></p></li></ol><p><img src="/assets/llm_start.png" alt="模型启动后资源占用" loading="lazy"></p><h3 id="4-2-资源占用"><a href="#4-2-资源占用" class="headerlink" title="4.2 资源占用"></a>4.2 资源占用</h3><ul><li><p><strong>显存</strong>：7.2–7.8GB（稳定不溢出）</p></li><li><p><strong>内存</strong>：16–20GB（专家层分流）</p></li><li><p><strong>CPU</strong>：90%（负载可控）</p></li></ul><p><img src="/assets/llm_decode.png" alt="模型生成过程资源占用" loading="lazy"></p><h3 id="4-3-推理速度"><a href="#4-3-推理速度" class="headerlink" title="4.3 推理速度"></a>4.3 推理速度</h3><ul><li><p>文本对话：<strong>30 token&#x2F;s</strong>（日常流畅）</p></li><li><p>图文对话：响应 2–3 秒，识别准确</p></li></ul><p><img src="/assets/llm_speed.png" alt="模型生成界面" loading="lazy"><br><img src="/assets/llm_speed2.png" alt="模型生成速度" loading="lazy"></p><h3 id="4-4-能力表现"><a href="#4-4-能力表现" class="headerlink" title="4.4 能力表现"></a>4.4 能力表现</h3><ul><li><p>文本：问答 &#x2F; 推理 &#x2F; 创作接近原生 35B</p></li><li><p>视觉：图片描述、OCR、简单图像问答可用</p></li></ul><h3 id="4-5-稳定性"><a href="#4-5-稳定性" class="headerlink" title="4.5 稳定性"></a>4.5 稳定性</h3><p>连续运行 4 小时无崩溃，长文本对话不掉链。</p><hr><h2 id="五、效果截图索引"><a href="#五、效果截图索引" class="headerlink" title="五、效果截图索引"></a>五、效果截图索引</h2><p>本文全部截图已按用途归入第四章，图注与图片一一对应：</p><ol><li><strong>图 1：模型启动后资源占用</strong> —— 对应 4.1 节图片 <code>/assets/llm_start.png</code></li><li><strong>图 2：模型生成过程资源占用</strong> —— 对应 4.2 节图片 <code>/assets/llm_decode.png</code></li><li><strong>图 3：模型生成界面</strong> —— 对应 4.3 节图片 <code>/assets/llm_speed.png</code></li><li><strong>图 4：模型生成速度</strong> —— 对应 4.3 节图片 <code>/assets/llm_speed2.png</code></li></ol><hr><h2 id="六、总结"><a href="#六、总结" class="headerlink" title="六、总结"></a>六、总结</h2><p><strong>RTX 4060 8G 真的能跑 35B MoE + 视觉</strong>。核心要点：</p><ul><li><p>CUDA 12.4 + llama.cpp 预编译，避开兼容问题</p></li><li><p>UD-Q4_K_M 量化 + KV 缓存量化，适配 8G 显存</p></li><li><p>MoE 专家分流到内存，32G 内存成为关键</p></li><li><p>hf-mirror 加速，国内高速下载模型</p></li></ul><p>这套方案<strong>成本极低、操作极简、效果可用</strong>，普通消费卡也能体验 35B 级大模型能力。</p>]]>
    </content>
    <id>https://haies.cn/ai-moe-qwen3-6-35b-a3b/</id>
    <link href="https://haies.cn/ai-moe-qwen3-6-35b-a3b/"/>
    <published>2026-05-26T02:33:07.000Z</published>
    <summary>Qwen3.6-35B-A3B MoE 模型在消费级显卡（RTX4060 8G）上的部署实战。</summary>
    <title>Qwen3.6-35B-A3B MoE大模型消费级显卡实战（RTX4060 8G）</title>
    <updated>2026-10-22T06:14:13.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="开发" scheme="https://haies.cn/categories/dev/"/>
    <category term="AI" scheme="https://haies.cn/tags/ai/"/>
    <category term="记录" scheme="https://haies.cn/tags/record/"/>
    <category term="教程" scheme="https://haies.cn/tags/manual/"/>
    <content>
      <![CDATA[<h2 id="目标"><a href="#目标" class="headerlink" title="目标"></a>目标</h2><p>解决 Hexo 博客中 LaTeX 矩阵公式（如 <code>bmatrix</code>）被渲染成单行的问题，使多行矩阵正确显示为多行结构。</p><h2 id="前置条件"><a href="#前置条件" class="headerlink" title="前置条件"></a>前置条件</h2><ul><li>Node.js 环境</li><li>已有的 Hexo 博客项目</li><li>使用 NexT 主题</li></ul><h2 id="环境安装"><a href="#环境安装" class="headerlink" title="环境安装"></a>环境安装</h2><h3 id="安装依赖"><a href="#安装依赖" class="headerlink" title="安装依赖"></a>安装依赖</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-filter-mathjax@0.3.1 mathjax@3.2.2 --save</span><br></pre></td></tr></table></figure><h3 id="站点配置"><a href="#站点配置" class="headerlink" title="站点配置"></a>站点配置</h3><p>在 <code>_config.yml</code> 中添加：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">mathjax:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">per_page:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">tags:</span> <span class="string">none</span></span><br></pre></td></tr></table></figure><p><strong>注意</strong>：<code>tags</code> 不要写成 <code>mathjax</code>，否则 <code>hexo generate</code> 时会报 <code>ReferenceError: mathjax is not defined</code>。</p><h3 id="关闭-NexT-主题前端-MathJax"><a href="#关闭-NexT-主题前端-MathJax" class="headerlink" title="关闭 NexT 主题前端 MathJax"></a>关闭 NexT 主题前端 MathJax</h3><p>NexT 主题会在前端加载自己的 MathJax CDN，与服务端渲染冲突。在主题 <code>_config.yml</code> 中关闭：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">math:</span></span><br><span class="line">  <span class="attr">mathjax:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">katex:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">false</span></span><br></pre></td></tr></table></figure><h2 id="核心：矩阵行尾反斜杠数量"><a href="#核心：矩阵行尾反斜杠数量" class="headerlink" title="核心：矩阵行尾反斜杠数量"></a>核心：矩阵行尾反斜杠数量</h2><p>这是最容易踩的坑。<code>hexo-renderer-marked</code> 在处理 Markdown 时，会将行末的反斜杠数量减半：</p><table><thead><tr><th>源码写入</th><th>marked 处理后</th><th>MathJax 收到</th><th>结果</th></tr></thead><tbody><tr><td><code>\\</code>（2个 <code>\</code>）</td><td><code>\</code>（1个 <code>\</code>）</td><td>触发 HTML <code>&lt;br&gt;</code></td><td>❌ 矩阵单行</td></tr><tr><td><code>\\\\</code>（4个 <code>\</code>）</td><td><code>\\</code>（2个 <code>\</code>）</td><td>识别为 LaTeX 换行</td><td>✅ 多行正确</td></tr></tbody></table><p><strong>结论：非最后一行矩阵数据行尾必须写 4 个反斜杠 <code>\\\\</code></strong></p><h3 id="正确写法示例"><a href="#正确写法示例" class="headerlink" title="正确写法示例"></a>正确写法示例</h3><figure class="highlight latex"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">$</span><span class="built_in">$</span></span><br><span class="line">X=</span><br><span class="line"><span class="keyword">\begin</span>{bmatrix}</span><br><span class="line">1 <span class="built_in">&amp;</span> 2 <span class="built_in">&amp;</span> 3 <span class="built_in">&amp;</span> 4 <span class="keyword">\\</span><span class="keyword">\\</span>    ← 非最后行：4个反斜杠</span><br><span class="line">2 <span class="built_in">&amp;</span> 1 <span class="built_in">&amp;</span> 4 <span class="built_in">&amp;</span> 3         ← 最后行：无反斜杠</span><br><span class="line"><span class="keyword">\end</span>{bmatrix}</span><br><span class="line"><span class="built_in">$</span><span class="built_in">$</span></span><br></pre></td></tr></table></figure><figure class="highlight latex"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">$</span><span class="built_in">$</span></span><br><span class="line">W<span class="built_in">_</span>Q=</span><br><span class="line"><span class="keyword">\begin</span>{bmatrix}</span><br><span class="line">0.1 <span class="built_in">&amp;</span> 0 <span class="built_in">&amp;</span> 0 <span class="built_in">&amp;</span> 0 <span class="keyword">\\</span><span class="keyword">\\</span></span><br><span class="line">0 <span class="built_in">&amp;</span> 0.2 <span class="built_in">&amp;</span> 0 <span class="built_in">&amp;</span> 0 <span class="keyword">\\</span><span class="keyword">\\</span></span><br><span class="line">0 <span class="built_in">&amp;</span> 0 <span class="built_in">&amp;</span> 0.3 <span class="built_in">&amp;</span> 0 <span class="keyword">\\</span><span class="keyword">\\</span></span><br><span class="line">0 <span class="built_in">&amp;</span> 0 <span class="built_in">&amp;</span> 0 <span class="built_in">&amp;</span> 0.4</span><br><span class="line"><span class="keyword">\end</span>{bmatrix}</span><br><span class="line"><span class="built_in">$</span><span class="built_in">$</span></span><br></pre></td></tr></table></figure><h2 id="下划线处理：operatorname"><a href="#下划线处理：operatorname" class="headerlink" title="下划线处理：operatorname"></a>下划线处理：operatorname</h2><p><code>\text{FFN_State}</code> 中的下划线在 MathJax 的 text 模式下不合法，会导致错误并 fallback 为纯文本。用 <code>operatorname</code> 替代：</p><table><thead><tr><th>场景</th><th>正确写法</th><th>错误写法</th></tr></thead><tbody><tr><td>无下划线</td><td><code>\text{LayerNorm}</code></td><td>—</td></tr><tr><td>有下划线</td><td><code>\operatorname{FFN_State}</code></td><td><code>\text{FFN_State}</code></td></tr></tbody></table><h2 id="验证方法"><a href="#验证方法" class="headerlink" title="验证方法"></a>验证方法</h2><h3 id="本地预览"><a href="#本地预览" class="headerlink" title="本地预览"></a>本地预览</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx hexo server -p 4000</span><br></pre></td></tr></table></figure><h3 id="检查-mtr-数量"><a href="#检查-mtr-数量" class="headerlink" title="检查 mtr 数量"></a>检查 mtr 数量</h3><p>mtr 是 MathJax 的矩阵行元素，有几个 mtr 就有几行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep -o <span class="string">'data-mml-node="mtr"'</span> public/文章路径/index.html | <span class="built_in">wc</span> -l</span><br></pre></td></tr></table></figure><p>多行矩阵应该 mtr ≥ 2。单行公式 mtr = 0 是正常的。</p><h3 id="浏览器控制台验证"><a href="#浏览器控制台验证" class="headerlink" title="浏览器控制台验证"></a>浏览器控制台验证</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="string">'mjx-container'</span>).<span class="property">length</span>   <span class="comment">// 总容器数</span></span><br><span class="line"><span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="string">'[data-mjx-error]'</span>).<span class="property">length</span> <span class="comment">// 错误数，应为 0</span></span><br></pre></td></tr></table></figure><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><h3 id="矩阵还是单行显示怎么办？"><a href="#矩阵还是单行显示怎么办？" class="headerlink" title="矩阵还是单行显示怎么办？"></a>矩阵还是单行显示怎么办？</h3><p>检查矩阵数据行尾的反斜杠数量：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">'source/_posts/文章.md'</span>) <span class="keyword">as</span> f:</span><br><span class="line">    <span class="keyword">for</span> i, line <span class="keyword">in</span> <span class="built_in">enumerate</span>(f, <span class="number">1</span>):</span><br><span class="line">        <span class="keyword">if</span> <span class="string">'&amp;'</span> <span class="keyword">in</span> line <span class="keyword">and</span> line.rstrip().endswith(<span class="string">'\\'</span>):</span><br><span class="line">            bs = line.rstrip().count(<span class="string">'\\'</span>)</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f"line <span class="subst">{i}</span>: <span class="subst">{bs}</span> backslashes <span class="subst">{<span class="string">'✓'</span> <span class="keyword">if</span> bs == <span class="number">4</span> <span class="keyword">else</span> <span class="string">'✗ NEEDS FIX'</span>}</span>"</span>)</span><br></pre></td></tr></table></figure><p>输出应有 <code>4 backslashes ✓</code>，否则需要修复。</p><h3 id="配置报错-ReferenceError-mathjax-is-not-defined"><a href="#配置报错-ReferenceError-mathjax-is-not-defined" class="headerlink" title="配置报错 ReferenceError: mathjax is not defined"></a>配置报错 <code>ReferenceError: mathjax is not defined</code></h3><p>检查 <code>_config.yml</code> 的 <code>mathjax.tags</code> 是否写成了 <code>mathjax</code>，应改为 <code>none</code>。</p><h3 id="浏览器控制台有-allowed-only-in-math-mode-错误"><a href="#浏览器控制台有-allowed-only-in-math-mode-错误" class="headerlink" title="浏览器控制台有 '_' allowed only in math mode 错误"></a>浏览器控制台有 <code>'_' allowed only in math mode</code> 错误</h3><p>使用了 <code>\text{FFN_State}</code>，下划线不合法。改用 <code>\operatorname{FFN_State}</code>。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>修复 Hexo 矩阵渲染只需记住两件事：</p><ol><li><strong>4个反斜杠</strong>：非最后行行尾写 <code>\\\\</code></li><li><strong>operatorname</strong>：含下划线的标识符用 <code>\operatorname</code> 代替 <code>\text</code></li></ol><p>其他配置（hexo-filter-mathjax、关闭 NexT MathJax）只需设置一次，后续写矩阵公式时遵循上述格式即可。</p>]]>
    </content>
    <id>https://haies.cn/hexo-mathjax-matrix-rendering-fix/</id>
    <link href="https://haies.cn/hexo-mathjax-matrix-rendering-fix/"/>
    <published>2026-05-24T07:35:00.000Z</published>
    <summary>Hexo + MathJax 矩阵公式渲染异常的完整排查与修复方法。</summary>
    <title>Hexo + MathJax 矩阵公式渲染修复完整方法</title>
    <updated>2026-10-21T00:56:24.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="笔记" scheme="https://haies.cn/categories/note/"/>
    <category term="AI" scheme="https://haies.cn/tags/ai/"/>
    <category term="Python" scheme="https://haies.cn/tags/python/"/>
    <category term="UV" scheme="https://haies.cn/tags/uv/"/>
    <content>
      <![CDATA[<h2 id="uv-切换问题"><a href="#uv-切换问题" class="headerlink" title="uv 切换问题"></a>uv 切换问题</h2><h3 id="原因分析"><a href="#原因分析" class="headerlink" title="原因分析"></a>原因分析</h3><p>Claude Code 的 python 环境检测优先级为：</p><ol><li><code>requirements.txt</code> — 最高优先级</li><li><code>pyproject.toml</code> — 次之</li><li>其他配置</li></ol><p>当项目没有 <code>uv.lock</code> 或 uv 特定的 <code>pyproject.toml</code> 结构时，Claude Code 默认走 pip&#x2F;venv 流程，不会自动切换到 uv。</p><h3 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h3><table><thead><tr><th>方案</th><th>改动量</th><th>生效速度</th><th>推荐场景</th></tr></thead><tbody><tr><td>CLAUDE.md</td><td>最少</td><td>重启后</td><td>快速解决</td></tr><tr><td>settings.json</td><td>少</td><td>即时</td><td>项目级配置</td></tr><tr><td>uv 项目化</td><td>中</td><td>完成后</td><td>长期维护</td></tr></tbody></table><h4 id="方案-1（推荐）：CLAUDE-md"><a href="#方案-1（推荐）：CLAUDE-md" class="headerlink" title="方案 1（推荐）：CLAUDE.md"></a>方案 1（推荐）：CLAUDE.md</h4><p>在项目根目录创建 <code>CLAUDE.md</code>：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># Python Environment</span></span><br><span class="line">Use <span class="code">`uv`</span> for all Python package management. Never use pip.</span><br><span class="line">Run commands with <span class="code">`uv run`</span>, e.g., <span class="code">`uv run python`</span>, <span class="code">`uv add &lt;package&gt;`</span>.</span><br></pre></td></tr></table></figure><p>加完 CLAUDE.md 后重启 Claude Code，它就会用 <code>uv run python</code> 代替默认的 pip&#x2F;venv 流程。</p><h4 id="方案-2：settings-json"><a href="#方案-2：settings-json" class="headerlink" title="方案 2：settings.json"></a>方案 2：settings.json</h4><p>在 <code>{project}/.claude/settings.json</code> 中配置：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;python&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;packageManager&quot;</span><span class="punctuation">:</span> <span class="string">&quot;uv&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h4 id="方案-3：uv-项目化"><a href="#方案-3：uv-项目化" class="headerlink" title="方案 3：uv 项目化"></a>方案 3：uv 项目化</h4><p>将项目完全迁移到 uv 管理：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">uv init</span><br><span class="line">uv add &lt;your-packages&gt;</span><br><span class="line"><span class="comment"># 确保有 uv.lock 文件存在</span></span><br></pre></td></tr></table></figure><blockquote><p>更多使用技巧将陆续补充。</p></blockquote>]]>
    </content>
    <id>https://haies.cn/ai-claude-code-usage-summary/</id>
    <link href="https://haies.cn/ai-claude-code-usage-summary/"/>
    <published>2026-05-22T11:00:00.000Z</published>
    <summary>Claude Code 使用技巧汇总：uv 环境切换、常用命令、会话管理与工程实践要点。</summary>
    <title>Claude code使用技巧汇总</title>
    <updated>2026-10-21T02:31:08.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="开发" scheme="https://haies.cn/categories/dev/"/>
    <category term="AI" scheme="https://haies.cn/tags/ai/"/>
    <category term="记录" scheme="https://haies.cn/tags/record/"/>
    <content>
      <![CDATA[<p>Claude Code 的记忆系统分为 <strong>三层</strong>，分别解决不同层面的问题。理解这三层的区别与关系，是高效使用 Claude Code 的前提。</p><hr><h2 id="一、三层架构概览"><a href="#一、三层架构概览" class="headerlink" title="一、三层架构概览"></a>一、三层架构概览</h2><table><thead><tr><th>层级</th><th>存储位置</th><th>解决问题</th><th align="center">跨项目共享？</th></tr></thead><tbody><tr><td><strong>全局配置</strong></td><td><code>~/.claude/settings.json</code></td><td>所有项目共享的权限、插件、环境变量</td><td align="center">✅ 是</td></tr><tr><td><strong>项目配置</strong></td><td><code>{project}/.claude/</code></td><td>该项目专属的权限、钩子</td><td align="center">❌ 否</td></tr><tr><td><strong>项目记忆</strong></td><td><code>~/.claude/projects/&lt;path&gt;/memory/</code></td><td>该项目的用户偏好、工作约定</td><td align="center">❌ 否</td></tr></tbody></table><hr><h2 id="二、全局配置层"><a href="#二、全局配置层" class="headerlink" title="二、全局配置层"></a>二、全局配置层</h2><p>所有项目共享的配置，定义 Claude Code 的全局行为：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;env&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;ANTHROPIC_MODEL&quot;</span><span class="punctuation">:</span> <span class="string">&quot;MiniMax-M2.7&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;permissions&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;allow&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="string">&quot;Bash(uv sync *)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(git log --oneline -20)&quot;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;enabledPlugins&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;superpowers@claude-plugins-official&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;remember@claude-plugins-official&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>核心配置项包括：</p><ul><li><strong>env</strong> — API key、全局默认模型</li><li><strong>permissions</strong> — 所有项目都允许的 Shell 命令</li><li><strong>enabledPlugins</strong> — 全局启用的插件</li></ul><hr><h2 id="三、项目配置层"><a href="#三、项目配置层" class="headerlink" title="三、项目配置层"></a>三、项目配置层</h2><p>单个项目专属的配置，通常与项目代码一起版本控制：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">tender-info/</span><br><span class="line">└── .claude/</span><br><span class="line">    └── settings.local.json</span><br></pre></td></tr></table></figure><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;permissions&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;allow&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="string">&quot;Bash(uv sync *)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(uv venv *)&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="string">&quot;Bash(git -C /Volumes/hai/code/tender-info log --oneline -5)&quot;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>项目配置文件的作用是记录该项目额外允许的 Shell 命令权限，避免每次操作都弹出权限提示。</p><hr><h2 id="四、项目记忆层"><a href="#四、项目记忆层" class="headerlink" title="四、项目记忆层"></a>四、项目记忆层</h2><p>严格按项目路径隔离的记忆系统，存放项目相关的持久上下文：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">~/.claude/projects/-Volumes-hai-code-tender-info/memory/</span><br><span class="line">├── MEMORY.md</span><br><span class="line">└── python-dependency-management.md</span><br></pre></td></tr></table></figure><h3 id="4-1-记忆文件类型"><a href="#4-1-记忆文件类型" class="headerlink" title="4.1 记忆文件类型"></a>4.1 记忆文件类型</h3><table><thead><tr><th>类型</th><th>用途</th><th>关键字段</th></tr></thead><tbody><tr><td><code>user</code></td><td>用户角色、偏好、工作方式</td><td>name, description, type, originSessionId</td></tr><tr><td><code>feedback</code></td><td>指导规则（什么该做&#x2F;不该做）</td><td>含 <strong>Why:</strong> 和 <strong>How to apply:</strong></td></tr><tr><td><code>project</code></td><td>项目状态、目标、截止日期</td><td>含 <strong>Why:</strong> 和 <strong>How to apply:</strong></td></tr><tr><td><code>reference</code></td><td>外部系统指针（Linear、Grafana 等）</td><td>链接 + 用途说明</td></tr></tbody></table><h3 id="4-2-记忆格式"><a href="#4-2-记忆格式" class="headerlink" title="4.2 记忆格式"></a>4.2 记忆格式</h3><p>每条记忆为独立 Markdown 文件，含 frontmatter：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">name:</span> <span class="string">python-dependency-management</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">用户级Python依赖管理原则</span></span><br><span class="line"><span class="attr">type:</span> <span class="string">user</span></span><br><span class="line"><span class="attr">originSessionId:</span> <span class="string">46dcfe60-6dcb-4824-850e-41e8ccc11b8f</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="comment">## 具体内容</span></span><br><span class="line"></span><br><span class="line"><span class="string">用户使用</span> <span class="string">**uv**</span> <span class="string">管理</span> <span class="string">Python</span> <span class="string">项目：</span></span><br><span class="line"><span class="number">1</span><span class="string">.</span> <span class="string">uv</span> <span class="string">sync：主要命令</span></span><br><span class="line"><span class="number">2</span><span class="string">.</span> <span class="string">uv</span> <span class="string">run：直接运行脚本</span></span><br></pre></td></tr></table></figure><p><code>MEMORY.md</code> 作为索引文件，<strong>每次会话自动加载</strong>；具体记忆文件在上下文相关时自动应用。</p><hr><h2 id="五、remember-插件-—-会话交接机制"><a href="#五、remember-插件-—-会话交接机制" class="headerlink" title="五、remember 插件 — 会话交接机制"></a>五、remember 插件 — 会话交接机制</h2><p><code>remember</code> 插件是记忆系统的<strong>补充机制</strong>，解决「跨时间连续性」问题。</p><h3 id="5-1-与-memory-的区别"><a href="#5-1-与-memory-的区别" class="headerlink" title="5.1 与 memory&#x2F; 的区别"></a>5.1 与 memory&#x2F; 的区别</h3><table><thead><tr><th>维度</th><th><code>memory/</code> 记忆系统</th><th><code>remember</code> 插件</th></tr></thead><tbody><tr><td><strong>位置</strong></td><td><code>~/.claude/projects/&lt;path&gt;/memory/</code></td><td><code>{project}/.remember/remember.md</code></td></tr><tr><td><strong>内容</strong></td><td>项目偏好、规则、约定</td><td>会话交接、进度、下一步</td></tr><tr><td><strong>触发</strong></td><td><strong>自动加载</strong></td><td>手动调用 <code>/remember</code></td></tr><tr><td><strong>生命周期</strong></td><td>跨会话持久</td><td>下次会话后可能被覆盖</td></tr><tr><td><strong>语义</strong></td><td>「这个项目是什么样的」</td><td>「上次我做到哪了」</td></tr></tbody></table><h3 id="5-2-文件格式"><a href="#5-2-文件格式" class="headerlink" title="5.2 文件格式"></a>5.2 文件格式</h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># Handoff</span></span><br><span class="line"></span><br><span class="line"><span class="section">## State</span></span><br><span class="line">&#123;已完成什么、未完成什么。文件、MR 号、决策。最多 2-4 行。&#125;</span><br><span class="line"></span><br><span class="line"><span class="section">## Next</span></span><br><span class="line">&#123;接下来要做什么。按优先级排列。1-3 项。&#125;</span><br><span class="line"></span><br><span class="line"><span class="section">## Context</span></span><br><span class="line">&#123;非显而易见的坑、阻碍、本次偏好。如无内容可省略。&#125;</span><br></pre></td></tr></table></figure><h3 id="5-3-使用规则"><a href="#5-3-使用规则" class="headerlink" title="5.3 使用规则"></a>5.3 使用规则</h3><table><thead><tr><th>规则</th><th>说明</th></tr></thead><tbody><tr><td>总行数 &lt; 20</td><td>简洁，避免长篇大论</td></tr><tr><td>具体</td><td>包含文件路径、MR 号、分支名</td></tr><tr><td>前瞻性</td><td>下一会话只关心「接下来干嘛」</td></tr><tr><td>无内容时</td><td>直接写 “No active work.”</td></tr></tbody></table><hr><h2 id="六、三层关系全景图"><a href="#六、三层关系全景图" class="headerlink" title="六、三层关系全景图"></a>六、三层关系全景图</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">~/.claude/</span><br><span class="line">├── settings.json              ← 【全局】所有项目共享</span><br><span class="line">│   ├── env (API key, 模型)</span><br><span class="line">│   ├── permissions (允许的命令)</span><br><span class="line">│   └── enabledPlugins</span><br><span class="line">│</span><br><span class="line">├── projects/                  ← 【记忆】按项目路径隔离</span><br><span class="line">│   └── -Volumes-hai-code-tender-info/</span><br><span class="line">│       └── memory/</span><br><span class="line">│           ├── MEMORY.md       ← 索引</span><br><span class="line">│           └── *.md            ← 具体记忆</span><br><span class="line">│</span><br><span class="line">tender-info/                   ← 【项目】</span><br><span class="line">├── .claude/</span><br><span class="line">│   └── settings.local.json    ← 项目级权限</span><br><span class="line">├── .remember/</span><br><span class="line">│   └── remember.md            ← 会话交接（remember 插件）</span><br><span class="line">└── ...项目文件</span><br></pre></td></tr></table></figure><hr><h2 id="七、设计思想"><a href="#七、设计思想" class="headerlink" title="七、设计思想"></a>七、设计思想</h2><table><thead><tr><th>层次</th><th>解决的问题</th><th>关键词</th></tr></thead><tbody><tr><td>全局配置</td><td>「所有项目通用」</td><td>权限、插件、模型</td></tr><tr><td>项目配置</td><td>「这个项目能做什么」</td><td>权限、钩子</td></tr><tr><td>项目记忆</td><td>「用户想要什么方式工作」</td><td>偏好、反馈、约定</td></tr><tr><td>remember</td><td>「上次做到哪了」</td><td>交接、进度、连续性</td></tr></tbody></table><p>三层设计体现了<strong>关注点分离原则</strong>：全局配置、项目配置、项目记忆三者职责清晰不混淆。<code>memory/</code> 和 <code>remember</code> 解决不同维度的问题——前者是「<strong>项目画像</strong>」，后者是「<strong>时间线快照</strong>」。</p><p>理解这四层的区别，就能理解为什么没有一个「跨项目全局记忆」——因为全局配置（<code>settings.json</code>）解决的是工具能力，而非项目上下文。</p>]]>
    </content>
    <id>https://haies.cn/ai-claude-code-memory/</id>
    <link href="https://haies.cn/ai-claude-code-memory/"/>
    <published>2026-05-17T23:55:00.000Z</published>
    <summary>Claude Code 记忆系统详解：全局配置、项目配置、项目记忆三层架构与 remember 会话交接机制。</summary>
    <title>Claude Code 记忆系统详解</title>
    <updated>2026-10-21T00:56:24.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="开发" scheme="https://haies.cn/categories/dev/"/>
    <category term="AI" scheme="https://haies.cn/tags/ai/"/>
    <category term="记录" scheme="https://haies.cn/tags/record/"/>
    <content>
      <![CDATA[<p>🔔 核心误解速查表（来自真实提问）</p><table><thead><tr><th align="left">❌ 常见误解</th><th align="left">✅ 正确理解</th></tr></thead><tbody><tr><td align="left">模型会把中文翻译成英文后再分token</td><td align="left">模型处理的是原始UTF-8字节或直接含中文的词表，不会自动翻译</td></tr><tr><td align="left">“指令”是独立于提示词的一个步骤</td><td align="left">指令只是提示词的一部分，模型不区分对待</td></tr><tr><td align="left">Token化就是传统分词</td><td align="left">Token化可能切出子词（如”学习”分成”学””习”），比分词更细</td></tr><tr><td align="left">Key&#x2F;Value向量就是嵌入向量</td><td align="left">嵌入向量是原料，K&#x2F;V是从中加工出来的专用向量</td></tr><tr><td align="left">预填充结果可能是随机的</td><td align="left">预填充纯矩阵运算，完全确定</td></tr><tr><td align="left">缓存命中允许微小变化（如空格）</td><td align="left">必须从第一个Token开始完全一致，任何差异都会导致失效</td></tr></tbody></table><h2 id="一、大模型推理的正确流程（总览）"><a href="#一、大模型推理的正确流程（总览）" class="headerlink" title="一、大模型推理的正确流程（总览）"></a>一、大模型推理的正确流程（总览）</h2><p>许多人对流程的理解存在偏差。下图是标准自回归模型（如GPT）的完整步骤：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">输入提示词 → 分词 → 嵌入 → 预填充（构建KV缓存） → 自回归生成（逐Token采样） → 输出</span><br></pre></td></tr></table></figure><ul><li><strong>分词与嵌入</strong>：将原始文本拆分为Token，并映射为稠密向量。</li><li><strong>预填充</strong>：一次性计算所有输入Token的Key、Value向量并缓存。此阶段计算密集，但只做一次。</li><li><strong>自回归生成</strong>：逐个产生新Token，每步仅计算新Token的K&#x2F;V并复用缓存。根据采样策略，输出可能确定或随机。</li></ul><p>以下各章将按此顺序逐一详解。</p><h2 id="二、分词与嵌入：从文字到向量"><a href="#二、分词与嵌入：从文字到向量" class="headerlink" title="二、分词与嵌入：从文字到向量"></a>二、分词与嵌入：从文字到向量</h2><h3 id="2-1-什么是Token？"><a href="#2-1-什么是Token？" class="headerlink" title="2.1 什么是Token？"></a>2.1 什么是Token？</h3><ul><li>模型不直接认识文字，需要先将输入文本拆分为最小处理单元——Token。</li><li>对于中文，一个Token可以是字、词或子词。例如”机器学习”可能分成 <code>[&quot;机器&quot;, &quot;学&quot;, &quot;习&quot;]</code>。</li></ul><blockquote><p>❗ 常见误解：Token化就是传统的中文分词（如jieba）。<br>✅ 正确理解：Token化会切得更细，常常把完整词拆成常见的片段（如”学习”拆为”学”和”习”），目的是控制词汇表大小并覆盖所有字符。</p></blockquote><h3 id="2-2-模型会把中文翻译成英文再处理吗？"><a href="#2-2-模型会把中文翻译成英文再处理吗？" class="headerlink" title="2.2 模型会把中文翻译成英文再处理吗？"></a>2.2 模型会把中文翻译成英文再处理吗？</h3><blockquote><p>❗ 常见误解：听说某些模型不支持中文，会把中文先翻译成英文再分token。<br>✅ 正确理解：绝对不会。模型只处理你输入的原始文本的UTF-8字节或直接包含中文词表。如果词表没有中文，每个汉字会变成3个字节Token（如”中” → <code>&lt;0xE4&gt; &lt;0xB8&gt; &lt;0xAD&gt;</code>），这是字节级编码，不是翻译。</p></blockquote><h3 id="2-3-嵌入向量：赋予Token数学含义"><a href="#2-3-嵌入向量：赋予Token数学含义" class="headerlink" title="2.3 嵌入向量：赋予Token数学含义"></a>2.3 嵌入向量：赋予Token数学含义</h3><ul><li>每个Token通过查一个可学习的嵌入表，得到一个固定维度的稠密向量（如768维），称为嵌入向量。</li><li>相同Token永远映射到相同嵌入向量（不考虑位置编码时），因此是静态的。</li><li>嵌入向量是模型的原始输入特征，携带该Token的基础语义信息。</li></ul><h2 id="三、预填充阶段：构建KV缓存"><a href="#三、预填充阶段：构建KV缓存" class="headerlink" title="三、预填充阶段：构建KV缓存"></a>三、预填充阶段：构建KV缓存</h2><p>当整个输入序列的嵌入向量准备好后，模型进入预填充（Prefill）阶段。这一步会一次性计算所有Token的Key、Value向量并缓存，供后续生成复用。</p><h3 id="3-1-从嵌入向量到Key-Value"><a href="#3-1-从嵌入向量到Key-Value" class="headerlink" title="3.1 从嵌入向量到Key&#x2F;Value"></a>3.1 从嵌入向量到Key&#x2F;Value</h3><ul><li>每个Token的嵌入向量 <code>X</code> 分别乘以三个可训练的权重矩阵：<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Q = X · W_Q,   K = X · W_K,   V = X · W_V</span><br></pre></td></tr></table></figure></li><li>其中 <code>W_K</code>, <code>W_V</code> 将嵌入”加工”为专门用于注意力机制的Key向量和Value向量。</li></ul><blockquote><p>❗ 常见误解：Key&#x2F;Value向量就是嵌入向量，只是换个名字。<br>✅ 正确理解：嵌入向量是原料，Key&#x2F;Value是从原料加工出来的专用工具。嵌入用于表示Token本身，Key用于匹配注意力权重，Value用于提供加权内容。三者完全不同。</p></blockquote><ul><li>Key用于匹配相关度（与其他Token的Query计算注意力权重）。</li><li>Value用于提供内容（根据权重加权求和，得到输出）。</li></ul><p><strong>通俗类比：</strong></p><table><thead><tr><th align="left">向量类型</th><th align="left">类比</th></tr></thead><tbody><tr><td align="left">嵌入向量</td><td align="left">员工原始简历</td></tr><tr><td align="left">Key</td><td align="left">简历中提取的”技能标签”（用来匹配岗位需求）</td></tr><tr><td align="left">Value</td><td align="left">简历中提取的”实际项目经验”（被选中后贡献的内容）</td></tr></tbody></table><h3 id="3-2-KV缓存：为什么能省计算？"><a href="#3-2-KV缓存：为什么能省计算？" class="headerlink" title="3.2 KV缓存：为什么能省计算？"></a>3.2 KV缓存：为什么能省计算？</h3><ul><li>在自注意力中，每个Token都需要所有Token的Key和Value。如果每次生成新Token都重新计算整个序列的K&#x2F;V，成本极高。</li><li>预填充阶段一次性算好所有Token的K&#x2F;V，并存入KV缓存。之后每生成一个新Token，只需计算该Token自己的K&#x2F;V，追加到缓存中即可。</li><li>相同输入的前缀，其缓存可直接复用——这就是缓存命中的基础。</li></ul><h3 id="3-3-确定性说明"><a href="#3-3-确定性说明" class="headerlink" title="3.3 确定性说明"></a>3.3 确定性说明</h3><blockquote><p>❗ 常见误解：因为模型有随机性，所以预填充的结果也可能每次不同。<br>✅ 正确理解：在推理模式下（关闭Dropout等随机层），相同的输入序列 → 相同的嵌入 → 相同的K&#x2F;V → 预填充结果完全确定。模型的随机性只出现在后续的生成采样阶段。</p></blockquote><h2 id="四、自回归生成阶段：逐Token采样与输出"><a href="#四、自回归生成阶段：逐Token采样与输出" class="headerlink" title="四、自回归生成阶段：逐Token采样与输出"></a>四、自回归生成阶段：逐Token采样与输出</h2><p>预填充完成后，模型进入自回归生成阶段，逐个产生新的Token。</p><h3 id="4-1-每一步做什么？"><a href="#4-1-每一步做什么？" class="headerlink" title="4.1 每一步做什么？"></a>4.1 每一步做什么？</h3><ol><li>利用已有的KV缓存（包含输入序列及之前已生成的所有Token），计算下一个Token的概率分布。</li><li>根据采样策略（如温度采样、Top-K、Top-P）随机或确定地选出一个Token。</li><li>将该Token追加到序列末尾，计算其K&#x2F;V并加入缓存。</li><li>重复直到遇到结束符或达到最大长度。</li></ol><h3 id="4-2-随机性的来源"><a href="#4-2-随机性的来源" class="headerlink" title="4.2 随机性的来源"></a>4.2 随机性的来源</h3><ul><li>如果使用贪心搜索（每次选概率最高的Token），输出完全固定。</li><li>如果使用随机采样（多数API默认），则相同输入可能产生不同输出——这正是常见”模型不听话”的真正原因。</li></ul><blockquote><p>❗ 常见误解：相同输入得到不同输出，是因为模型内部有”随机种子”在预填充阶段就起作用。<br>✅ 正确理解：随机性只发生在生成阶段的采样。预填充阶段没有任何随机操作。你可以通过设置 <code>temperature=0</code> 或使用贪婪解码来获得完全确定性的输出。</p></blockquote><h3 id="4-3-输出"><a href="#4-3-输出" class="headerlink" title="4.3 输出"></a>4.3 输出</h3><ul><li>将生成的Token序列通过解码器转换回文本，返回给用户。</li></ul><h3 id="4-4-思考型模型：思考过程在哪里？"><a href="#4-4-思考型模型：思考过程在哪里？" class="headerlink" title="4.4 思考型模型：思考过程在哪里？"></a>4.4 思考型模型：思考过程在哪里？</h3><blockquote><p>❓ 常见问题：像 DeepSeek-R1、OpenAI o1 等模型，它们展示的”思考过程”属于流程中的哪个阶段？<br>✅ 简明答案：思考过程完全属于<strong>自回归生成阶段</strong>，不是独立阶段。</p></blockquote><ul><li>模型在生成最终答案之前，先通过逐Token采样生成一连串表示”思考”的文本（例如”首先，我们需要…”、”因为…所以…”）。</li><li>这些思考Token和普通输出一样，是利用KV缓存逐步生成的，每一步只计算新Token的K&#x2F;V。</li><li>思考过程也具有随机性（如果使用采样）或确定性（如果 <code>temperature=0</code>）。</li></ul><p>换句话说：<strong>思考过程 &#x3D; 自回归生成早期产生的一批特殊Token</strong>，它既不是预填充，也不是嵌入，而是生成的一部分。</p><h2 id="五、缓存命中：省钱的秘密"><a href="#五、缓存命中：省钱的秘密" class="headerlink" title="五、缓存命中：省钱的秘密"></a>五、缓存命中：省钱的秘密</h2><h3 id="5-1-什么是KV缓存命中？"><a href="#5-1-什么是KV缓存命中？" class="headerlink" title="5.1 什么是KV缓存命中？"></a>5.1 什么是KV缓存命中？</h3><ul><li>当你发送新请求时，API服务会检查你的提示词前缀是否与之前某个请求的前缀Token序列完全一致。若是，则直接复用已缓存的K&#x2F;V，无需重新计算预填充。</li><li>计费上：缓存命中的输入Token价格通常仅为未命中的10%~20%。</li></ul><h3 id="5-2-命中的硬性条件"><a href="#5-2-命中的硬性条件" class="headerlink" title="5.2 命中的硬性条件"></a>5.2 命中的硬性条件</h3><ul><li>前缀必须从第一个Token开始连续完全相同。哪怕多一个空格、一个换行，或改变顺序，都会导致缓存失效。</li></ul><blockquote><p>❗ 常见误解：只要提示词大致相同，比如改了一个字或加了一个空格，应该还能命中大部分缓存吧？<br>✅ 正确理解：绝对不能。缓存匹配是严格的字节&#x2F;Token级别相等。一个空格、一个标点、甚至繁体与简体的差异，都会导致从差异位置开始后续全部无法命中。</p></blockquote><p><strong>示例：</strong></p><ul><li>请求A：<code>System: 你是个助手 User: 北京天气</code></li><li>请求B：<code>System: 你是个助手 User: 上海天气</code></li><li>命中 <code>System: 你是个助手 User:</code> 这一连续前缀（前提是长度足够触发折扣）。</li></ul><h3 id="5-3-缓存为什么会失效？"><a href="#5-3-缓存为什么会失效？" class="headerlink" title="5.3 缓存为什么会失效？"></a>5.3 缓存为什么会失效？</h3><ul><li><strong>时间过期（TTL）</strong>：每个缓存块有存活时间，通常5~60分钟。每次命中间隔不超过TTL则持续有效，否则被清除。</li><li><strong>空间淘汰（LRU）</strong>：缓存容量有限，长期未命中的旧缓存会被新请求挤掉。</li><li><strong>内容变更</strong>：任何前缀修改（哪怕是一个字、一个标点）都会使原缓存不可用。</li></ul><h3 id="5-4-最佳实践：静态在前，动态在后"><a href="#5-4-最佳实践：静态在前，动态在后" class="headerlink" title="5.4 最佳实践：静态在前，动态在后"></a>5.4 最佳实践：静态在前，动态在后</h3><ul><li>错误的模式：<code>[动态][静态][动态]</code> → 第一个Token不同，后续静态完全无法命中。</li><li>正确的模式：将所有静态内容连续放在最开头，所有动态内容放在末尾。</li></ul><blockquote><p>❗ 常见误解：可以静态和动态交替放置，只要后面有连续静态就能命中那一段。<br>✅ 正确理解：不能。因为缓存匹配必须从第一个Token连续一致。一旦第一个位置是动态，整个前缀就断裂了，后面的任何静态都无法被命中。只有把所有静态放在最前面形成连续前缀才能缓存。</p></blockquote><p><strong>示例：</strong></p><ul><li>❌ 错误：<code>[用户问题] [系统提示词] [随机ID]</code></li><li>✅ 正确：<code>[系统提示词] [历史对话] [当前用户问题]</code></li></ul><p><strong>黄金法则：不变的靠前放，多变的放末尾。</strong></p><h2 id="六、确定性与随机性总结"><a href="#六、确定性与随机性总结" class="headerlink" title="六、确定性与随机性总结"></a>六、确定性与随机性总结</h2><table><thead><tr><th align="left">阶段</th><th align="center">是否确定</th><th align="left">原因</th></tr></thead><tbody><tr><td align="left">预填充</td><td align="center">确定</td><td align="left">无随机操作，纯矩阵运算</td></tr><tr><td align="left">生成（贪心）</td><td align="center">确定</td><td align="left">每次选最高概率Token</td></tr><tr><td align="left">生成（采样）</td><td align="center">随机</td><td align="left">按概率分布随机抽取</td></tr></tbody></table><p>若需要完全可复现的结果，可以设置随机种子或使用贪心解码。</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>理解大模型内部的推理流程，不仅能帮你写出更高效的代码，还能在日常API调用中大幅降低成本。记住两条核心要点：</p><ol><li><strong>静态内容永远放在最前面</strong>，利用缓存命中节省80%+输入费用。</li><li><strong>生成随机性源自采样</strong>，并非模型”出错”。</li></ol>]]>
    </content>
    <id>https://haies.cn/llm-inference-token/</id>
    <link href="https://haies.cn/llm-inference-token/"/>
    <published>2026-05-10T15:46:00.000Z</published>
    <summary>大模型推理过程与缓存计费详解：Prefill、Decode 与 KV Cache 对 Token 消耗的影响。</summary>
    <title>从输入到输出：大模型推理过程与缓存计费详解</title>
    <updated>2026-10-21T00:56:24.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="笔记" scheme="https://haies.cn/categories/note/"/>
    <category term="技术栈" scheme="https://haies.cn/tags/stack/"/>
    <category term="教程" scheme="https://haies.cn/tags/manual/"/>
    <content>
      <![CDATA[<h2 id="pnpm-完全指南：Node-js-生态中不可忽视的高效包管理工具"><a href="#pnpm-完全指南：Node-js-生态中不可忽视的高效包管理工具" class="headerlink" title="pnpm 完全指南：Node.js 生态中不可忽视的高效包管理工具"></a>pnpm 完全指南：Node.js 生态中不可忽视的高效包管理工具</h2><p>在 Node.js 生态中，包管理工具一直是开发者绕不开的话题。从最初唯一的 npm，到后来崛起的 Yarn，再到今天的主角——pnpm，这场关于“如何更好地管理 JavaScript 依赖”的探索从未停止。</p><h3 id="一、pnpm：高性能的-Node-js-包管理工具"><a href="#一、pnpm：高性能的-Node-js-包管理工具" class="headerlink" title="一、pnpm：高性能的 Node.js 包管理工具"></a>一、pnpm：高性能的 Node.js 包管理工具</h3><p><strong>pnpm</strong>（Performant npm）是一个快速、节省磁盘空间的 JavaScript 包管理器，于 2016 年首次发布。它之所以能脱颖而出，是因为解决了传统包管理工具的三大痛点：</p><ol><li><strong>磁盘浪费</strong>：npm &#x2F; Yarn 在每个项目中重复存储相同版本的依赖，占用大量空间。</li><li><strong>安装缓慢</strong>：反复下载、解压、复制依赖，导致冷启动安装耗时较长。</li><li><strong>幽灵依赖</strong>：扁平化的 <code>node_modules</code> 允许项目访问未声明的包，埋下兼容性与安全隐患。</li></ol><p>pnpm 通过 <strong>内容可寻址存储</strong> + <strong>硬链接&#x2F;符号链接</strong> 机制颠覆了依赖管理方式：所有依赖在全局存储中只存一份，项目通过硬链接引用；<code>node_modules</code> 结构严格隔离，彻底杜绝幽灵依赖。这使得 pnpm 在速度、磁盘占用和安全性上都远超传统工具。</p><h3 id="二、快速上手指南"><a href="#二、快速上手指南" class="headerlink" title="二、快速上手指南"></a>二、快速上手指南</h3><h4 id="2-1-安装"><a href="#2-1-安装" class="headerlink" title="2.1 安装"></a>2.1 安装</h4><p>推荐使用独立脚本安装（无需 Node.js 环境）：</p><ul><li><p><strong>Linux &#x2F; macOS</strong>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -fsSL https://get.pnpm.io/install.sh | sh -</span><br></pre></td></tr></table></figure></li><li><p><strong>Windows (PowerShell)</strong>：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">iwr</span> https://get.pnpm.io/install.ps1 <span class="literal">-useb</span> | <span class="built_in">iex</span></span><br></pre></td></tr></table></figure></li></ul><p>其他方式：<code>npm install -g pnpm</code>、<code>brew install pnpm</code>、<code>scoop install pnpm</code> 等。</p><p>验证安装：<code>pnpm --version</code></p><h4 id="2-2-配置镜像加速（国内用户）"><a href="#2-2-配置镜像加速（国内用户）" class="headerlink" title="2.2 配置镜像加速（国内用户）"></a>2.2 配置镜像加速（国内用户）</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pnpm config <span class="built_in">set</span> registry https://registry.npmmirror.com</span><br><span class="line">pnpm config get registry</span><br></pre></td></tr></table></figure><h4 id="2-3-基础命令速查"><a href="#2-3-基础命令速查" class="headerlink" title="2.3 基础命令速查"></a>2.3 基础命令速查</h4><table><thead><tr><th>操作</th><th>npm 命令</th><th>pnpm 命令</th></tr></thead><tbody><tr><td>初始化项目</td><td><code>npm init</code></td><td><code>pnpm init</code></td></tr><tr><td>安装所有依赖</td><td><code>npm install</code></td><td><code>pnpm install</code></td></tr><tr><td>添加依赖</td><td><code>npm install &lt;pkg&gt;</code></td><td><code>pnpm add &lt;pkg&gt;</code></td></tr><tr><td>添加开发依赖</td><td><code>npm install -D &lt;pkg&gt;</code></td><td><code>pnpm add -D &lt;pkg&gt;</code></td></tr><tr><td>全局安装</td><td><code>npm install -g &lt;pkg&gt;</code></td><td><code>pnpm add -g &lt;pkg&gt;</code></td></tr><tr><td>移除依赖</td><td><code>npm remove &lt;pkg&gt;</code></td><td><code>pnpm remove &lt;pkg&gt;</code></td></tr><tr><td>运行脚本</td><td><code>npm run &lt;script&gt;</code></td><td><code>pnpm &lt;script&gt;</code>（可省略 run）</td></tr><tr><td>运行临时命令</td><td><code>npx &lt;cmd&gt;</code></td><td><code>pnpm dlx &lt;cmd&gt;</code></td></tr></tbody></table><h4 id="2-4-深入理解：install-与-add-的区别（npm-vs-pnpm）"><a href="#2-4-深入理解：install-与-add-的区别（npm-vs-pnpm）" class="headerlink" title="2.4 深入理解：install 与 add 的区别（npm vs pnpm）"></a>2.4 深入理解：<code>install</code> 与 <code>add</code> 的区别（npm vs pnpm）</h4><table><thead><tr><th>行为</th><th>npm</th><th>pnpm</th></tr></thead><tbody><tr><td><code>add</code> 是否为 <code>install</code> 别名？</td><td>是，两者等价</td><td>否，职责不同</td></tr><tr><td>默认是否自动保存到 <code>dependencies</code>？</td><td>是（v5+）</td><td>是（仅限 <code>add</code> 命令）</td></tr><tr><td><code>-S</code> 选项</td><td>存在但非必需</td><td>不存在 &#x2F; 无需使用</td></tr><tr><td>安装所有依赖的命令</td><td><code>npm install</code></td><td><code>pnpm install</code></td></tr><tr><td>添加新依赖的命令</td><td><code>npm install &lt;pkg&gt;</code></td><td><code>pnpm add &lt;pkg&gt;</code></td></tr></tbody></table><blockquote><p><strong>习惯建议</strong>：在团队中统一约定——使用 pnpm 时，<strong>新增依赖永远用 <code>pnpm add</code>，同步依赖永远用 <code>pnpm install</code></strong>。</p></blockquote><h4 id="2-5-常用进阶命令"><a href="#2-5-常用进阶命令" class="headerlink" title="2.5 常用进阶命令"></a>2.5 常用进阶命令</h4><ul><li><code>pnpm store prune</code>：清理全局存储中未被任何项目引用的包。</li><li><code>pnpm why &lt;pkg&gt;</code>：查看某个包被引入的原因。</li><li><code>pnpm list -g</code>：列出全局安装的包。</li><li><code>pnpm env use --global lts</code>：使用 pnpm 管理 Node.js 版本。</li></ul><h4 id="2-6-从-npm-Yarn-迁移"><a href="#2-6-从-npm-Yarn-迁移" class="headerlink" title="2.6 从 npm &#x2F; Yarn 迁移"></a>2.6 从 npm &#x2F; Yarn 迁移</h4><ol><li>删除 <code>node_modules</code> 和旧锁文件（<code>package-lock.json</code> 或 <code>yarn.lock</code>）。</li><li>安装 pnpm。</li><li>（可选）运行 <code>pnpm import</code> 生成 <code>pnpm-lock.yaml</code>。</li><li>运行 <code>pnpm install</code>。</li></ol><h3 id="三、Monorepo-最佳实践"><a href="#三、Monorepo-最佳实践" class="headerlink" title="三、Monorepo 最佳实践"></a>三、Monorepo 最佳实践</h3><p>pnpm 内置了对 Monorepo 的原生支持，通过 Workspace 机制，可以在一个仓库中管理多个相互关联但独立的项目。</p><h4 id="3-1-初始化-Monorepo"><a href="#3-1-初始化-Monorepo" class="headerlink" title="3.1 初始化 Monorepo"></a>3.1 初始化 Monorepo</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> my-monorepo &amp;&amp; <span class="built_in">cd</span> my-monorepo</span><br><span class="line">pnpm init</span><br></pre></td></tr></table></figure><h4 id="3-2-配置-pnpm-workspace-yaml"><a href="#3-2-配置-pnpm-workspace-yaml" class="headerlink" title="3.2 配置 pnpm-workspace.yaml"></a>3.2 配置 pnpm-workspace.yaml</h4><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">packages:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">&#x27;apps/*&#x27;</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">&#x27;packages/*&#x27;</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">&#x27;!**/test/**&#x27;</span></span><br></pre></td></tr></table></figure><h4 id="3-3-配置根目录-package-json"><a href="#3-3-配置根目录-package-json" class="headerlink" title="3.3 配置根目录 package.json"></a>3.3 配置根目录 package.json</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;private&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h4 id="3-4-项目间引用"><a href="#3-4-项目间引用" class="headerlink" title="3.4 项目间引用"></a>3.4 项目间引用</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;dependencies&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;@my-monorepo/ui&quot;</span><span class="punctuation">:</span> <span class="string">&quot;workspace:*&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h4 id="3-5-常用-Monorepo-命令"><a href="#3-5-常用-Monorepo-命令" class="headerlink" title="3.5 常用 Monorepo 命令"></a>3.5 常用 Monorepo 命令</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">pnpm install                     <span class="comment"># 安装所有依赖</span></span><br><span class="line">pnpm add lodash --filter @my-monorepo/utils   <span class="comment"># 为特定子包安装</span></span><br><span class="line">pnpm -r run dev                  <span class="comment"># 运行所有子包的 dev 脚本</span></span><br><span class="line">pnpm --filter @my-monorepo/web build</span><br></pre></td></tr></table></figure><h3 id="四、核心对比：pnpm-vs-npm-vs-Yarn"><a href="#四、核心对比：pnpm-vs-npm-vs-Yarn" class="headerlink" title="四、核心对比：pnpm vs npm vs Yarn"></a>四、核心对比：pnpm vs npm vs Yarn</h3><p>下表汇总了三者在性能、特性与适用场景上的关键差异。</p><table><thead><tr><th>对比维度</th><th>npm</th><th>Yarn Classic</th><th>pnpm</th></tr></thead><tbody><tr><td><strong>冷启动安装</strong></td><td>31.2s</td><td>7.2s</td><td><strong>7.2s</strong></td></tr><tr><td><strong>热启动安装</strong></td><td>1.3s</td><td>5.2s</td><td><strong>761ms</strong></td></tr><tr><td><strong>更新依赖</strong></td><td>6.3s</td><td>5.7s</td><td><strong>3.2s</strong></td></tr><tr><td><strong>磁盘占用（10个项目，React+Lodash）</strong></td><td>1.2GB</td><td>980MB</td><td><strong>320MB</strong></td></tr><tr><td><strong>核心原理</strong></td><td>扁平化 + 提升</td><td>扁平化 + 并行 + 缓存</td><td>硬链接 + 全局存储</td></tr><tr><td><strong>幽灵依赖</strong></td><td>存在</td><td>存在</td><td><strong>已消除</strong></td></tr><tr><td><strong>Monorepo 支持</strong></td><td>基础（v7+）</td><td>成熟</td><td><strong>最强，配置简单</strong></td></tr><tr><td><strong>生态兼容性</strong></td><td>最好（默认标配）</td><td>较好</td><td>良好</td></tr></tbody></table><p><strong>简评</strong>：pnpm 在安装速度、磁盘占用和依赖隔离上全面领先；npm 胜在生态兼容与零门槛；Yarn Classic 仍有遗留项目价值，但新项目优势已不明显。</p><h3 id="五、pnpm-11-新特性（2026）"><a href="#五、pnpm-11-新特性（2026）" class="headerlink" title="五、pnpm 11 新特性（2026）"></a>五、pnpm 11 新特性（2026）</h3><ul><li><strong>Node.js 要求</strong>：v22 或更高，pnpm 本身以纯 ESM 发布。</li><li><strong>供应链安全</strong>：新包发布后 24 小时内不会被解析（<code>minimumReleaseAge</code>）。</li><li><strong>构建权限</strong>：统一为 <code>allowBuilds</code> 配置。</li><li><strong>全局隔离</strong>：每个全局包拥有独立的 <code>node_modules</code> 和锁文件。</li><li><strong>存储索引</strong>：从 JSON 迁移到 SQLite，查询性能提升。</li><li><strong>原生发布</strong>：<code>pnpm publish</code>、<code>login</code> 等不再依赖 npm CLI。</li></ul><h3 id="六、选型建议总结"><a href="#六、选型建议总结" class="headerlink" title="六、选型建议总结"></a>六、选型建议总结</h3><table><thead><tr><th>使用场景</th><th>推荐</th></tr></thead><tbody><tr><td>新手或小团队</td><td>npm</td></tr><tr><td>Monorepo &#x2F; 企业级项目</td><td>pnpm</td></tr><tr><td>团队已在用 Yarn v1，迁移成本高</td><td>继续用 Yarn v1</td></tr><tr><td>对速度&#x2F;磁盘&#x2F;安全性有严格要求</td><td>pnpm</td></tr></tbody></table><h3 id="七、小结"><a href="#七、小结" class="headerlink" title="七、小结"></a>七、小结</h3><p>pnpm 通过硬链接与全局存储，重新定义了 JavaScript 依赖管理的效率与安全性边界。它不仅大幅节省磁盘空间、加快安装速度，还从架构上杜绝了幽灵依赖。无论是新项目启动，还是对现有工具链的性能优化，pnpm 都是当前极具前瞻性的选择。</p><p><strong>切记</strong>：不要在团队中混用多个包管理器。选择一个，统一使用，能避免绝大多数依赖相关的诡异问题。</p>]]>
    </content>
    <id>https://haies.cn/tool-pnpm/</id>
    <link href="https://haies.cn/tool-pnpm/"/>
    <published>2026-05-07T03:37:39.000Z</published>
    <summary>pnpm 完全指南：安装、workspace、依赖管理与性能优势。</summary>
    <title>pnpm 完全指南：Node.js 生态中不可忽视的高效包管理工具</title>
    <updated>2026-10-21T00:56:24.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="笔记" scheme="https://haies.cn/categories/note/"/>
    <category term="技术栈" scheme="https://haies.cn/tags/stack/"/>
    <category term="教程" scheme="https://haies.cn/tags/manual/"/>
    <content>
      <![CDATA[<p><code>uv</code> 是 Astral 团队开发的极速 Python 包与项目管理工具，旨在统一和简化开发流程。它既提供了现代项目模式（声明式依赖、锁定文件、自动虚拟环境），又能作为 <code>pip</code>、<code>pip-tools</code>、<code>poetry</code> 等工具的替代品。本文将从零开始，带你掌握 <code>uv</code> 的安装、项目构建、核心命令区别及最佳实践。</p><hr><h2 id="1-安装与准备"><a href="#1-安装与准备" class="headerlink" title="1. 安装与准备"></a>1. 安装与准备</h2><p>在系统上安装 <code>uv</code>：</p><ul><li><p><strong>macOS &#x2F; Linux</strong>  </p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -LsSf https://astral.sh/uv/install.sh | sh</span><br></pre></td></tr></table></figure></li><li><p><strong>Windows (PowerShell)</strong>  </p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">powershell <span class="literal">-ExecutionPolicy</span> ByPass <span class="literal">-c</span> <span class="string">&quot;irm https://astral.sh/uv/install.ps1 | iex&quot;</span></span><br></pre></td></tr></table></figure></li></ul><p>安装后验证：<code>uv --version</code>。<br>若需配置国内 PyPI 镜像（如清华源），可设置环境变量：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple   <span class="comment"># Linux/macOS</span></span><br></pre></td></tr></table></figure><hr><h2 id="2-从零开始构建项目与虚拟环境"><a href="#2-从零开始构建项目与虚拟环境" class="headerlink" title="2. 从零开始构建项目与虚拟环境"></a>2. 从零开始构建项目与虚拟环境</h2><p><code>uv</code> 推崇<strong>项目即环境</strong>，无需手动激活虚拟环境。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> my-project &amp;&amp; <span class="built_in">cd</span> my-project</span><br><span class="line">uv init --python 3.12          <span class="comment"># 初始化项目，自动下载 Python 3.12（若缺失）</span></span><br></pre></td></tr></table></figure><p>生成的文件：</p><ul><li><code>pyproject.toml</code> – 项目元数据与依赖声明（唯一真相来源）</li><li><code>uv.lock</code> – 精确依赖快照（需提交 Git）</li><li><code>.venv/</code> – 项目专属虚拟环境</li><li><code>.python-version</code> – 锁定 Python 版本</li><li><code>README.md</code>、<code>.gitignore</code></li></ul><hr><h2 id="3-依赖管理"><a href="#3-依赖管理" class="headerlink" title="3. 依赖管理"></a>3. 依赖管理</h2><h3 id="3-1-使用-uv-add（推荐项目模式）"><a href="#3-1-使用-uv-add（推荐项目模式）" class="headerlink" title="3.1 使用 uv add（推荐项目模式）"></a>3.1 使用 <code>uv add</code>（推荐项目模式）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">uv add requests               <span class="comment"># 添加依赖，自动更新 pyproject.toml 和 uv.lock</span></span><br><span class="line">uv add --dev pytest           <span class="comment"># 添加开发依赖</span></span><br><span class="line">uv remove requests            <span class="comment"># 移除依赖</span></span><br><span class="line">uv <span class="built_in">sync</span>                       <span class="comment"># 根据 uv.lock 同步环境（拉取更新后使用）</span></span><br></pre></td></tr></table></figure><h3 id="3-2-传统方式：uv-pip-install"><a href="#3-2-传统方式：uv-pip-install" class="headerlink" title="3.2 传统方式：uv pip install"></a>3.2 传统方式：<code>uv pip install</code></h3><p>作为 <code>pip</code> 的替代，<code>uv pip install</code> 更快速，但它<strong>不会修改项目配置文件</strong>，只影响当前环境。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uv pip install requests       <span class="comment"># 安装到当前激活的环境或全局</span></span><br></pre></td></tr></table></figure><h3 id="3-3-从-requirements-txt-迁移"><a href="#3-3-从-requirements-txt-迁移" class="headerlink" title="3.3 从 requirements.txt 迁移"></a>3.3 从 <code>requirements.txt</code> 迁移</h3><table><thead><tr><th>命令</th><th>作用</th><th>是否修改 pyproject.toml</th></tr></thead><tbody><tr><td><code>uv pip sync requirements.txt</code></td><td>使当前环境与 requirements.txt <strong>严格一致</strong>（会删除多余包）</td><td>❌ 否</td></tr><tr><td><code>uv add -r requirements.txt</code></td><td>将依赖导入 pyproject.toml，并生成 uv.lock（迁移到项目模式）</td><td>✅ 是</td></tr></tbody></table><p><strong>建议</strong>：新项目用 <code>uv add</code>；旧项目用 <code>uv add -r</code> 完成迁移。</p><hr><h2 id="4-运行脚本与工具"><a href="#4-运行脚本与工具" class="headerlink" title="4. 运行脚本与工具"></a>4. 运行脚本与工具</h2><h3 id="4-1-uv-run-–-在项目环境中运行"><a href="#4-1-uv-run-–-在项目环境中运行" class="headerlink" title="4.1 uv run – 在项目环境中运行"></a>4.1 <code>uv run</code> – 在项目环境中运行</h3><p><code>uv run</code> 会在项目的虚拟环境中执行命令，<strong>无需手动激活</strong>。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">uv run python main.py         <span class="comment"># 运行项目脚本</span></span><br><span class="line">uv run pytest                 <span class="comment"># 运行项目中安装的测试工具</span></span><br></pre></td></tr></table></figure><h3 id="4-2-uvx-uv-tool-run-–-临时运行独立工具"><a href="#4-2-uvx-uv-tool-run-–-临时运行独立工具" class="headerlink" title="4.2 uvx &#x2F; uv tool run – 临时运行独立工具"></a>4.2 <code>uvx</code> &#x2F; <code>uv tool run</code> – 临时运行独立工具</h3><p><code>uvx</code> 在一个<strong>临时隔离环境</strong>中运行工具，不依赖当前项目。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">uvx ruff check .              <span class="comment"># 运行 ruff 格式化工具（自动下载缓存）</span></span><br><span class="line">uvx --python 3.11 black       <span class="comment"># 指定 Python 版本</span></span><br><span class="line">uvx ruff@0.5.0                <span class="comment"># 指定工具版本</span></span><br></pre></td></tr></table></figure><h3 id="4-3-uv-tool-install-–-持久化安装全局工具"><a href="#4-3-uv-tool-install-–-持久化安装全局工具" class="headerlink" title="4.3 uv tool install – 持久化安装全局工具"></a>4.3 <code>uv tool install</code> – 持久化安装全局工具</h3><p>与 <code>uvx</code> 不同，<code>uv tool install</code> 将工具安装到持久化目录，并链接到 <code>PATH</code>，之后可作为系统命令直接调用。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">uv tool install ruff          <span class="comment"># 安装后可直接运行 ruff</span></span><br><span class="line">uv tool uninstall ruff        <span class="comment"># 卸载</span></span><br></pre></td></tr></table></figure><h3 id="uv-run-vs-uvx-区别一览"><a href="#uv-run-vs-uvx-区别一览" class="headerlink" title="uv run vs uvx 区别一览"></a><code>uv run</code> vs <code>uvx</code> 区别一览</h3><table><thead><tr><th>特性</th><th><code>uv run</code></th><th><code>uvx</code> &#x2F; <code>uv tool run</code></th></tr></thead><tbody><tr><td><strong>目的</strong></td><td>运行项目代码或项目内依赖的命令</td><td>一次性运行独立的命令行工具</td></tr><tr><td><strong>环境来源</strong></td><td>项目根目录的 <code>.venv</code> 虚拟环境</td><td>临时创建的隔离环境</td></tr><tr><td><strong>依赖可见性</strong></td><td>可访问项目中声明的所有依赖</td><td>完全隔离，无法访问项目依赖</td></tr><tr><td><strong>典型用例</strong></td><td><code>python script.py</code>, <code>pytest</code></td><td><code>ruff</code>, <code>black</code>, <code>httpie</code></td></tr></tbody></table><hr><h2 id="5-指定-uvx-的环境与版本"><a href="#5-指定-uvx-的环境与版本" class="headerlink" title="5. 指定 uvx 的环境与版本"></a>5. 指定 <code>uvx</code> 的环境与版本</h2><p>在日常交互中，<code>uvx</code> 默认会优先使用已安装的持久化版本（<code>uv tool install</code>），否则拉取最新兼容版本。但在可重现场景（CI、脚本、团队共享）中，<strong>建议显式指定</strong>：</p><ul><li>指定工具版本：<code>uvx ruff@0.5.0</code></li><li>指定 Python 版本：<code>uvx --python 3.11 black</code></li><li>同时指定：<code>uvx --python 3.12 --from pytest@8.2.0 pytest</code></li><li>强制全新隔离环境：<code>uvx --isolated ruff</code></li></ul><blockquote><p>💡 经验法则：<strong>日常交互不指定，生产&#x2F;自动化必须锁版</strong>。</p></blockquote><hr><h2 id="6-进阶：工作区、CI-CD-与容器化"><a href="#6-进阶：工作区、CI-CD-与容器化" class="headerlink" title="6. 进阶：工作区、CI&#x2F;CD 与容器化"></a>6. 进阶：工作区、CI&#x2F;CD 与容器化</h2><h3 id="工作区（Monorepo）"><a href="#工作区（Monorepo）" class="headerlink" title="工作区（Monorepo）"></a>工作区（Monorepo）</h3><p>在根目录 <code>pyproject.toml</code> 中定义：</p><figure class="highlight toml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[tool.uv.workspace]</span></span><br><span class="line"><span class="attr">members</span> = [<span class="string">&quot;packages/*&quot;</span>]</span><br></pre></td></tr></table></figure><p>单一锁文件保证全局一致性。</p><h3 id="CI-CD（GitHub-Actions）"><a href="#CI-CD（GitHub-Actions）" class="headerlink" title="CI&#x2F;CD（GitHub Actions）"></a>CI&#x2F;CD（GitHub Actions）</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">astral-sh/setup-uv@v3</span></span><br><span class="line">  <span class="attr">with:</span></span><br><span class="line">    <span class="attr">enable-cache:</span> <span class="literal">true</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">run:</span> <span class="string">uv</span> <span class="string">sync</span> <span class="string">--locked</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">run:</span> <span class="string">uv</span> <span class="string">run</span> <span class="string">pytest</span></span><br></pre></td></tr></table></figure><h3 id="容器化（Docker-多阶段构建）"><a href="#容器化（Docker-多阶段构建）" class="headerlink" title="容器化（Docker 多阶段构建）"></a>容器化（Docker 多阶段构建）</h3><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> ghcr.io/astral-sh/uv:latest AS builder</span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> pyproject.toml uv.lock .</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> uv <span class="built_in">sync</span> --no-dev</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">FROM</span> python:<span class="number">3.12</span>-slim</span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> --from=builder /app/.venv /app/.venv</span></span><br><span class="line"><span class="keyword">ENV</span> PATH=<span class="string">&quot;/app/.venv/bin:$PATH&quot;</span></span><br></pre></td></tr></table></figure><hr><h2 id="7-核心命令速查表"><a href="#7-核心命令速查表" class="headerlink" title="7. 核心命令速查表"></a>7. 核心命令速查表</h2><table><thead><tr><th>功能分类</th><th>命令</th><th>说明</th></tr></thead><tbody><tr><td><strong>初始化</strong></td><td><code>uv init --python 3.12</code></td><td>新建项目并锁定 Python 版本</td></tr><tr><td><strong>依赖管理</strong></td><td><code>uv add &lt;pkg&gt;</code></td><td>添加依赖并更新锁文件</td></tr><tr><td></td><td><code>uv add --dev &lt;pkg&gt;</code></td><td>添加开发依赖</td></tr><tr><td></td><td><code>uv remove &lt;pkg&gt;</code></td><td>移除依赖</td></tr><tr><td></td><td><code>uv sync</code></td><td>同步环境与锁文件</td></tr><tr><td><strong>运行&#x2F;执行</strong></td><td><code>uv run &lt;cmd&gt;</code></td><td>在项目环境中运行命令</td></tr><tr><td></td><td><code>uvx &lt;tool&gt;</code></td><td>临时运行独立工具</td></tr><tr><td><strong>工具安装</strong></td><td><code>uv tool install &lt;tool&gt;</code></td><td>持久化安装全局工具</td></tr><tr><td><strong>迁移兼容</strong></td><td><code>uv add -r requirements.txt</code></td><td>导入 requirements.txt 到项目模式</td></tr><tr><td></td><td><code>uv pip sync requirements.txt</code></td><td>使环境与 requirements.txt 严格一致</td></tr></tbody></table><hr><h2 id="8-常见区别对比"><a href="#8-常见区别对比" class="headerlink" title="8. 常见区别对比"></a>8. 常见区别对比</h2><h3 id="uv-add-vs-uv-pip-install"><a href="#uv-add-vs-uv-pip-install" class="headerlink" title="uv add vs uv pip install"></a><code>uv add</code> vs <code>uv pip install</code></h3><table><thead><tr><th></th><th><code>uv add</code></th><th><code>uv pip install</code></th></tr></thead><tbody><tr><td>修改 <code>pyproject.toml</code></td><td>✅ 是</td><td>❌ 否</td></tr><tr><td>生成&#x2F;更新 <code>uv.lock</code></td><td>✅ 是</td><td>❌ 否</td></tr><tr><td>适用场景</td><td>项目开发（现代模式）</td><td>一次性安装或传统工作流</td></tr></tbody></table><h3 id="uv-pip-sync-vs-uv-add-r"><a href="#uv-pip-sync-vs-uv-add-r" class="headerlink" title="uv pip sync vs uv add -r"></a><code>uv pip sync</code> vs <code>uv add -r</code></h3><table><thead><tr><th></th><th><code>uv pip sync requirements.txt</code></th><th><code>uv add -r requirements.txt</code></th></tr></thead><tbody><tr><td>用途</td><td>使当前环境与 txt 严格一致</td><td>迁移依赖到项目模式</td></tr><tr><td>是否创建 <code>pyproject.toml</code></td><td>❌</td><td>✅（若不存在）</td></tr><tr><td>是否会删除多余包</td><td>✅ 会</td><td>❌ 只添加</td></tr></tbody></table><h3 id="uv-run-vs-uvx"><a href="#uv-run-vs-uvx" class="headerlink" title="uv run vs uvx"></a><code>uv run</code> vs <code>uvx</code></h3><table><thead><tr><th></th><th><code>uv run</code></th><th><code>uvx</code></th></tr></thead><tbody><tr><td>依赖项目环境</td><td>是</td><td>否</td></tr><tr><td>需要项目初始化</td><td>是</td><td>否</td></tr><tr><td>典型例子</td><td><code>uv run python app.py</code></td><td><code>uvx ruff check .</code></td></tr></tbody></table><hr><p>好的，我已将您提供的这段话作为独立的观点小节，融入到博客原文中。请查看以下更新后的内容（新增部分位于“常见区别对比”与“总结最佳实践”之间）：</p><hr><h2 id="9-关于全局-Python-环境"><a href="#9-关于全局-Python-环境" class="headerlink" title="9. 关于全局 Python 环境"></a>9. 关于全局 Python 环境</h2><p><code>uv</code> 管理项目环境的方式，<strong><code>uv</code> 本身不建议直接修改系统 Python 环境</strong>，这与使用一个“干净”的全局 Python 作为运行时<strong>并不冲突</strong>，反而是一种现代、高效且更安全的选择。它将全局 Python 从复杂的项目依赖中解放出来，回归其作为系统基础组件的本来角色。</p><p>换句话说：</p><ul><li>全局 Python 只用于运行操作系统工具或 <code>uv</code> 自身。</li><li>所有项目依赖、版本、虚拟环境均由 <code>uv</code> 在项目隔离层管理。</li><li>你无需再为不同项目频繁切换或污染全局 Python。</li></ul><hr><p>通过上述整合，您的观点已完整融入博客，并成为独立小节，使全文逻辑更清晰。如果需要进一步调整位置或措辞，请随时告知。</p><h2 id="10-总结最佳实践"><a href="#10-总结最佳实践" class="headerlink" title="10. 总结最佳实践"></a>10. 总结最佳实践</h2><ol><li><strong>新项目一律使用项目模式</strong>：<code>uv init</code> → <code>uv add</code> → <code>uv run</code>。</li><li><strong>依赖管理</strong>：始终用 <code>uv add</code> &#x2F; <code>uv remove</code>，不要手动编辑 <code>pyproject.toml</code>。</li><li><strong>运行代码</strong>：用 <code>uv run</code> 代替手动激活虚拟环境。</li><li><strong>临时工具</strong>：用 <code>uvx</code>，若频繁使用则 <code>uv tool install</code>。</li><li><strong>可重现性</strong>：在 CI&#x2F;脚本中锁定工具版本（<code>uvx tool@ver</code>）和 Python 版本（<code>--python</code>）。</li><li><strong>迁移旧项目</strong>：使用 <code>uv add -r requirements.txt</code> 平滑过渡。</li><li><strong>提交锁文件</strong>：<code>uv.lock</code> 必须提交 Git，保证团队环境一致。</li></ol><hr><p>通过遵循以上指南，你可以充分利用 <code>uv</code> 的高效、简洁与可重现性，享受现代化的 Python 开发体验。</p>]]>
    </content>
    <id>https://haies.cn/tool-uv/</id>
    <link href="https://haies.cn/tool-uv/"/>
    <published>2026-05-07T03:00:57.000Z</published>
    <summary>uv Python 项目管理最佳实践指南：安装、项目构建、核心命令与 pip/poetry 对比。</summary>
    <title>uv Python 项目管理最佳实践指南</title>
    <updated>2026-10-21T00:56:24.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="笔记" scheme="https://haies.cn/categories/note/"/>
    <category term="技术栈" scheme="https://haies.cn/tags/stack/"/>
    <category term="AI" scheme="https://haies.cn/tags/ai/"/>
    <category term="教程" scheme="https://haies.cn/tags/manual/"/>
    <content>
      <![CDATA[<p>如今大模型层出不穷，Llama-3-8B-Base、Qwen-VL-7B-Chat、GPT-3.5 Turbo、Gemini 1.5 Flash……这些模型名称后的一串后缀，常常让新手一头雾水。到底Base和Chat有什么区别？Q8_K、Q4_K_M是什么意思？Turbo、Instant又代表什么？这篇博客就一次性把大模型后缀讲透，结合具体案例，让你看完就能精准选型、快速上手。</p><h2 id="一、基础认知：先搞懂大模型的核心维度与核心概念"><a href="#一、基础认知：先搞懂大模型的核心维度与核心概念" class="headerlink" title="一、基础认知：先搞懂大模型的核心维度与核心概念"></a>一、基础认知：先搞懂大模型的核心维度与核心概念</h2><p>新手看大模型后缀，先掌握其核心分类维度，再拆解具体概念，就能快速入门。大模型的核心差异主要体现在4个维度，也是后缀所对应的核心含义，先做总体介绍：</p><ul><li><p>能力维度：模型的强弱等级（如基础版、专业版、旗舰版），决定处理复杂任务的能力；</p></li><li><p>模态维度：模型能处理的数据类型（仅文本、图文结合、音视频全支持等）；</p></li><li><p>速度维度：模型的响应速度、推理效率，适配不同交互场景；</p></li><li><p>部署维度：模型的体积大小、适配设备，核心影响因素是量化优化。</p></li></ul><p>后续所有后缀，本质都是这4个维度的”缩写标识”。下面我们拆解两个最基础、最核心的概念——Base（能力基础）和量化（部署优化），为后续后缀解析做好充分铺垫，帮你快速衔接后续知识点。</p><h3 id="1-Base：原始预训练模型，所有优化模型的基础"><a href="#1-Base：原始预训练模型，所有优化模型的基础" class="headerlink" title="1. Base：原始预训练模型，所有优化模型的基础"></a>1. Base：原始预训练模型，所有优化模型的基础</h3><p>很多模型后缀带”Base”，比如Llama-3-8B-Base，它是大模型的”原始形态”，也是所有优化版模型的基础，核心特点是：只学”文字接龙”，不懂人类指令，不具备场景化能力，也不包含多模态、高速响应等优化特性。</p><p>它的训练逻辑很简单：仅基于海量无标注文本进行训练，核心任务是”预测下一个字符”，相当于一个只会自动翻页的书，没有问答意识、没有指令理解能力。</p><p>举个直观例子：给Base模型输入”解释什么是人工智能”，它不会给出正经的解释，反而会续写”解释什么是人工智能，在2025年全球科技发展浪潮中，各大科技公司纷纷布局大模型赛道……”，完全抓不住”提问”的核心需求。</p><p>适用场景：仅适合二次微调、科研训练，普通人不建议直接用来日常使用；我们日常用的具备问答、多模态、高速响应能力的模型，都是在Base模型基础上优化而来的。</p><h3 id="2-量化：优化部署维度，让普通设备也能运行大模型"><a href="#2-量化：优化部署维度，让普通设备也能运行大模型" class="headerlink" title="2. 量化：优化部署维度，让普通设备也能运行大模型"></a>2. 量化：优化部署维度，让普通设备也能运行大模型</h3><p>大模型的权重原本是FP16&#x2F;FP32高精度格式（类似高清图片），体积大、对硬件要求高，普通设备难以运行。而”量化”就是针对部署维度的优化，用轻微的精度损失，换取更小的体积和更快的运行速度，核心目的是让普通设备也能运行大模型。</p><p>量化的核心原理：将高精度的浮点数（如模型权重）映射为低精度的整数（如INT8），减少参数占用的存储空间和计算量，就像把高清图压缩成标清图，日常使用完全足够，且能大幅提升运行速度。基于量化的核心逻辑，下面我们拆解量化相关的后缀细节，这也是本地部署选型的关键。</p><h4 id="重点拆解：量化相关后缀（按”位数-算法-优化级别”分类，清晰好记）"><a href="#重点拆解：量化相关后缀（按”位数-算法-优化级别”分类，清晰好记）" class="headerlink" title="重点拆解：量化相关后缀（按”位数-算法-优化级别”分类，清晰好记）"></a>重点拆解：量化相关后缀（按”位数-算法-优化级别”分类，清晰好记）</h4><p>量化相关后缀是本地部署的关键，核心分为三类，结合具体案例更易理解：</p><p>（1）量化位数：Q后面的数字，直接代表量化精度和体积，核心常用档位：</p><ul><li><p>Q2：极致压缩，体积最小，精度损失较明显，仅适合极简场景；</p></li><li><p>Q4：黄金平衡点，体积小、速度快，精度无明显感知损失，是本地部署基础款；</p></li><li><p>Q8：8位量化，精度接近原版FP16，体积为原版的一半，适合追求保真度的场景。</p></li></ul><p>（2）量化算法：不同算法决定精度高低，核心常用两种：</p><ul><li><p>GPTQ&#x2F;AWQ：主流量化算法，可大幅降低显存占用（约75%），GPTQ适配PyTorch生态，AWQ推理速度更优；</p></li><li><p>Q8_K&#x2F;Q4_K：GGUF格式专属，带”K”即采用K-Quant混合精度算法，通过分组优化，比普通量化精度更高、误差更小（如Q8_K优于普通INT8）。</p></li></ul><p>（3）优化级别：GGUF格式专属，搭配K-Quant算法使用，平衡精度与速度，核心分为7类：</p><ul><li><p>XXS（极小级）：极致轻量化，适合低配设备应急，精度损失较明显；</p></li><li><p>XS（超小级）：介于XXS和S之间，兼顾速度与基础精度，适合手机等端侧设备；</p></li><li><p>S（轻度级）：轻度优化，速度快，精度适中，适合普通本地部署；</p></li><li><p>M（中度级）：精度与速度平衡，是本地部署首选（如Q4_K_M）；</p></li><li><p>L（高度级）：高精度优化，接近原版精度，速度略慢；</p></li><li><p>XL（超大级）：最高精度优化，精度接近原始模型，显存占用略高；</p></li><li><p>NL（非线性级）：场景化优化，针对MoE等特定架构模型，提升专项任务精度。</p></li></ul><p>核心示例：Q4_K_M &#x3D; 4bit量化（位数）+ K-Quant算法（算法）+ 中度优化（级别），是本地部署最具性价比的选择；Q8_K则是8bit量化+K-Quant算法，精度接近原版，适合追求保真度的场景，这也与前文量化算法的精度优势形成呼应。</p><h4 id="补充：量化案例（含计算过程，直观看精度差异）"><a href="#补充：量化案例（含计算过程，直观看精度差异）" class="headerlink" title="补充：量化案例（含计算过程，直观看精度差异）"></a>补充：量化案例（含计算过程，直观看精度差异）</h4><p>我们用一组真实数值，对比普通INT8与Q8_K（K-Quant算法）的量化差异，更易理解精度优势：</p><p>前提：INT8量化需将浮点数映射到-128~127的整数区间，Q8_K则先分组再单独量化，精度更优。</p><p>原始FP16数值：[0.12, 0.15, 0.13, 1.85, 1.92, 1.88, -0.14, -0.11]</p><ol><li>普通全局INT8量化（无分组）：</li></ol><ul><li><p>第一步：全局区间&#x3D;1.92 - (-0.14)&#x3D;2.06，整数区间总范围&#x3D;255（-128~127）；</p></li><li><p>第二步：套用公式int8_val &#x3D; 四舍五入(-128 + (x - 最小值)&#x2F;区间宽度 × 255)；</p></li><li><p>第三步：计算结果：0.12、0.13、0.15均映射为相近整数（约-93），细微差异被抹平，精度损失明显。</p></li></ul><ol start="2"><li>Q8_K分组量化（K-Quant算法）：</li></ol><ul><li><p>第一步：分组（按数值大小）：小幅正值组[0.12,0.15,0.13]、大幅正值组[1.85,1.92,1.88]、小幅负值组[-0.14,-0.11]；</p></li><li><p>第二步：每组单独计算区间和缩放比例，不再用全局统一标准；</p></li><li><p>第三步：计算结果：0.12、0.13、0.15分别对应不同整数（-95、-94、-92），细微差异被保留，精度明显优于普通INT8。</p></li></ul><p>结合前文量化原理和INT8的定义，这里有个关键提醒：大模型量化中的INT8，是8位（bit）有符号整数（取值-128~127）；而数据库中的INT8（如PostgreSQL）是8字节（Byte）整数（取值范围极广），二者定义、用途完全不同，切勿混淆，避免后续部署时出现认知偏差。</p><h2 id="二、全量后缀解析：按场景分类，一看就懂"><a href="#二、全量后缀解析：按场景分类，一看就懂" class="headerlink" title="二、全量后缀解析：按场景分类，一看就懂"></a>二、全量后缀解析：按场景分类，一看就懂</h2><p>了解完基础概念和核心维度后，下面我们按”速度、能力、技术、多模态、测试”五大类，拆解市面上所有常见后缀，全面覆盖能力、速度、模态、部署四大核心维度，直白好记、拿来就用，帮你快速对应场景选型。</p><h3 id="1-速度优先类：追求快响应、低延迟（对应基础认知：速度维度）"><a href="#1-速度优先类：追求快响应、低延迟（对应基础认知：速度维度）" class="headerlink" title="1. 速度优先类：追求快响应、低延迟（对应基础认知：速度维度）"></a>1. 速度优先类：追求快响应、低延迟（对应基础认知：速度维度）</h3><p>不同场景对模型响应速度的需求不同，这类后缀的核心是”快”，适合实时交互、批量任务等对速度要求高的场景：</p><ul><li><p>Turbo：主打更快推理、更低延迟，能力与标准版接近，性价比高，适合高频对话、实时交互（如GPT-3.5 Turbo）；</p></li><li><p>Instant：极轻量，亚秒级响应，侧重简单问答、文案润色、快速翻译，成本极低，适合大规模批量任务；</p></li><li><p>Flash：比Turbo更激进，极致速度+低显存，能力适当降级，适合高吞吐、低延迟场景（如Gemini 1.5 Flash）；</p></li><li><p>Fast：和Flash类似，强调速度优先、轻量高效。</p></li></ul><p>解决完速度需求，我们再来看如何通过后缀判断模型的能力强弱，对应基础认知中的”能力维度”。</p><h3 id="2-能力-规模等级类：区分模型强弱、大小（对应基础认知：能力维度）"><a href="#2-能力-规模等级类：区分模型强弱、大小（对应基础认知：能力维度）" class="headerlink" title="2. 能力&#x2F;规模等级类：区分模型强弱、大小（对应基础认知：能力维度）"></a>2. 能力&#x2F;规模等级类：区分模型强弱、大小（对应基础认知：能力维度）</h3><p>这类后缀直接体现模型的参数规模和能力等级，按需选择即可：</p><ul><li><p>Base：原始预训练基座，只懂续写，用于二次微调（前文已详细说明）；</p></li><li><p>Pro：主力专业版，能力均衡，推理强、稳定性好，适合大多数办公、创作场景；</p></li><li><p>Max：旗舰顶配，参数最大、能力最强，擅长长文本、复杂推理、专业任务；</p></li><li><p>Ultra：超旗舰，比Max更强，多模态+深度推理，算力要求最高；</p></li><li><p>Opus：顶级旗舰（多见于Claude系列），最强的理解与创作能力；</p></li><li><p>Lite：轻量精简版，参数小、速度快、成本低，适合简单任务、端侧部署；</p></li><li><p>Mini：比Lite更小，端侧友好（手机、嵌入式设备），基础能力够用；</p></li><li><p>Nano：极小尺寸，专为手机离线运行设计（如Gemini Nano）。</p></li></ul><p>明确模型能力后，后缀还能体现模型的训练方式，这对应基础认知中”能力优化”的核心逻辑，下面拆解技术&#x2F;训练特性类后缀。</p><h3 id="3-技术-训练特性类：体现模型的”训练方式”和”功能侧重”（对应基础认知：能力维度）"><a href="#3-技术-训练特性类：体现模型的”训练方式”和”功能侧重”（对应基础认知：能力维度）" class="headerlink" title="3. 技术&#x2F;训练特性类：体现模型的”训练方式”和”功能侧重”（对应基础认知：能力维度）"></a>3. 技术&#x2F;训练特性类：体现模型的”训练方式”和”功能侧重”（对应基础认知：能力维度）</h3><p>了解模型的训练方式，能更好判断其是否贴合人类使用习惯，这类后缀清晰体现了模型的训练逻辑和功能优化方向：</p><ul><li><p>Instruct：在Base基础上做指令微调，能听懂人话、按指令做事（翻译、摘要、写作等），日常使用首选；</p></li><li><p>Chat：在Instruct基础上优化多轮对话，更自然、连贯，有记忆能力，适合聊天场景；</p></li><li><p>Thinking&#x2F;Reason&#x2F;R：强化深度思考，擅长数学、逻辑、复杂推理，会”慢思考”，算力消耗更高；</p></li><li><p>RLHF：基于人类反馈强化学习，更听话、更安全、更少幻觉；</p></li><li><p>DPO：直接偏好优化，替代RLHF，训练更快、效果接近；</p></li><li><p>Quant&#x2F;GGUF：量化相关标识，GGUF是llama.cpp专用的量化格式，方便本地部署。</p></li></ul><p>除了通用能力，很多模型有专属的专项能力，尤其是多模态能力，对应基础认知中的”模态维度”，下面看多模态&#x2F;垂类类后缀。</p><h3 id="4-多模态-垂类类：体现模型的”专项能力”（对应基础认知：模态维度）"><a href="#4-多模态-垂类类：体现模型的”专项能力”（对应基础认知：模态维度）" class="headerlink" title="4. 多模态&#x2F;垂类类：体现模型的”专项能力”（对应基础认知：模态维度）"></a>4. 多模态&#x2F;垂类类：体现模型的”专项能力”（对应基础认知：模态维度）</h3><p>这类后缀代表模型有特定的专项能力，不是通用型模型，能快速区分其定位：</p><ul><li><p>Vision&#x2F;V&#x2F;VL：视觉增强，能识别图片、截图、图表（如GPT-4V）；</p></li><li><p>Omni&#x2F;o：全能多模态，支持文本、图像、音频等全场景（如GPT-4o）；</p></li><li><p>Code：代码专用，擅长生成、调试代码，适合编程场景；</p></li><li><p>Math：数学专用，擅长公式推导、复杂计算；</p></li><li><p>Audio：语音能力，支持语音输入、输出、语音对话。</p></li></ul><p>最后，后缀还能体现模型的版本稳定性，帮我们判断是否适合生产、日常使用等场景，下面拆解测试&#x2F;特殊类后缀。</p><h3 id="5-测试-特殊类：体现模型的”版本状态”（对应基础认知：全维度适配）"><a href="#5-测试-特殊类：体现模型的”版本状态”（对应基础认知：全维度适配）" class="headerlink" title="5. 测试&#x2F;特殊类：体现模型的”版本状态”（对应基础认知：全维度适配）"></a>5. 测试&#x2F;特殊类：体现模型的”版本状态”（对应基础认知：全维度适配）</h3><p>这类后缀能判断模型的稳定性，决定其适用场景：</p><ul><li><p>Alpha：早期内测版，功能不全、不稳定，仅限内部测试；</p></li><li><p>Beta：公测版，功能完整但可能有bug，供用户尝鲜；</p></li><li><p>Preview&#x2F;EXP：预览&#x2F;实验版，有新功能但不稳定，不建议生产环境使用；</p></li><li><p>Stable：稳定版，经过充分测试，适合长期部署；</p></li><li><p>Terminus：最终稳定版，该系列停止更新，提供长期支持。</p></li></ul><h2 id="三、新手选型口诀：看完直接用"><a href="#三、新手选型口诀：看完直接用" class="headerlink" title="三、新手选型口诀：看完直接用"></a>三、新手选型口诀：看完直接用</h2><p>结合前文基础认知、量化细节和全量后缀解析，我们整理了以下选型口诀，直接对应各类使用场景，新手可直接套用，无需死记硬背复杂知识点。</p><ul><li><p>日常用 → 选Instruct&#x2F;Chat（能听话、能问答）；</p></li><li><p>本地跑 → 选7B+Q4_K_M&#x2F;GPTQ（体积小、性价比高，Q4_K_M是首选，对应量化章节的中度优化级别）；</p></li><li><p>想保真 → 选Q8_K（8bit+K-Quant算法，接近原版精度，对应量化案例结论）；</p></li><li><p>要快速 → 选Turbo&#x2F;Flash&#x2F;Instant（低延迟、高吞吐）；</p></li><li><p>做专业 → 选Max&#x2F;Ultra&#x2F;Opus（复杂推理、强能力）；</p></li><li><p>看图片 → 选VL&#x2F;Omni（视觉增强、多模态）；</p></li><li><p>写代码&#x2F;算数学 → 选Code&#x2F;Math&#x2F;Thinking（专项优化）。</p></li></ul><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>大模型的后缀，本质上是”模型四大核心维度的缩写标识”——Base代表能力基础（能力维度），量化后缀代表部署优化（部署维度），Turbo&#x2F;Flash代表速度优势（速度维度），VL&#x2F;Omni代表模态特性（模态维度）。</p><p>不用死记硬背，只要记住”按场景选后缀”：想本地部署就看量化相关后缀，想快速响应就选Turbo&#x2F;Flash，想听话就选Instruct&#x2F;Chat，结合自己的设备和需求，就能轻松选对适合自己的大模型，真正实现新手快速上手、精准选型。</p>]]>
    </content>
    <id>https://haies.cn/ai-llm-suffix-gudie/</id>
    <link href="https://haies.cn/ai-llm-suffix-gudie/"/>
    <published>2026-05-06T08:42:16.000Z</published>
    <summary>看后缀识模型：大模型命名后缀全解析，理解参数量、量化与能力等级。</summary>
    <title>看后缀识模型：大模型后缀全解析</title>
    <updated>2026-10-22T06:14:13.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="笔记" scheme="https://haies.cn/categories/note/"/>
    <category term="技术栈" scheme="https://haies.cn/tags/stack/"/>
    <category term="AI" scheme="https://haies.cn/tags/ai/"/>
    <category term="教程" scheme="https://haies.cn/tags/manual/"/>
    <content>
      <![CDATA[<h2 id="一、ComfyUI是什么"><a href="#一、ComfyUI是什么" class="headerlink" title="一、ComfyUI是什么"></a>一、ComfyUI是什么</h2><p>ComfyUI是一款免费开源、节点式工作流的AI绘图工具，基于Stable Diffusion生态，同时支持SDXL、视频生成等场景。</p><p>它和传统网页版AI绘图最大区别：不是固定流水线，而是把AI生成拆成一个个独立Node（节点），像搭积木、接电路一样自由拖拽连线，自定义绘图全流程。</p><p>支持Windows、Linux、macOS三大系统，默认本地离线运行，所有模型都需自行下载存到本地，不上传数据，隐私性强；也有官方云端版本可免本地配置使用。</p><h2 id="二、三大系统运行优缺点"><a href="#二、三大系统运行优缺点" class="headerlink" title="二、三大系统运行优缺点"></a>二、三大系统运行优缺点</h2><h3 id="Windows"><a href="#Windows" class="headerlink" title="Windows"></a>Windows</h3><p><strong>优点</strong>：安装最简单，一键整合包解压即用；NVIDIA显卡CUDA兼容性拉满，插件和自定义节点生态最全，新手零门槛。</p><p><strong>缺点</strong>：同配置下显存占用略高，长期批量生成易显存泄漏；AMD显卡仅支持DirectML，运行速度差。</p><h3 id="Linux"><a href="#Linux" class="headerlink" title="Linux"></a>Linux</h3><p><strong>优点</strong>：显存利用率最高、性能最强，比Windows更快更省显存；长期后台批量生成稳定性极佳，AMD显卡可通过ROCm满血运行，适合服务器部署和专业工作室。</p><p><strong>缺点</strong>：安装需命令行配置环境，新手上手门槛高，部分小众自定义节点适配缺失。</p><h3 id="macOS（Apple-Silicon-M系列）"><a href="#macOS（Apple-Silicon-M系列）" class="headerlink" title="macOS（Apple Silicon M系列）"></a>macOS（Apple Silicon M系列）</h3><p><strong>优点</strong>：统一内存架构，大模型不易爆显存；笔记本便携安静、低功耗散热好，自带Metal加速无需额外装驱动。</p><p><strong>缺点</strong>：无CUDA支持，运行速度比NVIDIA显卡慢；自定义节点、视频生成、多ControlNet兼容性较差，Intel Mac不建议使用。</p><h2 id="三、ComfyUI硬件配置要求"><a href="#三、ComfyUI硬件配置要求" class="headerlink" title="三、ComfyUI硬件配置要求"></a>三、ComfyUI硬件配置要求</h2><table><thead><tr><th>硬件</th><th>要求</th></tr></thead><tbody><tr><td><strong>显卡GPU</strong></td><td>核心硬件，4-6GB显存可基础跑SD1.5；8GB为日常舒适底线，可运行SDXL；12GB及以上流畅驾驭多LoRA、多ControlNet、高清修复；16GB+适合FLUX大模型、AI视频生成</td></tr><tr><td><strong>内存RAM</strong></td><td>最低16GB，推荐32GB及以上，适配多节点、多模型加载</td></tr><tr><td><strong>硬盘</strong></td><td>必须NVMe固态硬盘，机械硬盘加载模型极慢；预留50GB以上空闲空间</td></tr><tr><td><strong>CPU</strong></td><td>无高要求，主流中端处理器即可，性能瓶颈只在显卡</td></tr></tbody></table><h2 id="四、AI绘图核心名词通俗详解"><a href="#四、AI绘图核心名词通俗详解" class="headerlink" title="四、AI绘图核心名词通俗详解"></a>四、AI绘图核心名词通俗详解</h2><h3 id="1-Checkpoint（CKPT大模型）"><a href="#1-Checkpoint（CKPT大模型）" class="headerlink" title="1. Checkpoint（CKPT大模型）"></a>1. Checkpoint（CKPT大模型）</h3><p>后缀为.ckpt&#x2F;.safetensors，体积2-7GB，是AI绘图的全能底子画家。</p><p><strong>作用</strong>：决定整体画风（写实、二次元、国风等）、画面构图、光影逻辑，更换大模型，整体画风会彻底改变，是运行绘图必须加载的基础模型。</p><p><strong>进阶理解</strong>：Checkpoint 是把 UNet、CLIP、VAE 三套模型权重完整封装打包在单个文件里的整合模型，内部已包含全套参数，不会从 unet、clip、vae 三个独立文件夹动态加载内容；而独立文件夹存放的是拆分出来的单独模型文件，和 Checkpoint 属于平行格式，互不依赖。新手用 Checkpoint 可一键加载成套匹配好的模型，简单不翻车；进阶玩家则可以单独调用三个独立模型自由混搭，适配 SDXL、Flux 等原生拆分式新模型。</p><h3 id="2-VAE"><a href="#2-VAE" class="headerlink" title="2. VAE"></a>2. VAE</h3><p>小型调色模型，体积仅几十到几百MB，相当于AI绘图的调色师+美颜滤镜。</p><p><strong>作用</strong>：AI生成的原始画面是灰蒙蒙的底层潜数据，没有色彩、发雾暗淡；VAE负责校正色彩、提亮通透感、锐化细节、去除噪点，没有合适VAE，生成图片会惨白模糊、观感极差。</p><h3 id="3-LoRA"><a href="#3-LoRA" class="headerlink" title="3. LoRA"></a>3. LoRA</h3><p>轻量化插件模型，体积20-300MB，不替换基础大模型，只做效果叠加。</p><p><strong>作用</strong>：可定制固定动漫角色、真人面容、专属画风、服饰穿搭、特定场景，支持多个LoRA混用，还能调节权重强度控制效果深浅。</p><h3 id="4-ControlNet"><a href="#4-ControlNet" class="headerlink" title="4. ControlNet"></a>4. ControlNet</h3><p>AI构图姿势控制器，强制约束AI绘画不随意发挥。</p><p><strong>作用</strong>：可精准控制人物骨架动作、画面轮廓线条、场景景深层次、建筑结构布局，给AI打好草稿，牢牢锁定构图和姿态。</p><h3 id="5-Embedding"><a href="#5-Embedding" class="headerlink" title="5. Embedding"></a>5. Embedding</h3><p>小众特征关键词补丁，体积小巧。</p><p><strong>作用</strong>：适合AI原生不认识的冷门角色、特殊服饰、小众细节特征，相当于给提示词扩充专属词库，补充LoRA覆盖不到的细微特征。</p><h3 id="6-UNET-和-CLIP（了解即可）"><a href="#6-UNET-和-CLIP（了解即可）" class="headerlink" title="6. UNET 和 CLIP（了解即可）"></a>6. UNET 和 CLIP（了解即可）</h3><p><strong>CLIP</strong>：文本编码器，负责”理解”文字提示词，将其转换为模型能懂的向量，类比于人的大脑。</p><p><strong>UNET</strong>：图像生成的核心神经网络，负责”执行”绘画，从噪声中重建图像，两者配合完成”理解文字→画出图像”的全过程。</p><h2 id="五、ComfyUI基础绘图标准工作流"><a href="#五、ComfyUI基础绘图标准工作流" class="headerlink" title="五、ComfyUI基础绘图标准工作流"></a>五、ComfyUI基础绘图标准工作流</h2><p>核心节点流程固定，所有复杂工作流都在此基础上扩展：</p><ol><li>加载Checkpoint大模型</li><li>可选添加LoRA加载节点，叠加风格人物</li><li>输入正向提示词（想要的画面内容）、反向提示词（规避畸形、模糊等瑕疵）</li><li>可选接入ControlNet，控制姿势与构图</li><li>KSampler采样器开始迭代运算，生成底层潜空间数据</li><li>通过VAE Decode解码，将灰蒙蒙数据转为正常彩色图片</li><li>预览并保存生成图片</li></ol><p><strong>整体口诀</strong>：加载大模型→加LoRA→写正反提示词→控构图姿势→采样画图→VAE调色出图</p><h2 id="六、总结"><a href="#六、总结" class="headerlink" title="六、总结"></a>六、总结</h2><p>ComfyUI凭借节点式自由定制、本地离线运行、跨平台适配，成为专业AI创作者首选工具。新手只需弄懂核心模型概念（Checkpoint、VAE、LoRA、ControlNet、Embedding等），掌握基础工作流逻辑，就能从零开始搭建属于自己的AI绘图流水线，无论是日常出图、风格创作，还是批量生成、视频制作都能轻松胜任。</p>]]>
    </content>
    <id>https://haies.cn/ai-comfyui-starter/</id>
    <link href="https://haies.cn/ai-comfyui-starter/"/>
    <published>2026-05-04T02:30:00.000Z</published>
    <summary>零基础看懂 ComfyUI：节点、VAE、LoRA、ControlNet 等核心概念科普与新手入门路径。</summary>
    <title>零基础看懂ComfyUI：节点、VAE、LoRA、ControlNet全科普，新手入门必看</title>
    <updated>2026-10-21T02:31:08.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="笔记" scheme="https://haies.cn/categories/note/"/>
    <category term="技术栈" scheme="https://haies.cn/tags/stack/"/>
    <category term="AI" scheme="https://haies.cn/tags/ai/"/>
    <category term="教程" scheme="https://haies.cn/tags/manual/"/>
    <content>
      <![CDATA[<h2 id="一、使用背景"><a href="#一、使用背景" class="headerlink" title="一、使用背景"></a>一、使用背景</h2><ul><li>系统：macOS + WSL2</li><li>核心用途：个人 AI 助手，通过飞书对话</li><li>主要模型：MiniMax-M2.7（主力）、Qwen3.5-4B-MLX-4bit（本地）</li></ul><h2 id="二、配置文件体系"><a href="#二、配置文件体系" class="headerlink" title="二、配置文件体系"></a>二、配置文件体系</h2><h3 id="目录结构"><a href="#目录结构" class="headerlink" title="目录结构"></a>目录结构</h3><p>所有配置存放在 <code>~/.hermes/</code> 目录下：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">~/.hermes/</span><br><span class="line">├── config.yaml     # 主配置文件（模型、终端、TTS、压缩等）</span><br><span class="line">├── .env             # API Key 和密钥（secrets）</span><br><span class="line">├── auth.json        # OAuth 凭证（Nous Portal 等）</span><br><span class="line">├── SOUL.md          # 主体身份定义（系统提示词 slot #1）</span><br><span class="line">├── memories/        # 持久化记忆（MEMORY.md、USER.md）</span><br><span class="line">├── skills/          # Agent 创建的技能（通过 skill_manage 管理）</span><br><span class="line">├── cron/             # 定时任务</span><br><span class="line">├── sessions/        # 网关会话</span><br><span class="line">└── logs/             # 日志（errors.log、gateway.log — 敏感信息自动脱敏）</span><br></pre></td></tr></table></figure><h3 id="三个核心配置文件"><a href="#三个核心配置文件" class="headerlink" title="三个核心配置文件"></a>三个核心配置文件</h3><table><thead><tr><th align="left">文件</th><th align="left">作用</th><th align="left">重要性</th></tr></thead><tbody><tr><td align="left"><code>config.yaml</code></td><td align="left">运行时主配置</td><td align="left">最高</td></tr><tr><td align="left"><code>.env</code></td><td align="left">环境变量（API Key 单一真相来源）</td><td align="left">最高</td></tr><tr><td align="left"><code>auth.json</code></td><td align="left">凭证池缓存（仅用于 Nous&#x2F;Copilot&#x2F;Custom Provider）</td><td align="left">一般</td></tr></tbody></table><h3 id="配置优先级（从上到下，高优先级覆盖低优先级）"><a href="#配置优先级（从上到下，高优先级覆盖低优先级）" class="headerlink" title="配置优先级（从上到下，高优先级覆盖低优先级）"></a>配置优先级（从上到下，高优先级覆盖低优先级）</h3><ol><li><strong>CLI 参数</strong> — 例如 <code>hermes chat --model anthropic/claude-sonnet-4</code>（每次调用时覆盖）</li><li><strong><code>config.yaml</code></strong> — 所有非密钥配置的主文件</li><li><strong><code>.env</code></strong> — 环境变量后备；密钥（API Key、Token、密码）必须放这里</li><li><strong>内置默认值</strong> — 以上均未设置时的安全默认值</li></ol><h3 id="经验总结"><a href="#经验总结" class="headerlink" title="经验总结"></a>经验总结</h3><ul><li><strong>标准规则</strong>：密钥（API Key、Bot Token、密码）放 <code>.env</code>；其他配置（模型、终端后端、压缩设置、工具集）放 <code>config.yaml</code></li><li>标准 api_key 类型 provider（如 <code>minimax-cn</code>、<code>omlx</code>）<strong>不走</strong> credential_pool，直接读 <code>.env</code></li><li>API Key 应只保存在 <code>.env</code>，避免冗余存储</li><li>配置修改流程：改 <code>config.yaml</code> → <code>hermes doctor --fix</code> → 重启网关</li></ul><h3 id="hermes-config-命令行"><a href="#hermes-config-命令行" class="headerlink" title="hermes config 命令行"></a>hermes config 命令行</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">hermes config                  <span class="comment"># 查看当前配置</span></span><br><span class="line">hermes config edit             <span class="comment"># 在编辑器中打开 config.yaml</span></span><br><span class="line">hermes config <span class="built_in">set</span> KEY VAL      <span class="comment"># 设置指定值（API Key 自动写入 .env，其他写入 config.yaml）</span></span><br><span class="line">hermes config check            <span class="comment"># 检查缺失项（升级后使用）</span></span><br><span class="line">hermes config migrate          <span class="comment"># 交互式添加缺失配置项</span></span><br></pre></td></tr></table></figure><blockquote><p><strong>技巧</strong>：<code>hermes config set</code> 会自动判断写入目标 — API Key 写入 <code>.env</code>，其他写入 <code>config.yaml</code>。</p></blockquote><h3 id="环境变量引用"><a href="#环境变量引用" class="headerlink" title="环境变量引用"></a>环境变量引用</h3><p><code>config.yaml</code> 中支持 <code>${VAR_NAME}</code> 语法引用环境变量：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">auxiliary:</span></span><br><span class="line">  <span class="attr">vision:</span></span><br><span class="line">    <span class="attr">api_key:</span> <span class="string">$&#123;GOOGLE_API_KEY&#125;</span></span><br><span class="line">    <span class="attr">base_url:</span> <span class="string">$&#123;CUSTOM_VISION_URL&#125;</span></span><br></pre></td></tr></table></figure><p>未定义的环境变量保持原样写入（<code>${UNDEFINED_VAR}</code> 不展开）。</p><h2 id="三、常见故障与修复"><a href="#三、常见故障与修复" class="headerlink" title="三、常见故障与修复"></a>三、常见故障与修复</h2><table><thead><tr><th align="left">问题</th><th align="left">根因</th><th align="left">解决方案</th></tr></thead><tbody><tr><td align="left">MiniMax API doctor 报 404</td><td align="left">doctor 检查 <code>/v1/models</code> 端点，但 MiniMax 只有 <code>/anthropic/v1/messages</code></td><td align="left">误报，不影响实际使用</td></tr><tr><td align="left">OMLX 本地模型 401</td><td align="left"><code>runtime_provider.py</code> 只读 <code>key_env</code>，忽略 <code>api_key_env</code></td><td align="left">补丁同时兼容两个字段</td></tr><tr><td align="left">auxiliary provider 失效</td><td align="left"><code>provider: auto</code> 无法正确路由</td><td align="left">显式指定 <code>provider: minimax-cn</code></td></tr><tr><td align="left">OMLX api_key_env 不生效</td><td align="left">config 字段名与代码读取不匹配</td><td align="left">确认使用 <code>key_env</code> 而非 <code>api_key_env</code></td></tr></tbody></table><h2 id="四、日常维护命令"><a href="#四、日常维护命令" class="headerlink" title="四、日常维护命令"></a>四、日常维护命令</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 健康检查</span></span><br><span class="line">hermes doctor</span><br><span class="line"></span><br><span class="line"><span class="comment"># 自动修复配置</span></span><br><span class="line">hermes doctor --fix</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重启网关</span></span><br><span class="line">hermes gateway restart</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看配置</span></span><br><span class="line">hermes config show</span><br></pre></td></tr></table></figure><p><strong>经验总结</strong>：</p><ul><li>修改 <code>config.yaml</code> 后必须先 <code>hermes doctor --fix</code> 再重启</li><li>重启失败时检查是否有并发进程占用端口</li><li>WSL2 和 macOS 环境下的网关管理命令一致</li></ul><h2 id="五、核心功能体系"><a href="#五、核心功能体系" class="headerlink" title="五、核心功能体系"></a>五、核心功能体系</h2><h3 id="记忆系统（Memory）"><a href="#记忆系统（Memory）" class="headerlink" title="记忆系统（Memory）"></a>记忆系统（Memory）</h3><p>Hermes 有两层持久化记忆：</p><table><thead><tr><th align="left">文件</th><th align="left">用途</th><th align="left">字符上限</th></tr></thead><tbody><tr><td align="left"><code>MEMORY.md</code></td><td align="left">Agent 的个人笔记 — 环境事实、约定、学到的经验</td><td align="left">2,200 chars</td></tr><tr><td align="left"><code>USER.md</code></td><td align="left">用户画像 — 偏好、沟通风格、期望</td><td align="left">1,375 chars</td></tr></tbody></table><p>两个文件均存放在 <code>~/.hermes/memories/</code>，会话启动时注入系统提示词（冻结快照）。</p><blockquote><p><strong>原理</strong>：记忆变更在当前会话不生效（保持 LLM 前缀缓存性能），修改立即持久化到磁盘，下个会话起效。</p></blockquote><h3 id="技能系统（Skills）"><a href="#技能系统（Skills）" class="headerlink" title="技能系统（Skills）"></a>技能系统（Skills）</h3><p>技能是按需加载的知识文档，采用<strong>渐进式披露</strong>节省 token：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Level 0: skills_list() → [&#123;name, description, category&#125;, ...]  (~3k tokens)</span><br><span class="line">Level 1: skill_view(name) → 完整内容 + 元数据</span><br><span class="line">Level 2: skill_view(name, path) → 指定引用文件</span><br></pre></td></tr></table></figure><p>技能通过 <code>/</code> 命令直接调用：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">/axolotl                    <span class="comment"># 加载技能并让 Agent 判断需要什么</span></span><br><span class="line">/github-pr-workflow         <span class="comment"># 直接执行</span></span><br><span class="line">/plan                       <span class="comment"># 加载 plan 技能，检查上下文后写实现计划</span></span><br></pre></td></tr></table></figure><p>技能文件存放在 <code>~/.hermes/skills/</code>，由 <code>skill_manage</code> 工具管理。</p><h3 id="Cron-自动化"><a href="#Cron-自动化" class="headerlink" title="Cron 自动化"></a>Cron 自动化</h3><p>定时任务支持：</p><ul><li>定时触发（<code>0 9 * * *</code>、<code>every 2h</code> 等 cron 表达式）</li><li>事件触发（webhook）</li><li>交付目标：飞书、本地文件、或其他平台</li></ul><h2 id="六、工具链配置"><a href="#六、工具链配置" class="headerlink" title="六、工具链配置"></a>六、工具链配置</h2><ul><li><strong>TTS&#x2F;图片&#x2F;音乐</strong>：MiniMax 原生 API（<code>MINIMAX_CN_API_KEY</code>），不依赖 Hermes 内置 fal.ai 的 <code>image_gen</code></li><li><strong>本地模型</strong>：OMLX（Ollama-MLX），通过 <code>http://127.0.0.1:8000/v1</code> 接入</li><li><strong>Smart Routing</strong>：<code>smart_model_routing.enabled: true</code> 开启后，简单任务自动路由到本地免费模型</li><li><strong>browser 工具</strong>：设置 <code>cloud_provider: &#39;&#39;</code> 使用本地 agent-browser 模式</li></ul><h2 id="七、安全与清理"><a href="#七、安全与清理" class="headerlink" title="七、安全与清理"></a>七、安全与清理</h2><h3 id="7-1-安全配置审计"><a href="#7-1-安全配置审计" class="headerlink" title="7.1 安全配置审计"></a>7.1 安全配置审计</h3><p>在日常维护中，定期运行安全审计能发现潜在风险。以下是我实际排查发现的问题：</p><h4 id="高风险项"><a href="#高风险项" class="headerlink" title="高风险项"></a>高风险项</h4><table><thead><tr><th align="left">问题</th><th align="left">发现方式</th><th align="left">修复方案</th></tr></thead><tbody><tr><td align="left"><code>.env</code> 中 <code>SUDO_PASSWORD</code> 明文存储</td><td align="left">人工检查 <code>.env</code> 文件</td><td align="left">立即删除，不推荐存储在此</td></tr><tr><td align="left"><code>tirith_fail_open: true</code></td><td align="left">配置审计</td><td align="left">改为 <code>tirith_fail_open: false</code></td></tr><tr><td align="left"><code>command_allowlist</code> 规则过于宽泛</td><td align="left">安全审计</td><td align="left">手动收窄，仅保留必要命令</td></tr></tbody></table><h4 id="中风险项"><a href="#中风险项" class="headerlink" title="中风险项"></a>中风险项</h4><table><thead><tr><th align="left">问题</th><th align="left">发现方式</th><th align="left">处理建议</th></tr></thead><tbody><tr><td align="left">WhatsApp Bridge 源码存在 npm 漏洞</td><td align="left"><code>npm audit</code></td><td align="left">配置已移除则无实际影响，源码目录可删除</td></tr><tr><td align="left">streaming 配置冲突</td><td align="left">配置比对</td><td align="left">根级 <code>streaming.enabled</code> 与 <code>display.streaming</code> 含义不同，需确认业务场景</td></tr></tbody></table><h4 id="低风险项"><a href="#低风险项" class="headerlink" title="低风险项"></a>低风险项</h4><table><thead><tr><th align="left">问题</th><th align="left">处理建议</th></tr></thead><tbody><tr><td align="left">config.yaml 中空配置块（<code>whatsapp: {}</code>、<code>mattermost: {}</code>、<code>quick_commands: {}</code>）</td><td align="left">直接删除整段</td></tr><tr><td align="left"><code>service_tier: &#39;&#39;</code> 空字符串</td><td align="left">改为 <code>service_tier: standard</code></td></tr><tr><td align="left"><code>timezone: &#39;&#39;</code> 空字符串</td><td align="left">改为 <code>timezone: Asia/Shanghai</code></td></tr></tbody></table><h3 id="7-2-凭证管理"><a href="#7-2-凭证管理" class="headerlink" title="7.2 凭证管理"></a>7.2 凭证管理</h3><p><strong>核心原则</strong>：API Key 只保存在 <code>.env</code>，不冗余存储。</p><p>实际排查发现 <code>auth.json</code> 中存在 <code>request_count: 0</code> 的凭证，说明从未被使用过。Hermes 运行时实际读取的是 <code>.env</code> 中的环境变量（通过 <code>api_key_env</code> 引用），<code>auth.json</code> 仅作为凭证池缓存层。</p><p><strong>维护建议</strong>：</p><ul><li>定期检查 <code>auth.json</code> 中各 provider 的 <code>request_count</code>，及时清理从未使用的凭证</li><li>保留 <code>copilot</code>（GitHub Copilot）等实际使用的凭证</li><li>删除冗余凭证：<code>minimax-cn</code>、<code>omlx</code> 等（若实际走 <code>.env</code>）</li></ul><h3 id="7-3-Skills-精简"><a href="#7-3-Skills-精简" class="headerlink" title="7.3 Skills 精简"></a>7.3 Skills 精简</h3><p>Skills 目录容易积累大量从未使用的技能，定期精简可减少维护负担。</p><p><strong>精简标准</strong>（个人经验）：</p><ul><li>优先保留正在使用的 skill（如 <code>github-pr-workflow</code>、<code>hexo-blog-post</code>）</li><li>删除空目录（仅含 <code>DESCRIPTION.md</code> 无实际内容）</li><li>删除与当前配置不符的 skill（如无 Modal GPU 需求则删 <code>modal-serverless-gpu</code>）</li><li>保留视频&#x2F;音频相关 skill（若业务需要）</li></ul><p><strong>实际清理结果</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">删除空目录：diagramming/、domain/、email/、feeds/、gaming/、gifs/、inference-sh/、smart-home/、social-media/、note-taking/</span><br><span class="line">删除冗余 skill：modal-serverless-gpu、obliteratus、popular-web-designs</span><br><span class="line">Skills 总数：114 → 约 105 个</span><br></pre></td></tr></table></figure><h3 id="7-4-配置精简"><a href="#7-4-配置精简" class="headerlink" title="7.4 配置精简"></a>7.4 配置精简</h3><p>config.yaml 也会积累无效配置项，定期清理效果显著。</p><p><strong>实际清理数据</strong>：</p><ul><li>初始行数：420 行</li><li>清理后：约 391 行（减少约 30 行）</li></ul><p><strong>删除项</strong>：</p><ul><li>空平台工具集引用：telegram、discord、whatsapp、slack、signal、homeassistant</li><li>空配置对象：<code>honcho: {}</code>、<code>quick_commands: {}</code>、<code>personalities: {}</code></li><li>重复的 <code>delegation</code> 块（patch 错误引入）</li></ul><h3 id="7-5-验证流程"><a href="#7-5-验证流程" class="headerlink" title="7.5 验证流程"></a>7.5 验证流程</h3><p>清理完成后，按以下顺序验证：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. 检查配置语法</span></span><br><span class="line">hermes doctor --fix</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 确认配置生效</span></span><br><span class="line">hermes config show</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. 重启网关</span></span><br><span class="line">hermes gateway restart</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4. 验证核心功能</span></span><br><span class="line">hermes doctor</span><br></pre></td></tr></table></figure><blockquote><p><strong>注意</strong>：修改 <code>config.yaml</code> 后必须先运行 <code>hermes doctor --fix</code> 自动修复错误配置，最后再重启网关。</p></blockquote><h2 id="八、推荐的工作流"><a href="#八、推荐的工作流" class="headerlink" title="八、推荐的工作流"></a>八、推荐的工作流</h2><ol><li>配置修改前先备份：<code>cp config.yaml config.yaml.backup_日期</code></li><li>用 <code>hermes doctor</code> 验证修改结果</li><li>用 <code>hermes config show</code> 确认配置生效</li><li>最后 <code>hermes gateway restart</code></li><li>重要决策（如删除 provider、修改认证逻辑）记录到记忆文件</li></ol><h2 id="九、使用技巧"><a href="#九、使用技巧" class="headerlink" title="九、使用技巧"></a>九、使用技巧</h2><p>来自官方文档的实践建议：</p><ul><li><strong>明确表达需求</strong>：给出具体上下文（文件路径、错误信息、期望行为），减少来回次数</li><li><strong>前置上下文</strong>：一次性提供所有相关信息，胜过多次补充</li><li><strong>用 Context Files</strong>：重复出现的指令（如”use tabs not spaces”）写入 <code>AGENTS.md</code>，Agent 自动读取</li><li><strong>交给 Agent 探索</strong>：说”修复失败的测试”而非”打开 tests&#x2F;test_foo.py 第 42 行然后…”</li><li><strong>优先用 Skill</strong>：复杂流程先查 <code>/skills</code>，再决定是否自己写提示词</li><li><strong>Cron 自动化重复任务</strong>：新闻简报、定时提醒、数据采集等场景优先考虑</li></ul>]]>
    </content>
    <id>https://haies.cn/hermes-daily-management/</id>
    <link href="https://haies.cn/hermes-daily-management/"/>
    <published>2026-05-02T14:10:00.000Z</published>
    <summary>Hermes AI 助手日常管理经验总结：配置管理、任务编排与常见问题处理。</summary>
    <title>Hermes AI 助手日常管理经验总结</title>
    <updated>2026-10-21T02:31:08.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="笔记" scheme="https://haies.cn/categories/note/"/>
    <category term="技术栈" scheme="https://haies.cn/tags/stack/"/>
    <category term="AI" scheme="https://haies.cn/tags/ai/"/>
    <category term="教程" scheme="https://haies.cn/tags/manual/"/>
    <content>
      <![CDATA[<p>日常使用大模型聊天、问答、生成内容时，背后藏着一套完整固定的数据流转逻辑。本文将分词器、词嵌入、隐藏向量、Transformer架构、Prefill预填充、模型层数、维度、参数量等核心知识点串联汇总，用通俗逻辑结合运算关系拆解底层原理，搭建完整的大模型基础认知体系。</p><h2 id="一、核心基础名词概念汇总"><a href="#一、核心基础名词概念汇总" class="headerlink" title="一、核心基础名词概念汇总"></a>一、核心基础名词概念汇总</h2><h3 id="Tokenizer-分词器"><a href="#Tokenizer-分词器" class="headerlink" title="Tokenizer 分词器"></a>Tokenizer 分词器</h3><p>大模型文本处理的第一道入口，模型无法直接识别完整语句，需要按照内置词典规则，将文本切割为最小处理单元。拆分单元可以是单字、词语、子词或是标点符号，只有完成分词得到单元序列，才能开展后续向量化计算。</p><h3 id="Token"><a href="#Token" class="headerlink" title="Token"></a>Token</h3><p>文本经过分词处理后得到的最小语义单元，每一个单元都会被分配专属数字编号。编号本身不承载语义，仅作为唯一身份标识。日常统计上下文长度、计算调用计费，均以Token作为统计单位。</p><h3 id="Embedding-词嵌入"><a href="#Embedding-词嵌入" class="headerlink" title="Embedding 词嵌入"></a>Embedding 词嵌入</h3><p>将离散的文字单元，转化为计算机可识别运算的多维数字向量的过程。语义含义相近的内容，转化后的向量数值分布也会更加贴合；语义差异较大的内容，向量数值距离会明显拉开。在主流原生大模型中，词嵌入输出的向量维度，和模型内部隐藏维度保持一致。</p><h3 id="向量、隐藏向量、中间状态向量"><a href="#向量、隐藏向量、中间状态向量" class="headerlink" title="向量、隐藏向量、中间状态向量"></a>向量、隐藏向量、中间状态向量</h3><p>向量是有序数字组成的数组，是模型唯一的运算数据形式。</p><p>隐藏向量指代经过词嵌入转换后，在网络内部流转计算的向量数据，这类数据无法被人类直接解读，仅用于特征运算处理，不会直接对外输出。</p><p>中间状态向量是向量经过单层网络权重运算、特征变换后产出的阶段性数据，记录当前层级提炼后的语义信息，会持续传递至下一层网络参与计算。</p><h3 id="Transformer-变换器"><a href="#Transformer-变换器" class="headerlink" title="Transformer 变换器"></a>Transformer 变换器</h3><p>当下绝大多数主流大模型的核心神经网络架构，常见的通用大模型均基于该结构研发搭建。整体由多组结构一致的模块堆叠构成，依靠自注意力机制捕捉语句上下文关联关系，搭配前馈网络结构，完成语义理解、逻辑推导与文本生成工作。</p><h3 id="Prefill-预填充阶段"><a href="#Prefill-预填充阶段" class="headerlink" title="Prefill 预填充阶段"></a>Prefill 预填充阶段</h3><p>用户提交完整提问内容后，模型一次性对整段输入内容执行分词、词嵌入、编码运算的全过程。该流程仅执行一次，运算结束后会留存上下文状态信息，后续逐字生成回复时不会重复运算，是提升模型推理响应速度的关键环节。</p><h3 id="模型隐藏维度"><a href="#模型隐藏维度" class="headerlink" title="模型隐藏维度"></a>模型隐藏维度</h3><p>单个向量包含的数字数量，也是模型全程运算统一的标准尺寸。网络内所有权重矩阵规格、向量传输、矩阵运算，都以该维度为基准，同一模型的向量维度固定不变。</p><h3 id="模型层数"><a href="#模型层数" class="headerlink" title="模型层数"></a>模型层数</h3><p>指代模型内部堆叠的Transformer模块数量，行业标注的32层、96层模型，对应数量的模块层层叠加，层数越高代表网络结构越深。</p><h3 id="模型参数量"><a href="#模型参数量" class="headerlink" title="模型参数量"></a>模型参数量</h3><p>网络中所有可学习权重矩阵、偏置参数的总和，涵盖词嵌入层参数以及每一层Transformer模块的全部权重数据。参数量的规模大小，直接决定模型的知识储备上限与语义理解能力。</p><h3 id="词库"><a href="#词库" class="headerlink" title="词库"></a>词库</h3><p>分词器对应的检索词典容量，决定模型能够识别的文字单元范围，常见词典规模分为三万、五万、十万、十五万词元等不同规格。</p><h2 id="二、完整数据流转链路"><a href="#二、完整数据流转链路" class="headerlink" title="二、完整数据流转链路"></a>二、完整数据流转链路</h2><p>自然语言文本 → 分词拆分得到基础单元 → 词嵌入转换为标准维度向量</p><p>→ 整段向量进入预填充环节完成全局编码</p><p>→ 向量送入多层堆叠的Transformer网络</p><p>→ 依托权重矩阵完成注意力计算与特征提取，逐层生成中间状态向量</p><p>→ 复用已编码的上下文信息，逐个生成新文本单元</p><p>→ 最终转换为自然语言输出回复内容</p><h2 id="三、关键模块运算逻辑详解"><a href="#三、关键模块运算逻辑详解" class="headerlink" title="三、关键模块运算逻辑详解"></a>三、关键模块运算逻辑详解</h2><h3 id="3-1-维度匹配基本原则"><a href="#3-1-维度匹配基本原则" class="headerlink" title="3.1 维度匹配基本原则"></a>3.1 维度匹配基本原则</h3><p>矩阵乘法有着固定运算规则，前序矩阵的列数必须和后序矩阵的行数相等，否则无法完成计算。词嵌入产出的向量维度，必须与Transformer内部所有权重矩阵的输入维度严格匹配。</p><p>常规模型设计中，嵌入维度等同于模型隐藏维度，天然适配网络运算规格；若使用外部向量数据，或是自定义特殊结构模型出现维度不一致时，需要增设投影层完成维度对齐转换。</p><h3 id="3-2-Transformer结构与权重矩阵"><a href="#3-2-Transformer结构与权重矩阵" class="headerlink" title="3.2 Transformer结构与权重矩阵"></a>3.2 Transformer结构与权重矩阵</h3><p>单层Transformer模块并不是单一的二维权重矩阵，而是由多组可学习权重搭配固定运算组合而成，核心权重分为两大板块：</p><p>多头注意力模块包含查询权重、键值权重、取值权重、输出融合权重，各组矩阵规格统一；</p><p>前馈网络模块包含升维权重矩阵与降维权重矩阵。</p><p>模型训练习得的语言规则、常识知识都存储在权重矩阵当中，向量与矩阵开展乘法运算，即可实现文本语义特征的提取与优化。</p><h3 id="3-3-向量与矩阵运算实例"><a href="#3-3-向量与矩阵运算实例" class="headerlink" title="3.3 向量与矩阵运算实例"></a>3.3 向量与矩阵运算实例</h3><p>设定简易运算条件：隐藏维度为4，采用单层Transformer模块，输入语句为<code>猫 吃鱼</code>，分词后得到两个文本单元，采用单头注意力简化运算演示。</p><h4 id="初始向量生成"><a href="#初始向量生成" class="headerlink" title="初始向量生成"></a>初始向量生成</h4><p>通过词嵌入查表，获取两个四维向量，组合形成输入矩阵：</p><p><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -0.452ex;" xmlns="http://www.w3.org/2000/svg" width="39.367ex" height="2.149ex" role="img" focusable="false" viewBox="0 -750 17400 950"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="X=\begin{bmatrix}1 &amp; 2 &amp; 3 &amp; 4 \\2 &amp; 1 &amp; 4 &amp; 3\end{bmatrix}"><g data-mml-node="merror" data-mjx-error="Unknown environment 'bmatrix'"><rect data-background="true" width="17400" height="950" y="-200"></rect><g data-mml-node="mtext" style="font-family: serif;"><text data-variant="-explicitFont" transform="scale(1,-1)" font-size="884px">Unknown environment 'bmatrix'</text></g></g></g></g></svg></mjx-container></p><p>矩阵格式对应：2个文本单元，每个单元对应4维向量数据。</p><h4 id="多头自注意力矩阵运算"><a href="#多头自注意力矩阵运算" class="headerlink" title="多头自注意力矩阵运算"></a>多头自注意力矩阵运算</h4><p>设置简易对角权重矩阵：</p><p><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -0.452ex;" xmlns="http://www.w3.org/2000/svg" width="39.367ex" height="2.149ex" role="img" focusable="false" viewBox="0 -750 17400 950"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="W_Q=W_K=W_V=\begin{bmatrix}0.1 &amp; 0 &amp; 0 &amp; 0 \\0 &amp; 0.2 &amp; 0 &amp; 0 \\0 &amp; 0 &amp; 0.3 &amp; 0 \\0 &amp; 0 &amp; 0 &amp; 0.4\end{bmatrix}"><g data-mml-node="merror" data-mjx-error="Unknown environment 'bmatrix'"><rect data-background="true" width="17400" height="950" y="-200"></rect><g data-mml-node="mtext" style="font-family: serif;"><text data-variant="-explicitFont" transform="scale(1,-1)" font-size="884px">Unknown environment 'bmatrix'</text></g></g></g></g></svg></mjx-container></p><p>通过矩阵乘法运算，生成查询、键值、取值特征向量。以查询向量为例：</p><p><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true" width="full" style="min-width: 21.358ex;"><svg style="vertical-align: -0.608ex; min-width: 21.358ex;" xmlns="http://www.w3.org/2000/svg" width="100%" height="2.347ex" role="img" focusable="false" data-mjx-viewBox="0 -768.6 9440.3 1037.2"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(0.0181,-0.0181) translate(0, -768.6)"><g data-mml-node="math" data-latex="Q = X \cdot W_Q"><g data-mml-node="mtable" data-latex="Q = X \cdot W_Q" transform="translate(2078,0) translate(-2078,0)"><g transform="translate(0 768.6) matrix(1 0 0 -1 0 0) scale(55.25)"><svg data-table="true" preserveAspectRatio="xMidYMid" viewBox="2642.2 -768.6 1 1037.2"><g transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mlabeledtr" transform="translate(0,18.6)"><g data-mml-node="mtd"><g data-mml-node="mi" data-latex="Q"><path data-c="1D444" d="M306-24C335-24 366-19 399-10C396-48 395-72 395-81C395-156 424-194 481-194C542-194 589-145 612-100C637-48 650-14 650 2C650 11 645 16 635 16C628 16 623 12 620 3C605-43 564-90 508-90C457-90 450-49 442 6C526 39 597 96 654 178C711 260 740 345 740 434C740 513 717 577 670 628C623 679 561 705 484 705C431 705 378 692 325 665C217 612 138 528 87 415C62 358 49 302 49 245C49 88 151-24 306-24M645 466C645 405 630 335 600 254C565 161 511 92 436 48C432 70 426 90 418 108C405 138 381 153 346 153C291 153 241 103 241 48C241 39 242 30 244 23C177 54 144 117 144 213C144 255 152 306 169 366C204 493 267 583 358 636C401 660 441 672 478 672C588 672 645 581 645 466M346 123C383 123 402 96 402 43C402 34 399 29 393 27C365 15 338 9 312 9C284 9 270 22 270 48C270 86 308 123 346 123Z"></path></g><g data-mml-node="mo" data-latex="=" transform="translate(1068.8,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mi" data-latex="X" transform="translate(2124.6,0)"><path data-c="1D44B" d="M834 683C817 683 758 680 741 680C721 680 651 683 631 683C616 683 608 675 608 659C608 650 613 645 624 644C648 641 660 633 660 618C660 609 654 598 642 585L486 417C457 485 429 552 400 620C401 622 402 624 405 626C414 636 431 642 455 644C471 646 479 654 479 667C479 678 473 683 460 683C436 683 359 680 335 680C314 680 245 683 224 683C209 683 202 675 202 659C202 649 211 644 229 644C274 644 288 644 300 615L416 342L208 119C205 116 201 112 196 109C155 66 108 42 53 39C36 38 27 29 27 14C30 5 31 0 44 0C61 0 120 3 137 3C158 3 227 0 248 0C263 0 270 8 270 24C270 33 265 38 254 39C230 41 218 50 218 65C218 75 227 89 244 107C306 173 369 239 430 306C464 225 499 145 532 63C531 61 530 59 527 56C518 47 502 42 478 39C463 37 455 29 455 16C455 5 461 0 474 0L599 3C620 3 690 0 708 0C723 0 731 8 731 23C731 33 724 38 709 39C678 39 658 40 651 44C644 48 636 60 628 80L501 383C569 455 620 509 653 546C677 571 693 588 702 595C739 626 780 642 825 644C846 645 851 650 851 669C848 678 847 683 834 683Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(3197.8,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="msub" data-latex="W_Q" transform="translate(3698,0)"><g data-mml-node="mi" data-latex="W"><path data-c="1D44A" d="M956 680C937 680 872 683 853 683C838 683 830 675 830 660C830 650 836 645 848 644C885 643 903 632 903 610C903 604 899 594 891 579L629 125L594 602C590 638 614 644 659 644C680 644 690 652 690 668C690 678 684 683 671 683C649 683 572 680 550 680C531 680 465 683 446 683C431 683 423 675 423 659C423 649 432 644 451 644C482 644 498 637 499 623L505 548L261 125L225 613C222 638 264 644 296 644C313 644 321 652 321 668C321 678 315 683 303 683C281 683 203 680 181 680C162 680 96 683 77 683C62 683 55 675 55 660C55 649 65 644 84 644C126 644 130 642 132 612L177 7C178-12 185-22 197-22C210-20 215-17 223-2C224-1 224 0 224 1L509 494L545 7C546-12 553-22 565-22C575-22 584-15 592-1L918 562C945 611 964 639 1025 644C1043 646 1048 651 1048 668C1048 678 1043 683 1032 683C1018 683 970 680 956 680Z"></path></g><g data-mml-node="mi" transform="translate(977,-150) scale(0.707)" data-latex="Q"><path data-c="1D444" d="M306-24C335-24 366-19 399-10C396-48 395-72 395-81C395-156 424-194 481-194C542-194 589-145 612-100C637-48 650-14 650 2C650 11 645 16 635 16C628 16 623 12 620 3C605-43 564-90 508-90C457-90 450-49 442 6C526 39 597 96 654 178C711 260 740 345 740 434C740 513 717 577 670 628C623 679 561 705 484 705C431 705 378 692 325 665C217 612 138 528 87 415C62 358 49 302 49 245C49 88 151-24 306-24M645 466C645 405 630 335 600 254C565 161 511 92 436 48C432 70 426 90 418 108C405 138 381 153 346 153C291 153 241 103 241 48C241 39 242 30 244 23C177 54 144 117 144 213C144 255 152 306 169 366C204 493 267 583 358 636C401 660 441 672 478 672C588 672 645 581 645 466M346 123C383 123 402 96 402 43C402 34 399 29 393 27C365 15 338 9 312 9C284 9 270 22 270 48C270 86 308 123 346 123Z"></path></g></g></g></g></g></svg><svg data-labels="true" preserveAspectRatio="xMaxYMid" viewBox="1278 -768.6 1 1037.2"><g data-labels="true" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mtd" id="mjx-eqn:1" transform="translate(0,766.6)"><text data-id-align="true"></text><g data-idbox="true" transform="translate(0,-748)"><g data-mml-node="mtext" data-latex="\text{(}"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mtext" data-latex="\text{1}" transform="translate(389,0)"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path></g><g data-mml-node="mtext" data-latex="\text{)}" transform="translate(889,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></g></svg></g></g></g></g></svg></mjx-container></p><p>运算后得到Query矩阵：</p><p><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -0.452ex;" xmlns="http://www.w3.org/2000/svg" width="39.367ex" height="2.149ex" role="img" focusable="false" viewBox="0 -750 17400 950"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="Q=\begin{bmatrix}0.1 &amp; 0.4 &amp; 0.9 &amp; 1.6 \\0.2 &amp; 0.2 &amp; 1.2 &amp; 1.2\end{bmatrix}"><g data-mml-node="merror" data-mjx-error="Unknown environment 'bmatrix'"><rect data-background="true" width="17400" height="950" y="-200"></rect><g data-mml-node="mtext" style="font-family: serif;"><text data-variant="-explicitFont" transform="scale(1,-1)" font-size="884px">Unknown environment 'bmatrix'</text></g></g></g></g></svg></mjx-container></p><p>按照相同逻辑求出 (K、V) 向量，再计算不同Token间语义相似度，加权融合后得到注意力输出特征。该环节作用：让语句内不同字词互相感知上下文关联，把语义关系融入特征向量当中。</p><h4 id="前馈网络特征变换"><a href="#前馈网络特征变换" class="headerlink" title="前馈网络特征变换"></a>前馈网络特征变换</h4><p>遵循四倍维度扩张的通用规则，配置4×16升维矩阵与16×4降维矩阵。向量先与升维权重相乘拓展维度，挖掘深层语义特征；经过非线性函数筛选无效信息后，再通过降维权重压缩维度，回归标准四维规格，得到加工完成的中间特征状态：</p><p><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -0.452ex;" xmlns="http://www.w3.org/2000/svg" width="54.299ex" height="2.149ex" role="img" focusable="false" viewBox="0 -750 24000 950"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="\operatorname{FFN_State}=\begin{bmatrix}0.5 &amp; 1.2 &amp; 2.1 &amp; 3.3 \\0.8 &amp; 0.6 &amp; 2.5 &amp; 2.2\end{bmatrix}"><g data-mml-node="merror" data-mjx-error="Undefined control sequence \operatorname"><rect data-background="true" width="24000" height="950" y="-200"></rect><g data-mml-node="mtext" style="font-family: serif;"><text data-variant="-explicitFont" transform="scale(1,-1)" font-size="884px">Undefined control sequence \operatorname</text></g></g></g></g></svg></mjx-container></p><p>该环节作用：独立对单个文本单元做语义深化，丰富特征表达细节。</p><h4 id="残差连接：原始向量与变换特征融合"><a href="#残差连接：原始向量与变换特征融合" class="headerlink" title="残差连接：原始向量与变换特征融合"></a>残差连接：原始向量与变换特征融合</h4><p>将模块初始输入向量 (X)，和网络加工后的 (\operatorname{FFN_State}) 逐位置元素相加，完成残差融合：</p><p><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -0.452ex;" xmlns="http://www.w3.org/2000/svg" width="54.299ex" height="2.149ex" role="img" focusable="false" viewBox="0 -750 24000 950"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="H = X + \operatorname{FFN_State}"><g data-mml-node="merror" data-mjx-error="Undefined control sequence \operatorname"><rect data-background="true" width="24000" height="950" y="-200"></rect><g data-mml-node="mtext" style="font-family: serif;"><text data-variant="-explicitFont" transform="scale(1,-1)" font-size="884px">Undefined control sequence \operatorname</text></g></g></g></g></svg></mjx-container></p><p><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -0.452ex;" xmlns="http://www.w3.org/2000/svg" width="39.367ex" height="2.149ex" role="img" focusable="false" viewBox="0 -750 17400 950"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="H=\begin{bmatrix}1.5 &amp; 3.2 &amp; 5.1 &amp; 7.3 \\2.8 &amp; 1.6 &amp; 6.5 &amp; 5.2\end{bmatrix}"><g data-mml-node="merror" data-mjx-error="Unknown environment 'bmatrix'"><rect data-background="true" width="17400" height="950" y="-200"></rect><g data-mml-node="mtext" style="font-family: serif;"><text data-variant="-explicitFont" transform="scale(1,-1)" font-size="884px">Unknown environment 'bmatrix'</text></g></g></g></g></svg></mjx-container></p><p>残差连接核心价值：保留文本基础原始含义，叠加模型挖掘的深层语义；同时打通跨层信息传递通道，缓解多层网络训练时的梯度消失问题，避免信息损耗丢失。</p><h4 id="层归一化处理"><a href="#层归一化处理" class="headerlink" title="层归一化处理"></a>层归一化处理</h4><p>对融合后的特征矩阵做数值规整收敛，统一数据分布区间，计算公式如下：</p><p><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -0.452ex;" xmlns="http://www.w3.org/2000/svg" width="54.299ex" height="2.149ex" role="img" focusable="false" viewBox="0 -750 24000 950"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="\operatorname{LayerNorm}(h_i) = \gamma \cdot \frac{h_i - \mu}{\sqrt{\sigma^2+\varepsilon}} + \beta"><g data-mml-node="merror" data-mjx-error="Undefined control sequence \operatorname"><rect data-background="true" width="24000" height="950" y="-200"></rect><g data-mml-node="mtext" style="font-family: serif;"><text data-variant="-explicitFont" transform="scale(1,-1)" font-size="884px">Undefined control sequence \operatorname</text></g></g></g></g></svg></mjx-container></p><p>式中：</p><ul><li>(h_i)：向量内单个特征数值</li><li>(\mu)：单条向量元素平均值</li><li>(\sigma^2)：单条向量元素方差</li><li>(\varepsilon)：极小常数，规避分母为0运算错误</li><li>(\gamma、\beta)：模型可学习缩放与偏移参数</li></ul><p>最终输出单层模块计算结果：</p><p><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true"><svg style="vertical-align: -0.452ex;" xmlns="http://www.w3.org/2000/svg" width="54.299ex" height="2.149ex" role="img" focusable="false" viewBox="0 -750 24000 950"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="Out=\operatorname{LayerNorm}(H)"><g data-mml-node="merror" data-mjx-error="Undefined control sequence \operatorname"><rect data-background="true" width="24000" height="950" y="-200"></rect><g data-mml-node="mtext" style="font-family: serif;"><text data-variant="-explicitFont" transform="scale(1,-1)" font-size="884px">Undefined control sequence \operatorname</text></g></g></g></g></svg></mjx-container></p><p>归一化作用：约束特征数值大小，避免数值偏移失控，保障多层网络连续运算稳定可靠。</p><h4 id="多层网络流转逻辑"><a href="#多层网络流转逻辑" class="headerlink" title="多层网络流转逻辑"></a>多层网络流转逻辑</h4><p>多层模块堆叠运行时，上一层输出的中间状态向量直接进入下一层重复整套运算流程。每一层都会不断更新向量内部数值，循序渐进加深模型对文本内容的理解程度。</p><h3 id="3-4-常见认知误区"><a href="#3-4-常见认知误区" class="headerlink" title="3.4 常见认知误区"></a>3.4 常见认知误区</h3><p>一层Transformer无法等同于单个权重矩阵，它是集合注意力机制、前馈网络、归一化、残差结构的完整子网络，内部包含多组不同规格的权重矩阵；</p><p>模型层数对应模块堆叠数量，层数越多网络深度越高；</p><p>中间状态向量是层级运算的产物，全程保持固定维度，仅内部特征数据发生变化。</p><h2 id="四、维度、层数、结构与参数量的关联关系"><a href="#四、维度、层数、结构与参数量的关联关系" class="headerlink" title="四、维度、层数、结构与参数量的关联关系"></a>四、维度、层数、结构与参数量的关联关系</h2><p>参数量是评判模型规模的核心指标，整体数值由Transformer结构设计、隐藏维度大小、模块堆叠层数共同决定，参数本质就是网络内所有可训练权重与偏置数据。</p><h3 id="基础参数符号"><a href="#基础参数符号" class="headerlink" title="基础参数符号"></a>基础参数符号</h3><p><mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="1.176ex" height="1.595ex" role="img" focusable="false" viewBox="0 -694 520 705"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="d"><g data-mml-node="mi" data-latex="d"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g></svg></mjx-container>：模型隐藏维度，统一的运算标准尺寸</p><p><mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="1.541ex" height="1.548ex" role="img" focusable="false" viewBox="0 -684 681 684"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="L"><g data-mml-node="mi" data-latex="L"><path data-c="1D43F" d="M520 667C520 678 513 683 500 683L354 680L223 683C208 684 200 676 200 659C200 652 203 647 209 646C218 645 226 644 231 644C262 643 279 641 284 640C289 639 292 636 292 631C292 629 291 623 288 613L156 82C150 60 140 47 125 42C119 40 101 39 70 39C49 39 39 31 39 15C39 5 49 0 70 0L527 0C552 0 554 0 561 19L639 233C642 240 643 245 643 248C643 258 638 263 627 263C617 263 612 254 607 240C588 191 570 154 555 131C518 75 455 39 363 39L270 39C259 39 252 39 249 40C242 40 239 42 239 45C239 47 241 54 244 67L377 601C383 624 396 637 415 642C421 643 442 644 478 644C506 644 520 644 520 667Z"></path></g></g></g></svg></mjx-container>：Transformer模块堆叠层数</p><p><mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.667ex;" xmlns="http://www.w3.org/2000/svg" width="3.13ex" height="2.237ex" role="img" focusable="false" viewBox="0 -694 1383.6 989"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="d_{ff}"><g data-mml-node="msub" data-latex="d_{ff}"><g data-mml-node="mi" data-latex="d"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g><g data-mml-node="TeXAtom" transform="translate(553,-150) scale(0.707)" data-latex="{f f}" data-mjx-texclass="ORD"><g data-mml-node="mi" data-latex="f"><path data-c="1D453" d="M552 633C552 677 509 705 462 705C400 705 357 665 334 586C329 568 318 517 302 433L237 433C215 433 204 432 204 411C204 400 214 395 235 395L295 395L222 8C211-49 201-91 192-119C180-156 163-175 141-175C126-175 114-171 103-164C135-159 151-140 151-108C151-82 138-69 111-69C77-69 53-99 53-133C53-177 94-205 141-205C166-205 189-195 208-174C240-141 265-94 283-31C294 8 304 46 311 84L369 395L451 395C474 395 484 396 484 419C484 428 474 433 454 433L377 433C383 474 411 625 420 644C430 665 444 675 462 675C477 675 490 671 501 664C470 657 454 639 454 608C454 582 467 569 494 569C528 569 552 599 552 633Z"></path></g><g data-mml-node="mi" data-latex="f" transform="translate(552,0)"><path data-c="1D453" d="M552 633C552 677 509 705 462 705C400 705 357 665 334 586C329 568 318 517 302 433L237 433C215 433 204 432 204 411C204 400 214 395 235 395L295 395L222 8C211-49 201-91 192-119C180-156 163-175 141-175C126-175 114-171 103-164C135-159 151-140 151-108C151-82 138-69 111-69C77-69 53-99 53-133C53-177 94-205 141-205C166-205 189-195 208-174C240-141 265-94 283-31C294 8 304 46 311 84L369 395L451 395C474 395 484 396 484 419C484 428 474 433 454 433L377 433C383 474 411 625 420 644C430 665 444 675 462 675C477 675 490 671 501 664C470 657 454 639 454 608C454 582 467 569 494 569C528 569 552 599 552 633Z"></path></g></g></g></g></g></svg></mjx-container>：前馈网络扩张维度，常规采用四倍扩张设计</p><h3 id="单层模块参数量计算"><a href="#单层模块参数量计算" class="headerlink" title="单层模块参数量计算"></a>单层模块参数量计算</h3><p>注意力板块包含四组同规格方阵，参数总量为<mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.025ex;" xmlns="http://www.w3.org/2000/svg" width="3.295ex" height="1.912ex" role="img" focusable="false" viewBox="0 -833.9 1456.6 844.9"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="4d^2"><g data-mml-node="mn" data-latex="4"><path data-c="34" d="M353 677C344 677 336 672 330 663L28 199L28 163L289 163L289 81C289 63 285 51 278 46C271 41 252 39 219 39L194 39L194 0C223 2 269 3 331 3C393 3 439 2 468 0L468 39L443 39C410 39 391 41 384 46C377 51 373 63 373 81L373 163L471 163L471 202L373 202L373 660C373 670 366 677 353 677M295 553L295 202L67 202Z"></path></g><g data-mml-node="msup" data-latex="d^2" transform="translate(500,0)"><g data-mml-node="mi" data-latex="d"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g><g data-mml-node="mn" transform="translate(553,363) scale(0.707)" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g></g></g></svg></mjx-container>；</p><p>前馈网络两组权重矩阵，参数总量为<mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.05ex;" xmlns="http://www.w3.org/2000/svg" width="3.295ex" height="1.937ex" role="img" focusable="false" viewBox="0 -833.9 1456.6 855.9"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="8d^2"><g data-mml-node="mn" data-latex="8"><path data-c="38" d="M250 666C201 666 158 650 122 618C86 586 68 546 68 497C68 456 83 419 113 386C120 378 142 361 179 335C88 288 42 227 42 153C42 100 64 57 107 24C147-7 194-22 249-22C305-22 354-4 395 32C436 68 457 115 457 170C457 216 441 257 408 294C396 307 365 330 316 361C393 402 431 454 431 515C431 606 344 666 250 666M379 515C379 463 348 418 286 381L167 459C136 479 120 505 120 536C120 596 185 633 249 633C318 633 379 584 379 515M250 14C168 14 99 73 99 153C99 220 136 274 210 315L328 240C376 209 400 174 400 134C400 62 325 14 250 14Z"></path></g><g data-mml-node="msup" data-latex="d^2" transform="translate(500,0)"><g data-mml-node="mi" data-latex="d"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g><g data-mml-node="mn" transform="translate(553,363) scale(0.707)" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g></g></g></svg></mjx-container>。</p><p>单层模块整体核心参数：</p><p><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true" width="full" style="min-width: 34.287ex;"><svg style="vertical-align: -0.768ex; min-width: 34.287ex;" xmlns="http://www.w3.org/2000/svg" width="100%" height="2.667ex" role="img" focusable="false" data-mjx-viewBox="0 -839.4 15154.8 1178.9"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(0.0181,-0.0181) translate(0, -839.4)"><g data-mml-node="math" data-latex="P_{\text{layer}}=4d^2+8d^2=12d^2"><g data-mml-node="mtable" data-latex="P_{\text{layer}}=4d^2 +8d^2 =12d^2" transform="translate(2078,0) translate(-2078,0)"><g transform="translate(0 839.4) matrix(1 0 0 -1 0 0) scale(55.25)"><svg data-table="true" preserveAspectRatio="xMidYMid" viewBox="5499.4 -839.4 1 1178.9"><g transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mlabeledtr" transform="translate(0,-44.5)"><g data-mml-node="mtd"><g data-mml-node="msub" data-latex="P_{\text{layer}}"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g><g data-mml-node="TeXAtom" transform="translate(675,-150) scale(0.707)" data-latex="{\text{layer}}" data-mjx-texclass="ORD"><g data-mml-node="mtext" data-latex="\text{layer}"><path data-c="6C" d="M144 3L255 0L255 39C219 39 197 40 190 44C183 48 180 60 180 79L180 694L33 683L33 645C68 645 90 642 97 636C104 630 108 616 108 593L108 79C108 60 105 48 98 44C91 40 69 39 33 39L33 0Z"></path><path data-c="61" d="M483 91L483 150L451 150L451 91C451 52 440 32 419 32C399 32 387 57 387 77L387 274C387 309 383 335 376 353C352 412 283 448 213 448C136 448 60 405 60 333C60 300 77 283 110 283C143 283 159 299 159 332C159 361 144 378 113 381C135 406 168 419 211 419C273 419 311 362 311 297L311 264C233 259 174 247 133 228C66 197 32 154 32 97C32 71 42 49 61 32C93 3 137-11 193-11C252-11 294 14 320 65C327 27 355-6 398-6C451-6 483 36 483 91M200 18C154 18 116 52 116 98C116 191 213 231 311 236L311 141C311 74 267 18 200 18Z" transform="translate(278,0)"></path><path data-c="79" d="M113-205C168-205 212-167 243-90L416 332C433 372 463 392 508 392L508 431C475 428 449 427 430 428L341 431L341 393C372 392 387 379 387 354C387 348 385 341 381 332L286 98L180 354C177 362 175 368 174 371C174 385 193 392 230 392L230 431L118 428C94 427 61 428 19 431L19 392C72 392 85 394 99 360L246 1L222-55C195-119 176-175 113-175C99-175 87-171 76-164C99-159 110-144 110-120C110-90 95-75 64-75C34-75 19-90 19-121C19-170 64-205 113-205Z" transform="translate(778,0)"></path><path data-c="65" d="M415 251C415 366 348 448 236 448C176 448 126 425 85 378C47 334 28 281 28 220C28 157 49 104 91 58C133 12 185-11 247-11C304-11 348 9 378 48C403 81 415 105 415 121C415 131 409 136 398 136C390 136 385 131 382 120C360 54 317 21 253 21C208 21 173 42 146 85C127 116 118 163 117 227L387 227C409 227 415 229 415 251M326 349C337 316 342 284 342 255L118 255C121 321 138 366 168 389C193 409 215 419 236 419C281 419 311 396 326 349Z" transform="translate(1306,0)"></path><path data-c="72" d="M364 378C364 417 327 442 288 442C237 442 198 412 172 351L172 442L28 431L28 393C63 393 84 390 92 384C100 378 104 365 104 342L104 79C104 60 101 48 94 44C87 40 65 38 28 38L28 0L143 3C185 4 228 3 271 0L271 38L247 38C214 38 193 41 186 46C179 51 176 63 176 81L176 232C176 275 184 314 199 347C219 390 248 412 287 413C277 403 272 391 272 377C272 346 287 331 318 331C345 331 364 352 364 378Z" transform="translate(1750,0)"></path></g></g></g><g data-mml-node="mo" data-latex="=" transform="translate(2517.4,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mn" data-latex="4" transform="translate(3573.2,0)"><path data-c="34" d="M353 677C344 677 336 672 330 663L28 199L28 163L289 163L289 81C289 63 285 51 278 46C271 41 252 39 219 39L194 39L194 0C223 2 269 3 331 3C393 3 439 2 468 0L468 39L443 39C410 39 391 41 384 46C377 51 373 63 373 81L373 163L471 163L471 202L373 202L373 660C373 670 366 677 353 677M295 553L295 202L67 202Z"></path></g><g data-mml-node="msup" data-latex="d^2" transform="translate(4073.2,0)"><g data-mml-node="mi" data-latex="d"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g><g data-mml-node="mn" transform="translate(553,413) scale(0.707)" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g><g data-mml-node="mo" data-latex="+" transform="translate(5252,0)"><path data-c="2B" d="M698 274L413 274L413 559C413 575 405 583 389 583C373 583 365 575 365 559L365 274L80 274C64 274 56 266 56 250C56 234 64 226 80 226L365 226L365-59C365-75 373-83 389-83C405-83 413-75 413-59L413 226L698 226C714 226 722 234 722 250C722 263 711 274 698 274Z"></path></g><g data-mml-node="mn" data-latex="8" transform="translate(6252.2,0)"><path data-c="38" d="M250 666C201 666 158 650 122 618C86 586 68 546 68 497C68 456 83 419 113 386C120 378 142 361 179 335C88 288 42 227 42 153C42 100 64 57 107 24C147-7 194-22 249-22C305-22 354-4 395 32C436 68 457 115 457 170C457 216 441 257 408 294C396 307 365 330 316 361C393 402 431 454 431 515C431 606 344 666 250 666M379 515C379 463 348 418 286 381L167 459C136 479 120 505 120 536C120 596 185 633 249 633C318 633 379 584 379 515M250 14C168 14 99 73 99 153C99 220 136 274 210 315L328 240C376 209 400 174 400 134C400 62 325 14 250 14Z"></path></g><g data-mml-node="msup" data-latex="d^2" transform="translate(6752.2,0)"><g data-mml-node="mi" data-latex="d"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g><g data-mml-node="mn" transform="translate(553,413) scale(0.707)" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g><g data-mml-node="mo" data-latex="=" transform="translate(7986.5,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mn" data-latex="12" transform="translate(9042.3,0)"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z" transform="translate(500,0)"></path></g><g data-mml-node="msup" data-latex="d^2" transform="translate(10042.3,0)"><g data-mml-node="mi" data-latex="d"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g><g data-mml-node="mn" transform="translate(553,413) scale(0.707)" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g></g></g></g></svg><svg data-labels="true" preserveAspectRatio="xMaxYMid" viewBox="1278 -839.4 1 1178.9"><g data-labels="true" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mtd" id="mjx-eqn:2" transform="translate(0,703.5)"><text data-id-align="true"></text><g data-idbox="true" transform="translate(0,-748)"><g data-mml-node="mtext" data-latex="\text{(}"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mtext" data-latex="\text{2}" transform="translate(389,0)"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g><g data-mml-node="mtext" data-latex="\text{)}" transform="translate(889,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></g></svg></g></g></g></g></svg></mjx-container></p><p>单层参数规模远大于单纯的维度相乘结果，由多组矩阵共同构成。</p><h3 id="多层模块总参数量"><a href="#多层模块总参数量" class="headerlink" title="多层模块总参数量"></a>多层模块总参数量</h3><p>按照层数线性累加单层参数，全部模块参数总和：</p><p><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true" width="full" style="min-width: 26.362ex;"><svg style="vertical-align: -0.717ex; min-width: 26.362ex;" xmlns="http://www.w3.org/2000/svg" width="100%" height="2.565ex" role="img" focusable="false" data-mjx-viewBox="0 -817 11652.1 1133.9"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(0.0181,-0.0181) translate(0, -817)"><g data-mml-node="math" data-latex="P_{\text{trans}}=L \times 12d^2"><g data-mml-node="mtable" data-latex="P_{\text{trans}}=L \times 12d^2" transform="translate(2078,0) translate(-2078,0)"><g transform="translate(0 817) matrix(1 0 0 -1 0 0) scale(55.25)"><svg data-table="true" preserveAspectRatio="xMidYMid" viewBox="3748.1 -817 1 1133.9"><g transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mlabeledtr" transform="translate(0,-67)"><g data-mml-node="mtd"><g data-mml-node="msub" data-latex="P_{\text{trans}}"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g><g data-mml-node="TeXAtom" transform="translate(675,-150) scale(0.707)" data-latex="{\text{trans}}" data-mjx-texclass="ORD"><g data-mml-node="mtext" data-latex="\text{trans}"><path data-c="74" d="M332 126L332 186L300 186L300 128C300 78 282 22 238 22C197 22 177 56 177 124L177 395L316 395L316 433L177 433L177 615L145 615C144 582 141 553 134 527C117 461 78 427 19 424L19 395L102 395L102 126C102 67 120 29 155 10C182-4 207-11 232-11C298-11 332 55 332 126Z"></path><path data-c="72" d="M364 378C364 417 327 442 288 442C237 442 198 412 172 351L172 442L28 431L28 393C63 393 84 390 92 384C100 378 104 365 104 342L104 79C104 60 101 48 94 44C87 40 65 38 28 38L28 0L143 3C185 4 228 3 271 0L271 38L247 38C214 38 193 41 186 46C179 51 176 63 176 81L176 232C176 275 184 314 199 347C219 390 248 412 287 413C277 403 272 391 272 377C272 346 287 331 318 331C345 331 364 352 364 378Z" transform="translate(389,0)"></path><path data-c="61" d="M483 91L483 150L451 150L451 91C451 52 440 32 419 32C399 32 387 57 387 77L387 274C387 309 383 335 376 353C352 412 283 448 213 448C136 448 60 405 60 333C60 300 77 283 110 283C143 283 159 299 159 332C159 361 144 378 113 381C135 406 168 419 211 419C273 419 311 362 311 297L311 264C233 259 174 247 133 228C66 197 32 154 32 97C32 71 42 49 61 32C93 3 137-11 193-11C252-11 294 14 320 65C327 27 355-6 398-6C451-6 483 36 483 91M200 18C154 18 116 52 116 98C116 191 213 231 311 236L311 141C311 74 267 18 200 18Z" transform="translate(781,0)"></path><path data-c="6E" d="M314 413C359 413 382 378 382 307L382 79C382 60 379 48 372 44C365 40 343 38 306 38L306 0L421 3L535 0L535 38C503 38 482 39 472 42C462 45 458 52 458 64L458 251C458 298 457 331 454 350C444 411 399 442 320 442C257 442 210 412 179 352L179 442L32 431L32 393C68 393 90 390 98 384C106 378 109 365 109 342L109 79C109 60 105 48 98 44C91 40 69 38 32 38L32 0L147 3L261 0L261 38C224 38 203 40 196 44C189 48 185 60 185 79L185 259C185 340 236 413 314 413Z" transform="translate(1281,0)"></path><path data-c="73" d="M360 130C360 206 308 254 205 274C158 283 128 294 112 305C96 316 88 332 88 351C88 398 123 421 193 421C261 421 298 383 303 306C304 298 309 294 319 294C330 294 336 303 336 321L336 420C336 439 331 448 321 448C310 448 295 430 285 422C260 439 229 448 193 448C104 448 33 408 33 323C33 289 47 260 76 237C111 208 144 202 207 191C272 178 305 149 305 104C305 47 270 18 199 18C130 18 86 64 67 155C64 168 59 175 50 175C39 175 33 165 33 146L33 17C33-2 38-11 48-11C51-11 56-8 64-1C82 15 74 12 92 30C121 3 157-11 199-11C294-11 360 38 360 130Z" transform="translate(1837,0)"></path></g></g></g><g data-mml-node="mo" data-latex="=" transform="translate(2580.3,0)"><path data-c="3D" d="M698 367L80 367C64 367 56 359 56 344C56 329 64 321 80 321L698 321C714 321 722 329 722 344C722 356 711 367 698 367M698 179L80 179C64 179 56 171 56 156C56 141 64 133 80 133L698 133C714 133 722 141 722 156C722 169 711 179 698 179Z"></path></g><g data-mml-node="mi" data-latex="L" transform="translate(3636.1,0)"><path data-c="1D43F" d="M520 667C520 678 513 683 500 683L354 680L223 683C208 684 200 676 200 659C200 652 203 647 209 646C218 645 226 644 231 644C262 643 279 641 284 640C289 639 292 636 292 631C292 629 291 623 288 613L156 82C150 60 140 47 125 42C119 40 101 39 70 39C49 39 39 31 39 15C39 5 49 0 70 0L527 0C552 0 554 0 561 19L639 233C642 240 643 245 643 248C643 258 638 263 627 263C617 263 612 254 607 240C588 191 570 154 555 131C518 75 455 39 363 39L270 39C259 39 252 39 249 40C242 40 239 42 239 45C239 47 241 54 244 67L377 601C383 624 396 637 415 642C421 643 442 644 478 644C506 644 520 644 520 667Z"></path></g><g data-mml-node="mo" data-latex="\times" transform="translate(4539.3,0)"><path data-c="D7" d="M630 32C630 39 628 44 623 49L422 250L623 451C628 456 630 461 630 468C630 481 620 491 607 491C600 491 595 489 590 484L389 283L188 484C183 489 178 491 171 491C158 491 148 481 148 468C148 461 150 456 155 451L356 250L155 49C150 44 148 39 148 32C148 19 158 9 171 9C178 9 183 11 188 16L389 217L590 16C595 11 600 9 607 9C620 9 630 19 630 32Z"></path></g><g data-mml-node="mn" data-latex="12" transform="translate(5539.6,0)"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z" transform="translate(500,0)"></path></g><g data-mml-node="msup" data-latex="d^2" transform="translate(6539.6,0)"><g data-mml-node="mi" data-latex="d"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g><g data-mml-node="mn" transform="translate(553,413) scale(0.707)" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g></g></g></g></svg><svg data-labels="true" preserveAspectRatio="xMaxYMid" viewBox="1278 -817 1 1133.9"><g data-labels="true" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mtd" id="mjx-eqn:3" transform="translate(0,681)"><text data-id-align="true"></text><g data-idbox="true" transform="translate(0,-748)"><g data-mml-node="mtext" data-latex="\text{(}"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mtext" data-latex="\text{3}" transform="translate(389,0)"><path data-c="33" d="M303 353C369 378 431 441 431 526C431 569 410 604 369 631C333 654 292 666 246 666C201 666 162 654 127 631C88 605 68 571 68 528C68 495 90 472 122 472C154 472 176 495 176 527C176 560 157 578 119 580C145 615 186 633 242 633C302 633 332 598 332 527C332 485 324 450 309 421C282 373 245 364 183 364C171 362 165 357 165 348C165 333 172 333 192 333L235 333C310 333 348 280 348 173C348 88 317 14 241 14C176 14 128 36 99 80C134 79 160 105 160 139C160 173 135 198 101 198C62 198 42 178 42 137C42 88 64 49 108 18C147-9 193-22 244-22C301-22 350-3 393 34C436 71 457 117 457 173C457 267 383 332 303 353Z"></path></g><g data-mml-node="mtext" data-latex="\text{)}" transform="translate(889,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></g></svg></g></g></g></g></svg></mjx-container></p><h3 id="模型整体参数量"><a href="#模型整体参数量" class="headerlink" title="模型整体参数量"></a>模型整体参数量</h3><p>结合词嵌入层权重数据，常规模型输出层权重与嵌入权重共用，不重复统计，整体参数公式：</p><p><mjx-container class="MathJax" jax="SVG" overflow="overflow" display="true" width="full" style="min-width: 30.624ex;"><svg style="vertical-align: -0.717ex; min-width: 30.624ex;" xmlns="http://www.w3.org/2000/svg" width="100%" height="2.565ex" role="img" focusable="false" data-mjx-viewBox="0 -817 13535.8 1133.9"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(0.0181,-0.0181) translate(0, -817)"><g data-mml-node="math" data-latex="P_{\text{total}} \approx 12Ld^2 + V\cdot d"><g data-mml-node="mtable" data-latex="P_{\text{total}} \approx 12Ld^2  + V\cdot d" transform="translate(2078,0) translate(-2078,0)"><g transform="translate(0 817) matrix(1 0 0 -1 0 0) scale(55.25)"><svg data-table="true" preserveAspectRatio="xMidYMid" viewBox="4689.9 -817 1 1133.9"><g transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mlabeledtr" transform="translate(0,-67)"><g data-mml-node="mtd"><g data-mml-node="msub" data-latex="P_{\text{total}}"><g data-mml-node="mi" data-latex="P"><path data-c="1D443" d="M555 683L235 683C212 683 201 682 201 660C201 649 212 644 234 644C254 644 294 647 294 631C294 629 293 623 290 613L158 82C152 60 142 47 128 42C121 40 103 39 72 39C50 39 40 37 40 16C40 5 46 0 59 0L184 3L248 2C259 2 299 0 312 0C328 0 336 8 336 24C336 34 325 39 304 39C264 39 244 43 244 52C244 52 245 55 247 68L307 312L472 312C537 312 599 332 657 371C722 414 754 467 754 530C754 629 660 683 555 683M524 644C611 644 654 614 654 554C654 498 626 423 597 397C559 363 509 346 447 346L313 346L379 610C387 644 387 644 429 644Z"></path></g><g data-mml-node="TeXAtom" transform="translate(675,-150) scale(0.707)" data-latex="{\text{total}}" data-mjx-texclass="ORD"><g data-mml-node="mtext" data-latex="\text{total}"><path data-c="74" d="M332 126L332 186L300 186L300 128C300 78 282 22 238 22C197 22 177 56 177 124L177 395L316 395L316 433L177 433L177 615L145 615C144 582 141 553 134 527C117 461 78 427 19 424L19 395L102 395L102 126C102 67 120 29 155 10C182-4 207-11 232-11C298-11 332 55 332 126Z"></path><path data-c="6F" d="M249-11C311-11 363 11 406 55C449 99 471 152 471 214C471 277 450 332 408 378C366 424 313 448 250 448C187 448 135 424 92 378C49 332 28 277 28 214C28 152 49 99 92 55C135 11 188-11 249-11M250 21C202 21 166 42 141 85C125 113 117 159 117 222C117 283 125 327 140 355C164 398 200 419 249 419C296 419 332 398 357 357C374 329 382 284 382 222C382 106 348 21 250 21Z" transform="translate(389,0)"></path><path data-c="74" d="M332 126L332 186L300 186L300 128C300 78 282 22 238 22C197 22 177 56 177 124L177 395L316 395L316 433L177 433L177 615L145 615C144 582 141 553 134 527C117 461 78 427 19 424L19 395L102 395L102 126C102 67 120 29 155 10C182-4 207-11 232-11C298-11 332 55 332 126Z" transform="translate(889,0)"></path><path data-c="61" d="M483 91L483 150L451 150L451 91C451 52 440 32 419 32C399 32 387 57 387 77L387 274C387 309 383 335 376 353C352 412 283 448 213 448C136 448 60 405 60 333C60 300 77 283 110 283C143 283 159 299 159 332C159 361 144 378 113 381C135 406 168 419 211 419C273 419 311 362 311 297L311 264C233 259 174 247 133 228C66 197 32 154 32 97C32 71 42 49 61 32C93 3 137-11 193-11C252-11 294 14 320 65C327 27 355-6 398-6C451-6 483 36 483 91M200 18C154 18 116 52 116 98C116 191 213 231 311 236L311 141C311 74 267 18 200 18Z" transform="translate(1278,0)"></path><path data-c="6C" d="M144 3L255 0L255 39C219 39 197 40 190 44C183 48 180 60 180 79L180 694L33 683L33 645C68 645 90 642 97 636C104 630 108 616 108 593L108 79C108 60 105 48 98 44C91 40 69 39 33 39L33 0Z" transform="translate(1778,0)"></path></g></g></g><g data-mml-node="mo" data-latex="\approx" transform="translate(2456.6,0)"><path data-c="2248" d="M717 432L717 434C717 445 712 450 701 450C694 450 689 446 686 439C679 404 665 377 645 360C612 331 577 317 539 317C510 317 480 328 449 349C392 390 358 413 347 420C304 445 266 457 232 457C125 457 77 382 56 284L56 281C56 271 61 266 72 266C81 266 86 270 88 278C95 313 108 339 128 356C161 385 196 399 235 399C264 399 293 388 324 366C381 326 415 303 426 296C469 271 507 259 541 259C648 259 696 334 717 432M717 216L717 219C717 229 712 234 701 234C694 234 689 230 686 223C679 188 665 162 645 144C612 115 577 101 539 101C510 101 480 112 449 134C392 174 358 197 347 204C304 229 266 241 232 241C125 241 77 166 56 68L56 66C56 55 61 50 72 50C81 50 86 54 88 62C95 97 108 123 128 140C161 169 196 183 235 183C264 183 293 172 324 151C381 110 415 87 426 80C469 55 507 43 541 43C648 43 696 118 717 216Z"></path></g><g data-mml-node="mn" data-latex="12" transform="translate(3507.4,0)"><path data-c="31" d="M269 666C228 624 168 603 89 603L89 564C141 564 184 572 217 588L217 82C217 64 213 52 204 47C195 42 170 39 130 39L95 39L95 0C120 2 174 3 257 3C340 3 394 2 419 0L419 39L384 39C343 39 318 42 310 47C302 52 297 64 297 82L297 636C297 660 295 666 269 666Z"></path><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z" transform="translate(500,0)"></path></g><g data-mml-node="mi" data-latex="L" transform="translate(4507.4,0)"><path data-c="1D43F" d="M520 667C520 678 513 683 500 683L354 680L223 683C208 684 200 676 200 659C200 652 203 647 209 646C218 645 226 644 231 644C262 643 279 641 284 640C289 639 292 636 292 631C292 629 291 623 288 613L156 82C150 60 140 47 125 42C119 40 101 39 70 39C49 39 39 31 39 15C39 5 49 0 70 0L527 0C552 0 554 0 561 19L639 233C642 240 643 245 643 248C643 258 638 263 627 263C617 263 612 254 607 240C588 191 570 154 555 131C518 75 455 39 363 39L270 39C259 39 252 39 249 40C242 40 239 42 239 45C239 47 241 54 244 67L377 601C383 624 396 637 415 642C421 643 442 644 478 644C506 644 520 644 520 667Z"></path></g><g data-mml-node="msup" data-latex="d^2" transform="translate(5188.4,0)"><g data-mml-node="mi" data-latex="d"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g><g data-mml-node="mn" transform="translate(553,413) scale(0.707)" data-latex="2"><path data-c="32" d="M237 666C186 666 143 648 106 612C69 576 50 534 50 483C50 449 75 424 106 424C136 424 161 450 161 480C161 513 137 536 105 536C102 536 100 536 98 535C117 584 161 627 224 627C306 627 352 556 352 470C352 403 318 331 250 255L62 43C49 28 50 29 50 0L421 0L450 180L417 180C409 129 402 100 396 91C391 86 361 84 306 84L139 84L236 179C304 243 390 312 419 365C439 400 449 435 449 470C449 588 357 666 237 666Z"></path></g></g><g data-mml-node="mo" data-latex="+" transform="translate(6367.1,0)"><path data-c="2B" d="M698 274L413 274L413 559C413 575 405 583 389 583C373 583 365 575 365 559L365 274L80 274C64 274 56 266 56 250C56 234 64 226 80 226L365 226L365-59C365-75 373-83 389-83C405-83 413-75 413-59L413 226L698 226C714 226 722 234 722 250C722 263 711 274 698 274Z"></path></g><g data-mml-node="mi" data-latex="V" transform="translate(7367.4,0)"><path data-c="1D449" d="M671 680C652 680 592 683 573 683C558 683 550 675 550 660C550 650 557 645 570 644C598 643 612 633 612 616C612 607 607 595 598 580L300 107L234 619C234 636 255 644 298 644C318 644 327 651 327 668C327 678 321 683 309 683C287 683 209 680 187 680C167 680 99 683 79 683C64 683 56 675 56 660C56 649 66 644 85 644C102 644 114 642 122 640C138 635 137 633 140 614L218 4C221-13 229-22 242-22C255-22 265-15 273-2L629 564C652 600 674 623 696 632C711 639 730 643 752 644C763 645 768 652 769 667C770 678 764 683 752 683C737 683 686 680 671 680Z"></path></g><g data-mml-node="mo" data-latex="\cdot" transform="translate(8359.6,0)"><path data-c="22C5" d="M192 250C192 279 168 303 139 303C110 303 86 279 86 250C86 221 110 197 139 197C168 197 192 221 192 250Z"></path></g><g data-mml-node="mi" data-latex="d" transform="translate(8859.8,0)"><path data-c="1D451" d="M429 632L370 389C349 426 320 445 281 445C216 445 159 412 109 345C63 283 40 218 40 151C40 63 91-11 175-11C218-11 260 12 300 59C311 21 345-11 392-11C461-11 483 71 498 145C498 154 493 159 483 159C474 159 468 152 465 138C445 59 421 19 394 19C377 19 368 33 368 60C368 75 370 91 374 107L516 679L516 683C513 690 507 694 499 694C476 694 434 690 374 683C363 682 357 674 357 660C357 650 366 645 384 645C403 645 429 646 429 632M341 376C351 355 356 341 356 332C355 328 354 323 353 316L304 122C301 111 294 99 285 87C248 42 212 19 177 19C138 19 118 49 118 108C118 132 124 168 136 216C157 301 187 359 224 390C244 407 263 415 282 415C309 415 329 402 341 376Z"></path></g></g></g></g></svg><svg data-labels="true" preserveAspectRatio="xMaxYMid" viewBox="1278 -817 1 1133.9"><g data-labels="true" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="mtd" id="mjx-eqn:4" transform="translate(0,681)"><text data-id-align="true"></text><g data-idbox="true" transform="translate(0,-748)"><g data-mml-node="mtext" data-latex="\text{(}"><path data-c="28" d="M318-248C327-248 332-243 332-234C332-231 330-227 327-223C275-183 233-117 202-26C175 53 161 131 161 208L161 292C161 369 175 447 202 526C233 617 275 683 327 723C330 726 332 730 332 734C332 743 327 748 318 748C317 748 314 747 311 745C251 699 201 631 160 540C121 453 101 371 101 292L101 208C101 129 121 47 160-40C201-131 251-199 311-245C314-247 317-248 318-248Z"></path></g><g data-mml-node="mtext" data-latex="\text{4}" transform="translate(389,0)"><path data-c="34" d="M353 677C344 677 336 672 330 663L28 199L28 163L289 163L289 81C289 63 285 51 278 46C271 41 252 39 219 39L194 39L194 0C223 2 269 3 331 3C393 3 439 2 468 0L468 39L443 39C410 39 391 41 384 46C377 51 373 63 373 81L373 163L471 163L471 202L373 202L373 660C373 670 366 677 353 677M295 553L295 202L67 202Z"></path></g><g data-mml-node="mtext" data-latex="\text{)}" transform="translate(889,0)"><path data-c="29" d="M78-245C138-199 188-131 229-40C268 47 288 129 288 208L288 292C288 371 268 453 229 540C188 631 138 699 78 745C75 747 72 748 71 748C62 748 57 743 57 734C57 730 59 726 62 723C114 683 156 617 187 526C214 447 228 369 228 292L228 208C228 131 214 53 187-26C156-117 114-183 62-223C59-227 57-231 57-234C57-243 62-248 71-248C72-248 75-247 78-245Z"></path></g></g></g></g></svg></g></g></g></g></svg></mjx-container></p><p>公式内<mjx-container class="MathJax" jax="SVG" overflow="overflow"><svg style="vertical-align: -0.05ex;" xmlns="http://www.w3.org/2000/svg" width="1.742ex" height="1.595ex" role="img" focusable="false" viewBox="0 -683 770 705"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math" data-latex="V"><g data-mml-node="mi" data-latex="V"><path data-c="1D449" d="M671 680C652 680 592 683 573 683C558 683 550 675 550 660C550 650 557 645 570 644C598 643 612 633 612 616C612 607 607 595 598 580L300 107L234 619C234 636 255 644 298 644C318 644 327 651 327 668C327 678 321 683 309 683C287 683 209 680 187 680C167 680 99 683 79 683C64 683 56 675 56 660C56 649 66 644 85 644C102 644 114 642 122 640C138 635 137 633 140 614L218 4C221-13 229-22 242-22C255-22 265-15 273-2L629 564C652 600 674 623 696 632C711 639 730 643 752 644C763 645 768 652 769 667C770 678 764 683 752 683C737 683 686 680 671 680Z"></path></g></g></g></svg></mjx-container>代表模型词典容量大小。</p><h3 id="参数变化规律"><a href="#参数变化规律" class="headerlink" title="参数变化规律"></a>参数变化规律</h3><p>隐藏维度对参数量影响最大，参数随维度呈现平方级增长，维度小幅提升就会带来参数规模暴涨，同时模型语义表现力、硬件显存消耗也会同步增加；</p><p>堆叠层数与参数量呈线性增长关系，层数增加会提升网络深度，强化模型逻辑推理与长文本理解能力；</p><p>网络结构设计同样影响参数体量，前馈扩张倍数、注意力结构改动，都会改变单层参数基准数值。</p><h3 id="实际模型参考"><a href="#实际模型参考" class="headerlink" title="实际模型参考"></a>实际模型参考</h3><p>以经典70亿参数模型为例，配置32层网络结构、4096维隐藏维度，仅Transformer模块就拥有数十亿参数，叠加嵌入层参数后，整体规模匹配对应参数规格。</p><h2 id="五、拓展认知要点"><a href="#五、拓展认知要点" class="headerlink" title="五、拓展认知要点"></a>五、拓展认知要点</h2><h3 id="不同形式数据的分词差异"><a href="#不同形式数据的分词差异" class="headerlink" title="不同形式数据的分词差异"></a>不同形式数据的分词差异</h3><p>文字文本依靠专属分词器拆分单元，拆分结果具备可读语义；图像、音频数据不存在传统分词逻辑，依靠切块、编码、量化方式生成处理单元，仅适配统一网络运算格式，和文本分词原理完全不同。</p><h3 id="Token与向量核心区别"><a href="#Token与向量核心区别" class="headerlink" title="Token与向量核心区别"></a>Token与向量核心区别</h3><p>Token只是文字对应的数字编号，仅起到标识作用，本身没有语义含义；向量是内容浓缩后的语义特征，依靠数值分布体现文字含义。实际应用中，统计长度、核算费用使用Token，语义检索、知识库问答场景使用向量数据。</p><h3 id="模型数据独立性"><a href="#模型数据独立性" class="headerlink" title="模型数据独立性"></a>模型数据独立性</h3><p>不同大模型的词典规则、编号体系互不通用，相同文字在不同模型中对应的数字编号存在差异；各模型独立训练语义空间，训练得到的特征向量无法跨模型直接调用。</p><h3 id="固定维度的表达原理"><a href="#固定维度的表达原理" class="headerlink" title="固定维度的表达原理"></a>固定维度的表达原理</h3><p>模型参数相当于搭建高维语义空间的框架，整体数量存在上限；向量作为空间内的特征坐标，依靠维度组合的多元化特性承载海量语义信息，有限规格可以表达近乎无穷的文字内容。</p><h2 id="六、易混淆概念区分"><a href="#六、易混淆概念区分" class="headerlink" title="六、易混淆概念区分"></a>六、易混淆概念区分</h2><h3 id="Embedding-与-Prefill"><a href="#Embedding-与-Prefill" class="headerlink" title="Embedding 与 Prefill"></a>Embedding 与 Prefill</h3><p>词嵌入只是文本单元转向量的单一数据转换步骤；预填充是整合分词、嵌入、编码的完整输入处理流程，词嵌入属于预填充环节中的其中一步，二者不能等同看待。</p><h3 id="各类向量区别"><a href="#各类向量区别" class="headerlink" title="各类向量区别"></a>各类向量区别</h3><p>文本刚转换完成的数据为嵌入向量；进入网络参与运算后统称为隐藏向量；单层运算产出的阶段性数据为中间状态向量。三类数据本源一致，仅处于不同运算阶段。</p><h3 id="维度规格区别"><a href="#维度规格区别" class="headerlink" title="维度规格区别"></a>维度规格区别</h3><p>常规大模型嵌入维度与隐藏维度统一，保障运算顺畅；仅外部数据接入、定制化模型场景下会出现维度偏差，通过投影层即可完成对齐适配。</p><h3 id="层数、维度与参数量"><a href="#层数、维度与参数量" class="headerlink" title="层数、维度与参数量"></a>层数、维度与参数量</h3><p>层数决定网络堆叠深度，维度决定单条信息的表达上限，结构设计划定单层参数基数，三项要素相互结合，最终计算得出模型整体参数量。</p><h2 id="七、知识总结"><a href="#七、知识总结" class="headerlink" title="七、知识总结"></a>七、知识总结</h2><p>文本经过分词处理拆解为基础单元，借助词嵌入转化为模型可运算的向量数据，维度规格统一是所有运算开展的基础条件。</p><p>预填充环节一次性完成输入内容编码，向量进入Transformer网络后，依靠多组权重矩阵执行矩阵运算，逐层生成中间特征向量，持续提炼语义信息。</p><p>网络层数决定模型深度，隐藏维度决定信息表达上限，结合内部结构设计，共同构成模型整体参数量，参数规模直接划定模型能力边界。</p><p>文字、图像、音频数据的分词处理逻辑存在差异，标识单元无语义，特征向量承载含义，不同模型的数据体系相互独立。</p><p>有限的参数框架依托维度组合实现海量语义表达，从文字输入到内容输出，全程依靠向量矩阵运算完成信息处理，这也是大模型理解语言、生成内容的底层本质。</p><h2 id="整套流程串联总结"><a href="#整套流程串联总结" class="headerlink" title="整套流程串联总结"></a>整套流程串联总结</h2><ol><li><strong>初始向量</strong>：自然语言转化为模型可计算的数字特征</li><li><strong>注意力运算</strong>：捕捉上下文字词之间的语义关联关系</li><li><strong>前馈网络</strong>：深度细化、打磨单个文本单元的语义特征</li><li><strong>残差相加</strong>：融合原始基础信息与深层推理特征，完整留存语义</li><li><strong>层归一化</strong>：规整数值范围，为下一层网络运算提供稳定输入</li></ol><p>单层输出结果 (Out) 会直接作为下一层Transformer模块的输入，经过多层重复堆叠计算，最终实现文本理解、逻辑推理与内容生成。</p>]]>
    </content>
    <id>https://haies.cn/ai-from-token-to-vector/</id>
    <link href="https://haies.cn/ai-from-token-to-vector/"/>
    <published>2026-05-02T13:50:00.000Z</published>
    <summary>从零吃透大模型基础：Tokenizer、Embedding、Transformer、Prefill 与参数量。</summary>
    <title>从零吃透大模型核心基础：Tokenizer、Embedding、向量、Transformer、Prefill、参数量全梳理</title>
    <updated>2026-10-21T00:56:24.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="笔记" scheme="https://haies.cn/categories/note/"/>
    <category term="AI" scheme="https://haies.cn/tags/ai/"/>
    <category term="教程" scheme="https://haies.cn/tags/manual/"/>
    <content>
      <![CDATA[<p>在 AI Agent 的长期协作中，<strong>上下文管理</strong>是决定智能体能力上限的核心瓶颈。传统方案要么因窗口限制导致“失忆”，要么因全量传输造成 Token 成本爆炸。本文将基于 OpenClaw 文档与社区实践，详解 <strong>Lossless-Claw（LCM）与 QMD</strong> 的无损上下文组合方案，从原理、价值到可直接复制的实操配置，全部经过官方文档与经验验证。</p><h2 id="一、为什么做：三大痛点"><a href="#一、为什么做：三大痛点" class="headerlink" title="一、为什么做：三大痛点"></a>一、为什么做：三大痛点</h2><h3 id="1-1-滑动窗口失忆"><a href="#1-1-滑动窗口失忆" class="headerlink" title="1.1 滑动窗口失忆"></a>1.1 滑动窗口失忆</h3><p>OpenClaw 内置的上下文压缩机制存在一个根本性缺陷：它是有损的（lossy）。当对话超过模型上限（如 8k&#x2F;16k Token），早期信息直接被截断，AI 彻底“忘记”前期需求、代码细节和关键决策。内置压缩还会把数十轮对话压成一段几百 Token 的摘要，不保留原始消息，压缩后细节永远丢失。</p><h3 id="1-2-Token-成本雪崩"><a href="#1-2-Token-成本雪崩" class="headerlink" title="1.2 Token 成本雪崩"></a>1.2 Token 成本雪崩</h3><p>长对话全量传输，每轮请求 Token 数指数级增长。经验显示，长对话场景下单次请求可能携带 8 万 + tokens，不仅响应延迟高达 45 秒，API 成本可达 $2.4&#x2F;次。</p><h3 id="1-3-缺乏可定制性"><a href="#1-3-缺乏可定制性" class="headerlink" title="1.3 缺乏可定制性"></a>1.3 缺乏可定制性</h3><p>传统压缩规则硬编码在核心中，插件无法介入。近期 OpenClaw 版本开始支持可插拔上下文引擎，新增 ContextEngine 插槽与生命周期钩子，使插件可以在上下文生成、压缩、拼接以及子 Agent 管理的各个阶段介入。OpenClaw 文档支持 lossless-claw 插件——基于 Voltropy 团队 LCM 论文的无损上下文方案。</p><h3 id="1-4-破局：Lossless-Claw-QMD"><a href="#1-4-破局：Lossless-Claw-QMD" class="headerlink" title="1.4 破局：Lossless-Claw + QMD"></a>1.4 破局：Lossless-Claw + QMD</h3><p>这套组合是 OpenClaw 社区中广泛采用的<strong>无损上下文方案</strong>，核心价值在于<strong>分工明确、互补增效</strong>：</p><ul><li><strong>Lossless-Claw（LCM）</strong> ：负责<strong>当前会话内存</strong>。用 DAG 分层摘要 + SQLite 全量持久化，对话再长也不丢原始消息，同时把活跃上下文压缩到模型窗口 75% 以内。</li><li><strong>QMD</strong>：负责<strong>跨会话硬盘记忆</strong>。本地语义搜索引擎，只提取最相关的 2-3 句话注入上下文，杜绝全库扫描的 Token 浪费。</li></ul><p><strong>LCM 管“当下对话不中断”，QMD 管“历史知识不丢失”</strong> ，两者结合实现“永久记忆 + 零成本膨胀”。</p><h3 id="1-5-预期效果对比"><a href="#1-5-预期效果对比" class="headerlink" title="1.5 预期效果对比"></a>1.5 预期效果对比</h3><p>| 指标 | 原生 OpenClaw | Lossless-Claw + QMD | 提升 |<br>|: —|: —|: —|: —|<br>| 上下文大小 | 5000+ Token（溢出） | 800-1200 Token | 削减 75%-85% |<br>| 历史追溯 | 无法恢复早期消息 | 100% 无损展开 | 永久记忆 |<br>| 响应速度 | 8-10 秒 | 1-2 秒 | 提速 80%+ |<br>| Token 成本 | 100 轮 ≈ 50 万 Token | 100 轮 ≈ 5 万 Token | 节省 90% |<br>| OOLONG 得分 | Claude Code 70.3 | lossless-claw 74.8 | 击败默认方案 |</p><p>在 OOLONG 长上下文推理基准测试中，相同模型（Claude Opus 4.6）搭配 lossless-claw 后得分从 70.3 提升至 74.8，Token 消耗降低 30%+。QMD 端 Token 削减达 60-97%（平均 95% 以上），响应速度提升 5-50 倍，成本降低 90-99%，精准度高达 93%。</p><h2 id="二、是什么：双引擎架构解析"><a href="#二、是什么：双引擎架构解析" class="headerlink" title="二、是什么：双引擎架构解析"></a>二、是什么：双引擎架构解析</h2><h3 id="2-1-Lossless-Claw：DAG-无损上下文管理"><a href="#2-1-Lossless-Claw：DAG-无损上下文管理" class="headerlink" title="2.1 Lossless-Claw：DAG 无损上下文管理"></a>2.1 Lossless-Claw：DAG 无损上下文管理</h3><p>Lossless Claw（LCM）是一个为 OpenClaw 开发的无损上下文管理插件，基于 DAG（有向无向图）结构的摘要系统替代 OpenClaw 内置的滑动窗口压缩机制。它不在上下文爆满后临时补救，而是持续在后台异步处理历史消息。首先将所有原始消息完整写入 SQLite 数据库，不主动丢弃任何内容；随后将较旧的消息分块，调用 LLM 生成摘要；这些摘要被组织成 DAG 结构——底层节点保留时序细节，上层节点逐步浓缩为高层级摘要，既能控制上下文体积，又不会真正失去原始信息。</p><p>LCM 的核心架构包含两大层次：</p><ul><li><strong>持久化存储</strong>：所有对话消息、工具调用记录、文件内容均存入 SQLite 数据库，永不主动删除，作为不可变的原始副本。</li><li><strong>DAG 摘要层</strong>：超出最新 N 条消息后，异步生成 Leaf 层级摘要；同层摘要积累到阈值后向上凝练，形成层级化 DAG 结构。每个摘要都链接回它的源消息——这就是“无损”的含义。</li></ul><p>LCM 通过五个关键操作完成工作：将每条消息持久化到 SQLite 数据库；将旧消息分块摘要；随着摘要积累，进一步浓缩为更高层级节点，形成 DAG；每轮通过组合摘要 + 近期原始消息来组装上下文；并提供 <code>lcm_grep</code>、<code>lcm_describe</code>、<code>lcm_expand</code> 等工具，让 Agent 可以搜索和回忆已压缩历史中的细节。</p><p>OpenClaw 核心开发者 Josh Lehman 在亲身测试后的评价：“对话感觉永远不会丢失信息（因为某种程度上确实不会），始终在 30-100K Token 范围内运行，零维护。”</p><h3 id="2-2-QMD：本地语义搜索引擎"><a href="#2-2-QMD：本地语义搜索引擎" class="headerlink" title="2.2 QMD：本地语义搜索引擎"></a>2.2 QMD：本地语义搜索引擎</h3><p>QMD（Quantum Memory Database）是由 GitHub 用户 <code>tobi</code> 开发的本地语义搜索引擎。它的核心理念是：不要把整个文件塞给 AI，而是先用本地搜索找到最相关的片段（通常只有 2-3 句话），再把这些精准内容传给 AI。</p><p>QMD 采用<strong>三层混合检索</strong>机制：</p><ol><li><strong>BM25 全文搜索</strong>：精准匹配端口、变量名、文件名等精确术语；</li><li><strong>向量语义搜索</strong>：理解概念关联（如“服务器配置”与“部署网关”的同义表述）；</li><li><strong>LLM 重排序</strong>：轻量模型二次筛选，确保最相关片段优先。</li></ol><p>QMD 的核心特性：完全本地运行，所有模型、数据、索引都不上云；混合搜索（BM25 + 向量语义 + LLM 重排序）；不消耗任何 API 配额，自带模型；支持 MCP 协议，专为 AI 工作流设计。</p><p>OpenClaw 文档将其列为支持的 memory backend，定位为 Local-first sidecar，具备重排序（reranking）、查询扩展（query expansion）以及索引工作区外目录的能力。</p><h3 id="2-3-协同工作流"><a href="#2-3-协同工作流" class="headerlink" title="2.3 协同工作流"></a>2.3 协同工作流</h3><ul><li><strong>写入</strong>：LCM 将每一轮对话、每一次工具调用、每一个决策都完整写入 SQLite 数据库，并异步构建 DAG 摘要层，确保信息永不丢失。</li><li><strong>检索</strong>：QMD 通过向量检索从长期记忆中精准召回最相关的片段，避免把整个历史上下文塞给模型。</li><li><strong>巩固</strong>：配合 OpenClaw 内置的 Dreaming 梦境系统（模拟人类睡眠的记忆巩固过程），三者形成“<strong>写入 → 巩固 → 检索</strong>”的完整记忆闭环。</li></ul><h2 id="三、怎么做：完整配置指南"><a href="#三、怎么做：完整配置指南" class="headerlink" title="三、怎么做：完整配置指南"></a>三、怎么做：完整配置指南</h2><blockquote><p>⚠️ <strong>前置条件</strong>：OpenClaw 版本需 ≥ 2026.3.7（lossless-claw 要求）且 ≥ 2026.2.2（QMD 要求）。用 <code>openclaw --version</code> 检查版本。</p></blockquote><h3 id="3-1-安装-Lossless-Claw"><a href="#3-1-安装-Lossless-Claw" class="headerlink" title="3.1 安装 Lossless-Claw"></a>3.1 安装 Lossless-Claw</h3><p><strong>第一步：检查前置条件</strong></p><ul><li>已安装支持插件上下文引擎的 OpenClaw（≥ 2026.3.7）；</li><li>Node.js 版本为 22 或更高；</li><li>已在 OpenClaw 中配置好可用于摘要生成的 LLM 提供方；</li><li>强烈建议 Node 运行环境支持 SQLite FTS5 编译选项。</li></ul><p><strong>第二步：安装插件</strong></p><p>使用官方插件安装命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openclaw plugins install @martian-engineering/lossless-claw</span><br></pre></td></tr></table></figure><p>该命令会下载插件、登记配置，并在系统中启用 lossless-claw。OpenClaw 会优先从 ClawHub 拉取，自动回退到 npm。</p><p><strong>第三步：将 lossless-claw 设为默认上下文引擎</strong></p><p>编辑配置文件 <code>~/.openclaw/openclaw.json</code>，确保 contextEngine 指向 lossless-claw：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;plugins&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;slots&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;contextEngine&quot;</span><span class="punctuation">:</span> <span class="string">&quot;lossless-claw&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p><strong>第四步：调整进阶参数（可选）</strong></p><p>在 <code>openclaw.json</code> 的 <code>plugins.entries</code> 中添加 lossless-claw 的详细配置：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;plugins&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;entries&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;lossless-claw&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;config&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;freshTailCount&quot;</span><span class="punctuation">:</span> <span class="number">32</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;contextThreshold&quot;</span><span class="punctuation">:</span> <span class="number">0.75</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;incrementalMaxDepth&quot;</span><span class="punctuation">:</span> <span class="number">-1</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;summaryModel&quot;</span><span class="punctuation">:</span> <span class="string">&quot;openai/gpt-5.4-mini&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>参数说明：</p><ul><li><code>freshTailCount: 32</code>：保护最近 32 条消息不被压缩，保持短期上下文连贯。</li><li><code>contextThreshold: 0.75</code>：当上下文占用达到 75% 时启动压缩流程，为模型回复预留空间。</li><li><code>incrementalMaxDepth: -1</code>：允许摘要树无限制扩展，让长期记忆自然增长。</li><li><code>summaryModel</code>：将压缩摘要绑定到指定模型（本配置使用 openai&#x2F;gpt-5.4-mini）。</li></ul><p><strong>第五步：重启服务</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openclaw gateway restart</span><br></pre></td></tr></table></figure><h3 id="3-2-安装-QMD"><a href="#3-2-安装-QMD" class="headerlink" title="3.2 安装 QMD"></a>3.2 安装 QMD</h3><p><strong>第一步：安装 QMD CLI</strong></p><p>方式一（推荐，使用 npm）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i -g @tobilu/qmd</span><br></pre></td></tr></table></figure><p>方式二（使用 Bun，速度更快）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 先装 Bun</span></span><br><span class="line">curl -fsSL https://bun.sh/install | bash</span><br><span class="line"><span class="comment"># 装 Qmd</span></span><br><span class="line">bun install -g @tobilu/qmd</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">ln</span> -s $(<span class="built_in">which</span> qmd) /usr/local/bin/qmd</span><br></pre></td></tr></table></figure><p><strong>第二步：首次运行自动下载模型</strong></p><p>首次运行 QMD 时，会自动下载默认模型文件，通常包括 embeddinggemma 和 query-expansion 相关 GGUF 模型，整体约 1.5GB 左右。首次启动会比后续运行慢，并且需要等待模型下载完毕后才能进入正常索引。</p><p><strong>⚠️ 常见问题：模型文件名不匹配</strong></p><p>QMD 运行时可能因文件名大小写问题找不到模型，需手动创建软链接：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ~/.cache/qmd/models</span><br><span class="line"><span class="built_in">ln</span> -sf hf_ggml-org_embeddinggemma-300M-Q8_0.gguf <span class="built_in">local</span>:embeddinggemma-300m-qat-Q8_0.gguf</span><br></pre></td></tr></table></figure><p><strong>第三步：配置 OpenClaw 使用 QMD</strong></p><p>编辑 <code>~/.openclaw/openclaw.json</code>，在 memory 段添加 QMD 配置：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;memory&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;backend&quot;</span><span class="punctuation">:</span> <span class="string">&quot;qmd&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;citations&quot;</span><span class="punctuation">:</span> <span class="string">&quot;auto&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;qmd&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;searchMode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;query&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;includeDefaultMemory&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;update&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="string">&quot;5m&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;debounceMs&quot;</span><span class="punctuation">:</span> <span class="number">15000</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;onBoot&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;sessions&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;enabled&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;retentionDays&quot;</span><span class="punctuation">:</span> <span class="number">30</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;limits&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;maxResults&quot;</span><span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;maxSnippetChars&quot;</span><span class="punctuation">:</span> <span class="number">600</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;timeoutMs&quot;</span><span class="punctuation">:</span> <span class="number">120000</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;scope&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;default&quot;</span><span class="punctuation">:</span> <span class="string">&quot;deny&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;rules&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">          <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;allow&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;match&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">              <span class="attr">&quot;chatType&quot;</span><span class="punctuation">:</span> <span class="string">&quot;direct&quot;</span></span><br><span class="line">            <span class="punctuation">&#125;</span></span><br><span class="line">          <span class="punctuation">&#125;</span></span><br><span class="line">        <span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;paths&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;blogs&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;path&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/Users/sean/note/haies.cn/source/_posts&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;pattern&quot;</span><span class="punctuation">:</span> <span class="string">&quot;**/*.md&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">          <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;wans&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;path&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/Users/sean/note/wans&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="attr">&quot;pattern&quot;</span><span class="punctuation">:</span> <span class="string">&quot;**/*.md&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">      <span class="punctuation">]</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>参数说明：</p><ul><li><code>backend: &quot;qmd&quot;</code>：启用 QMD 记忆后端。</li><li><code>searchMode: &quot;query&quot;</code>：混合搜索（语义 + 关键词，最准）。可选 <code>search</code>（纯关键词，最快）或 <code>vsearch</code>（纯语义搜索）。</li><li><code>paths</code>：配置需要索引的外部路径，支持多个目录。</li><li><code>maxResults: 6</code>：最大返回结果数，越多越耗 Token。</li><li><code>scope.default: &quot;deny&quot;</code> + <code>rules</code>：默认关闭记忆，仅允许私聊使用。</li></ul><p><strong>第四步：初始化 QMD 索引并生成向量嵌入</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 首次索引（自动扫描 paths 中配置的路径）</span></span><br><span class="line">qmd index</span><br><span class="line"></span><br><span class="line"><span class="comment"># 生成向量嵌入（提升搜索精度，必须执行）</span></span><br><span class="line">qmd embed</span><br></pre></td></tr></table></figure><blockquote><p>💡 建议定期运行 <code>qmd embed</code>（如每天一次）以确保新增文档可被向量检索。</p></blockquote><h3 id="3-3-验证配置"><a href="#3-3-验证配置" class="headerlink" title="3.3 验证配置"></a>3.3 验证配置</h3><p><strong>验证 Lossless-Claw</strong>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 检查插件列表</span></span><br><span class="line">openclaw plugins list</span><br><span class="line"><span class="comment"># 预期输出包含 @martian-engineering/lossless-claw</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 检查上下文引擎配置</span></span><br><span class="line">openclaw config get plugins.slots.contextEngine</span><br><span class="line"><span class="comment"># 预期输出：&quot;lossless-claw&quot;</span></span><br></pre></td></tr></table></figure><p><strong>验证 QMD</strong>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看 QMD 版本</span></span><br><span class="line">qmd --version</span><br><span class="line"></span><br><span class="line"><span class="comment"># 检查 OpenClaw 记忆健康状态</span></span><br><span class="line">openclaw memory status</span><br><span class="line"><span class="comment"># 预期看到 Indexed、Store、Vector 状态正常</span></span><br></pre></td></tr></table></figure><p><strong>联合验证</strong>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openclaw memory status</span><br></pre></td></tr></table></figure><p>若输出正常，说明两套系统均已就绪。也可以运行 <code>openclaw memory search &quot;测试关键词&quot;</code> 测试搜索功能。</p><h3 id="3-4-验证清单"><a href="#3-4-验证清单" class="headerlink" title="3.4 验证清单"></a>3.4 验证清单</h3><table><thead><tr><th>验证项</th><th>命令</th><th>预期结果</th></tr></thead><tbody><tr><td>插件安装</td><td><code>openclaw plugins list</code></td><td>显示 lossless-claw [installed]</td></tr><tr><td>引擎配置</td><td><code>openclaw config get plugins.slots.contextEngine</code></td><td>返回 “lossless-claw”</td></tr><tr><td>LCM 数据库</td><td><code>ls ~/.openclaw/lcm.db</code></td><td>文件存在</td></tr><tr><td>LCM 运行状态</td><td><code>openclaw logs --limit 50 | grep lossless</code></td><td>显示 Plugin loaded</td></tr><tr><td>LCM 数据统计</td><td><code>sqlite3 ~/.openclaw/lcm.db &quot;SELECT COUNT(*) FROM summaries; SELECT COUNT(*) FROM messages;&quot;</code></td><td>摘要数和消息数</td></tr><tr><td>QMD 索引</td><td><code>qmd status</code></td><td>显示 indexed documents 数量</td></tr><tr><td>QMD 向量嵌入</td><td><code>qmd embed</code></td><td>显示 Embedded N chunks from M documents</td></tr><tr><td>QMD 搜索测试</td><td><code>qmd search &quot;关键词&quot; -c blogs -n 3</code></td><td>返回相关结果</td></tr><tr><td>内存搜索</td><td><code>memory_search</code> 工具</td><td>返回相关结果</td></tr></tbody></table><p><strong>示例验证结果（2026-04-10）</strong>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># LCM 状态</span></span><br><span class="line">$ openclaw logs --<span class="built_in">limit</span> 50 | grep lossless</span><br><span class="line">2026-04-09T16:08:23.838Z info &#123;<span class="string">&quot;plugin&quot;</span>:<span class="string">&quot;lossless-claw&quot;</span>&#125; [lcm] Plugin loaded (enabled=<span class="literal">true</span>, db=/Users/sean/.openclaw/lcm.db, threshold=0.75)</span><br><span class="line"></span><br><span class="line">$ sqlite3 ~/.openclaw/lcm.db <span class="string">&quot;SELECT COUNT(*) FROM summaries; SELECT COUNT(*) FROM messages;&quot;</span></span><br><span class="line">159</span><br><span class="line">7855</span><br><span class="line"></span><br><span class="line"><span class="comment"># QMD 状态</span></span><br><span class="line">$ qmd status</span><br><span class="line">Documents</span><br><span class="line">  Total:    537 files indexed</span><br><span class="line">  Vectors:  1882 embedded</span><br><span class="line">  Pending:  0</span><br><span class="line"></span><br><span class="line">Collections</span><br><span class="line">  blogs (qmd://blogs/): 42 files</span><br><span class="line">  wans (qmd://wans/): 26 files</span><br><span class="line">  memory (qmd://memory/): 275 files</span><br><span class="line">  sessions-main (qmd://sessions-main/): 68 files</span><br><span class="line"></span><br><span class="line"><span class="comment"># 搜索测试</span></span><br><span class="line">$ qmd search <span class="string">&quot;docker&quot;</span> -c blogs -n 3</span><br><span class="line">qmd://blogs/docker.md:2 <span class="comment">#637513 - Score: 85%</span></span><br><span class="line">qmd://blogs/containerd.md:8 <span class="comment">#7d32a7 - Score: 83%</span></span><br><span class="line">qmd://blogs/geoserver.md:11 <span class="comment">#cff5cb - Score: 83%</span></span><br></pre></td></tr></table></figure><h2 id="四、高级优化与故障排除"><a href="#四、高级优化与故障排除" class="headerlink" title="四、高级优化与故障排除"></a>四、高级优化与故障排除</h2><h3 id="4-1-黄金参数调优"><a href="#4-1-黄金参数调优" class="headerlink" title="4.1 黄金参数调优"></a>4.1 黄金参数调优</h3><table><thead><tr><th align="left">场景</th><th align="left">freshTailCount</th><th align="left">contextThreshold</th><th align="left">maxResults</th></tr></thead><tbody><tr><td align="left">代码调试&#x2F;编程</td><td align="left">40</td><td align="left">0.7</td><td align="left">3</td></tr><tr><td align="left">文档分析</td><td align="left">40-64</td><td align="left">0.7</td><td align="left">4</td></tr><tr><td align="left">轻量对话&#x2F;日常聊天</td><td align="left">24</td><td align="left">0.8</td><td align="left">4</td></tr></tbody></table><h3 id="4-2-成本优化策略"><a href="#4-2-成本优化策略" class="headerlink" title="4.2 成本优化策略"></a>4.2 成本优化策略</h3><ul><li><strong>摘要模型降级</strong>：使用 <code>claude-haiku-4-5</code> 或本地 <code>ollama/llama-3:8b</code> 执行摘要，主对话保持高级模型。</li><li><strong>排除噪音会话</strong>：通过 <code>ignoreSessionPatterns</code> 过滤 cron job、心跳检测等无状态会话。</li></ul><h3 id="4-3-常见问题排查"><a href="#4-3-常见问题排查" class="headerlink" title="4.3 常见问题排查"></a>4.3 常见问题排查</h3><p><strong>Q1：配置后 AI 仍“失忆”</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 检查 contextEngine 是否指向 lossless-claw</span></span><br><span class="line">openclaw config get plugins.slots.contextEngine</span><br><span class="line"><span class="comment"># 若未指向，执行：</span></span><br><span class="line">openclaw config <span class="built_in">set</span> plugins.slots.contextEngine <span class="string">&quot;lossless-claw&quot;</span></span><br><span class="line">openclaw gateway restart</span><br></pre></td></tr></table></figure><p><strong>Q2：Token 消耗未降低</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 检查 freshTailCount 是否过大</span></span><br><span class="line">openclaw config get plugins.entries.@martian-engineering/lossless-claw.LCM_FRESH_TAIL_COUNT</span><br><span class="line"><span class="comment"># 建议调整为 32，并降低阈值：</span></span><br><span class="line">openclaw config <span class="built_in">set</span> plugins.entries.@martian-engineering/lossless-claw.LCM_CONTEXT_THRESHOLD 0.6</span><br></pre></td></tr></table></figure><p><strong>Q3：QMD 搜索超时或无结果</strong></p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 调整 openclaw.json 中的超时设置</span></span><br><span class="line"><span class="attr">&quot;limits&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;timeoutMs&quot;</span><span class="punctuation">:</span> <span class="number">8000</span><span class="punctuation">,</span>   <span class="comment">// 从 4000 增加到 8000</span></span><br><span class="line">  <span class="attr">&quot;maxResults&quot;</span><span class="punctuation">:</span> <span class="number">4</span>      <span class="comment">// 减少结果数以降低负载</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>若完全无结果，检查索引是否已生成：<code>qmd embed</code>。</p><p><strong>Q4：QMD 模型文件未找到</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 检查模型文件</span></span><br><span class="line"><span class="built_in">ls</span> -la ~/.cache/qmd/models/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 如发现文件名不匹配，创建软链接</span></span><br><span class="line"><span class="built_in">cd</span> ~/.cache/qmd/models</span><br><span class="line"><span class="built_in">ln</span> -sf hf_ggml-org_embeddinggemma-300M-Q8_0.gguf <span class="built_in">local</span>:embeddinggemma-300m-qat-Q8_0.gguf</span><br></pre></td></tr></table></figure><p><strong>Q5：SQLite 权限错误（Linux&#x2F;Docker）</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> <span class="built_in">chmod</span> -R 775 ~/.openclaw/data</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">chown</span> -R $(<span class="built_in">whoami</span>):$(<span class="built_in">whoami</span>) ~/.openclaw/data</span><br></pre></td></tr></table></figure><h2 id="五、总结"><a href="#五、总结" class="headerlink" title="五、总结"></a>五、总结</h2><p>Lossless-Claw + QMD 是 OpenClaw 社区中广泛使用的<strong>无损上下文组合方案</strong>，可以有效缓解“失忆、成本、精度”三大痛点。通过 LCM 的 DAG 无损压缩与 QMD 的本地精准检索，目标是实现<strong>永久记忆 + Token 膨胀可控 + 更平稳的响应时间</strong>。</p><p>两者分工明确、互补增效：LCM 负责“当下对话不中断”，QMD 负责“历史知识不丢失”，配合 OpenClaw 内置的 Dreaming 梦境系统，形成“写入 → 巩固 → 检索”的完整记忆闭环。在一些测试中表明：在一些长上下文场景中，得分和成本都有明显改善，但实际结果仍依赖具体模型、主题和配置。</p><p>本文中的配置、命令和参数基于 OpenClaw、LCM、QMD 的官方文档或社区资料整理，可作为可复制的参考。按此配置，你的 OpenClaw 能更好地支持长期对话与历史记忆场景。</p><blockquote><p><strong>官方参考</strong></p><ul><li>Lossless-Claw GitHub：<a href="https://github.com/Martian-Engineering/lossless-claw">https://github.com/Martian-Engineering/lossless-claw</a></li><li>QMD GitHub：<a href="https://github.com/tobi/qmd">https://github.com/tobi/qmd</a></li><li>OpenClaw 官方文档：<a href="https://docs.openclaw.ai/">https://docs.openclaw.ai</a></li><li>OpenClaw Context Engine：<a href="https://docs.openclaw.ai/concepts/context-engine">https://docs.openclaw.ai/concepts/context-engine</a></li><li>OpenClaw Memory Overview：<a href="https://docs.openclaw.ai/concepts/memory">https://docs.openclaw.ai/concepts/memory</a></li></ul></blockquote>]]>
    </content>
    <id>https://haies.cn/openclaw-context-mgr/</id>
    <link href="https://haies.cn/openclaw-context-mgr/"/>
    <published>2026-04-09T01:13:03.000Z</published>
    <summary>OpenClaw 无损上下文管理指南：Lossless-Claw + QMD 双工具配合实现上下文压缩与检索。</summary>
    <title>OpenClaw 无损上下文管理指南：Lossless-Claw + QMD 双剑合璧</title>
    <updated>2026-10-22T06:14:13.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>万术海</name>
    </author>
    <category term="笔记" scheme="https://haies.cn/categories/note/"/>
    <category term="AI" scheme="https://haies.cn/tags/ai/"/>
    <category term="教程" scheme="https://haies.cn/tags/manual/"/>
    <content>
      <![CDATA[<p>在 OpenClaw 中集成 LiteLLM Proxy，通过其自定义 Hook 实现「本地小模型处理简单问题＋云端思考型大模型处理复杂问题」的自动路由。复杂度路由是 LiteLLM 的功能，不是 OpenClaw 原生能力。</p><blockquote><p><strong>环境状态</strong>：OpenClaw v2026.4.1、oMLX、Qwen3.5-4B-MLX-4bit 已安装完成。<br><strong>重要说明</strong>：复杂度智能路由通过 LiteLLM 的 <code>async_pre_call_hook</code> 实现，OpenClaw 本身不支持基于任务复杂度自动选择模型的功能。</p></blockquote><hr><h2 id="OpenClaw-原生路由能力分析"><a href="#OpenClaw-原生路由能力分析" class="headerlink" title="OpenClaw 原生路由能力分析"></a>OpenClaw 原生路由能力分析</h2><h3 id="OpenClaw-原生路由能力（v2026-4-1）"><a href="#OpenClaw-原生路由能力（v2026-4-1）" class="headerlink" title="OpenClaw 原生路由能力（v2026.4.1）"></a>OpenClaw 原生路由能力（v2026.4.1）</h3><table><thead><tr><th>路由类型</th><th>支持情况</th><th>说明</th></tr></thead><tbody><tr><td><strong>多代理路由</strong></td><td>✅ 支持</td><td>按 channel&#x2F;account&#x2F;peer 路由到不同 agent</td></tr><tr><td><strong>会话路由</strong></td><td>✅ 支持</td><td>基于 session key 的路由（线程、主题）</td></tr><tr><td><strong>子代理分发</strong></td><td>✅ 支持</td><td>使用 requesterOrigin 进行分发</td></tr><tr><td><strong>模型故障转移</strong></td><td>✅ 支持</td><td>agents.defaults.model.fallbacks</td></tr><tr><td><strong>复杂度智能路由</strong></td><td>❌ 不支持</td><td>无根据任务复杂度自动选择模型的能力</td></tr></tbody></table><h3 id="为什么选择-LiteLLM-方案？"><a href="#为什么选择-LiteLLM-方案？" class="headerlink" title="为什么选择 LiteLLM 方案？"></a>为什么选择 LiteLLM 方案？</h3><pre><code class="highlight mermaid">flowchart TD    subgraph OpenClaw原生[&quot;OpenClaw 原生路由能力&quot;]        A1[&quot;1️⃣ 多代理路由&lt;br/&gt;(Multi-Agent Routing)&quot;] --&gt; A1_result&#123;✓ 根据用户/频道路由到不同 Agent&lt;br/&gt;✗ 不能根据任务复杂度选择模型&#125;        A2[&quot;2️⃣ 模型故障转移&lt;br/&gt;(Model Failover)&quot;] --&gt; A2_result&#123;✓ 模型失败时切换备用模型&lt;br/&gt;✗ 简单的轮询/列表切换&lt;br/&gt;不考虑任务复杂度&#125;        A3[&quot;3️⃣ 复杂度智能路由&lt;br/&gt;(Complexity Routing)&quot;] --&gt; A3_result&#123;✗ OpenClaw 完全不支持&lt;br/&gt;✓ 需要通过 LiteLLM Custom Hook 实现&#125;    end</code></pre><h3 id="LiteLLM-vs-OpenClaw-原生功能对比"><a href="#LiteLLM-vs-OpenClaw-原生功能对比" class="headerlink" title="LiteLLM vs OpenClaw 原生功能对比"></a>LiteLLM vs OpenClaw 原生功能对比</h3><table><thead><tr><th>功能</th><th>LiteLLM + Hook</th><th>OpenClaw 原生</th></tr></thead><tbody><tr><td>复杂度评分</td><td>✅ Token + 关键词 + 代码检测</td><td>❌ 不支持</td></tr><tr><td>智能路由</td><td>✅ 自动选择本地&#x2F;云端模型</td><td>❌ 不支持</td></tr><tr><td>故障转移</td><td>✅ 多层自动转移</td><td>✅ 基础故障转移</td></tr><tr><td>成本追踪</td><td>✅ 统一计费</td><td>❌ 分散计费</td></tr><tr><td>统一入口</td><td>✅ 单一 API 调用</td><td>❌ 需要多配置</td></tr></tbody></table><p><strong>结论</strong>：OpenClaw 原生路由主要用于<strong>多代理场景</strong>（不同用户&#x2F;频道使用不同 Agent），而非<strong>复杂度路由</strong>（根据任务难度选择模型）。真正的智能路由必须依赖 LiteLLM 的 Custom Hook。</p><hr><h2 id="核心价值"><a href="#核心价值" class="headerlink" title="核心价值"></a>核心价值</h2><p>通过 <strong>LiteLLM Proxy + 自定义 Hook</strong> 实现真正的本地+云端复杂度智能路由：</p><pre><code class="highlight mermaid">flowchart TB    A[&quot;用户请求&quot;] --&gt; B[&quot;OpenClaw Gateway&quot;]    B --&gt; C[&quot;LiteLLM Proxy&lt;br/&gt;(复杂度路由层)&quot;]    C --&gt; D[&quot;async_pre_call_hook&lt;br/&gt;(复杂度分析)&quot;]    D --&gt; D1[&quot;Token 数量统计&quot;]    D --&gt; D2[&quot;关键词模式匹配&quot;]    D --&gt; D3[&quot;复杂度评分算法&quot;]    D1 --&gt; E&#123;评分 ≥ 阈值?&#125;    D2 --&gt; E    D3 --&gt; E    E --&gt;|是| F[&quot;astron-code-latest&lt;br/&gt;(云端)&quot;]    E --&gt;|否| G[&quot;qwen-local&lt;br/&gt;(本地)&quot;]    F --&gt; H[&quot;云端模型&lt;br/&gt;Astron Code&lt;br/&gt;(深度推理)&quot;]    G --&gt; I[&quot;本地模型&lt;br/&gt;oMLX Qwen3.5-4B&lt;br/&gt;(毫秒响应)&quot;]</code></pre><p><strong>核心优势</strong>：</p><ul><li><strong>真正的复杂度路由</strong>：自动根据任务复杂度选择模型（LiteLLM Hook 功能）</li><li><strong>零成本处理简单任务</strong>：本地模型响应简单查询</li><li><strong>智能故障转移</strong>：模型不可用时自动切换</li><li><strong>统一成本追踪</strong>：集中查看所有模型消费</li></ul><hr><h2 id="一、架构概述"><a href="#一、架构概述" class="headerlink" title="一、架构概述"></a>一、架构概述</h2><pre><code class="highlight mermaid">flowchart TB    subgraph OpenClaw[&quot;OpenClaw Gateway (v2026.4.1 + skill-vetter)&quot;]        A[&quot;用户请求&quot;]    end    A --&gt;|/v1/chat/completions| B[&quot;LiteLLM Proxy&lt;br/&gt;(localhost:4000 复杂度路由层)&quot;]    subgraph LiteLLM[&quot;LiteLLM Proxy&quot;]        direction TB        C[&quot;complexity_router.py&lt;br/&gt;• 复杂度评分算法&lt;br/&gt;• 关键词匹配&lt;br/&gt;• 模型路由决策&quot;]        D[&quot;config.yaml&lt;br/&gt;• 模型列表定义&lt;br/&gt;• 故障转移规则&lt;br/&gt;• Hook 注册&quot;]    end    B --&gt; C    B --&gt; D    C --&gt; E&#123;&quot;模型选择&quot;&#125;    E --&gt;|简单任务| F[&quot;本地模型&quot;]    E --&gt;|复杂任务| G[&quot;云端模型&quot;]    subgraph Local[&quot;本地模型&quot;]        F1[&quot;oMLX Qwen3.5-4B-MLX&lt;br/&gt;(localhost:8000)&lt;br/&gt;• 零成本&lt;br/&gt;• 毫秒级响应&quot;]    end    subgraph Cloud[&quot;云端模型&quot;]        G1[&quot;Astron Code / Claude / GPT-4&lt;br/&gt;(api.astron.com 等)&lt;br/&gt;• 按量计费&lt;br/&gt;• 深度推理能力&quot;]    end    F --&gt; F1    G --&gt; G1</code></pre><p><strong>重要说明</strong>：复杂度路由完全由 LiteLLM Proxy 的自定义 Hook 实现，OpenClaw 仅作为统一的 AI agent 网关。</p><hr><h2 id="二、LiteLLM-Proxy-安装"><a href="#二、LiteLLM-Proxy-安装" class="headerlink" title="二、LiteLLM Proxy 安装"></a>二、LiteLLM Proxy 安装</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装 LiteLLM Proxy (带完整依赖)</span></span><br><span class="line">pip install <span class="string">&#x27;litellm[proxy]&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 或使用 Docker</span></span><br><span class="line">docker run \</span><br><span class="line">  -v $(<span class="built_in">pwd</span>)/config.yaml:/app/config.yaml \</span><br><span class="line">  -v $(<span class="built_in">pwd</span>)/complexity_router.py:/app/complexity_router.py \</span><br><span class="line">  -e DEEPSEEK_API_KEY=<span class="string">&quot;your-deepseek-key&quot;</span> \</span><br><span class="line">  -p 4000:4000 \</span><br><span class="line">  ghcr.io/berriai/litellm:main-latest</span><br></pre></td></tr></table></figure><hr><h2 id="三、复杂度路由-Hook-实现"><a href="#三、复杂度路由-Hook-实现" class="headerlink" title="三、复杂度路由 Hook 实现"></a>三、复杂度路由 Hook 实现</h2><p>这是核心组件，实现基于 prompt 复杂度的智能路由。</p><p><strong>重要说明</strong>：此复杂度路由器是 LiteLLM 的自定义 Hook，不是 OpenClaw 的原生功能。需要先配置 LiteLLM Proxy，然后 OpenClaw 连接到已配置好的 Proxy。</p><h3 id="3-1-创建复杂度路由器"><a href="#3-1-创建复杂度路由器" class="headerlink" title="3.1 创建复杂度路由器"></a>3.1 创建复杂度路由器</h3><p>创建 <code>~/.openclaw/litellm/complexity_router.py</code>：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">LiteLLM 复杂度路由 Hook</span></span><br><span class="line"><span class="string">根据 prompt 复杂度自动选择本地或云端模型</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">注意：此功能完全由 LiteLLM 实现，OpenClaw 本身不支持复杂度路由</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">简单任务 → 本地模型 (oMLX Qwen3.5-4B) - 零成本，毫秒响应</span></span><br><span class="line"><span class="string">复杂任务 → 云端模型 (DeepSeek Reasoner) - 深度推理能力</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">from</span> typing <span class="keyword">import</span> <span class="type">Any</span>, <span class="type">Dict</span>, <span class="type">Literal</span>, <span class="type">Optional</span></span><br><span class="line"><span class="keyword">from</span> litellm.integrations.custom_logger <span class="keyword">import</span> CustomLogger</span><br><span class="line"><span class="keyword">from</span> litellm.types.utils <span class="keyword">import</span> ModelResponse</span><br><span class="line"><span class="keyword">import</span> litellm</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">ComplexityRouter</span>(<span class="title class_ inherited__">CustomLogger</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    复杂度路由器：根据 prompt 特征自动选择模型</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="built_in">super</span>().__init__()</span><br><span class="line">        <span class="comment"># 复杂度阈值：分数 &gt;= threshold 路由到云端</span></span><br><span class="line">        <span class="variable language_">self</span>.threshold = <span class="number">2</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 复杂任务关键词</span></span><br><span class="line">        <span class="variable language_">self</span>.complex_keywords = [</span><br><span class="line">            <span class="comment"># 中文复杂任务</span></span><br><span class="line">            <span class="string">&quot;分析&quot;</span>, <span class="string">&quot;比较&quot;</span>, <span class="string">&quot;设计&quot;</span>, <span class="string">&quot;架构&quot;</span>, <span class="string">&quot;推理&quot;</span>, <span class="string">&quot;证明&quot;</span>, <span class="string">&quot;评估&quot;</span>, <span class="string">&quot;总结&quot;</span>,</span><br><span class="line">            <span class="string">&quot;深度&quot;</span>, <span class="string">&quot;详细&quot;</span>, <span class="string">&quot;全面&quot;</span>, <span class="string">&quot;系统&quot;</span>, <span class="string">&quot;研究&quot;</span>, <span class="string">&quot;解释原因&quot;</span>, <span class="string">&quot;为什么&quot;</span>,</span><br><span class="line">            <span class="string">&quot;如何实现&quot;</span>, <span class="string">&quot;如何解决&quot;</span>, <span class="string">&quot;论述&quot;</span>, <span class="string">&quot;阐述&quot;</span>, <span class="string">&quot;评估&quot;</span>, <span class="string">&quot;判断&quot;</span>,</span><br><span class="line">            <span class="comment"># 英文复杂任务</span></span><br><span class="line">            <span class="string">&quot;analyze&quot;</span>, <span class="string">&quot;compare&quot;</span>, <span class="string">&quot;design&quot;</span>, <span class="string">&quot;architect&quot;</span>, <span class="string">&quot;reason&quot;</span>, <span class="string">&quot;prove&quot;</span>,</span><br><span class="line">            <span class="string">&quot;evaluate&quot;</span>, <span class="string">&quot;synthesize&quot;</span>, <span class="string">&quot;comprehensive&quot;</span>, <span class="string">&quot;detailed&quot;</span>, <span class="string">&quot;explain why&quot;</span>,</span><br><span class="line">            <span class="string">&quot;how to implement&quot;</span>, <span class="string">&quot;discuss&quot;</span>, <span class="string">&quot;assess&quot;</span>, <span class="string">&quot;critical thinking&quot;</span>,</span><br><span class="line">            <span class="comment"># 数学/逻辑</span></span><br><span class="line">            <span class="string">&quot;计算&quot;</span>, <span class="string">&quot;推导&quot;</span>, <span class="string">&quot;求解&quot;</span>, <span class="string">&quot;证明&quot;</span>, <span class="string">&quot;calculate&quot;</span>, <span class="string">&quot;derive&quot;</span>, <span class="string">&quot;solve&quot;</span>,</span><br><span class="line">            <span class="comment"># 代码相关</span></span><br><span class="line">            <span class="string">&quot;debug&quot;</span>, <span class="string">&quot;optimize&quot;</span>, <span class="string">&quot;refactor&quot;</span>, <span class="string">&quot;重构&quot;</span>, <span class="string">&quot;优化&quot;</span>, <span class="string">&quot;调试&quot;</span></span><br><span class="line">        ]</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 简单任务关键词</span></span><br><span class="line">        <span class="variable language_">self</span>.simple_keywords = [</span><br><span class="line">            <span class="string">&quot;你好&quot;</span>, <span class="string">&quot;hi&quot;</span>, <span class="string">&quot;hello&quot;</span>, <span class="string">&quot;嗨&quot;</span>, <span class="string">&quot;hey&quot;</span>,</span><br><span class="line">            <span class="string">&quot;谢谢&quot;</span>, <span class="string">&quot;thanks&quot;</span>, <span class="string">&quot;thank you&quot;</span>,</span><br><span class="line">            <span class="string">&quot;查询&quot;</span>, <span class="string">&quot;look up&quot;</span>, <span class="string">&quot;search&quot;</span>,</span><br><span class="line">            <span class="string">&quot;翻译&quot;</span>, <span class="string">&quot;translate&quot;</span>,</span><br><span class="line">            <span class="string">&quot;今天&quot;</span>, <span class="string">&quot;天气&quot;</span>, <span class="string">&quot;时间&quot;</span>, <span class="string">&quot;日期&quot;</span>, <span class="string">&quot;today&quot;</span>, <span class="string">&quot;weather&quot;</span>, <span class="string">&quot;time&quot;</span>, <span class="string">&quot;date&quot;</span>,</span><br><span class="line">            <span class="string">&quot;问候&quot;</span>, <span class="string">&quot;greeting&quot;</span>, <span class="string">&quot;打招呼&quot;</span>,</span><br><span class="line">            <span class="string">&quot;简单&quot;</span>, <span class="string">&quot;easy&quot;</span>, <span class="string">&quot;simple&quot;</span>,</span><br><span class="line">            <span class="string">&quot;是什么&quot;</span>, <span class="string">&quot;what is&quot;</span>, <span class="string">&quot;who is&quot;</span>, <span class="string">&quot;define&quot;</span></span><br><span class="line">        ]</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">_calculate_complexity_score</span>(<span class="params">self, text: <span class="built_in">str</span></span>) -&gt; <span class="built_in">int</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        计算 prompt 复杂度分数</span></span><br><span class="line"><span class="string">        返回值越高表示越复杂</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        score = <span class="number">0</span></span><br><span class="line">        text_lower = text.lower()</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 1. Token 数量 (粗略估算)</span></span><br><span class="line">        tokens = <span class="built_in">len</span>(text.split())</span><br><span class="line">        <span class="keyword">if</span> tokens &gt; <span class="number">1000</span>:</span><br><span class="line">            score += <span class="number">4</span></span><br><span class="line">        <span class="keyword">elif</span> tokens &gt; <span class="number">500</span>:</span><br><span class="line">            score += <span class="number">3</span></span><br><span class="line">        <span class="keyword">elif</span> tokens &gt; <span class="number">200</span>:</span><br><span class="line">            score += <span class="number">2</span></span><br><span class="line">        <span class="keyword">elif</span> tokens &gt; <span class="number">50</span>:</span><br><span class="line">            score += <span class="number">1</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 2. 复杂任务关键词匹配</span></span><br><span class="line">        <span class="keyword">for</span> keyword <span class="keyword">in</span> <span class="variable language_">self</span>.complex_keywords:</span><br><span class="line">            <span class="keyword">if</span> keyword.lower() <span class="keyword">in</span> text_lower:</span><br><span class="line">                score += <span class="number">1</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 3. 简单任务关键词匹配</span></span><br><span class="line">        <span class="keyword">for</span> keyword <span class="keyword">in</span> <span class="variable language_">self</span>.simple_keywords:</span><br><span class="line">            <span class="keyword">if</span> keyword.lower() <span class="keyword">in</span> text_lower:</span><br><span class="line">                score -= <span class="number">2</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 4. 代码/技术内容判断</span></span><br><span class="line">        code_indicators = [<span class="string">&quot;```&quot;</span>, <span class="string">&quot;def &quot;</span>, <span class="string">&quot;class &quot;</span>, <span class="string">&quot;function&quot;</span>, <span class="string">&quot;import &quot;</span>,</span><br><span class="line">                          <span class="string">&quot;代码&quot;</span>, <span class="string">&quot;code&quot;</span>, <span class="string">&quot;python&quot;</span>, <span class="string">&quot;javascript&quot;</span>, <span class="string">&quot;api&quot;</span>]</span><br><span class="line">        <span class="keyword">for</span> indicator <span class="keyword">in</span> code_indicators:</span><br><span class="line">            <span class="keyword">if</span> indicator <span class="keyword">in</span> text_lower:</span><br><span class="line">                score += <span class="number">1</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 5. 问号数量（提问复杂度）</span></span><br><span class="line">        question_count = text.count(<span class="string">&#x27;?&#x27;</span>) + text.count(<span class="string">&#x27;？&#x27;</span>)</span><br><span class="line">        <span class="keyword">if</span> question_count &gt;= <span class="number">3</span>:</span><br><span class="line">            score += <span class="number">2</span></span><br><span class="line">        <span class="keyword">elif</span> question_count &gt;= <span class="number">1</span>:</span><br><span class="line">            score += <span class="number">1</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 6. 否定简单问候</span></span><br><span class="line">        greeting_patterns = [</span><br><span class="line">            <span class="string">r&#x27;^你好[吗呀啊]?&#x27;</span>, <span class="string">r&#x27;^hi\s*$&#x27;</span>, <span class="string">r&#x27;^hello\s*$&#x27;</span>, <span class="string">r&#x27;^hey\s*$&#x27;</span>,</span><br><span class="line">            <span class="string">r&#x27;^嗨[吗呀啊]?&#x27;</span>, <span class="string">r&#x27;^嗨$&#x27;</span></span><br><span class="line">        ]</span><br><span class="line">        <span class="keyword">for</span> pattern <span class="keyword">in</span> greeting_patterns:</span><br><span class="line">            <span class="keyword">if</span> re.<span class="keyword">match</span>(pattern, text.strip(), re.IGNORECASE):</span><br><span class="line">                score = -<span class="number">10</span>  <span class="comment"># 强制为简单任务</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> score</span><br><span class="line"></span><br><span class="line">    <span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">async_pre_call_hook</span>(<span class="params"></span></span><br><span class="line"><span class="params">        self,</span></span><br><span class="line"><span class="params">        user_api_key_dict: <span class="type">Any</span>,</span></span><br><span class="line"><span class="params">        cache: <span class="type">Any</span>,</span></span><br><span class="line"><span class="params">        data: <span class="type">Dict</span>,</span></span><br><span class="line"><span class="params">        call_type: <span class="type">Literal</span>[<span class="string">&quot;completion&quot;</span>, <span class="string">&quot;text_completion&quot;</span>, <span class="string">&quot;embeddings&quot;</span>,</span></span><br><span class="line"><span class="params">                          <span class="string">&quot;image_generation&quot;</span>, <span class="string">&quot;moderation&quot;</span>, <span class="string">&quot;audio_transcription&quot;</span>]</span></span><br><span class="line"><span class="params">    </span>) -&gt; <span class="type">Dict</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        LiteLLM Pre-Call Hook</span></span><br><span class="line"><span class="string">        在请求发送到模型之前修改模型选择</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        Args:</span></span><br><span class="line"><span class="string">            user_api_key_dict: 用户 API 密钥信息</span></span><br><span class="line"><span class="string">            cache: 缓存实例</span></span><br><span class="line"><span class="string">            data: 请求数据 (包含 messages, model 等)</span></span><br><span class="line"><span class="string">            call_type: 调用类型</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">        Returns:</span></span><br><span class="line"><span class="string">            修改后的 data (其中 model 字段被替换)</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="comment"># 只处理 completion 调用</span></span><br><span class="line">        <span class="keyword">if</span> call_type != <span class="string">&quot;completion&quot;</span>:</span><br><span class="line">            <span class="keyword">return</span> data</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 提取文本内容</span></span><br><span class="line">        messages = data.get(<span class="string">&quot;messages&quot;</span>, [])</span><br><span class="line">        text_content = <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> message <span class="keyword">in</span> messages:</span><br><span class="line">            <span class="keyword">if</span> <span class="built_in">isinstance</span>(message, <span class="built_in">dict</span>):</span><br><span class="line">                content = message.get(<span class="string">&quot;content&quot;</span>, <span class="string">&quot;&quot;</span>)</span><br><span class="line">                <span class="keyword">if</span> <span class="built_in">isinstance</span>(content, <span class="built_in">str</span>):</span><br><span class="line">                    text_content += content + <span class="string">&quot; &quot;</span></span><br><span class="line">            <span class="keyword">elif</span> <span class="built_in">isinstance</span>(message, <span class="built_in">str</span>):</span><br><span class="line">                text_content += message + <span class="string">&quot; &quot;</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 计算复杂度分数</span></span><br><span class="line">        complexity_score = <span class="variable language_">self</span>._calculate_complexity_score(text_content)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 路由决策</span></span><br><span class="line">        <span class="keyword">if</span> complexity_score &gt;= <span class="variable language_">self</span>.threshold:</span><br><span class="line">            <span class="comment"># 复杂任务 → 云端推理模型</span></span><br><span class="line">            target_model = <span class="string">&quot;astron-code-latest&quot;</span></span><br><span class="line">            route_reason = <span class="string">f&quot;complex (score=<span class="subst">&#123;complexity_score&#125;</span>)&quot;</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="comment"># 简单任务 → 本地模型</span></span><br><span class="line">            target_model = <span class="string">&quot;qwen-local&quot;</span></span><br><span class="line">            route_reason = <span class="string">f&quot;simple (score=<span class="subst">&#123;complexity_score&#125;</span>)&quot;</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 记录路由决策</span></span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;[ComplexityRouter] <span class="subst">&#123;route_reason&#125;</span> → <span class="subst">&#123;target_model&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;[ComplexityRouter] Text preview: <span class="subst">&#123;text_content[:<span class="number">100</span>]&#125;</span>...&quot;</span>)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 修改请求中的模型</span></span><br><span class="line">        data[<span class="string">&quot;model&quot;</span>] = target_model</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> data</span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建全局实例供 config.yaml 引用</span></span><br><span class="line">complexity_router_instance = ComplexityRouter()</span><br></pre></td></tr></table></figure><h3 id="3-2-复杂度评分说明"><a href="#3-2-复杂度评分说明" class="headerlink" title="3.2 复杂度评分说明"></a>3.2 复杂度评分说明</h3><table><thead><tr><th>特征</th><th>分值</th><th>说明</th></tr></thead><tbody><tr><td>Token &gt; 1000</td><td>+4</td><td>超长文本</td></tr><tr><td>Token 500-1000</td><td>+3</td><td>长文本</td></tr><tr><td>Token 200-500</td><td>+2</td><td>中等长度</td></tr><tr><td>Token 50-200</td><td>+1</td><td>短文本</td></tr><tr><td>复杂关键词</td><td>+1&#x2F;个</td><td>分析、比较、设计等</td></tr><tr><td>简单关键词</td><td>-2&#x2F;个</td><td>你好、查询、翻译等</td></tr><tr><td>代码内容</td><td>+1</td><td>包含代码标记</td></tr><tr><td>多个问号</td><td>+1~2</td><td>深度提问</td></tr></tbody></table><p><strong>示例</strong>：</p><table><thead><tr><th>输入</th><th>分数</th><th>路由</th></tr></thead><tbody><tr><td>“你好”</td><td>-10</td><td>本地 (qwen-local)</td></tr><tr><td>“翻译 hello world”</td><td>-3</td><td>本地 (qwen-local)</td></tr><tr><td>“解释量子计算原理”</td><td>3</td><td>云端 (astron-code-latest)</td></tr><tr><td>“分析人工智能对就业市场的影响”</td><td>5</td><td>云端 (astron-code-latest)</td></tr></tbody></table><h3 id="3-3-工具感知路由（Tool-Aware-Routing）"><a href="#3-3-工具感知路由（Tool-Aware-Routing）" class="headerlink" title="3.3 工具感知路由（Tool-Aware Routing）"></a>3.3 工具感知路由（Tool-Aware Routing）</h3><p>OpenClaw 的核心能力是工具调用（Function Calling），不同工具对模型能力要求差异巨大。以下是工具场景的路由建议：</p><h4 id="工具类型与模型匹配矩阵"><a href="#工具类型与模型匹配矩阵" class="headerlink" title="工具类型与模型匹配矩阵"></a>工具类型与模型匹配矩阵</h4><table><thead><tr><th>工具类型</th><th>示例场景</th><th>推荐模型</th><th>原因</th></tr></thead><tbody><tr><td><strong>简单查询</strong></td><td>查天气、查时间、简单计算</td><td>qwen-local (本地)</td><td>零成本、毫秒响应</td></tr><tr><td><strong>文件操作</strong></td><td>读取本地文件、列出目录</td><td>qwen-local (本地)</td><td>本地数据处理，快速响应</td></tr><tr><td><strong>文件编辑</strong></td><td>写代码、改配置、创建文件</td><td>astron-code-latest (云端)</td><td>需要代码补全和语法理解</td></tr><tr><td><strong>网页搜索</strong></td><td>Google搜索、新闻查询</td><td>astron-code-latest (云端)</td><td>需要联网能力和最新知识</td></tr><tr><td><strong>网页内容提取</strong></td><td>抓取网页、解析HTML</td><td>astron-code-latest (云端)</td><td>需要理解和处理结构化数据</td></tr><tr><td><strong>浏览器自动化</strong></td><td>填表单、点击操作、爬虫</td><td>astron-code-latest (云端)</td><td>需要多步推理和视觉理解</td></tr><tr><td><strong>代码调试</strong></td><td>修复Bug、性能分析</td><td>astron-code-latest (云端)</td><td>需要深度推理和复杂分析</td></tr><tr><td><strong>架构设计</strong></td><td>系统设计、API规划</td><td>astron-code-latest (云端)</td><td>需要复杂推理和多轮思考</td></tr><tr><td><strong>多工具编排</strong></td><td>Agent子任务、多步骤工作流</td><td>astron-code-latest (云端)</td><td>需要长期规划和状态管理</td></tr></tbody></table><h4 id="工具感知路由流程图"><a href="#工具感知路由流程图" class="headerlink" title="工具感知路由流程图"></a>工具感知路由流程图</h4><pre><code class="highlight mermaid">flowchart TD    A[&quot;用户请求&quot;] --&gt; B&#123;检测工具调用意图?&#125;    B --&gt;|无| C&#123;文本复杂度评估&#125;    C --&gt;|简单| C1[&quot;qwen-local&lt;br/&gt;(本地)&quot;]    C --&gt;|复杂| C2[&quot;astron-code-latest&lt;br/&gt;(云端)&quot;]    B --&gt;|是| D&#123;&quot;工具类型?&quot;&#125;    D --&gt;|简单查询/文件读取| E[&quot;qwen-local&lt;br/&gt;(本地)&quot;]    D --&gt;|文件编辑/网页操作| F[&quot;astron-code-latest&lt;br/&gt;(云端)&quot;]    D --&gt;|代码调试/架构设计| G[&quot;astron-code-latest&lt;br/&gt;(云端)&quot;]    D --&gt;|多工具编排| H[&quot;astron-code-latest&lt;br/&gt;(云端)&quot;]    C1 --&gt; Z[&quot;返回结果&quot;]    C2 --&gt; Z    E --&gt; Z    F --&gt; Z    G --&gt; Z    H --&gt; Z</code></pre><h4 id="增强版复杂度路由器"><a href="#增强版复杂度路由器" class="headerlink" title="增强版复杂度路由器"></a>增强版复杂度路由器</h4><p>更新 <code>complexity_router.py</code> 以支持工具感知路由：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">LiteLLM 增强版复杂度路由 Hook</span></span><br><span class="line"><span class="string">支持工具感知路由，根据任务类型和复杂度自动选择模型</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">路由策略：</span></span><br><span class="line"><span class="string">- 简单任务 → 本地模型 (oMLX Qwen3.5-4B)</span></span><br><span class="line"><span class="string">- 工具操作 → 根据工具类型选择</span></span><br><span class="line"><span class="string">- 复杂推理 → 云端推理模型 (DeepSeek Reasoner)</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">from</span> typing <span class="keyword">import</span> <span class="type">Any</span>, <span class="type">Dict</span>, <span class="type">Literal</span>, <span class="type">Optional</span>, <span class="type">List</span></span><br><span class="line"><span class="keyword">from</span> litellm.integrations.custom_logger <span class="keyword">import</span> CustomLogger</span><br><span class="line"><span class="keyword">from</span> litellm.types.utils <span class="keyword">import</span> ModelResponse</span><br><span class="line"><span class="keyword">import</span> litellm</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">EnhancedComplexityRouter</span>(<span class="title class_ inherited__">CustomLogger</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    增强版复杂度路由器：支持工具感知的智能路由</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">__init__</span>(<span class="params">self</span>):</span><br><span class="line">        <span class="built_in">super</span>().__init__()</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 复杂度阈值</span></span><br><span class="line">        <span class="variable language_">self</span>.text_threshold = <span class="number">2</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 工具类型与模型映射</span></span><br><span class="line">        <span class="variable language_">self</span>.tool_model_mapping = &#123;</span><br><span class="line">            <span class="comment"># 简单工具 → 本地模型</span></span><br><span class="line">            <span class="string">&quot;simple&quot;</span>: &#123;</span><br><span class="line">                <span class="string">&quot;tools&quot;</span>: [</span><br><span class="line">                    <span class="string">&quot;weather&quot;</span>, <span class="string">&quot;time&quot;</span>, <span class="string">&quot;date&quot;</span>, <span class="string">&quot;calculator&quot;</span>, <span class="string">&quot;simple_search&quot;</span>,</span><br><span class="line">                    <span class="string">&quot;read_file&quot;</span>, <span class="string">&quot;list_directory&quot;</span>, <span class="string">&quot;get_time&quot;</span>, <span class="string">&quot;currency_convert&quot;</span></span><br><span class="line">                ],</span><br><span class="line">                <span class="string">&quot;model&quot;</span>: <span class="string">&quot;qwen-local&quot;</span></span><br><span class="line">            &#125;,</span><br><span class="line">            <span class="comment"># 中等复杂度 → 云端聊天模型</span></span><br><span class="line">            <span class="string">&quot;medium&quot;</span>: &#123;</span><br><span class="line">                <span class="string">&quot;tools&quot;</span>: [</span><br><span class="line">                    <span class="string">&quot;write_file&quot;</span>, <span class="string">&quot;edit_file&quot;</span>, <span class="string">&quot;web_search&quot;</span>, <span class="string">&quot;web_scrape&quot;</span>,</span><br><span class="line">                    <span class="string">&quot;image_generation&quot;</span>, <span class="string">&quot;document_parser&quot;</span>, <span class="string">&quot;api_call&quot;</span>,</span><br><span class="line">                    <span class="string">&quot;send_message&quot;</span>, <span class="string">&quot;create_reminder&quot;</span></span><br><span class="line">                ],</span><br><span class="line">                <span class="string">&quot;model&quot;</span>: <span class="string">&quot;astron-code-latest&quot;</span></span><br><span class="line">            &#125;,</span><br><span class="line">            <span class="comment"># 高复杂度 → 云端推理模型</span></span><br><span class="line">            <span class="string">&quot;complex&quot;</span>: &#123;</span><br><span class="line">                <span class="string">&quot;tools&quot;</span>: [</span><br><span class="line">                    <span class="string">&quot;debug&quot;</span>, <span class="string">&quot;code_review&quot;</span>, <span class="string">&quot;architecture_design&quot;</span>, <span class="string">&quot;security_audit&quot;</span>,</span><br><span class="line">                    <span class="string">&quot;multi_agent&quot;</span>, <span class="string">&quot;workflow_orchestration&quot;</span>, <span class="string">&quot;data_analysis&quot;</span>,</span><br><span class="line">                    <span class="string">&quot;report_generation&quot;</span>, <span class="string">&quot;research_synthesis&quot;</span></span><br><span class="line">                ],</span><br><span class="line">                <span class="string">&quot;model&quot;</span>: <span class="string">&quot;astron-code-latest&quot;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 复杂任务关键词</span></span><br><span class="line">        <span class="variable language_">self</span>.complex_keywords = [</span><br><span class="line">            <span class="string">&quot;分析&quot;</span>, <span class="string">&quot;比较&quot;</span>, <span class="string">&quot;设计&quot;</span>, <span class="string">&quot;架构&quot;</span>, <span class="string">&quot;推理&quot;</span>, <span class="string">&quot;证明&quot;</span>, <span class="string">&quot;评估&quot;</span>, <span class="string">&quot;总结&quot;</span>,</span><br><span class="line">            <span class="string">&quot;深度&quot;</span>, <span class="string">&quot;详细&quot;</span>, <span class="string">&quot;全面&quot;</span>, <span class="string">&quot;系统&quot;</span>, <span class="string">&quot;研究&quot;</span>, <span class="string">&quot;解释原因&quot;</span>, <span class="string">&quot;为什么&quot;</span>,</span><br><span class="line">            <span class="string">&quot;如何实现&quot;</span>, <span class="string">&quot;如何解决&quot;</span>, <span class="string">&quot;论述&quot;</span>, <span class="string">&quot;阐述&quot;</span>, <span class="string">&quot;判断&quot;</span>,</span><br><span class="line">            <span class="string">&quot;analyze&quot;</span>, <span class="string">&quot;compare&quot;</span>, <span class="string">&quot;design&quot;</span>, <span class="string">&quot;architect&quot;</span>, <span class="string">&quot;reason&quot;</span>, <span class="string">&quot;prove&quot;</span>,</span><br><span class="line">            <span class="string">&quot;evaluate&quot;</span>, <span class="string">&quot;synthesize&quot;</span>, <span class="string">&quot;comprehensive&quot;</span>, <span class="string">&quot;debug&quot;</span>, <span class="string">&quot;optimize&quot;</span></span><br><span class="line">        ]</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 简单任务关键词</span></span><br><span class="line">        <span class="variable language_">self</span>.simple_keywords = [</span><br><span class="line">            <span class="string">&quot;你好&quot;</span>, <span class="string">&quot;hi&quot;</span>, <span class="string">&quot;hello&quot;</span>, <span class="string">&quot;嗨&quot;</span>, <span class="string">&quot;hey&quot;</span>,</span><br><span class="line">            <span class="string">&quot;谢谢&quot;</span>, <span class="string">&quot;thanks&quot;</span>, <span class="string">&quot;查询&quot;</span>, <span class="string">&quot;翻译&quot;</span>, <span class="string">&quot;天气&quot;</span>, <span class="string">&quot;时间&quot;</span>,</span><br><span class="line">            <span class="string">&quot;问候&quot;</span>, <span class="string">&quot;打招呼&quot;</span>, <span class="string">&quot;是什么&quot;</span>, <span class="string">&quot;what is&quot;</span>, <span class="string">&quot;define&quot;</span></span><br><span class="line">        ]</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">_detect_tool_intent</span>(<span class="params">self, text: <span class="built_in">str</span>, messages: <span class="type">List</span>[<span class="type">Dict</span>]</span>) -&gt; <span class="type">Optional</span>[<span class="built_in">str</span>]:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        检测是否有工具调用意图</span></span><br><span class="line"><span class="string">        返回工具类型：simple, medium, complex, 或 None</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        text_lower = text.lower()</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 检查最后一条用户消息是否暗示使用工具</span></span><br><span class="line">        tool_indicators = &#123;</span><br><span class="line">            <span class="string">&quot;simple&quot;</span>: [</span><br><span class="line">                <span class="string">&quot;查一下天气&quot;</span>, <span class="string">&quot;现在几点了&quot;</span>, <span class="string">&quot;今天多少号&quot;</span>, <span class="string">&quot;帮我算一下&quot;</span>,</span><br><span class="line">                <span class="string">&quot;weather&quot;</span>, <span class="string">&quot;time&quot;</span>, <span class="string">&quot;date&quot;</span>, <span class="string">&quot;what time is it&quot;</span></span><br><span class="line">            ],</span><br><span class="line">            <span class="string">&quot;medium&quot;</span>: [</span><br><span class="line">                <span class="string">&quot;帮我写一个文件&quot;</span>, <span class="string">&quot;搜索一下&quot;</span>, <span class="string">&quot;查找网页&quot;</span>, <span class="string">&quot;发消息&quot;</span>,</span><br><span class="line">                <span class="string">&quot;write&quot;</span>, <span class="string">&quot;search&quot;</span>, <span class="string">&quot;scrape&quot;</span>, <span class="string">&quot;send&quot;</span>, <span class="string">&quot;create file&quot;</span>,</span><br><span class="line">                <span class="string">&quot;帮我发送&quot;</span>, <span class="string">&quot;生成图片&quot;</span></span><br><span class="line">            ],</span><br><span class="line">            <span class="string">&quot;complex&quot;</span>: [</span><br><span class="line">                <span class="string">&quot;帮我debug&quot;</span>, <span class="string">&quot;代码审查&quot;</span>, <span class="string">&quot;架构设计&quot;</span>, <span class="string">&quot;安全审计&quot;</span>,</span><br><span class="line">                <span class="string">&quot;帮我分析这段代码&quot;</span>, <span class="string">&quot;多步骤完成&quot;</span>, <span class="string">&quot;自动执行&quot;</span>,</span><br><span class="line">                <span class="string">&quot;debug&quot;</span>, <span class="string">&quot;review&quot;</span>, <span class="string">&quot;architect&quot;</span>, <span class="string">&quot;audit&quot;</span>, <span class="string">&quot;analyze code&quot;</span>,</span><br><span class="line">                <span class="string">&quot;帮我规划&quot;</span>, <span class="string">&quot;research&quot;</span></span><br><span class="line">            ]</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> level, indicators <span class="keyword">in</span> tool_indicators.items():</span><br><span class="line">            <span class="keyword">for</span> indicator <span class="keyword">in</span> indicators:</span><br><span class="line">                <span class="keyword">if</span> indicator.lower() <span class="keyword">in</span> text_lower:</span><br><span class="line">                    <span class="keyword">return</span> level</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 检查消息历史中是否有工具调用</span></span><br><span class="line">        <span class="keyword">for</span> msg <span class="keyword">in</span> messages[-<span class="number">3</span>:]:  <span class="comment"># 检查最近3条消息</span></span><br><span class="line">            <span class="keyword">if</span> <span class="built_in">isinstance</span>(msg, <span class="built_in">dict</span>):</span><br><span class="line">                content = msg.get(<span class="string">&quot;content&quot;</span>, <span class="string">&quot;&quot;</span>)</span><br><span class="line">                tool_calls = msg.get(<span class="string">&quot;tool_calls&quot;</span>, [])</span><br><span class="line">                <span class="keyword">if</span> tool_calls:</span><br><span class="line">                    <span class="comment"># 有工具调用，检查工具名称</span></span><br><span class="line">                    <span class="keyword">for</span> call <span class="keyword">in</span> tool_calls:</span><br><span class="line">                        func_name = call.get(<span class="string">&quot;function&quot;</span>, &#123;&#125;).get(<span class="string">&quot;name&quot;</span>, <span class="string">&quot;&quot;</span>).lower()</span><br><span class="line">                        <span class="keyword">for</span> level, config <span class="keyword">in</span> <span class="variable language_">self</span>.tool_model_mapping.items():</span><br><span class="line">                            <span class="keyword">if</span> func_name <span class="keyword">in</span> config[<span class="string">&quot;tools&quot;</span>]:</span><br><span class="line">                                <span class="keyword">return</span> level</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">_calculate_complexity_score</span>(<span class="params">self, text: <span class="built_in">str</span></span>) -&gt; <span class="built_in">int</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        计算纯文本复杂度分数</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        score = <span class="number">0</span></span><br><span class="line">        text_lower = text.lower()</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 1. Token 数量</span></span><br><span class="line">        tokens = <span class="built_in">len</span>(text.split())</span><br><span class="line">        <span class="keyword">if</span> tokens &gt; <span class="number">1000</span>:</span><br><span class="line">            score += <span class="number">4</span></span><br><span class="line">        <span class="keyword">elif</span> tokens &gt; <span class="number">500</span>:</span><br><span class="line">            score += <span class="number">3</span></span><br><span class="line">        <span class="keyword">elif</span> tokens &gt; <span class="number">200</span>:</span><br><span class="line">            score += <span class="number">2</span></span><br><span class="line">        <span class="keyword">elif</span> tokens &gt; <span class="number">50</span>:</span><br><span class="line">            score += <span class="number">1</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 2. 复杂关键词</span></span><br><span class="line">        <span class="keyword">for</span> keyword <span class="keyword">in</span> <span class="variable language_">self</span>.complex_keywords:</span><br><span class="line">            <span class="keyword">if</span> keyword.lower() <span class="keyword">in</span> text_lower:</span><br><span class="line">                score += <span class="number">1</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 3. 简单关键词</span></span><br><span class="line">        <span class="keyword">for</span> keyword <span class="keyword">in</span> <span class="variable language_">self</span>.simple_keywords:</span><br><span class="line">            <span class="keyword">if</span> keyword.lower() <span class="keyword">in</span> text_lower:</span><br><span class="line">                score -= <span class="number">2</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 4. 问号数量</span></span><br><span class="line">        question_count = text.count(<span class="string">&#x27;?&#x27;</span>) + text.count(<span class="string">&#x27;？&#x27;</span>)</span><br><span class="line">        <span class="keyword">if</span> question_count &gt;= <span class="number">3</span>:</span><br><span class="line">            score += <span class="number">2</span></span><br><span class="line">        <span class="keyword">elif</span> question_count &gt;= <span class="number">1</span>:</span><br><span class="line">            score += <span class="number">1</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 5. 问候检测</span></span><br><span class="line">        greeting_patterns = [</span><br><span class="line">            <span class="string">r&#x27;^你好[吗呀啊]?&#x27;</span>, <span class="string">r&#x27;^hi\s*$&#x27;</span>, <span class="string">r&#x27;^hello\s*$&#x27;</span>, <span class="string">r&#x27;^hey\s*$&#x27;</span></span><br><span class="line">        ]</span><br><span class="line">        <span class="keyword">for</span> pattern <span class="keyword">in</span> greeting_patterns:</span><br><span class="line">            <span class="keyword">if</span> re.<span class="keyword">match</span>(pattern, text.strip(), re.IGNORECASE):</span><br><span class="line">                score = -<span class="number">10</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> score</span><br><span class="line"></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">_select_model_for_tool</span>(<span class="params">self, tool_level: <span class="built_in">str</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        根据工具类型选择模型</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">if</span> tool_level <span class="keyword">in</span> <span class="variable language_">self</span>.tool_model_mapping:</span><br><span class="line">            <span class="keyword">return</span> <span class="variable language_">self</span>.tool_model_mapping[tool_level][<span class="string">&quot;model&quot;</span>]</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;astron-code-latest&quot;</span>  <span class="comment"># 默认使用云端聊天模型</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">async</span> <span class="keyword">def</span> <span class="title function_">async_pre_call_hook</span>(<span class="params"></span></span><br><span class="line"><span class="params">        self,</span></span><br><span class="line"><span class="params">        user_api_key_dict: <span class="type">Any</span>,</span></span><br><span class="line"><span class="params">        cache: <span class="type">Any</span>,</span></span><br><span class="line"><span class="params">        data: <span class="type">Dict</span>,</span></span><br><span class="line"><span class="params">        call_type: <span class="type">Literal</span>[<span class="string">&quot;completion&quot;</span>, <span class="string">&quot;text_completion&quot;</span>, <span class="string">&quot;embeddings&quot;</span>,</span></span><br><span class="line"><span class="params">                          <span class="string">&quot;image_generation&quot;</span>, <span class="string">&quot;moderation&quot;</span>, <span class="string">&quot;audio_transcription&quot;</span>]</span></span><br><span class="line"><span class="params">    </span>) -&gt; <span class="type">Dict</span>:</span><br><span class="line">        <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">        LiteLLM Pre-Call Hook</span></span><br><span class="line"><span class="string">        支持工具感知的智能路由</span></span><br><span class="line"><span class="string">        &quot;&quot;&quot;</span></span><br><span class="line">        <span class="keyword">if</span> call_type != <span class="string">&quot;completion&quot;</span>:</span><br><span class="line">            <span class="keyword">return</span> data</span><br><span class="line"></span><br><span class="line">        messages = data.get(<span class="string">&quot;messages&quot;</span>, [])</span><br><span class="line">        text_content = <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> message <span class="keyword">in</span> messages:</span><br><span class="line">            <span class="keyword">if</span> <span class="built_in">isinstance</span>(message, <span class="built_in">dict</span>):</span><br><span class="line">                content = message.get(<span class="string">&quot;content&quot;</span>, <span class="string">&quot;&quot;</span>)</span><br><span class="line">                <span class="keyword">if</span> <span class="built_in">isinstance</span>(content, <span class="built_in">str</span>):</span><br><span class="line">                    text_content += content + <span class="string">&quot; &quot;</span></span><br><span class="line">            <span class="keyword">elif</span> <span class="built_in">isinstance</span>(message, <span class="built_in">str</span>):</span><br><span class="line">                text_content += message + <span class="string">&quot; &quot;</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 1. 首先检测工具调用意图</span></span><br><span class="line">        tool_level = <span class="variable language_">self</span>._detect_tool_intent(text_content, messages)</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> tool_level:</span><br><span class="line">            <span class="comment"># 工具感知路由</span></span><br><span class="line">            target_model = <span class="variable language_">self</span>._select_model_for_tool(tool_level)</span><br><span class="line">            route_reason = <span class="string">f&quot;tool-<span class="subst">&#123;tool_level&#125;</span>&quot;</span></span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;[EnhancedRouter] <span class="subst">&#123;route_reason&#125;</span> → <span class="subst">&#123;target_model&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="comment"># 2. 纯文本复杂度路由</span></span><br><span class="line">            complexity_score = <span class="variable language_">self</span>._calculate_complexity_score(text_content)</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> complexity_score &gt;= <span class="variable language_">self</span>.text_threshold:</span><br><span class="line">                target_model = <span class="string">&quot;astron-code-latest&quot;</span></span><br><span class="line">                route_reason = <span class="string">f&quot;complex-text (score=<span class="subst">&#123;complexity_score&#125;</span>)&quot;</span></span><br><span class="line">            <span class="keyword">else</span>:</span><br><span class="line">                target_model = <span class="string">&quot;qwen-local&quot;</span></span><br><span class="line">                route_reason = <span class="string">f&quot;simple-text (score=<span class="subst">&#123;complexity_score&#125;</span>)&quot;</span></span><br><span class="line"></span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;[EnhancedRouter] <span class="subst">&#123;route_reason&#125;</span> → <span class="subst">&#123;target_model&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">        data[<span class="string">&quot;model&quot;</span>] = target_model</span><br><span class="line">        <span class="keyword">return</span> data</span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建全局实例</span></span><br><span class="line">enhanced_router_instance = EnhancedComplexityRouter()</span><br></pre></td></tr></table></figure><h4 id="工具场景路由示例"><a href="#工具场景路由示例" class="headerlink" title="工具场景路由示例"></a>工具场景路由示例</h4><table><thead><tr><th>用户请求</th><th>工具检测</th><th>路由决策</th><th>模型</th></tr></thead><tbody><tr><td>“你好”</td><td>无工具</td><td>简单文本</td><td>qwen-local</td></tr><tr><td>“查一下北京天气”</td><td>simple工具</td><td>天气查询</td><td>qwen-local</td></tr><tr><td>“帮我搜索OpenClaw最新消息”</td><td>medium工具</td><td>网页搜索</td><td>astron-code-latest</td></tr><tr><td>“这段代码有Bug帮我看看”</td><td>complex工具</td><td>代码调试</td><td>astron-code-latest</td></tr><tr><td>“分析这段Python代码的性能”</td><td>复杂文本</td><td>深度分析</td><td>astron-code-latest</td></tr><tr><td>“帮我设计一个微服务架构”</td><td>complex工具</td><td>架构设计</td><td>astron-code-latest</td></tr></tbody></table><h4 id="工具成本优化策略"><a href="#工具成本优化策略" class="headerlink" title="工具成本优化策略"></a>工具成本优化策略</h4><table><thead><tr><th>工具类型</th><th>月均调用占比</th><th>使用模型</th><th>月成本(假设1000次&#x2F;天)</th></tr></thead><tbody><tr><td>简单工具</td><td>~40%</td><td>qwen-local</td><td>$0</td></tr><tr><td>中等工具</td><td>~35%</td><td>astron-code-latest</td><td>~$15</td></tr><tr><td>复杂工具</td><td>~25%</td><td>astron-code-latest</td><td>~$25</td></tr><tr><td><strong>总计</strong></td><td>100%</td><td>智能路由</td><td><strong>~$40</strong></td></tr></tbody></table><p><strong>对比全云端方案</strong>：全部使用 astron-code-latest，月成本约 $100，节省 <strong>60%</strong>。</p><hr><h2 id="四、LiteLLM-配置文件"><a href="#四、LiteLLM-配置文件" class="headerlink" title="四、LiteLLM 配置文件"></a>四、LiteLLM 配置文件</h2><p>创建 <code>~/.openclaw/litellm/config.yaml</code>：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ===========================================</span></span><br><span class="line"><span class="comment"># 模型列表定义</span></span><br><span class="line"><span class="comment"># ===========================================</span></span><br><span class="line"><span class="attr">model_list:</span></span><br><span class="line">  <span class="comment"># ─────────────────────────────────────────</span></span><br><span class="line">  <span class="comment"># 本地模型：oMLX Qwen3.5-4B</span></span><br><span class="line">  <span class="comment"># ─────────────────────────────────────────</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">model_name:</span> <span class="string">qwen-local</span></span><br><span class="line">    <span class="attr">litellm_params:</span></span><br><span class="line">      <span class="attr">model:</span> <span class="string">openai/qwen3.5-4b</span></span><br><span class="line">      <span class="attr">api_base:</span> <span class="string">http://localhost:8000/v1</span></span><br><span class="line">      <span class="attr">api_key:</span> <span class="string">&quot;omlx-local&quot;</span></span><br><span class="line">      <span class="attr">rpm:</span> <span class="number">60</span></span><br><span class="line">    <span class="attr">model_info:</span></span><br><span class="line">      <span class="attr">mode:</span> <span class="string">chat</span></span><br><span class="line">      <span class="attr">supports_function_calling:</span> <span class="literal">false</span></span><br><span class="line">      <span class="attr">supports_vision:</span> <span class="literal">false</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># ─────────────────────────────────────────</span></span><br><span class="line">  <span class="comment"># 云端模型：DeepSeek</span></span><br><span class="line">  <span class="comment"># ─────────────────────────────────────────</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">model_name:</span> <span class="string">astron-code-latest</span></span><br><span class="line">    <span class="attr">litellm_params:</span></span><br><span class="line">      <span class="attr">model:</span> <span class="string">deepseek/astron-code-latest</span></span><br><span class="line">      <span class="attr">api_key:</span> <span class="string">os.environ/DEEPSEEK_API_KEY</span></span><br><span class="line">      <span class="attr">rpm:</span> <span class="number">60</span></span><br><span class="line">    <span class="attr">model_info:</span></span><br><span class="line">      <span class="attr">mode:</span> <span class="string">chat</span></span><br><span class="line">      <span class="attr">supports_function_calling:</span> <span class="literal">true</span></span><br><span class="line"></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">model_name:</span> <span class="string">astron-code-latest</span></span><br><span class="line">    <span class="attr">litellm_params:</span></span><br><span class="line">      <span class="attr">model:</span> <span class="string">deepseek/astron-code-latest</span></span><br><span class="line">      <span class="attr">api_key:</span> <span class="string">os.environ/DEEPSEEK_API_KEY</span></span><br><span class="line">      <span class="attr">rpm:</span> <span class="number">10</span></span><br><span class="line">    <span class="attr">model_info:</span></span><br><span class="line">      <span class="attr">mode:</span> <span class="string">chat</span></span><br><span class="line">      <span class="attr">supports_function_calling:</span> <span class="literal">false</span></span><br><span class="line">      <span class="attr">supports_reasoning:</span> <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># ===========================================</span></span><br><span class="line"><span class="comment"># 复杂度路由 Hook</span></span><br><span class="line"><span class="comment"># ===========================================</span></span><br><span class="line"><span class="attr">litellm_settings:</span></span><br><span class="line">  <span class="comment"># 注册复杂度路由 Hook</span></span><br><span class="line">  <span class="attr">callbacks:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">complexity_router.complexity_router_instance</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 重试配置</span></span><br><span class="line">  <span class="attr">num_retries:</span> <span class="number">2</span></span><br><span class="line">  <span class="attr">request_timeout:</span> <span class="number">60</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 故障转移配置</span></span><br><span class="line">  <span class="attr">fallbacks:</span></span><br><span class="line">    <span class="comment"># 本地模型失败 → 云端模型</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">&quot;qwen-local&quot;:</span> [<span class="string">&quot;astron-code-latest&quot;</span>]</span><br><span class="line">    <span class="comment"># 云端推理失败 → 云端聊天模型 → 本地模型</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">&quot;astron-code-latest&quot;:</span> [<span class="string">&quot;astron-code-latest&quot;</span>, <span class="string">&quot;qwen-local&quot;</span>]</span><br><span class="line"></span><br><span class="line">  <span class="comment"># 上下文窗口溢出时降级</span></span><br><span class="line">  <span class="attr">context_window_fallbacks:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">&quot;qwen-local&quot;:</span> [<span class="string">&quot;astron-code-latest&quot;</span>]</span><br><span class="line">    <span class="bullet">-</span> <span class="attr">&quot;astron-code-latest&quot;:</span> [<span class="string">&quot;astron-code-latest&quot;</span>]</span><br><span class="line"></span><br><span class="line">  <span class="comment"># 允许的连续失败次数</span></span><br><span class="line">  <span class="attr">allowed_fails:</span> <span class="number">3</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 丢弃不支持的参数</span></span><br><span class="line">  <span class="attr">drop_params:</span> <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># ===========================================</span></span><br><span class="line"><span class="comment"># 路由策略</span></span><br><span class="line"><span class="comment"># ===========================================</span></span><br><span class="line"><span class="attr">router_settings:</span></span><br><span class="line">  <span class="comment"># 由于我们使用自定义复杂度路由，这里设置为 simple-shuffle 作为 fallback</span></span><br><span class="line">  <span class="attr">routing_strategy:</span> <span class="string">simple-shuffle</span></span><br><span class="line">  <span class="attr">timeout:</span> <span class="number">60</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># ===========================================</span></span><br><span class="line"><span class="comment"># 服务配置</span></span><br><span class="line"><span class="comment"># ===========================================</span></span><br><span class="line"><span class="attr">general_settings:</span></span><br><span class="line">  <span class="attr">master_key:</span> <span class="string">sk-openclaw-local</span></span><br><span class="line">  <span class="attr">port:</span> <span class="number">4000</span></span><br><span class="line">  <span class="attr">host:</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span></span><br></pre></td></tr></table></figure><hr><h2 id="五、环境变量配置"><a href="#五、环境变量配置" class="headerlink" title="五、环境变量配置"></a>五、环境变量配置</h2><p>创建 <code>~/.openclaw/litellm/.env</code>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 云端 API Keys</span></span><br><span class="line">DEEPSEEK_API_KEY=sk-your-deepseek-key</span><br></pre></td></tr></table></figure><hr><h2 id="五点五、配置-LiteLLM-Proxy-的复杂度路由-Hook"><a href="#五点五、配置-LiteLLM-Proxy-的复杂度路由-Hook" class="headerlink" title="五点五、配置 LiteLLM Proxy 的复杂度路由 Hook"></a>五点五、配置 LiteLLM Proxy 的复杂度路由 Hook</h2><p>在启动 LiteLLM Proxy 之前，确保 Hook 已正确配置：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. 确保复杂度路由器文件存在</span></span><br><span class="line"><span class="built_in">ls</span> -la ~/.openclaw/litellm/complexity_router.py</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 验证 config.yaml 中的 Hook 注册</span></span><br><span class="line">grep -A 5 <span class="string">&quot;callbacks&quot;</span> ~/.openclaw/litellm/config.yaml</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. 测试 Hook 导入</span></span><br><span class="line"><span class="built_in">cd</span> ~/.openclaw/litellm</span><br><span class="line">python -c <span class="string">&quot;from complexity_router import complexity_router_instance; print(&#x27;Hook loaded successfully&#x27;)&quot;</span></span><br></pre></td></tr></table></figure><hr><h2 id="六、启动与验证"><a href="#六、启动与验证" class="headerlink" title="六、启动与验证"></a>六、启动与验证</h2><h3 id="6-1-启动-LiteLLM-Proxy"><a href="#6-1-启动-LiteLLM-Proxy" class="headerlink" title="6.1 启动 LiteLLM Proxy"></a>6.1 启动 LiteLLM Proxy</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ~/.openclaw/litellm</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动服务</span></span><br><span class="line">litellm --config ~/.openclaw/litellm/config.yaml</span><br><span class="line"></span><br><span class="line"><span class="comment"># 或者后台运行</span></span><br><span class="line"><span class="built_in">nohup</span> litellm --config ~/.openclaw/litellm/config.yaml \</span><br><span class="line">  --detailed_debug &gt; litellm.log 2&gt;&amp;1 &amp;</span><br></pre></td></tr></table></figure><h3 id="6-2-验证服务"><a href="#6-2-验证服务" class="headerlink" title="6.2 验证服务"></a>6.2 验证服务</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. 检查健康状态</span></span><br><span class="line">curl http://localhost:4000/health</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 查看可用模型</span></span><br><span class="line">curl http://localhost:4000/v1/model/list</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. 测试简单任务（应路由到本地模型）</span></span><br><span class="line">curl -X POST http://localhost:4000/chat/completions \</span><br><span class="line">  -H <span class="string">&quot;Content-Type: application/json&quot;</span> \</span><br><span class="line">  -H <span class="string">&quot;Authorization: Bearer sk-openclaw-local&quot;</span> \</span><br><span class="line">  -d <span class="string">&#x27;&#123;</span></span><br><span class="line"><span class="string">    &quot;model&quot;: &quot;qwen-local&quot;,</span></span><br><span class="line"><span class="string">    &quot;messages&quot;: [&#123;&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;你好，请介绍一下自己&quot;&#125;]</span></span><br><span class="line"><span class="string">  &#125;&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 4. 测试复杂任务（应路由到云端模型）</span></span><br><span class="line">curl -X POST http://localhost:4000/chat/completions \</span><br><span class="line">  -H <span class="string">&quot;Content-Type: application/json&quot;</span> \</span><br><span class="line">  -H <span class="string">&quot;Authorization: Bearer sk-openclaw-local&quot;</span> \</span><br><span class="line">  -d <span class="string">&#x27;&#123;</span></span><br><span class="line"><span class="string">    &quot;model&quot;: &quot;astron-code-latest&quot;,</span></span><br><span class="line"><span class="string">    &quot;messages&quot;: [&#123;&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;深度分析人工智能对就业市场的影响，需要考虑技术进步、自动化、行业转型等多个维度&quot;&#125;]</span></span><br><span class="line"><span class="string">  &#125;&#x27;</span></span><br></pre></td></tr></table></figure><h3 id="6-3-查看日志验证路由"><a href="#6-3-查看日志验证路由" class="headerlink" title="6.3 查看日志验证路由"></a>6.3 查看日志验证路由</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看 LiteLLM 日志</span></span><br><span class="line"><span class="built_in">tail</span> -f ~/.openclaw/litellm/litellm.log | grep ComplexityRouter</span><br><span class="line"></span><br><span class="line"><span class="comment"># 预期输出示例：</span></span><br><span class="line"><span class="comment"># [ComplexityRouter] simple (score=-10) → qwen-local</span></span><br><span class="line"><span class="comment"># [ComplexityRouter] complex (score=3) → astron-code-latest</span></span><br></pre></td></tr></table></figure><h3 id="6-4-验证-OpenClaw-连接"><a href="#6-4-验证-OpenClaw-连接" class="headerlink" title="6.4 验证 OpenClaw 连接"></a>6.4 验证 OpenClaw 连接</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 测试 OpenClaw 与 LiteLLM Proxy 的连接</span></span><br><span class="line">curl -X POST http://localhost:4000/chat/completions \</span><br><span class="line">  -H <span class="string">&quot;Content-Type: application/json&quot;</span> \</span><br><span class="line">  -H <span class="string">&quot;Authorization: Bearer sk-openclaw-local&quot;</span> \</span><br><span class="line">  -d <span class="string">&#x27;&#123;</span></span><br><span class="line"><span class="string">    &quot;model&quot;: &quot;qwen-local&quot;,</span></span><br><span class="line"><span class="string">    &quot;messages&quot;: [&#123;&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;测试连接&quot;&#125;]</span></span><br><span class="line"><span class="string">  &#125;&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证复杂度路由是否生效</span></span><br><span class="line">curl -X POST http://localhost:4000/chat/completions \</span><br><span class="line">  -H <span class="string">&quot;Content-Type: application/json&quot;</span> \</span><br><span class="line">  -H <span class="string">&quot;Authorization: Bearer sk-openclaw-local&quot;</span> \</span><br><span class="line">  -d <span class="string">&#x27;&#123;</span></span><br><span class="line"><span class="string">    &quot;model&quot;: &quot;astron-code-latest&quot;,</span></span><br><span class="line"><span class="string">    &quot;messages&quot;: [&#123;&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;深度分析人工智能发展趋势&quot;&#125;]</span></span><br><span class="line"><span class="string">  &#125;&#x27;</span></span><br></pre></td></tr></table></figure><hr><h2 id="七、OpenClaw-配置"><a href="#七、OpenClaw-配置" class="headerlink" title="七、OpenClaw 配置"></a>七、OpenClaw 配置</h2><p><strong>重要说明</strong>：OpenClaw 的配置只是连接到已配置好的 LiteLLM Proxy。复杂度路由完全在 LiteLLM 层实现，OpenClaw 本身不具备此功能。</p><p>编辑 <code>~/.openclaw/openclaw.json</code>：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;meta&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;lastTouchedVersion&quot;</span><span class="punctuation">:</span> <span class="string">&quot;v2026.4.1&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;lastTouchedAt&quot;</span><span class="punctuation">:</span> <span class="string">&quot;2026-04-02T12:00:00.000Z&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;platform&quot;</span><span class="punctuation">:</span> <span class="string">&quot;apple-silicon&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;mlx_optimized&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;models&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;mode&quot;</span><span class="punctuation">:</span> <span class="string">&quot;merge&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;providers&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;local-omlx&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;baseUrl&quot;</span><span class="punctuation">:</span> <span class="string">&quot;http://localhost:8000/v1&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;apiKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;omlx-local&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;api&quot;</span><span class="punctuation">:</span> <span class="string">&quot;openai-completions&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;models&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">          <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="string">&quot;qwen3.5-4b-mlx-q4&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Qwen3.5-4B-MLX-4bit&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;contextWindow&quot;</span><span class="punctuation">:</span> <span class="number">32768</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;maxTokens&quot;</span><span class="punctuation">:</span> <span class="number">4096</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;reasoning&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;input&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;text&quot;</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;cost&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;input&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span> <span class="attr">&quot;output&quot;</span><span class="punctuation">:</span> <span class="number">0</span> <span class="punctuation">&#125;</span></span><br><span class="line">          <span class="punctuation">&#125;</span></span><br><span class="line">        <span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;litellm&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;baseUrl&quot;</span><span class="punctuation">:</span> <span class="string">&quot;http://localhost:4000&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;apiKey&quot;</span><span class="punctuation">:</span> <span class="string">&quot;sk-openclaw-local&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;api&quot;</span><span class="punctuation">:</span> <span class="string">&quot;openai-completions&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;models&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">          <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="string">&quot;qwen-local&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Qwen3.5-4B (LiteLLM)&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;contextWindow&quot;</span><span class="punctuation">:</span> <span class="number">32768</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;reasoning&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;input&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;text&quot;</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;cost&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span> <span class="attr">&quot;input&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span> <span class="attr">&quot;output&quot;</span><span class="punctuation">:</span> <span class="number">0</span> <span class="punctuation">&#125;</span></span><br><span class="line">          <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="string">&quot;astron-code-latest&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;DeepSeek-V3&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;contextWindow&quot;</span><span class="punctuation">:</span> <span class="number">64000</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;reasoning&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;input&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;text&quot;</span><span class="punctuation">]</span></span><br><span class="line">          <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="string">&quot;astron-code-latest&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;DeepSeek-R2&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;contextWindow&quot;</span><span class="punctuation">:</span> <span class="number">200000</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;reasoning&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;input&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;text&quot;</span><span class="punctuation">]</span></span><br><span class="line">          <span class="punctuation">&#125;</span></span><br><span class="line">        <span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;agents&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;defaults&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;model&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;primary&quot;</span><span class="punctuation">:</span> <span class="string">&quot;litellm/qwen-local&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;fallbacks&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">          <span class="string">&quot;litellm/astron-code-latest&quot;</span><span class="punctuation">,</span></span><br><span class="line">          <span class="string">&quot;litellm/astron-code-latest&quot;</span></span><br><span class="line">        <span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;fault_tolerance&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;enable_failover&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;max_retries&quot;</span><span class="punctuation">:</span> <span class="number">2</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><hr><h2 id="八、OpenClaw-原生路由能力"><a href="#八、OpenClaw-原生路由能力" class="headerlink" title="八、OpenClaw 原生路由能力"></a>八、OpenClaw 原生路由能力</h2><h3 id="8-1-多代理路由（Multi-Agent-Routing）"><a href="#8-1-多代理路由（Multi-Agent-Routing）" class="headerlink" title="8.1 多代理路由（Multi-Agent Routing）"></a>8.1 多代理路由（Multi-Agent Routing）</h3><p>OpenClaw 支持按渠道&#x2F;用户路由到不同 Agent，这与复杂度路由是<strong>不同的概念</strong>：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;channels&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;telegram&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;dmPolicy&quot;</span><span class="punctuation">:</span> <span class="string">&quot;routing&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;route&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;+8613812345678&quot;</span><span class="punctuation">:</span> <span class="string">&quot;agent-fast&quot;</span><span class="punctuation">,</span>      <span class="comment">// 快速问答代理</span></span><br><span class="line">        <span class="attr">&quot;+8613912345678&quot;</span><span class="punctuation">:</span> <span class="string">&quot;agent-coding&quot;</span>      <span class="comment">// 编程专用代理</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;discord&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;dmPolicy&quot;</span><span class="punctuation">:</span> <span class="string">&quot;routing&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;route&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;user-alpha&quot;</span><span class="punctuation">:</span> <span class="string">&quot;agent-fast&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;user-beta&quot;</span><span class="punctuation">:</span> <span class="string">&quot;agent-reasoning&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p><strong>用途</strong>：不同用户&#x2F;场景使用不同 Agent，而非根据任务复杂度选择模型。</p><h3 id="8-2-Model-Failover-机制"><a href="#8-2-Model-Failover-机制" class="headerlink" title="8.2 Model Failover 机制"></a>8.2 Model Failover 机制</h3><p>LiteLLM 的复杂度路由与 OpenClaw 的故障转移协同工作：</p><pre><code class="highlight mermaid">flowchart TB    A[&quot;用户请求&quot;] --&gt; B[&quot;LiteLLM 复杂度路由&lt;br/&gt;(async_pre_call_hook)&quot;]    B --&gt; C&#123;复杂度评分 → 模型选择&#125;    C --&gt;|简单| C1[&quot;qwen-local&lt;br/&gt;(本地)&quot;]    C --&gt;|复杂| C2[&quot;astron-code-latest&lt;br/&gt;(云端)&quot;]    C1 &amp; C2 --&gt; D&#123;模型可用?&#125;    D --&gt;|是| Z[&quot;返回结果&quot;]    D --&gt;|否| E[&quot;LiteLLM 故障转移&quot;]    subgraph LiteLLM_Fallback[&quot;LiteLLM 故障转移&quot;]        E[&quot;fallbacks 配置&quot;]        E --&gt; E1[&quot;qwen-local → astron-code-latest&quot;]        E --&gt; E2[&quot;astron-code-latest → astron-code-latest → qwen-local&quot;]    end    E1 &amp; E2 --&gt; F&#123;LiteLLM 层可用?&#125;    F --&gt;|否| G[&quot;OpenClaw Model Failover&quot;]    subgraph OpenClaw_Fallback[&quot;OpenClaw Model Failover&quot;]        G[&quot;agents.defaults.model.fallbacks&quot;]        G --&gt; G1[&quot;litellm/qwen-local → litellm/astron-code-latest → ...&quot;]    end    G1 --&gt; H[&quot;返回结果&quot;]    E1 &amp; E2 --&gt; H</code></pre><h3 id="8-3-路由能力总结"><a href="#8-3-路由能力总结" class="headerlink" title="8.3 路由能力总结"></a>8.3 路由能力总结</h3><table><thead><tr><th>路由类型</th><th>实现层</th><th>说明</th></tr></thead><tbody><tr><td><strong>复杂度智能路由</strong></td><td>LiteLLM Hook</td><td>✅ 本文方案</td></tr><tr><td><strong>多代理路由</strong></td><td>OpenClaw</td><td>✅ 按用户&#x2F;渠道</td></tr><tr><td><strong>故障转移</strong></td><td>双重</td><td>LiteLLM + OpenClaw</td></tr></tbody></table><hr><h2 id="九、测试完整流程"><a href="#九、测试完整流程" class="headerlink" title="九、测试完整流程"></a>九、测试完整流程</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. 重启 OpenClaw Gateway</span></span><br><span class="line">openclaw gateway restart</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 检查状态</span></span><br><span class="line">openclaw gateway status</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. 运行健康检查</span></span><br><span class="line">openclaw doctor</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4. 测试复杂度路由（通过 LiteLLM Hook 实现）</span></span><br><span class="line"><span class="comment"># 简单任务 → 自动路由到本地模型</span></span><br><span class="line">openclaw run <span class="string">&quot;你好&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 复杂任务 → 自动路由到云端推理模型</span></span><br><span class="line">openclaw run <span class="string">&quot;深度分析量子计算对未来 cryptography 的影响&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 5. 查看日志</span></span><br><span class="line">openclaw gateway logs --<span class="built_in">tail</span> 100</span><br><span class="line"></span><br><span class="line"><span class="comment"># 同时查看 LiteLLM 日志验证路由决策</span></span><br><span class="line"><span class="built_in">tail</span> -f ~/.openclaw/litellm/litellm.log | grep -E <span class="string">&quot;(ComplexityRouter|EnhancedRouter)&quot;</span></span><br></pre></td></tr></table></figure><p><strong>测试要点</strong>：</p><ul><li>验证 LiteLLM Proxy 的复杂度路由 Hook 是否正常工作</li><li>确认 OpenClaw 能正确调用 LiteLLM Proxy</li><li>检查故障转移机制是否生效</li></ul><hr><h2 id="十、成本优化效果"><a href="#十、成本优化效果" class="headerlink" title="十、成本优化效果"></a>十、成本优化效果</h2><table><thead><tr><th>任务类型</th><th>比例</th><th>模型</th><th>成本</th></tr></thead><tbody><tr><td>简单任务（问候、查询等）</td><td>~60%</td><td>qwen-local (本地)</td><td>$0</td></tr><tr><td>复杂任务（分析、推理等）</td><td>~40%</td><td>astron-code-latest</td><td>按量计费</td></tr></tbody></table><p><strong>预估月成本节省</strong>（假设每日 100 次请求）：</p><table><thead><tr><th>方案</th><th>本地占比</th><th>云端占比</th><th>月成本</th></tr></thead><tbody><tr><td>全部云端</td><td>0%</td><td>100%</td><td>~$30</td></tr><tr><td><strong>智能路由</strong></td><td><strong>60%</strong></td><td><strong>40%</strong></td><td><strong>~$12</strong></td></tr></tbody></table><hr><h2 id="十一、架构总结"><a href="#十一、架构总结" class="headerlink" title="十一、架构总结"></a>十一、架构总结</h2><pre><code class="highlight mermaid">flowchart TB    A[&quot;用户请求&quot;] --&gt; B[&quot;LiteLLM Proxy&lt;br/&gt;(复杂度路由层)&quot;]    subgraph Router[&quot;async_pre_call_hook (复杂度分析)&quot;]        B --&gt; C[&quot;输入&quot;]        C --&gt; C1[&quot;Token计数&quot;]        C1 --&gt; C2[&quot;关键词匹配&quot;]        C2 --&gt; C3[&quot;复杂度评分&quot;]        C3 --&gt; C4&#123;&quot;模型选择&quot;&#125;        C4 --&gt;|分数 ≥ 2| C5[&quot;astron-code-latest&lt;br/&gt;(云端)&quot;]        C4 --&gt;|分数 &lt; 2| C6[&quot;qwen-local&lt;br/&gt;(本地)&quot;]    end    B --&gt; D[&quot;+ 故障自动转移&quot;]    B --&gt; E[&quot;+ 成本追踪&quot;]    C5 &amp; C6 --&gt; F[&quot;模型响应&quot;]    subgraph LocalModel[&quot;本地模型&quot;]        F --&gt;|简单任务 ~60%| G[&quot;oMLX Qwen3.5-4B&lt;br/&gt;✓ 零成本&lt;br/&gt;✓ 毫秒级响应&lt;br/&gt;✓ 数据隐私&quot;]    end    subgraph CloudModel[&quot;云端模型&quot;]        F --&gt;|复杂任务 ~40%| H[&quot;Astron Code&lt;br/&gt;✓ 深度推理&lt;br/&gt;✓ 按量计费&quot;]    end    G &lt;-.-&gt;|故障转移| H</code></pre><p><strong>组件职责分工</strong>：</p><table><thead><tr><th>组件</th><th>主要职责</th><th>功能范围</th></tr></thead><tbody><tr><td><strong>OpenClaw Gateway</strong></td><td>AI agent 网关</td><td>多代理路由、会话管理、工具调用统一入口</td></tr><tr><td><strong>LiteLLM Proxy</strong></td><td>模型路由中枢</td><td>复杂度分析、模型选择、故障转移、成本追踪</td></tr><tr><td><strong>本地模型 (oMLX)</strong></td><td>简单任务处理</td><td>零成本、快速响应、数据隐私保护</td></tr><tr><td><strong>云端模型 (Astron)</strong></td><td>复杂任务处理</td><td>深度推理、知识更新、复杂计算</td></tr></tbody></table><p><strong>关键说明</strong>：复杂度智能路由完全由 LiteLLM 的自定义 Hook 实现，OpenClaw 提供统一的管理界面和工具调用支持。</p><p><strong>智能路由效果</strong>：</p><ul><li>简单任务 (~60%) → 本地模型 (零成本)</li><li>复杂任务 (~40%) → 云端模型 (按需付费)</li><li>故障时 → 自动转移备用模型</li><li>月成本节省 ~60%</li></ul><hr><h2 id="十三、OpenClaw-vs-LiteLLM：功能对比总结"><a href="#十三、OpenClaw-vs-LiteLLM：功能对比总结" class="headerlink" title="十三、OpenClaw vs LiteLLM：功能对比总结"></a>十三、OpenClaw vs LiteLLM：功能对比总结</h2><table><thead><tr><th>功能维度</th><th>OpenClaw</th><th>LiteLLM</th><th>本方案</th></tr></thead><tbody><tr><td><strong>复杂度路由</strong></td><td>❌ 不支持</td><td>✅ Hook 实现</td><td>✅ 通过 LiteLLM</td></tr><tr><td><strong>多代理路由</strong></td><td>✅ 按用户&#x2F;频道</td><td>❌ 不支持</td><td>✅ OpenClaw 原生</td></tr><tr><td><strong>工具调用统一</strong></td><td>✅ Function Calling</td><td>❌ 不支持</td><td>✅ OpenClaw 原生</td></tr><tr><td><strong>模型故障转移</strong></td><td>✅ 基础故障转移</td><td>✅ 高级故障转移</td><td>✅ 双重保障</td></tr><tr><td><strong>成本追踪</strong></td><td>❌ 分散计费</td><td>✅ 统一计费</td><td>✅ LiteLLM 统一</td></tr><tr><td><strong>本地模型支持</strong></td><td>✅ 通过 provider</td><td>✅ 通过 proxy</td><td>✅ 双重集成</td></tr></tbody></table><p><strong>最佳实践</strong>：</p><ul><li><strong>使用 OpenClaw</strong> 进行多代理管理和工具调用编排</li><li><strong>使用 LiteLLM</strong> 进行复杂度路由和成本优化</li><li><strong>组合使用</strong> 获得完整的 AI agent 解决方案</li></ul><hr><h3 id="OpenClaw-官方资源"><a href="#OpenClaw-官方资源" class="headerlink" title="OpenClaw 官方资源"></a>OpenClaw 官方资源</h3><ul><li><a href="https://docs.openclaw.ai/">OpenClaw 官方文档</a></li><li><a href="https://github.com/openclaw/openclaw/blob/main/CHANGELOG.md">OpenClaw GitHub CHANGELOG</a></li><li><a href="https://docs.openclaw.ai/providers/litellm">OpenClaw LiteLLM Provider</a></li><li><a href="https://docs.openclaw.ai/cli">OpenClaw CLI Reference</a></li><li><a href="https://docs.openclaw.ai/help/faq">OpenClaw Help&#x2F;FAQ</a></li></ul><h3 id="LiteLLM-官方资源"><a href="#LiteLLM-官方资源" class="headerlink" title="LiteLLM 官方资源"></a>LiteLLM 官方资源</h3><ul><li><a href="https://docs.litellm.ai/">LiteLLM 官方文档</a></li><li><a href="https://docs.litellm.ai/docs/proxy_server">LiteLLM Proxy 指南</a></li><li><a href="https://docs.litellm.ai/docs/proxy/custom_pricing">LiteLLM Custom Hooks</a></li><li><a href="https://docs.litellm.ai/docs/routing">LiteLLM 路由策略</a></li><li><a href="https://docs.litellm.ai/docs/proxy/call_hooks">LiteLLM Call Hooks</a></li></ul><h3 id="版本更新记录"><a href="#版本更新记录" class="headerlink" title="版本更新记录"></a>版本更新记录</h3><table><thead><tr><th>日期</th><th>版本</th><th>关键更新</th></tr></thead><tbody><tr><td>2026-04-01</td><td>v2026.4.1</td><td>&#x2F;tasks 后台任务看板，Agent 本地故障转移</td></tr><tr><td>2026-03-23</td><td>v2026.3.23</td><td>Qwen endpoints，UI 优化</td></tr><tr><td>2026-03-22</td><td>v2026.3.22</td><td>ClawHub 优先，MCP 整合</td></tr><tr><td>2026-03-13</td><td>v2026.3.12</td><td>Gateway Dashboard v2，GPT-5.4&#x2F;Claude 快速模式</td></tr><tr><td>2026-03-08</td><td>v2026.3.7</td><td>Context Engine 插件接口，GPT-5.4 支持</td></tr></tbody></table>]]>
    </content>
    <id>https://haies.cn/openclaw-mix-models/</id>
    <link href="https://haies.cn/openclaw-mix-models/"/>
    <published>2026-04-01T03:17:09.000Z</published>
    <summary>OpenClaw 集成 LiteLLM 实现智能模型路由，支持本地与云端模型混合部署与自动降级。</summary>
    <title>OpenClaw集成LiteLLM实现智能模型路由：本地+云端混合部署</title>
    <updated>2026-10-21T02:31:08.000Z</updated>
  </entry>
</feed>
