<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Illya·Lily·Iris·Alice</title><description>修车、折腾、写代码</description><link>https://foxlesbiao.github.io/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.15.4</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年8月1日 23:38:55</lastBuildDate><item><title>Hermes Memory System：从 MEMORY.md 到认知记忆治理层的 10 版演化</title><link>https://foxlesbiao.github.io/blog/posts/memory-system-evolution/</link><guid isPermaLink="true">https://foxlesbiao.github.io/blog/posts/memory-system-evolution/</guid><description>Hermes Memory System：从 MEMORY.md 到认知记忆治理层的 10 版演化</description><pubDate>Sat, 01 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Hermes Memory System：从 MEMORY.md 到认知记忆治理层的 10 版演化&lt;/h1&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;这是 Hermes Agent 系列的第四篇文章。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://foxlesbiao.github.io/blog/2026/07/31/building-personal-ai-engineering-knowledge-os.html&quot; target=&quot;_blank&quot;&gt;第一篇：构建个人 AI 工程知识操作系统&lt;/a&gt; — 记忆分层架构&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://foxlesbiao.github.io/blog/2026/07/31/hermes-multi-model-routing-architecture.html&quot; target=&quot;_blank&quot;&gt;第二篇：多模型路由架构演化&lt;/a&gt; — v1→v3 路由&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://foxlesbiao.github.io/blog/2026/07/31/observable-ai-system.html&quot; target=&quot;_blank&quot;&gt;第三篇：可观测 AI 系统&lt;/a&gt; — task-memory + trace + 经验闭环&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第四篇（本文）：Memory System v1.0→v1.41 演化&lt;/strong&gt; — 冲突解决 + 权限治理 + 实体图谱 + 检索引擎&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本文记录 Hermes Agent 的记忆系统从简单的 MEMORY.md 文件，经过 10 个版本迭代，演化为一个带权限治理、来源链审计、时间版本、实体图谱和意图感知检索的认知记忆层的过程。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;起点：为什么需要 Memory System&lt;/h2&gt;
&lt;p&gt;Hermes Agent 原来使用 MEMORY.md 存储用户事实，存在五个核心问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;无时间戳 — 无法判断过期&lt;/li&gt;
&lt;li&gt;无可信度标记 — 事实和推测混在一起&lt;/li&gt;
&lt;li&gt;无冲突解决 — 多来源矛盾时无裁决依据&lt;/li&gt;
&lt;li&gt;无过期机制 — 老旧条目永久占空间&lt;/li&gt;
&lt;li&gt;无冷冻机制 — 关键条目可能被意外覆盖&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;演化路线&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;v1.0  能记东西&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.1  会冲突检测&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.2  会生命周期管理（持久化 + decay）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.3  会排序（Memory Ranking Engine）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.35 会权限和实体（authority + entity/field）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.36 会不可变保护（IMMUTABLE_TYPES）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.37 会混合评分（authority_gate × 加权和）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.38 会来源审计（provenance + scope 隔离）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.39 会时间记忆（valid_from/until + memory_layer）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.40 会检索（Query Planner + GC + EntityGraph）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.41 会意图感知 + 预算管理（Intent Detection + Budget）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;核心架构（v1.41 最终状态）&lt;/h2&gt;
&lt;h3&gt;MemoryEntry 数据模型&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; MemoryEntry&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    value              &lt;/span&gt;&lt;span&gt;# 内容&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    memory_type        &lt;/span&gt;&lt;span&gt;# IDENTITY / FACT / PREFERENCE / SKILL / PROJECT / TEMP&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    memory_layer       &lt;/span&gt;&lt;span&gt;# EPISODIC / SEMANTIC / PROCEDURAL / IDENTITY / TEMPORARY&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    authority          &lt;/span&gt;&lt;span&gt;# user=1.0 / tool=0.6 / agent=0.3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    source             &lt;/span&gt;&lt;span&gt;# 来源（与 authority 分离）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    confidence         &lt;/span&gt;&lt;span&gt;# 0.0-1.0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    explicitness       &lt;/span&gt;&lt;span&gt;# 0.0-1.0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    freshness          &lt;/span&gt;&lt;span&gt;# 基于 decay_days 自动衰减&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    retention          &lt;/span&gt;&lt;span&gt;# freshness×0.5 + usage×0.3 + confidence×0.2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    provenance&lt;/span&gt;&lt;span&gt;[]&lt;/span&gt;&lt;span&gt;       # 来源链审计（可追溯用户原始陈述）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    valid_from         &lt;/span&gt;&lt;span&gt;# 记忆生效时间&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    valid_until        &lt;/span&gt;&lt;span&gt;# 记忆失效时间（supersede 时自动关闭）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    entity             &lt;/span&gt;&lt;span&gt;# 实体名（如 NAS、GPU、OS）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    field              &lt;/span&gt;&lt;span&gt;# 属性名（如 ip、model、system）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    scope              &lt;/span&gt;&lt;span&gt;# 范围隔离（如 main_pc、laptop）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    relation           &lt;/span&gt;&lt;span&gt;# 实体关系（如 located_at）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    target             &lt;/span&gt;&lt;span&gt;# 关系目标（如 home_network）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    relation_confidence&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    identity_status    &lt;/span&gt;&lt;span&gt;# ACTIVE / CONFIRMED / CHANGED / ARCHIVED&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    usage_count        &lt;/span&gt;&lt;span&gt;# 被引用次数（影响 retention）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    change_reason      &lt;/span&gt;&lt;span&gt;# 变更原因&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    supersedes         &lt;/span&gt;&lt;span&gt;# 前任 memory_id&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    superseded_by      &lt;/span&gt;&lt;span&gt;# 继任者&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    conflict_with      &lt;/span&gt;&lt;span&gt;# 冲突条目&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;评分公式&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;score = authority_gate × (&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    0.4 × confidence&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  + 0.2 × freshness&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  + 0.2 × explicitness&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  + 0.1 × retention&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  + 0.1 × usage_frequency&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;authority_gate 是一个门控函数：&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;权限级别&lt;/th&gt;&lt;th&gt;权重&lt;/th&gt;&lt;th&gt;gate&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;user&lt;/td&gt;&lt;td&gt;1.0&lt;/td&gt;&lt;td&gt;1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;tool&lt;/td&gt;&lt;td&gt;0.6&lt;/td&gt;&lt;td&gt;0.7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;agent&lt;/td&gt;&lt;td&gt;0.3&lt;/td&gt;&lt;td&gt;0.4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;unknown&lt;/td&gt;&lt;td&gt;0.0&lt;/td&gt;&lt;td&gt;0.1&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;这确保了：外部信息（网页、模型推理）永远无法覆盖用户确认的事实，即使外部信息的 confidence/freshness 全部为 1.0。&lt;/p&gt;
&lt;h3&gt;冲突解决管道&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;用户输入&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Assertion Parser（解析断言类型）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── CONFIRMED    → 明确事实&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── HYPOTHETICAL → 假设，不写入&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── UNCERTAIN    → 可能/应该/觉得&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── RECALL       → 我记得&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── QUERY        → 提问，不产生 memory&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── REFERENCE    → 保持，不改变&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Intent Detection（是否为更新意图）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Authority Check（权限检查）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── IDENTITY 保护：非 user 权限不可修改&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── authority_gate 评分门控&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Conflict Detection（冲突检测）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── scope 隔离：main_pc vs laptop 不冲突&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── score 比较：新分数 &amp;gt; 旧分数才允许覆盖&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── 权限门控：agent 永远无法超越 user&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Decision（决策）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── supersede        → 新值替代旧值，保留历史链&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── supersede_frozen → 用户确认覆盖 FROZEN&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── flag_conflict    → 保留双方，请求用户确认&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── reject           → 拒绝写入&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── no_op            → 无操作&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Memory Write（写入）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── provenance 自动传播（继承旧链 + 追加新条目）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── memory_layer/scope/entity 继承&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── valid_until 自动关闭旧版本&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;记忆生命周期&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;ACTIVE → STALE → COMPRESSED → ARCHIVED&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ↑                        ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── TEMP 高频使用 → EPISODIC（自动升级）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关键设计：从不删除。TEMPORARY 如果被高频引用，自动升级为 EPISODIC。&lt;/p&gt;
&lt;h3&gt;意图感知检索&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; MemoryQueryPlanner&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    # 检测查询意图&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    intents &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;&lt;/span&gt;&lt;span&gt;WHOAMI&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;我是/我的&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;       → &lt;/span&gt;&lt;span&gt;IDENTITY&lt;/span&gt;&lt;span&gt; 层权重提升&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;&lt;/span&gt;&lt;span&gt;HOWTO&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;       &quot;&lt;/span&gt;&lt;span&gt;怎么/如何/安装&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;   → &lt;/span&gt;&lt;span&gt;PROCEDURAL&lt;/span&gt;&lt;span&gt; 层权重提升&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;&lt;/span&gt;&lt;span&gt;FACT_LOOKUP&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;是什么/是多少&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;    → &lt;/span&gt;&lt;span&gt;SEMANTIC&lt;/span&gt;&lt;span&gt; 层权重提升&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;&lt;/span&gt;&lt;span&gt;DIAGNOSE&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;    &quot;&lt;/span&gt;&lt;span&gt;为什么/报错/失败&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; → &lt;/span&gt;&lt;span&gt;EPISODIC&lt;/span&gt;&lt;span&gt; 层权重提升&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;&lt;/span&gt;&lt;span&gt;TEMPORAL&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;    &quot;&lt;/span&gt;&lt;span&gt;什么时候/历史/之前&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; → &lt;/span&gt;&lt;span&gt;EPISODIC&lt;/span&gt;&lt;span&gt; 层权重提升&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    # 检索评分&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    retrieval_score &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        0.35&lt;/span&gt;&lt;span&gt; × keyword_match&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      +&lt;/span&gt;&lt;span&gt; 0.25&lt;/span&gt;&lt;span&gt; × authority&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      +&lt;/span&gt;&lt;span&gt; 0.15&lt;/span&gt;&lt;span&gt; × freshness&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      +&lt;/span&gt;&lt;span&gt; 0.15&lt;/span&gt;&lt;span&gt; × scope_match&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      +&lt;/span&gt;&lt;span&gt; 0.10&lt;/span&gt;&lt;span&gt; × layer_priority&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    # Token 预算控制&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    budget &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        IDENTITY&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 1000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; SEMANTIC&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 3000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        PROCEDURAL&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 2000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; EPISODIC&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 1000&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; TEMPORARY&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 500&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    # 按意图动态调整&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;关键设计决策&lt;/h2&gt;
&lt;h3&gt;1. 来源与权限分离&lt;/h3&gt;
&lt;p&gt;信息来源（source）和修改权限（authority）是两个独立维度：&lt;/p&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;source&lt;/th&gt;&lt;th&gt;authority&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;用户输入&lt;/td&gt;&lt;td&gt;user&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;FTS5 检索&lt;/td&gt;&lt;td&gt;tool&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenViking&lt;/td&gt;&lt;td&gt;tool&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;传感器&lt;/td&gt;&lt;td&gt;tool&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;网页搜索&lt;/td&gt;&lt;td&gt;agent&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;模型推理&lt;/td&gt;&lt;td&gt;agent&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;这样设计的好处：用户提供的网址（source=web）仍然是 user 权限，不会被降级。&lt;/p&gt;
&lt;h3&gt;2. IDENTITY 不可变保护&lt;/h3&gt;
&lt;p&gt;IDENTITY 类型的记忆（如”用户使用 Debian”）不能被网页或模型推理覆盖。只有 user 权限的明确修改意图才能 supersede。&lt;/p&gt;
&lt;p&gt;这防止了 Agent 最容易犯的错误：自己推理出来的信息污染用户画像。&lt;/p&gt;
&lt;h3&gt;3. Provenance 自动传播&lt;/h3&gt;
&lt;p&gt;每次 supersede 时，新记忆自动继承旧记忆的 provenance 链，并追加当前变更记录。调用者不传 provenance 也不会断链。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Arch (ACTIVE)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── provenance[0]: user said &quot;I use Debian&quot; (2026-07-01)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── provenance[1]: user changed OS to Arch (2026-07-31)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这使 Agent 可以回答：“为什么认为你使用 Arch？” → “因为你在 2026-07-31 明确说 OS 改成 Arch”。&lt;/p&gt;
&lt;h3&gt;4. Scope 隔离&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;GPU.model = 7650GRE  (scope=main_pc)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;GPU.model = RTX3060  (scope=laptop)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不再冲突。&lt;code&gt;find_active(entity, field, scope)&lt;/code&gt; 支持范围过滤。&lt;/p&gt;
&lt;h3&gt;5. 时间版本&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Debian  valid_from=2025-01  valid_until=2026-07-31&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ↓ supersede&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Arch    valid_from=2026-07-31  valid_until=NULL&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以回答：“我什么时候开始用 Arch？” → “2026-07-31”。&lt;/p&gt;
&lt;h3&gt;6. Memory Layer 分类&lt;/h3&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Layer&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;th&gt;例子&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;IDENTITY&lt;/td&gt;&lt;td&gt;长期身份&lt;/td&gt;&lt;td&gt;我使用 Debian 13&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SEMANTIC&lt;/td&gt;&lt;td&gt;事实知识&lt;/td&gt;&lt;td&gt;7650GRE 参数&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;PROCEDURAL&lt;/td&gt;&lt;td&gt;技能流程&lt;/td&gt;&lt;td&gt;Docker 安装步骤&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;EPISODIC&lt;/td&gt;&lt;td&gt;事件&lt;/td&gt;&lt;td&gt;昨天修复 grub&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TEMPORARY&lt;/td&gt;&lt;td&gt;短期状态&lt;/td&gt;&lt;td&gt;正在测试 OTA&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;测试验证&lt;/h2&gt;
&lt;p&gt;15 个测试案例，覆盖：&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;批次&lt;/th&gt;&lt;th&gt;案例&lt;/th&gt;&lt;th&gt;场景&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;第一批 A-E&lt;/td&gt;&lt;td&gt;用户确认/假设/FROZEN/冲突/FTS5覆盖&lt;/td&gt;&lt;td&gt;基础冲突解决&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;第二批 F-J&lt;/td&gt;&lt;td&gt;不确定/提问/确认/废弃/保持&lt;/td&gt;&lt;td&gt;语义压力测试&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;第三批 K-N&lt;/td&gt;&lt;td&gt;重启恢复/示例误写入/重复确认/过期decay&lt;/td&gt;&lt;td&gt;生命周期测试&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;第四批 O&lt;/td&gt;&lt;td&gt;CONFIRMED 无 update_intent 不覆盖 FROZEN&lt;/td&gt;&lt;td&gt;权限安全&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;全部 15/15 PASS。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;与普通 RAG 的区别&lt;/h2&gt;
&lt;p&gt;普通 RAG：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;文档 → Embedding → Search → Answer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hermes Memory System：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;观察&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  → Assertion Parser（断言分类）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  → Authority Check（权限检查）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  → Conflict Resolver（冲突解决）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  → Ranking（评分排序）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  → Consolidation（记忆合并）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  → Entity Graph（实体图谱）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  → Intent-aware Retrieval（意图感知检索）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  → Token Budget（预算控制）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  → Context Injection（上下文注入）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  → Reasoning（推理）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;下一阶段：v1.42 Hybrid Retrieval&lt;/h2&gt;
&lt;p&gt;v1.41 已冻结为基线。下一步不是继续堆字段，而是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Entity Normalization&lt;/strong&gt;（最高优先级）— “显卡” = “GPU” = “7650GRE”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hybrid Retrieval&lt;/strong&gt; — keyword + vector + entity graph&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多标签 Intent&lt;/strong&gt; — 一个查询可以同时是 FACT_LOOKUP + WHOAMI&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;value_per_token&lt;/strong&gt; — relevance × authority × freshness ÷ token_cost&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模块化拆分&lt;/strong&gt; — 1020 行单文件拆为 memory/ 包&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;策略：先让 Memory System 在真实任务中运行，收集 retrieval_success / retrieval_failure 数据，用真实失败样本驱动 v1.42 迭代。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;文件清单&lt;/h2&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.hermes/lib/memory_conflict_resolver.py&lt;/code&gt;&lt;/td&gt;&lt;td&gt;核心引擎（~1020 行）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.hermes/scripts/memory_lifecycle_v1.2_test.py&lt;/code&gt;&lt;/td&gt;&lt;td&gt;15 个测试案例&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.hermes/plugins/experience-recorder/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hook 自动记录插件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.hermes/skills/meta/experience-recorder/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;分类规则 Skill&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.hermes/skills/meta/memory-lifecycle-rules/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;生命周期规则 Skill&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.hermes/task-memory/raw/*.jsonl&lt;/code&gt;&lt;/td&gt;&lt;td&gt;任务记忆原始日志&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.hermes/failure-memory.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;失败记录&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.hermes/traces/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;完整 trace 文件&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;从 v1.0 到 v1.41，Hermes Memory System 经历了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;v1.0&lt;/strong&gt;：能记东西&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;v1.2&lt;/strong&gt;：会生命周期管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;v1.3&lt;/strong&gt;：会排序&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;v1.37&lt;/strong&gt;：会混合评分（authority gate）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;v1.39&lt;/strong&gt;：会时间记忆和来源审计&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;v1.41&lt;/strong&gt;：会意图感知检索和预算控制&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;已经从一个简单的 MEMORY.md 文件，演化为一个接近认知科学记忆模型的长期记忆治理层。&lt;/p&gt;
&lt;p&gt;下一步的重点不是继续增加规则，而是让系统在真实任务中产生数据，用失败案例驱动迭代。这比理论优化更重要。&lt;/p&gt;</content:encoded></item><item><title>Hermes 个人 AI 工程系统 v1.0：从零搭建到可观测认知架构的完整记录</title><link>https://foxlesbiao.github.io/blog/posts/personal-ai-engineering-system-v1/</link><guid isPermaLink="true">https://foxlesbiao.github.io/blog/posts/personal-ai-engineering-system-v1/</guid><description>Hermes 个人 AI 工程系统 v1.0：从零搭建到可观测认知架构的完整记录</description><pubDate>Sat, 01 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Hermes 个人 AI 工程系统 v1.0&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;这不是一篇配置教程，而是一个关于&lt;strong&gt;如何让 AI 记住你、理解你、并越用越聪明&lt;/strong&gt;的工程记录。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;我日常使用 Hermes Agent 处理系统架构设计、NAS 运维、家庭能源系统规划、代码编写等任务。但几个月下来，暴露了一个核心问题：&lt;strong&gt;AI 没有长期记忆&lt;/strong&gt;。每次问同一个问题，它都从零开始推理。不会记住我的设备参数，不会记住之前的决策，不会从历史经验中学习。&lt;/p&gt;
&lt;p&gt;解决这个问题需要一套完整的&lt;strong&gt;工程系统&lt;/strong&gt;，而不是单一工具。经过连续多日的迭代，这套系统从”配置多个模型”正式进入 v1.0 阶段。&lt;/p&gt;
&lt;p&gt;本文是对四篇系列文章的完整整合，一次性呈现这套系统的全貌。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;系统总览&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;┌─────────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│                    Hermes 个人 AI 工程系统 v1.0               │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├─────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│                                                             │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  ┌─────────────────────────────────────────────────────┐   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  │  Layer 1: 行为准则 (SOUL.md)                         │   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  │  实事求是、调查研究、矛盾分析、系统思维、控制论        │   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  │  反馈闭环、假设验证、工程优先                         │   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  └─────────────────────────────────────────────────────┘   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│                            │                                 │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  ┌─────────────────────────────────────────────────────┐   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  │  Layer 2: 专业技能 (Skills)                          │   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  │  knowledge-retrieval-evidence-policy                 │   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  │  decision-memory / model-router v3                   │   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  │  memory-lifecycle-rules / experience-recorder        │   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  └─────────────────────────────────────────────────────┘   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│                            │                                 │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  ┌─────────────────────────────────────────────────────┐   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  │  Layer 3: 持久事实 (MEMORY.md + USER.md)             │   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  │  用户偏好、设备参数、环境信息、已验证的长期经验        │   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  └─────────────────────────────────────────────────────┘   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│                            │                                 │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  ┌─────────────────────────────────────────────────────┐   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  │  Layer 4: 知识库 (OpenViking)                        │   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  │  resources: 工程控制论/系统科学/软件工程/方法论       │   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  │  memories: 决策记录/历史案例/架构模式                │   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  └─────────────────────────────────────────────────────┘   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│                            │                                 │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  ┌─────────────────────────────────────────────────────┐   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  │  Layer 5: 多模型路由 (Model Router)                  │   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  │  Flash(主控制器) + Pro(审查) + GLM(专家) + Doubao(视觉)│   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  └─────────────────────────────────────────────────────┘   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│                            │                                 │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  ┌─────────────────────────────────────────────────────┐   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  │  Layer 6: 可观测性 (Observability)                   │   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  │  task-memory / failure-memory / trace / batch test  │   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│  └─────────────────────────────────────────────────────┘   │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│                                                             │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;└─────────────────────────────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;第一章：为什么需要记忆系统&lt;/h2&gt;
&lt;h3&gt;起点&lt;/h3&gt;
&lt;p&gt;Hermes Agent 原本只靠 MEMORY.md 存储用户事实，存在五个核心问题：&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;问题&lt;/th&gt;&lt;th&gt;后果&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;无时间戳&lt;/td&gt;&lt;td&gt;无法判断过期&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;无可信度标记&lt;/td&gt;&lt;td&gt;事实和推测混在一起&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;无冲突解决&lt;/td&gt;&lt;td&gt;多来源矛盾时无裁决依据&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;无过期机制&lt;/td&gt;&lt;td&gt;老旧条目永久占空间&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;无冷冻机制&lt;/td&gt;&lt;td&gt;关键条目可能被意外覆盖&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;关键问题：AI 没有长期记忆&lt;/h3&gt;
&lt;p&gt;举一个典型例子：测试中 AI 把”三电压逆变器”理解成”48V DC + 220V AC + 电网”，但实际是&lt;strong&gt;电池侧兼容 48V/60V/72V 三种电压&lt;/strong&gt;。原因是模型用通用知识推测，没有优先尊重用户 memory 中已记录的设备事实。&lt;/p&gt;
&lt;p&gt;这说明：&lt;strong&gt;再强的模型，如果不尊重用户已有事实，输出也是错的。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;第二章：知识库搭建（OpenViking）&lt;/h2&gt;
&lt;h3&gt;选型对比&lt;/h3&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;方案&lt;/th&gt;&lt;th&gt;优势&lt;/th&gt;&lt;th&gt;劣势&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Supermemory&lt;/td&gt;&lt;td&gt;自带 OCR、Gemini 提取&lt;/td&gt;&lt;td&gt;太重（PyTorch ~2GB），ARM64 慢&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;knowledge-base-mcp&lt;/td&gt;&lt;td&gt;MCP 协议，Claude 兼容&lt;/td&gt;&lt;td&gt;同样太重，ARM64 1 chunk/s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;OpenViking 0.4.11&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;轻量 Go 二进制，FTS5 全文搜索，ARM64 飞快&lt;/td&gt;&lt;td&gt;无 OCR，需手动组织知识&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;最终选择 OpenViking。纯 Go 编译，无 Python 依赖，在 ARM64 上毫秒级响应。&lt;/p&gt;
&lt;h3&gt;知识分类&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;viking://resources/rag/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── engineering_control/    — 《工程控制论》上下册&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── history_politics/       — 毛选等（方法论层）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── software_engineering/   — 《人月神话》等&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;└── systems_thinking/       — 《一般系统论》《系统科学方法概论》&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;知识检索策略&lt;/h3&gt;
&lt;p&gt;创建 &lt;code&gt;knowledge-retrieval-evidence-policy&lt;/code&gt; skill，强制规则：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;事实优先于推测&lt;/strong&gt; — 用户 memory 中的设备参数 &amp;gt; 模型通用知识&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;未知参数必须标记&lt;/strong&gt; — 不允许自行补全，列出条件分支&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;检索在推理之前&lt;/strong&gt; — 复杂问题先查知识库，再推理&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;优先级链：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;当前用户明确提供的事实 &amp;gt; 用户已验证的长期事实 &amp;gt; 当前环境实际检测结果&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;gt; 官方文档与可靠资料 &amp;gt; 知识库专业知识 &amp;gt; 一般经验 &amp;gt; 推测与假设&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;第三章：记忆系统从 v1.0 到 v1.41 的演化&lt;/h2&gt;
&lt;h3&gt;演化路线&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;v1.0  能记东西&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.1  会冲突检测&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.2  会生命周期管理（持久化 + decay）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.3  会排序（Memory Ranking Engine）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.35 会权限和实体（authority + entity/field）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.36 会不可变保护（IMMUTABLE_TYPES）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.37 会混合评分（authority_gate × 加权和）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.38 会来源审计（provenance + scope 隔离）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.39 会时间记忆（valid_from/until + memory_layer）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.40 会检索（Query Planner + GC + EntityGraph）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v1.41 会意图感知 + 预算管理（Intent Detection + Budget）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;v1.41 核心架构&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;MemoryEntry 数据模型&lt;/strong&gt; — 20+ 维度，包括：value、entity、field、scope、authority、confidence、provenance、valid_from/until、memory_layer、identity_status 等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;评分公式&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;score = authority_gate × (&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    0.4 × confidence&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  + 0.2 × freshness&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  + 0.2 × explicitness&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  + 0.1 × retention&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  + 0.1 × usage_frequency&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;权限门控&lt;/strong&gt;：&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;权限级别&lt;/th&gt;&lt;th&gt;权重&lt;/th&gt;&lt;th&gt;gate&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;user&lt;/td&gt;&lt;td&gt;1.0&lt;/td&gt;&lt;td&gt;1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;tool&lt;/td&gt;&lt;td&gt;0.6&lt;/td&gt;&lt;td&gt;0.7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;agent&lt;/td&gt;&lt;td&gt;0.3&lt;/td&gt;&lt;td&gt;0.4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;unknown&lt;/td&gt;&lt;td&gt;0.0&lt;/td&gt;&lt;td&gt;0.1&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;外部信息（网页、模型推理）永远无法覆盖用户确认的事实。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;冲突解决管道&lt;/strong&gt;：用户输入 → Assertion Parser（CONFIRMED/HYPOTHETICAL/UNCERTAIN/RECALL/QUERY/REFERENCE）→ Intent Detection → Authority Check → Conflict Detection → Decision（supersede/flag_conflict/reject）→ Memory Write&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;记忆生命周期&lt;/strong&gt;：ACTIVE → STALE → COMPRESSED → ARCHIVED。从不删除，TEMPORARY 高频使用自动升级为 EPISODIC。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;意图感知检索&lt;/strong&gt;：根据查询意图（WHOAMI/HOWTO/FACT_LOOKUP/DIAGNOSE/TEMPORAL）动态调整各记忆层权重，以匹配度 × 权限 × 新鲜度 × 范围匹配 × 层优先级 综合评分。&lt;/p&gt;
&lt;h3&gt;关键设计决策&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;来源与权限分离&lt;/strong&gt; — 信息来源（source）和修改权限（authority）是两个独立维度。用户提供的网址（source=web）仍然是 user 权限，不会被降级。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IDENTITY 不可变保护&lt;/strong&gt; — 用户身份/偏好不能被网页或模型推理覆盖。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provenance 自动传播&lt;/strong&gt; — 每次 supersede 自动继承旧链并追加新记录。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope 隔离&lt;/strong&gt; — main_pc 和 laptop 的同属性不同值不冲突。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时间版本&lt;/strong&gt; — 每次变更保留 valid_from/valid_until 历史链。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;测试验证&lt;/h3&gt;
&lt;p&gt;15 个测试案例，覆盖基础冲突解决、语义压力测试、生命周期测试、权限安全测试，全部 15/15 PASS。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;第四章：多模型路由架构&lt;/h2&gt;
&lt;h3&gt;问题&lt;/h3&gt;
&lt;p&gt;Hermes 只有一个主模型，但日常问答、复杂架构设计、图片识别对模型能力要求不同。&lt;/p&gt;
&lt;h3&gt;可用模型池&lt;/h3&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;模型&lt;/th&gt;&lt;th&gt;角色&lt;/th&gt;&lt;th&gt;资源等级&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;DeepSeek V4 Flash&lt;/td&gt;&lt;td&gt;主模型 + Router + 整合者&lt;/td&gt;&lt;td&gt;快速&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DeepSeek V4 Pro&lt;/td&gt;&lt;td&gt;审查 + 增强&lt;/td&gt;&lt;td&gt;增强&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GLM-5.2&lt;/td&gt;&lt;td&gt;深度推理专家&lt;/td&gt;&lt;td&gt;深度&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Doubao Seed 2.0 Pro&lt;/td&gt;&lt;td&gt;视觉&lt;/td&gt;&lt;td&gt;专用&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;架构演化（v1 → v2 → v3）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;v1（关键词触发）&lt;/strong&gt;：看到”架构”→ delegate，看到”状态机”→ delegate。问题：误触发，过拟合。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;v2（三级任务分级）&lt;/strong&gt;：Level 0（Flash）→ Level 1（Flash+Pro）→ Level 2（GLM）。改进：从关键词升级为按复杂度分级。遗留：GLM 直接输出给用户，无用户覆盖。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;v3（三级路由 + 专家回流 + 用户覆盖）&lt;/strong&gt; — 当前冻结版本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;                User Request&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                     │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                     ▼&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          DeepSeek V4 Flash&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          Router + Orchestrator&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                     │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        ┌────────────┼────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        │            │            │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        ▼            ▼            ▼&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;     Level 0      Level 1      Level 2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;     Flash       Flash+Pro      GLM-5.2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        │            │            │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        │            │            │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        ▼            ▼            ▼&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    简单任务      审查增强      专家设计&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                     │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                     ▼&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;              Flash 整合输出&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;核心规则&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GLM 是专家，不直接面对用户，输出必须回流 Flash 验证+整合&lt;/li&gt;
&lt;li&gt;用户明确指定模型时覆盖自动路由&lt;/li&gt;
&lt;li&gt;先查 OpenViking 知识库，再决定是否 delegate&lt;/li&gt;
&lt;li&gt;预估 &amp;lt;1000 tokens 且无架构/安全需求时不 delegate&lt;/li&gt;
&lt;li&gt;资源等级替代成本等级（避免 API Plan 价格变化导致错误）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;完整决策树&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Step 1: 用户指定了模型？ → 尊重用户选择&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Step 2: 包含图片？ → Doubao Vision（自动）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Step 3: 有 OpenViking 知识？ → 先检索&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Step 4: 复杂度评估&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Step 5: 路由（Level 0/1/2）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置实现&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  default&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; deepseek-v4-flash&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  provider&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; custom&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;delegation&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; glm-5.2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  provider&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; custom&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;auxiliary&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  vision&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; doubao-seed-2-0-pro-260215&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    base_url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;https://ark.cn-beijing.volces.com/api/coding/v3&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    timeout&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 120&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  compression&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; deepseek-v4-pro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  background_review&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; deepseek-v4-pro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  curator&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; deepseek-v4-pro&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;第五章：可观测 AI 系统&lt;/h2&gt;
&lt;h3&gt;三个阶段&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;阶段1: 工具调用 Agent → 能调用工具，但每次独立决策，无记忆&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;阶段2: 多模型 Agent → 多模型分工，规则路由，有记忆分层&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;阶段3: 可观测 AI 系统 → 有日志，有版本，有实验，有回滚，有失败分析&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;阶段4: 经验驱动 AI 系统（未来）→ 基于积累数据自动优化路由&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;内存生命周期规则&lt;/h3&gt;
&lt;p&gt;7 类可信度标记：&lt;/p&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;标记&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;th&gt;TTL&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CONFIRMED ✅&lt;/td&gt;&lt;td&gt;用户确认的事实&lt;/td&gt;&lt;td&gt;30-90 天&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OBSERVED 📋&lt;/td&gt;&lt;td&gt;自动探测的信息&lt;/td&gt;&lt;td&gt;30 天&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DERIVED 🔄&lt;/td&gt;&lt;td&gt;推理得出的结论&lt;/td&gt;&lt;td&gt;14 天&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SPECULATIVE ❓&lt;/td&gt;&lt;td&gt;猜测，未验证&lt;/td&gt;&lt;td&gt;1 天&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;STALE ⌛&lt;/td&gt;&lt;td&gt;已过期&lt;/td&gt;&lt;td&gt;保留 7 天后移除&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CONFLICTED ⚠️&lt;/td&gt;&lt;td&gt;多个来源不一致&lt;/td&gt;&lt;td&gt;待裁决&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;FROZEN 🧊&lt;/td&gt;&lt;td&gt;用户锁定，永不覆盖&lt;/td&gt;&lt;td&gt;永久&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;冲突优先级：&lt;strong&gt;来源可信度 &amp;gt; 存储位置&lt;/strong&gt;。用户今天说的 CONFIRMED 事实，优先级高于旧 MEMORY.md 记录。&lt;/p&gt;
&lt;h3&gt;三层记忆职责边界&lt;/h3&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;层&lt;/th&gt;&lt;th&gt;存储&lt;/th&gt;&lt;th&gt;职责&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;MEMORY.md / USER.md&lt;/td&gt;&lt;td&gt;高频事实&lt;/td&gt;&lt;td&gt;系统 prompt 自动注入，零延迟&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenViking&lt;/td&gt;&lt;td&gt;语义知识&lt;/td&gt;&lt;td&gt;长期知识、决策、经验、架构模式&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;FTS5 (session_search)&lt;/td&gt;&lt;td&gt;原始对话&lt;/td&gt;&lt;td&gt;全文检索历史对话，兜底&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;交叉检索策略：先查 MEMORY → 再查 OpenViking → 最后查 FTS5。&lt;/p&gt;
&lt;h3&gt;Task-Memory 和 Failure-Memory&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Task-Memory&lt;/strong&gt; 记录每次路由决策的完整信息：任务类型、复杂度评分、路由判断、使用模型、耗时、token、结果摘要。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Failure-Memory&lt;/strong&gt; 记录每次失败的根本原因和修复方案：&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;ID&lt;/th&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;原因&lt;/th&gt;&lt;th&gt;修复&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;F001&lt;/td&gt;&lt;td&gt;CONFIG&lt;/td&gt;&lt;td&gt;delegation.provider 指向不存在的 provider&lt;/td&gt;&lt;td&gt;修复为 volcengine-coding-plan&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;F002&lt;/td&gt;&lt;td&gt;TOOL&lt;/td&gt;&lt;td&gt;GLM 子任务执行过多环境探测，600s 超时&lt;/td&gt;&lt;td&gt;Flash 在 delegate 前完成检索&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;F003&lt;/td&gt;&lt;td&gt;TOOL&lt;/td&gt;&lt;td&gt;web_search 依赖缺失，子任务花时间安装&lt;/td&gt;&lt;td&gt;delegate context 预装依赖&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;F004&lt;/td&gt;&lt;td&gt;CONFIG&lt;/td&gt;&lt;td&gt;auxiliary.provider 同样指向不存在的 provider&lt;/td&gt;&lt;td&gt;统一切换 provider&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Batch Test v1&lt;/h3&gt;






















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;任务&lt;/th&gt;&lt;th&gt;等级&lt;/th&gt;&lt;th&gt;模型&lt;/th&gt;&lt;th&gt;耗时&lt;/th&gt;&lt;th&gt;结果&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;什么是 MQTT broker&lt;/td&gt;&lt;td&gt;Level 0&lt;/td&gt;&lt;td&gt;Flash&lt;/td&gt;&lt;td&gt;0.5s&lt;/td&gt;&lt;td&gt;正确路由&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;查 NAS IP&lt;/td&gt;&lt;td&gt;Level 0&lt;/td&gt;&lt;td&gt;Flash&lt;/td&gt;&lt;td&gt;0.5s&lt;/td&gt;&lt;td&gt;正确路由&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;写光伏效率函数&lt;/td&gt;&lt;td&gt;Level 1&lt;/td&gt;&lt;td&gt;Flash&lt;/td&gt;&lt;td&gt;0.5s&lt;/td&gt;&lt;td&gt;正确路由&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;审查 HA MQTT 配置&lt;/td&gt;&lt;td&gt;Level 1&lt;/td&gt;&lt;td&gt;Pro&lt;/td&gt;&lt;td&gt;52s&lt;/td&gt;&lt;td&gt;正确路由，发现 9 项风险&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;设计 15 状态机&lt;/td&gt;&lt;td&gt;Level 2&lt;/td&gt;&lt;td&gt;GLM&lt;/td&gt;&lt;td&gt;419s&lt;/td&gt;&lt;td&gt;正确路由，36KB 设计文档&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;对比 MQTT vs Modbus&lt;/td&gt;&lt;td&gt;Level 2&lt;/td&gt;&lt;td&gt;GLM&lt;/td&gt;&lt;td&gt;102s&lt;/td&gt;&lt;td&gt;正确路由，18K 字符深度分析&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;路由正确率：6/6。样本量小，需扩充到 20-50。&lt;/p&gt;
&lt;h3&gt;关键发现&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;配置错误导致静默失败&lt;/strong&gt; — delegation.provider 未配置 API key，所有 delegate 任务静默失败&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GLM 子任务执行过剩环境探测&lt;/strong&gt; — 600 秒中大部分时间花在 session_search、execute_code 等环境探测上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1000-token 阈值无数据支撑&lt;/strong&gt; — 拍脑袋的，需要更多样本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flash 同时作为路由器和审查者是循环依赖&lt;/strong&gt; — v4 目标：引入 Pro 作为独立审查者&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;第六章：经验教训&lt;/h2&gt;
&lt;h3&gt;架构原则&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;分层比堆叠重要&lt;/strong&gt; — 把行为准则、知识、事实、技能分开，比往一个文件里塞更多内容有效&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;事实约束比模型能力重要&lt;/strong&gt; — 再强的模型，如果不尊重用户已有事实，输出也是错的&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;轻量方案优先&lt;/strong&gt; — ARM64 上跑 PyTorch 是不归路，FTS5 全文搜索足够快&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Agent 需要反馈闭环&lt;/strong&gt; — 一次回答不够，需要设计验证、修正、迭代的机制&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;路由设计教训&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;不要用关键词触发路由&lt;/strong&gt; — 容易误触发，趋向过拟合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flash 是大脑，不是最低级模型&lt;/strong&gt; — 它负责判断和整合，不是替代品&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GLM 不直接面对用户&lt;/strong&gt; — 专家输出必须经过主模型验证和整合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;成本等级不要硬编码&lt;/strong&gt; — 不同 API Plan 价格不同，用资源等级替代&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;先查知识库再 delegate&lt;/strong&gt; — 充分利用已有知识，避免不必要的专家调用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;规则路由是起点，经验路由是终点&lt;/strong&gt; — 先跑数据，再做自适应&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;第七章：当前状态与下一阶段&lt;/h2&gt;
&lt;h3&gt;v1.0 冻结清单&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;model-router v3 (frozen-baseline)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 三级路由：Level 0 (Flash) / Level 1 (Flash/Pro) / Level 2 (GLM)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 固定分工：视觉 → Doubao，审查 → Pro，压缩 → Pro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── 用户覆盖：用户指定模型时跳过自动路由&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;memory-lifecycle-rules v1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 7 类可信度标记&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 5 类生命周期规则&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 三层记忆职责边界&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── 冲突优先级：来源可信度 &amp;gt; 存储位置&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;memory_conflict_resolver v1.41&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── ~1020 行 Python 核心引擎&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 15/15 测试通过&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 意图感知检索 + Token 预算控制&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── 冻结，等待真实数据驱动迭代&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;task-memory / failure-memory (observation only)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── 不自动影响路由，仅收集数据&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;experience-recorder (Python plugin)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── hook 自动触发，不依赖模型遵守规则&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4 个观察指标&lt;/h3&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;指标&lt;/th&gt;&lt;th&gt;目标&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;路由准确率&lt;/td&gt;&lt;td&gt;逐步提升&lt;/td&gt;&lt;td&gt;任务→路由→结果质量评分&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GLM 调用比例&lt;/td&gt;&lt;td&gt;5-15%&lt;/td&gt;&lt;td&gt;超过 30% 说明 Router 太激进&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;升级失败案例&lt;/td&gt;&lt;td&gt;重点收集&lt;/td&gt;&lt;td&gt;Flash 不足→用户追问→GLM 解决的案例&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;决策稳定性&lt;/td&gt;&lt;td&gt;同类任务一致&lt;/td&gt;&lt;td&gt;避免同类型任务反复切换模型&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;理想模型分配&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Flash:  70-85%&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Pro:    10-20%&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;GLM:     5-15%&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Doubao: 按需&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;下一阶段方向&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;v1.42 Memory System&lt;/strong&gt;（不急着写，先收集真实数据）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Entity Normalization（最高优先级）— “显卡” = “GPU” = “7650GRE”&lt;/li&gt;
&lt;li&gt;Hybrid Retrieval — keyword + vector + entity graph&lt;/li&gt;
&lt;li&gt;多标签 Intent&lt;/li&gt;
&lt;li&gt;value_per_token budget&lt;/li&gt;
&lt;li&gt;模块化拆分（1020 行单文件拆为 memory/ 包）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;v4 路由&lt;/strong&gt;（暂不实现）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Flash = Orchestrator&lt;/li&gt;
&lt;li&gt;GLM = Design Expert&lt;/li&gt;
&lt;li&gt;Pro = Independent Reviewer&lt;/li&gt;
&lt;li&gt;Doubao = Vision&lt;/li&gt;
&lt;li&gt;经验驱动路由替代规则驱动&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;文件清单&lt;/h3&gt;

















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.hermes/lib/memory_conflict_resolver.py&lt;/code&gt;&lt;/td&gt;&lt;td&gt;核心引擎（~1020 行）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.hermes/scripts/memory_lifecycle_v1.2_test.py&lt;/code&gt;&lt;/td&gt;&lt;td&gt;15 个测试案例&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.hermes/plugins/experience-recorder/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Hook 自动记录插件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.hermes/skills/meta/model-router/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;三级路由规则&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.hermes/skills/meta/experience-recorder/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;分类规则 Skill&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.hermes/skills/meta/memory-lifecycle-rules/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;生命周期规则 Skill&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.hermes/skills/meta/knowledge-retrieval-evidence-policy/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;事实约束规则&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.hermes/task-memory/raw/*.jsonl&lt;/code&gt;&lt;/td&gt;&lt;td&gt;任务记忆原始日志&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.hermes/failure-memory.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;失败记录&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.hermes/traces/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;完整 trace 文件&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;这套系统现在已经从”配置多个模型”进入”个人 AI 工程系统”的阶段。&lt;/p&gt;
&lt;p&gt;当前阶段的成功标准不是路由更复杂，而是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;每一次决策都有记录&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;每一次失败都有原因&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;每一次改进都有依据&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下一步的重点不是继续增加规则，而是让系统在真实任务中产生数据，用失败案例驱动迭代。这比理论优化更重要。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;已从”配置 AI”进入”培养 AI”阶段。&lt;/strong&gt;&lt;/p&gt;</content:encoded></item><item><title>构建个人 AI 工程知识操作系统：Hermes + OpenViking 多层记忆架构实践</title><link>https://foxlesbiao.github.io/blog/posts/building-personal-ai-engineering-knowledge-os/</link><guid isPermaLink="true">https://foxlesbiao.github.io/blog/posts/building-personal-ai-engineering-knowledge-os/</guid><description>构建个人 AI 工程知识操作系统：Hermes + OpenViking 多层记忆架构实践</description><pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;构建个人 AI 工程知识操作系统：Hermes + OpenViking 多层记忆架构实践&lt;/h1&gt;
&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;我日常使用 &lt;strong&gt;Hermes Agent&lt;/strong&gt;（Nous Research 开源）作为 AI 助手，处理系统架构设计、NAS 运维、家庭能源系统规划、代码编写等任务。但几个月下来，暴露了一个核心问题：&lt;strong&gt;AI 没有长期记忆&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;每次问同一个问题，它都从零开始推理。不会记住我的设备参数、不会记住之前的决策、不会从历史经验中学习。&lt;/p&gt;
&lt;p&gt;解决这个问题需要一套完整的&lt;strong&gt;记忆架构&lt;/strong&gt;，而不是单一工具。这篇博客记录了过去几天的优化过程。&lt;/p&gt;
&lt;h2&gt;一、知识库搭建：OpenViking&lt;/h2&gt;
&lt;h3&gt;选型&lt;/h3&gt;
&lt;p&gt;对比了几个方案：&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;方案&lt;/th&gt;&lt;th&gt;优势&lt;/th&gt;&lt;th&gt;劣势&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Supermemory&lt;/td&gt;&lt;td&gt;自带 OCR、Gemini 提取&lt;/td&gt;&lt;td&gt;太重（PyTorch ~2GB），ARM64 慢，需自建服务&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;knowledge-base-mcp&lt;/td&gt;&lt;td&gt;MCP 协议，Claude 兼容&lt;/td&gt;&lt;td&gt;同样太重（PyTorch + BGE-M3 ~4GB），ARM64 1 chunk/s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenViking&lt;/td&gt;&lt;td&gt;轻量（Go 二进制），本地文件系统索引，FTS5 全文搜索&lt;/td&gt;&lt;td&gt;无 OCR，需要手动组织知识&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;最终选择 &lt;strong&gt;OpenViking 0.4.11&lt;/strong&gt;。原因：纯 Go 编译，无 Python 依赖，在 ARM64 上跑得飞快，FTS5 搜索毫秒级响应。&lt;/p&gt;
&lt;h3&gt;知识分类&lt;/h3&gt;
&lt;p&gt;将知识库按领域划分：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;viking://resources/rag/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── engineering_control/    — 《工程控制论》上下册&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── history_politics/       — 毛选等（方法论层）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── software_engineering/   — 《人月神话》等&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;└── systems_thinking/       — 《一般系统论》《系统科学方法概论》&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;核心是 &lt;strong&gt;工程控制论 + 系统科学&lt;/strong&gt;，作为解决复杂工程问题时的知识来源。&lt;/p&gt;
&lt;h3&gt;Hermes 集成&lt;/h3&gt;
&lt;p&gt;配置 Hermes 的 memory provider 为 OpenViking，并启用 &lt;code&gt;OPENVIKING_RECALL_RESOURCES=true&lt;/code&gt;，让 Hermes 在遇到复杂问题时自动检索知识库：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;memory&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  provider&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; openviking&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;二、多层记忆架构&lt;/h2&gt;
&lt;p&gt;Hermes 的长期记忆系统设计为四层，各司其职：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Layer 1: SOUL.md（行为准则）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 实事求是、调查研究、矛盾分析&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 系统思维、控制论、工程优先&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── 反馈闭环、假设验证&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Layer 2: Skills（怎么做）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── knowledge-retrieval-evidence-policy&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── decision-memory&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── 各领域专业技能&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Layer 3: USER.md + MEMORY.md（事实）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 用户偏好、设备参数、环境信息&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── 已验证的长期经验&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Layer 4: OpenViking（知识 + 经验）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 工程控制论、系统科学&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 软件工程、项目管理&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── 决策记录、历史案例&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;关键原则&lt;/strong&gt;：不要把知识往 SOUL.md 里堆。SOUL.md 是行为准则，不是知识库。知识归知识库，事实归 memory，做法归 skills。&lt;/p&gt;
&lt;h2&gt;三、知识检索策略优化&lt;/h2&gt;
&lt;h3&gt;发现的问题&lt;/h3&gt;
&lt;p&gt;测试中暴露了一个典型错误：AI 把”三电压逆变器”理解成”48V DC + 220V AC + 电网”，但实际是&lt;strong&gt;电池侧兼容 48V/60V/72V 三种电压&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;原因是：模型用通用知识推测，没有优先尊重用户 memory 中已记录的设备事实。&lt;/p&gt;
&lt;h3&gt;解决方案&lt;/h3&gt;
&lt;p&gt;创建 &lt;code&gt;knowledge-retrieval-evidence-policy&lt;/code&gt; skill，强制以下规则：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;事实优先于推测&lt;/strong&gt; — 用户 memory 中的设备参数 &amp;gt; 模型通用知识&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;未知参数必须标记&lt;/strong&gt; — 不允许自行补全，列出条件分支&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;检索在推理之前&lt;/strong&gt; — 复杂问题先查知识库，再推理&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;结果：下次测试时，Hermes 正确识别了三电压逆变器的含义，并主动询问未知参数，而不是自行假设。&lt;/p&gt;
&lt;h2&gt;四、家庭能源系统设计&lt;/h2&gt;
&lt;h3&gt;跨领域测试&lt;/h3&gt;
&lt;p&gt;作为知识库效果验证，设计了一套家庭能源管理系统。Hermes 在这个过程中主动调用了 OpenViking 中的工程控制论和系统科学知识，完成了跨领域综合。&lt;/p&gt;
&lt;h3&gt;四层架构&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;L4: 米家智能家居层 — 非关键负载控制&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;L3: HA 能源管理层 — 状态机、能量调度、SOC 管理&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;L2: 逆变器控制层 — MPPT、EPS 切换、电池检测&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;L1: 硬件保护层 — 断路器、SPD、熔断器（纯物理）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;15 状态机&lt;/h3&gt;
&lt;p&gt;覆盖无电池、电池怠速、PV 充电、PV 自用、余电上网、电网充电、削峰放电、多级停电、换电池、故障、手动接管等场景。&lt;/p&gt;
&lt;h3&gt;租赁电池的特殊性&lt;/h3&gt;
&lt;p&gt;用户电池不是固定购买，而是临时租赁。这意味着系统必须支持：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;无电池状态&lt;/strong&gt;：PV 自发自用，余电上网&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;电池接入检测&lt;/strong&gt;：自动识别 48V/60V/72V，无需 BMS 通信&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;换电池不停机&lt;/strong&gt;：热插拔支持&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;停电备用&lt;/h3&gt;
&lt;p&gt;电气切换由逆变器硬件 EPS 完成（&amp;lt;20ms），HA 负责 30s 后管理非关键负载，不承担毫秒级安全切换。&lt;/p&gt;
&lt;h2&gt;五、多模型路由配置&lt;/h2&gt;
&lt;h3&gt;问题&lt;/h3&gt;
&lt;p&gt;Hermes 只有一个主模型。但日常问答、复杂架构设计、图片识别对模型能力要求不同。全部用最强模型浪费 token，全部用最便宜模型质量不够。&lt;/p&gt;
&lt;h3&gt;方案&lt;/h3&gt;
&lt;p&gt;利用 Hermes 的 &lt;code&gt;auxiliary&lt;/code&gt; 和 &lt;code&gt;delegation&lt;/code&gt; 机制，实现多模型分工：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;                    Hermes&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                       │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;           DeepSeek V4 Flash（主模型）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;           日常对话、RAG、工具调用、记忆管理&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                       │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          ┌──────────────┼──────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          │              │              │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          ▼              ▼              ▼&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;       GLM-5.2      DeepSeek V4 Pro  Doubao Seed 2.0 Pro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;       ─────────     ─────────────     ─────────────────&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;       子任务         压缩             vision_analyze&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;       delegate      后台审查          OCR/截图/电路图&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                     策展&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  default&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; deepseek-v4-flash&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  provider&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; custom&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;delegation&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; glm-5.2&lt;/span&gt;&lt;span&gt;          # 子任务自动走 GLM&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  provider&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; custom&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;auxiliary&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  vision&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; doubao-seed-2-0-pro-260215&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    base_url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;https://ark.cn-beijing.volces.com/api/coding/v3&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    timeout&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 120&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  compression&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; deepseek-v4-pro&lt;/span&gt;&lt;span&gt;   # 压缩质量优先，不丢关键约束&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  background_review&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; deepseek-v4-pro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  curator&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; deepseek-v4-pro&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;限制&lt;/strong&gt;：&lt;code&gt;delegation.model&lt;/code&gt; 是”所有子任务固定走 GLM”，不是智能路由。Hermes 目前没有内置根据任务难度自动切换模型的能力。&lt;/p&gt;
&lt;h2&gt;六、清理与取舍&lt;/h2&gt;
&lt;h3&gt;放弃的方案&lt;/h3&gt;
&lt;p&gt;过去几个月尝试过的一些路线，最终都放弃了：&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;项目&lt;/th&gt;&lt;th&gt;放弃原因&lt;/th&gt;&lt;th&gt;替代方案&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;knowledge-base-mcp&lt;/td&gt;&lt;td&gt;PyTorch ~2GB + BGE-M3 ~2.2GB，ARM64 极慢&lt;/td&gt;&lt;td&gt;OpenViking FTS5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Supermemory&lt;/td&gt;&lt;td&gt;同样太重，Gemini 配额限制每天 20 次&lt;/td&gt;&lt;td&gt;直接放弃，改为 OpenViking&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;lottery-agent（彩票分析）&lt;/td&gt;&lt;td&gt;不再需要&lt;/td&gt;&lt;td&gt;已删除&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;清理命令&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; -rf&lt;/span&gt;&lt;span&gt; ~/knowledge-base-mcp&lt;/span&gt;&lt;span&gt; ~/kb-mcp-server&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; -rf&lt;/span&gt;&lt;span&gt; ~/lottery-agent&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;七、三层系统整合&lt;/h2&gt;
&lt;p&gt;NAS、AI Agent、家庭能源系统形成三层架构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Layer A: AI Agent（智能决策层）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── HA API 读取能源状态&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── SSH 管理 NAS 服务&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── cron 定时任务（日报/异常检测）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── OpenViking 知识库&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Layer B: NAS（基础设施层）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 数据存储（InfluxDB/SQLite）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── Grafana 可视化&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── nginx 反向代理&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── Ghost 博客&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Layer C: HA 能源管理层&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 状态机执行&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 逆变器 Modbus 通信&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 米家设备集成&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── SOC 管理 / 负载调度&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;h3&gt;当前状态&lt;/h3&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;组件&lt;/th&gt;&lt;th&gt;评分&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;SOUL.md（行为准则）&lt;/td&gt;&lt;td&gt;8.5/10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenViking 知识库&lt;/td&gt;&lt;td&gt;8/10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;知识分类&lt;/td&gt;&lt;td&gt;8/10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;知识调用策略&lt;/td&gt;&lt;td&gt;7/10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;多模型路由&lt;/td&gt;&lt;td&gt;已完成&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;经验教训&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;分层比堆叠重要&lt;/strong&gt; — 把行为准则、知识、事实、技能分开，比往一个文件里塞更多内容有效&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;事实约束比模型能力重要&lt;/strong&gt; — 再强的模型，如果不尊重用户已有事实，输出也是错的&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;轻量方案优先&lt;/strong&gt; — ARM64 上跑 PyTorch 是不归路，FTS5 全文搜索足够快&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Agent 需要反馈闭环&lt;/strong&gt; — 一次回答不够，需要设计验证、修正、迭代的机制&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;下一步&lt;/h3&gt;
&lt;p&gt;做一个 &lt;strong&gt;delegate 触发规则 skill&lt;/strong&gt;，让 Hermes 能自动判断什么时候需要走 GLM-5.2 子任务，接近真正的多模型智能路由。&lt;/p&gt;</content:encoded></item><item><title>Hermes 多模型路由架构：从单模型到三级专家协作的演化之路</title><link>https://foxlesbiao.github.io/blog/posts/multi-model-routing-architecture/</link><guid isPermaLink="true">https://foxlesbiao.github.io/blog/posts/multi-model-routing-architecture/</guid><description>Hermes 多模型路由架构：从单模型到三级专家协作的演化之路</description><pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Hermes 多模型路由架构：从单模型到三级专家协作的演化之路&lt;/h1&gt;
&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;在上一篇《构建个人 AI 工程知识操作系统》中，我记录了 Hermes Agent 多层记忆架构的搭建过程。但解决了”记住什么”之后，下一个问题是——&lt;strong&gt;“用什么模型来思考”&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;日常对话、RAG 检索、简单脚本用 Flash 就够，但系统架构设计、硬件安全分析、多方案权衡需要更强的推理能力。全部用最强模型浪费 token，全部用最便宜模型质量不够。&lt;/p&gt;
&lt;p&gt;本文记录从单模型到多模型路由的完整演化过程。&lt;/p&gt;
&lt;h2&gt;问题定义&lt;/h2&gt;
&lt;h3&gt;可用模型池&lt;/h3&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;模型&lt;/th&gt;&lt;th&gt;能力特征&lt;/th&gt;&lt;th&gt;资源消耗&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;DeepSeek V4 Flash&lt;/td&gt;&lt;td&gt;快速响应，工具调用稳定&lt;/td&gt;&lt;td&gt;低&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DeepSeek V4 Pro&lt;/td&gt;&lt;td&gt;代码能力中等，适合审查&lt;/td&gt;&lt;td&gt;中&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GLM-5.2&lt;/td&gt;&lt;td&gt;深度推理，架构设计强&lt;/td&gt;&lt;td&gt;高&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Doubao Seed 2.0 Pro&lt;/td&gt;&lt;td&gt;视觉理解，OCR&lt;/td&gt;&lt;td&gt;专用&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;核心矛盾&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;单一模型无法同时兼顾&lt;/strong&gt;速度、成本、复杂推理质量&lt;/li&gt;
&lt;li&gt;Hermes 没有内置”根据任务难度自动切换模型”的能力&lt;/li&gt;
&lt;li&gt;主模型只能有一个，但任务类型多种多样&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;设计目标&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;简单任务不浪费 GLM&lt;/li&gt;
&lt;li&gt;复杂任务 Flash 能判断出来交给专家&lt;/li&gt;
&lt;li&gt;视觉不走主模型&lt;/li&gt;
&lt;li&gt;用户明确指定时覆盖自动路由&lt;/li&gt;
&lt;li&gt;路由决策可追溯、可优化&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;架构演化&lt;/h2&gt;
&lt;h3&gt;v1：关键词触发（跳过）&lt;/h3&gt;
&lt;p&gt;第一版简单粗暴——用关键词匹配判断是否 delegate：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;看到&quot;架构&quot; → delegate&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;看到&quot;状态机&quot; → delegate&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;看到&quot;电路图&quot; → delegate&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户问”什么是状态机？“也会误触发&lt;/li&gt;
&lt;li&gt;简单问题被升级，浪费 token&lt;/li&gt;
&lt;li&gt;规则越来越复杂，趋向过拟合&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;v2：三级任务分级&lt;/h3&gt;
&lt;p&gt;将任务分为三个等级：&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;等级&lt;/th&gt;&lt;th&gt;描述&lt;/th&gt;&lt;th&gt;路由目标&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Level 0&lt;/td&gt;&lt;td&gt;单步问答、查询、配置&lt;/td&gt;&lt;td&gt;Flash 直接回答&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Level 1&lt;/td&gt;&lt;td&gt;需要分析，不需要重新设计系统&lt;/td&gt;&lt;td&gt;Flash 或 Pro&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Level 2&lt;/td&gt;&lt;td&gt;系统设计、架构、多方案权衡&lt;/td&gt;&lt;td&gt;delegate → GLM-5.2&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;改进&lt;/strong&gt;：从”关键词触发”升级为”按复杂度分级”，误触发减少。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;遗留问题&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GLM 直接输出给用户，没有经过 Flash 验证&lt;/li&gt;
&lt;li&gt;没有用户覆盖机制&lt;/li&gt;
&lt;li&gt;成本等级标注不准确（不同 API Plan 价格不同）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;v3：三级路由 + 专家回流 + 用户覆盖（当前版本）&lt;/h3&gt;
&lt;p&gt;最终架构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;                User Request&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                     │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                     ▼&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          DeepSeek V4 Flash&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          Router + Orchestrator&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                     │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        ┌────────────┼────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        │            │            │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        ▼            ▼            ▼&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;     Level 0      Level 1      Level 2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;     Flash       Flash+Pro      GLM-5.2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        │            │            │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        │            │            │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        ▼            ▼            ▼&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    简单任务      审查增强      专家设计&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                     │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                     ▼&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;              Flash 整合输出&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;核心改进 1：GLM 输出回流&lt;/h4&gt;
&lt;p&gt;GLM 是专家，不直接面对用户。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Flash&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;delegate_task → GLM-5.2（深度推理）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;GLM 结果返回 Flash&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Flash 职责：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 验证结果合理性&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 合并 memory 上下文（用户偏好、设备参数）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 检查已知/未知约束&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 补充 OpenViking 知识&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── 输出最终答案给用户&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;核心改进 2：用户覆盖&lt;/h4&gt;
&lt;p&gt;如果用户明确指定模型，&lt;strong&gt;始终尊重&lt;/strong&gt;，跳过路由判断。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&quot;用 GLM-5.2 分析这个架构&quot; → 走 GLM&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&quot;用 DeepSeek Pro 审查代码&quot;  → 走 Pro&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;核心改进 3：资源等级替代成本等级&lt;/h4&gt;
&lt;p&gt;避免不同 API Plan 下价格标注不准确：&lt;/p&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;模型&lt;/th&gt;&lt;th&gt;资源等级&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Flash&lt;/td&gt;&lt;td&gt;快速&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pro&lt;/td&gt;&lt;td&gt;增强&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GLM&lt;/td&gt;&lt;td&gt;深度&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h4&gt;核心改进 4：RAG 优先&lt;/h4&gt;
&lt;p&gt;先查 OpenViking 知识库，再决定是否 delegate。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;问题&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;有 OpenViking 知识可用？&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ↓ YES → 先检索，看能否直接回答&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ↓ NO  → 继续复杂度判断&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;核心改进 5：Token 预算判断&lt;/h4&gt;
&lt;p&gt;delegate 前先预估：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;如果预计回答 &amp;lt; 1000 tokens&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  AND 无架构设计&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  AND 无多方案比较&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  AND 无硬件安全&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;→ 不要 delegate，Flash 足够&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;完整路由决策树&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Step 1: 用户指定了模型？&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  YES → 尊重用户选择，跳过路由&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Step 2: 包含图片？&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  YES → Doubao Vision（自动，无需操作）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Step 3: 有 OpenViking 知识可用？&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  YES → 先检索，看能否直接回答&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Step 4: 复杂度评估&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  预计回答长度、模块数、是否含方案比较、&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  是否涉及硬件安全、是否需要架构图&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Step 5: 路由&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  Level 0 → Flash 直接回答&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  Level 1 → Flash 或 Pro（代码审查走 Pro）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  Level 2 → delegate → GLM-5.2 → 回流 Flash 整合&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;辅助链（自动路由，无需操作）&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;图片/截图/OCR&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        ▼&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Doubao Seed 2.0 Pro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;后台任务（压缩、策展、background_review）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        ▼&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;DeepSeek V4 Pro&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;为什么 Flash 是”大脑”而不是”最低级模型”&lt;/h2&gt;
&lt;p&gt;很多多模型方案的结构是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;便宜模型 → 判断 → 贵模型&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种方案的问题：便宜模型判断不准，路由错误率高。&lt;/p&gt;
&lt;p&gt;我们的方案：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Flash → 理解上下文 → 决定是否调用专家 → 整合输出&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Flash 不是”便宜替代品”，而是&lt;strong&gt;主控制器&lt;/strong&gt;。它负责：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;理解用户完整意图&lt;/li&gt;
&lt;li&gt;调用 memory 和知识库&lt;/li&gt;
&lt;li&gt;判断是否需要专家介入&lt;/li&gt;
&lt;li&gt;整合专家输出为最终答案&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;配置实现&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  default&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; deepseek-v4-flash&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  provider&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; custom&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;delegation&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; glm-5.2&lt;/span&gt;&lt;span&gt;          # 子任务自动走 GLM&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  provider&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; custom&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;auxiliary&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  vision&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; doubao-seed-2-0-pro-260215&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    base_url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;https://ark.cn-beijing.volces.com/api/coding/v3&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    timeout&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 120&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  compression&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; deepseek-v4-pro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  background_review&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; deepseek-v4-pro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  curator&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; deepseek-v4-pro&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;当前状态：冻结 v3，进入数据收集&lt;/h2&gt;
&lt;p&gt;现在不做更多规则调整，让真实使用数据跑出来。&lt;/p&gt;
&lt;h3&gt;4 个观察指标&lt;/h3&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;指标&lt;/th&gt;&lt;th&gt;目标&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;路由准确率&lt;/td&gt;&lt;td&gt;逐步提升&lt;/td&gt;&lt;td&gt;任务→路由→结果质量评分&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GLM 调用比例&lt;/td&gt;&lt;td&gt;5-15%&lt;/td&gt;&lt;td&gt;超过 30% 说明 Router 太激进&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;升级失败案例&lt;/td&gt;&lt;td&gt;重点收集&lt;/td&gt;&lt;td&gt;Flash 不足→用户追问→GLM 解决的案例&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;决策稳定性&lt;/td&gt;&lt;td&gt;同类任务一致&lt;/td&gt;&lt;td&gt;避免同类型任务反复切换模型&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;理想分配&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Flash:  70-85%&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Pro:    10-20%&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;GLM:     5-15%&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Doubao: 按需&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;未来方向&lt;/h2&gt;
&lt;h3&gt;v4.1：task-memory（经验驱动路由）&lt;/h3&gt;
&lt;p&gt;记录每次路由决策的效果，积累经验数据：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;task-memory/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── energy/EMS设计&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│     ├── model: GLM-5.2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│     ├── success: true&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│     └── pattern: state-machine&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;├── software/docker迁移&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│     ├── model: Flash&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;│     └── success: true&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;└── hardware/BMS分析&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      ├── model: GLM-5.2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      └── success: true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以后遇到类似任务，直接查询历史，自动选择最佳模型。&lt;/p&gt;
&lt;h3&gt;v4.2：failure-memory（失败升级）&lt;/h3&gt;
&lt;p&gt;Flash 尝试解决 → 检测到多次工具失败/不确定性 → 自动升级到 GLM。&lt;/p&gt;
&lt;h3&gt;最终形态&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;                  Hermes&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                    │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;             Model Router&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                    │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        ┌───────────┼───────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;     Rules       Memory       Feedback&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;       │            │             │&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;   当前规则     历史决策      成功率&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        └───────────┼───────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                    ▼&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            自适应模型选择&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;架构模式总结&lt;/h2&gt;
&lt;p&gt;当前 Hermes 已经形成 4 层知识体系：&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;层级&lt;/th&gt;&lt;th&gt;内容&lt;/th&gt;&lt;th&gt;回答的问题&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Resource Memory&lt;/td&gt;&lt;td&gt;专业知识库&lt;/td&gt;&lt;td&gt;“这个领域有什么知识？”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Event/Experience Memory&lt;/td&gt;&lt;td&gt;历史经验&lt;/td&gt;&lt;td&gt;“以前发生过什么？”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Decision Memory&lt;/td&gt;&lt;td&gt;设计决策&lt;/td&gt;&lt;td&gt;“为什么选择这个方案？”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pattern Memory&lt;/td&gt;&lt;td&gt;架构模式&lt;/td&gt;&lt;td&gt;“以后类似问题怎么处理？”&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;模型链形成 &lt;strong&gt;Planner → Specialist → Reviewer → Integrator&lt;/strong&gt; 结构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;创造能力 = GLM-5.2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;执行能力 = DeepSeek V4 Flash&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;审查能力 = DeepSeek V4 Pro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;经验能力 = OpenViking&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;经验教训&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;不要用关键词触发路由&lt;/strong&gt; — 容易误触发，趋向过拟合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flash 是大脑，不是最低级模型&lt;/strong&gt; — 它负责判断和整合，不是替代品&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GLM 不直接面对用户&lt;/strong&gt; — 专家输出必须经过主模型验证和整合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;成本等级不要硬编码&lt;/strong&gt; — 不同 API Plan 价格不同，用资源等级替代&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;先查知识库再 delegate&lt;/strong&gt; — 充分利用已有知识，避免不必要的专家调用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;规则路由是起点，经验路由是终点&lt;/strong&gt; — 先跑数据，再做自适应&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;关联阅读&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/blog/2026/07/31/building-personal-ai-engineering-knowledge-os.html&quot;&gt;构建个人 AI 工程知识操作系统：Hermes + OpenViking 多层记忆架构实践&lt;/a&gt; — 记忆架构搭建&lt;/li&gt;
&lt;li&gt;model-router skill：&lt;code&gt;~/.hermes/skills/meta/model-router/SKILL.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;决策记录：OpenViking &lt;code&gt;viking://user/memories/events/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Hermes 可观测 AI 系统：从规则驱动到数据驱动的工程闭环</title><link>https://foxlesbiao.github.io/blog/posts/observable-ai-system/</link><guid isPermaLink="true">https://foxlesbiao.github.io/blog/posts/observable-ai-system/</guid><description>Hermes 可观测 AI 系统：从规则驱动到数据驱动的工程闭环</description><pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Hermes 可观测 AI 系统：从规则驱动到数据驱动的工程闭环&lt;/h1&gt;
&lt;h2&gt;前情提要&lt;/h2&gt;
&lt;p&gt;前两篇记录了 Hermes Agent 的搭建过程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;《构建个人 AI 工程知识操作系统》&lt;/strong&gt; —— 多层记忆架构（OpenViking + 分层记忆 + 知识检索）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;《Hermes 多模型路由架构》&lt;/strong&gt; —— 三级专家协作路由（v1→v2→v3 演化）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本篇文章是系列的第三篇，也是&lt;strong&gt;阶段总结篇&lt;/strong&gt;。经过八小时连续的架构设计、规则编写、测试验证和故障修复，这套系统从”配置多个模型”正式进入”个人 AI 工程系统”的第三阶段——&lt;strong&gt;可观测 AI 系统&lt;/strong&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;三个阶段&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;阶段1: 工具调用 Agent&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  → 能调用工具，但每次独立决策，无记忆&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;阶段2: 多模型 Agent&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  → 多模型分工，规则路由，有记忆分层&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;阶段3: 可观测 AI 系统  ← 现在这里&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  → 有日志，有版本，有实验，有回滚，有失败分析&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;阶段4: 经验驱动 AI 系统（未来）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  → 基于积累数据自动优化路由&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;本次构建的核心成果&lt;/h2&gt;
&lt;h3&gt;1. 内存生命周期规则&lt;/h3&gt;
&lt;p&gt;解决了”记忆污染”问题——Agent 不再把旧事实当新事实，也不再不分来源地混用记忆。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7 类可信度标记&lt;/strong&gt;：&lt;/p&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;标记&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;th&gt;TTL&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;CONFIRMED ✅&lt;/td&gt;&lt;td&gt;用户确认的事实&lt;/td&gt;&lt;td&gt;30-90 天&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OBSERVED 📋&lt;/td&gt;&lt;td&gt;自动探测的信息&lt;/td&gt;&lt;td&gt;30 天&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DERIVED 🔄&lt;/td&gt;&lt;td&gt;推理得出的结论&lt;/td&gt;&lt;td&gt;14 天&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SPECULATIVE ❓&lt;/td&gt;&lt;td&gt;猜测，未验证&lt;/td&gt;&lt;td&gt;1 天&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;STALE ⌛&lt;/td&gt;&lt;td&gt;已过期&lt;/td&gt;&lt;td&gt;保留 7 天后移除&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CONFLICTED ⚠️&lt;/td&gt;&lt;td&gt;多个来源不一致&lt;/td&gt;&lt;td&gt;待裁决&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;FROZEN 🧊&lt;/td&gt;&lt;td&gt;用户锁定，永不覆盖&lt;/td&gt;&lt;td&gt;永久&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;5 类生命周期规则&lt;/strong&gt;：写入规则、冲突解决、过期管理、回滚机制、冷冻保护。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;冲突优先级修正&lt;/strong&gt;：核心原则改为”来源可信度 &amp;gt; 存储位置”。用户今天说的 CONFIRMED 事实，优先级高于旧 MEMORY.md 记录。不再因为”存在 MEMORY 里”就自动压过新输入。&lt;/p&gt;
&lt;h3&gt;2. 三层记忆职责边界&lt;/h3&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;层&lt;/th&gt;&lt;th&gt;存储&lt;/th&gt;&lt;th&gt;职责&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;MEMORY.md / USER.md&lt;/td&gt;&lt;td&gt;高频事实&lt;/td&gt;&lt;td&gt;系统 prompt 自动注入，零延迟&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenViking&lt;/td&gt;&lt;td&gt;语义知识&lt;/td&gt;&lt;td&gt;长期知识、决策、经验、架构模式&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;FTS5 (session_search)&lt;/td&gt;&lt;td&gt;原始对话&lt;/td&gt;&lt;td&gt;全文检索历史对话，兜底&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;三层的交叉检索策略：先查 MEMORY（高频事实）→ 再查 OpenViking（语义知识）→ 最后查 FTS5（原始对话）。&lt;/p&gt;
&lt;h3&gt;3. 真实请求 Trace 系统&lt;/h3&gt;
&lt;p&gt;建立完整链路追踪：&lt;strong&gt;用户输入 → 检索 → 路由 → delegate → 模型执行 → 整合结果&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;每次请求记录：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;输入任务和复杂度评分&lt;/li&gt;
&lt;li&gt;路由判断依据&lt;/li&gt;
&lt;li&gt;检索来源（哪些知识库命中）&lt;/li&gt;
&lt;li&gt;使用模型&lt;/li&gt;
&lt;li&gt;输出结果摘要&lt;/li&gt;
&lt;li&gt;用户反馈（待收集）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. Task-Memory 和 Failure-Memory 观察数据库&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Task-Memory&lt;/strong&gt; 记录每次路由决策的完整信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;task_id&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; T6&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;task&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 对比 MQTT vs Modbus TCP&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;complexity&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; modules&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; safety&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; arch&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; tradeoff&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; scale&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; large&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;routing&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; decision&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; Level 2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; model&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; GLM-5.2&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;evaluation&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  latency_seconds&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 102&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  input_tokens&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 19590&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  output_tokens&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 2414&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  human_rating&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; (待收集)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Failure-Memory&lt;/strong&gt; 记录每次失败的根本原因和修复方案：&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;ID&lt;/th&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;原因&lt;/th&gt;&lt;th&gt;修复&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;F001&lt;/td&gt;&lt;td&gt;CONFIG&lt;/td&gt;&lt;td&gt;delegation.provider 指向不存在的 provider&lt;/td&gt;&lt;td&gt;修复为 volcengine-coding-plan&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;F002&lt;/td&gt;&lt;td&gt;TOOL&lt;/td&gt;&lt;td&gt;GLM 子任务执行过多环境探测，600s 超时&lt;/td&gt;&lt;td&gt;Flash 在 delegate 前完成检索&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;F003&lt;/td&gt;&lt;td&gt;TOOL&lt;/td&gt;&lt;td&gt;web_search 依赖缺失，子任务花时间安装&lt;/td&gt;&lt;td&gt;delegate context 预装依赖&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;F004&lt;/td&gt;&lt;td&gt;CONFIG&lt;/td&gt;&lt;td&gt;auxiliary.provider 同样指向不存在的 provider&lt;/td&gt;&lt;td&gt;统一切换 provider&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;分类&lt;/strong&gt;：CONFIG / ROUTING / RETRIEVAL / MODEL / TOOL / MEMORY&lt;/p&gt;
&lt;h3&gt;5. Batch Test v1：6 个测试用例 × 3 个模型&lt;/h3&gt;






















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;任务&lt;/th&gt;&lt;th&gt;等级&lt;/th&gt;&lt;th&gt;模型&lt;/th&gt;&lt;th&gt;耗时&lt;/th&gt;&lt;th&gt;结果&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;什么是 MQTT broker&lt;/td&gt;&lt;td&gt;Level 0&lt;/td&gt;&lt;td&gt;Flash&lt;/td&gt;&lt;td&gt;0.5s&lt;/td&gt;&lt;td&gt;正确路由&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;查 NAS IP&lt;/td&gt;&lt;td&gt;Level 0&lt;/td&gt;&lt;td&gt;Flash&lt;/td&gt;&lt;td&gt;0.5s&lt;/td&gt;&lt;td&gt;正确路由&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;写光伏效率函数&lt;/td&gt;&lt;td&gt;Level 1&lt;/td&gt;&lt;td&gt;Flash&lt;/td&gt;&lt;td&gt;0.5s&lt;/td&gt;&lt;td&gt;正确路由&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;审查 HA MQTT 配置&lt;/td&gt;&lt;td&gt;Level 1&lt;/td&gt;&lt;td&gt;Pro&lt;/td&gt;&lt;td&gt;52s&lt;/td&gt;&lt;td&gt;正确路由，发现 9 项风险&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;设计 15 状态机&lt;/td&gt;&lt;td&gt;Level 2&lt;/td&gt;&lt;td&gt;GLM&lt;/td&gt;&lt;td&gt;419s&lt;/td&gt;&lt;td&gt;正确路由，36KB 设计文档&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;对比 MQTT vs Modbus&lt;/td&gt;&lt;td&gt;Level 2&lt;/td&gt;&lt;td&gt;GLM&lt;/td&gt;&lt;td&gt;102s&lt;/td&gt;&lt;td&gt;正确路由，18K 字符深度分析&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;路由正确率：6/6。但样本量小，需要扩充到 20-50 个。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;当前冻结的架构 v3&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;model-router v3 (frozen-baseline)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 三级路由：Level 0 (Flash) / Level 1 (Flash/Pro) / Level 2 (GLM)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 固定分工：视觉 → Doubao，审查 → Pro，压缩 → Pro&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 复杂度评分维度：模块数、安全风险、架构设计、方案权衡、输出规模&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── 用户覆盖：用户指定模型时跳过自动路由&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;memory-lifecycle-rules v1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 7 类可信度标记&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 5 类生命周期规则&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ├── 三层记忆职责边界&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── 冲突优先级：来源可信度 &amp;gt; 存储位置&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;task-memory / failure-memory (observation only)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  └── 不自动影响路由，仅收集数据&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;关键发现&lt;/h2&gt;
&lt;h3&gt;1. 配置错误导致静默失败&lt;/h3&gt;
&lt;p&gt;delegation.provider 设为 “custom” 但未配置 API key，所有 delegate 任务静默失败。同样问题存在于 auxiliary.compression 和 auxiliary.curator。修复后管道畅通。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;教训&lt;/strong&gt;：配置必须验证，不能假设”看起来对”。&lt;/p&gt;
&lt;h3&gt;2. GLM 子任务执行过剩环境探测&lt;/h3&gt;
&lt;p&gt;GLM 在推理前做了 session_search、execute_code、skill_view 等 15 次探测操作，消耗了 600 秒中的大部分时间。这些应该在 Flash 阶段完成，只传递精简 context 给 GLM。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;教训&lt;/strong&gt;：delegate 是推理增强，不是环境探测增强。环境探测是 orchestrator 的职责。&lt;/p&gt;
&lt;h3&gt;3. 1000-token 阈值无数据支撑&lt;/h3&gt;
&lt;p&gt;路由规则中的 1000-token 阈值是拍脑袋的。本次 batch test 第一次收集了实际数据（T6 实际输出 22,004 tokens）。需要更多样本才能确定合理阈值。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;教训&lt;/strong&gt;：路由参数必须有数据支撑，不能凭感觉设。&lt;/p&gt;
&lt;h3&gt;4. Flash 同时作为路由器和审查者是循环依赖&lt;/h3&gt;
&lt;p&gt;当前架构中，Flash 负责判断”这是 Level 2”→ delegate 给 GLM → GLM 返回 → Flash 审查 GLM 输出。如果 Flash 无法识别 GLM 的错误，坏答案直接交付。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;v4 目标&lt;/strong&gt;：引入 Pro 作为独立审查者，形成 Flash → GLM → Pro → Flash 管道。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;下一阶段策略&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;当前策略：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  规则驱动 &amp;gt; 经验驱动&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  经验库只观察，不控制&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;下一阶段目标：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  不是让 Hermes 更聪明&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  而是让 Hermes 的每一次决策都有证据、有反馈、可优化&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;需要积累：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  - 20-50 条真实任务 trace&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  - 不同难度边界案例&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  - 用户反馈质量标签&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  - 模型耗时/token/成功率&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;v4 设计目标（暂不实现）：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  Flash = Orchestrator&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  GLM = Design Expert&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  Pro = Independent Reviewer&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  Doubao = Vision&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;成功标准&lt;/h2&gt;
&lt;p&gt;当前阶段的成功标准不是路由更复杂，而是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;每一次决策都有记录&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;每一次失败都有原因&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;每一次改进都有依据&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这套系统现在已经从”配置多个模型”进入”个人 AI 工程系统”的阶段。下一步是收集数据，而不是继续堆规则。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;相关文章&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://foxlesbiao.github.io/blog/2026/07/31/building-personal-ai-engineering-knowledge-os.html&quot; target=&quot;_blank&quot;&gt;构建个人 AI 工程知识操作系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://foxlesbiao.github.io/blog/2026/07/31/hermes-multi-model-routing-architecture.html&quot; target=&quot;_blank&quot;&gt;Hermes 多模型路由架构&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>AutoBangumi TMDB 被墙？不用代理，一行 sed 搞定</title><link>https://foxlesbiao.github.io/blog/posts/autobangumi-tmdb-wall-fix/</link><guid isPermaLink="true">https://foxlesbiao.github.io/blog/posts/autobangumi-tmdb-wall-fix/</guid><description>AutoBangumi TMDB 被墙？不用代理，一行 sed 搞定</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;AutoBangumi TMDB 被墙？不用代理，一行 sed 搞定&lt;/h1&gt;
&lt;h2&gt;问题&lt;/h2&gt;
&lt;p&gt;AutoBangumi（AB）用 TMDB 获取番剧元数据。默认请求的是 &lt;code&gt;api.themoviedb.org&lt;/code&gt;，但这个域名在国内很多网络环境下丢包严重甚至完全不通，导致元数据查询持续超时。&lt;/p&gt;
&lt;p&gt;AB 虽然支持 HTTP 代理（&lt;code&gt;proxy.enable&lt;/code&gt;），但不是所有人都能搭代理。有没有更简单的办法？&lt;/p&gt;
&lt;h2&gt;答案&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;api.themoviedb.org&lt;/code&gt; 的短域名 &lt;code&gt;api.tmdb.org&lt;/code&gt; 在很多国内网络下是通的。只需把容器里的硬编码 URL 换掉就行。&lt;/p&gt;
&lt;h2&gt;方法&lt;/h2&gt;
&lt;h3&gt;第一步：找到要改的文件&lt;/h3&gt;
&lt;p&gt;AB 容器里硬编码 TMDB URL 的文件：&lt;/p&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;硬编码 URL&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;/app/module/parser/analyser/tmdb_parser.py&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://api.themoviedb.org&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;/app/module/parser/analyser/tmdb_parser.py&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://image.tmdb.org/t/p/w780&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;/app/module/bgmi_calendar.py&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://api.bgm.tv/calendar&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;一般只需要改第一个。&lt;code&gt;image.tmdb.org&lt;/code&gt; 和 &lt;code&gt;api.bgm.tv&lt;/code&gt; 通常能通。&lt;/p&gt;
&lt;h3&gt;第二步：进容器改&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; exec&lt;/span&gt;&lt;span&gt; -it&lt;/span&gt;&lt;span&gt; AutoBangumi&lt;/span&gt;&lt;span&gt; bash&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 替换 TMDB API 域名&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sed&lt;/span&gt;&lt;span&gt; -i&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;s|https://api.themoviedb.org|https://api.tmdb.org|g&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; /app/module/parser/analyser/tmdb_parser.py&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 退出容器后重启&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;exit&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; restart&lt;/span&gt;&lt;span&gt; AutoBangumi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;改完立刻生效，AB 会用 &lt;code&gt;api.tmdb.org&lt;/code&gt; 请求 TMDB。&lt;/p&gt;
&lt;h3&gt;第三步：持久化（关键）&lt;/h3&gt;
&lt;p&gt;容器重建（更新镜像、&lt;code&gt;docker-compose down &amp;amp;&amp;amp; up&lt;/code&gt;）后改动会丢失。两种方式持久化：&lt;/p&gt;
&lt;h4&gt;方式一：crontab 脚本（推荐）&lt;/h4&gt;
&lt;p&gt;写一个脚本，NAS 启动时自动 patch：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# /vol1/1000/Mikan/autobangumi/patch_tmdb.sh&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt; 10&lt;/span&gt;&lt;span&gt;  # 等容器启动&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FILE&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;/app/module/parser/analyser/tmdb_parser.py&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;CONTAINER&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;AutoBangumi&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; docker&lt;/span&gt;&lt;span&gt; exec&lt;/span&gt;&lt;span&gt; $CONTAINER&lt;/span&gt;&lt;span&gt; grep&lt;/span&gt;&lt;span&gt; -q&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;api.themoviedb.org&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;$FILE&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; 2&amp;gt;&lt;/span&gt;&lt;span&gt;/dev/null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    docker&lt;/span&gt;&lt;span&gt; exec&lt;/span&gt;&lt;span&gt; $CONTAINER&lt;/span&gt;&lt;span&gt; sed&lt;/span&gt;&lt;span&gt; -i&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;s|https://api.themoviedb.org|https://api.tmdb.org|g&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;$FILE&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    docker&lt;/span&gt;&lt;span&gt; restart&lt;/span&gt;&lt;span&gt; $CONTAINER&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;: TMDB patched&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; /vol1/1000/Mikan/autobangumi/patch.log&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加到 crontab：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;crontab&lt;/span&gt;&lt;span&gt; -e&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 加入：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;@reboot&lt;/span&gt;&lt;span&gt; /vol1/1000/Mikan/autobangumi/patch_tmdb.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;脚本有判断逻辑：只有 URL 还没被改过才执行 patch，避免重复重启。&lt;/p&gt;
&lt;h4&gt;方式二：Dockerfile 继承（更规范）&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; ghcr.io/estrellaxd/auto_bangumi:latest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RUN&lt;/span&gt;&lt;span&gt; sed -i &lt;/span&gt;&lt;span&gt;&apos;s|https://api.themoviedb.org|https://api.tmdb.org|g&apos;&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    /app/module/parser/analyser/tmdb_parser.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后用这个自定义镜像代替官方镜像。缺点是每次 AB 更新要重新 build。&lt;/p&gt;
&lt;h2&gt;验证&lt;/h2&gt;
&lt;p&gt;改完后查看 AB 日志，TMDB 请求应该不再超时：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; logs&lt;/span&gt;&lt;span&gt; AutoBangumi&lt;/span&gt;&lt;span&gt; --tail&lt;/span&gt;&lt;span&gt; 50&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; grep&lt;/span&gt;&lt;span&gt; -i&lt;/span&gt;&lt;span&gt; tmdb&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果看到正常的元数据返回而不是 timeout，就成功了。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;方案&lt;/th&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;sed&lt;/code&gt; + crontab&lt;/td&gt;&lt;td&gt;简单，一行命令&lt;/td&gt;&lt;td&gt;容器重建要等脚本触发&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Dockerfile 继承&lt;/td&gt;&lt;td&gt;更新时自动生效&lt;/td&gt;&lt;td&gt;每次 AB 更新要重新 build&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HTTP 代理&lt;/td&gt;&lt;td&gt;AB 原生支持&lt;/td&gt;&lt;td&gt;需要搭代理服务器&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;对于不想折腾代理的用户，&lt;code&gt;sed&lt;/code&gt; 替换是最快的方案。&lt;/p&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;我已向 AB 开发者提交了 &lt;a href=&quot;https://github.com/EstrellaXD/Auto_Bangumi/issues/1042&quot; target=&quot;_blank&quot;&gt;Feature Request #1042&lt;/a&gt;，建议在配置中增加自定义 API Base URL 的选项。如果被采纳，以后就不需要手动 patch 了。&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded></item><item><title>SQLite FTS5 跨架构迁移踩坑记：从 x86 到 ARM64</title><link>https://foxlesbiao.github.io/blog/posts/sqlite-fts5-cross-architecture-migration/</link><guid isPermaLink="true">https://foxlesbiao.github.io/blog/posts/sqlite-fts5-cross-architecture-migration/</guid><description>SQLite FTS5 跨架构迁移踩坑记：从 x86 到 ARM64</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;SQLite FTS5 跨架构迁移踩坑记：从 x86 到 ARM64&lt;/h1&gt;
&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;最近将 &lt;strong&gt;Hermes Agent&lt;/strong&gt;（一个基于 SQLite 的 AI 聊天代理）从一台 x86_64 Arch Linux 服务器迁移到一台 ARM64 Armbian 开发板上。数据量不大：约 111MB 的 &lt;code&gt;state.db&lt;/code&gt;，包含 9786 条消息、186 个会话。&lt;/p&gt;
&lt;p&gt;迁移数据库嘛，听起来很简单对吧？然而这次踩了一个大坑。&lt;/p&gt;
&lt;h2&gt;迁移方案的选择&lt;/h2&gt;
&lt;h3&gt;方案一：&lt;code&gt;.dump&lt;/code&gt; / &lt;code&gt;.reload&lt;/code&gt;（我选的，后来证明是错的）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 在源机器上导出&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sqlite3&lt;/span&gt;&lt;span&gt; state.db&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;.dump&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; dump.sql&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 在目标机器上导入&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sqlite3&lt;/span&gt;&lt;span&gt; state.db&lt;/span&gt;&lt;span&gt; &amp;lt;&lt;/span&gt;&lt;span&gt; dump.sql&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看起来很标准对吧？SQLite 官方文档也推荐这个方法来做版本升级或格式转换。但问题是——&lt;strong&gt;当数据库包含 FTS5 虚拟表时，这个方法有严重的隐患。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;方案二：直接复制 &lt;code&gt;.db&lt;/code&gt; 文件（正确方案）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 直接拷贝&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;scp&lt;/span&gt;&lt;span&gt; user@source-server:/path/to/state.db&lt;/span&gt;&lt;span&gt; ./state.db&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;没错，就这么简单。&lt;strong&gt;SQLite 的 &lt;code&gt;.db&lt;/code&gt; 文件是二进制跨架构兼容的&lt;/strong&gt;——x86 和 ARM64 使用相同的字节序（小端），SQLite 文件格式不依赖任何平台特定的结构。直接复制就行。&lt;/p&gt;
&lt;h2&gt;问题现象&lt;/h2&gt;
&lt;p&gt;使用 &lt;code&gt;.dump&lt;/code&gt; / &lt;code&gt;.reload&lt;/code&gt; 导入后，数据库看起来正常，表和数据都在。但当 Agent 尝试写入新消息时：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;RuntimeError: constraint failed&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;具体报错指向 FTS5 虚拟表的插入操作。进一步测试：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;-- 查询没问题&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; COUNT&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; messages;  &lt;/span&gt;&lt;span&gt;-- 9786，正常&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-- 插入就报错&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;INSERT INTO&lt;/span&gt;&lt;span&gt; messages (session_id, &lt;/span&gt;&lt;span&gt;role&lt;/span&gt;&lt;span&gt;, content, &lt;/span&gt;&lt;span&gt;timestamp&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;VALUES&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;test&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;hello&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;datetime&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-- Error: constraint failed&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;诊断过程&lt;/h2&gt;
&lt;h3&gt;1. 标准完整性检查——没用&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;PRAGMA integrity_check;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-- ok&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;PRAGMA integrity_check&lt;/code&gt; 返回正常！但它&lt;strong&gt;不会检查 FTS5 shadow 表的完整性&lt;/strong&gt;。这是一个容易被忽略的坑。&lt;/p&gt;
&lt;h3&gt;2. FTS5 专用完整性检查——发现问题&lt;/h3&gt;
&lt;p&gt;FTS5 提供了内置的完整性检查命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;span&gt; FROM&lt;/span&gt;&lt;span&gt; messages_fts(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;integrity-check&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;如果 FTS5 索引完好，这条语句返回&lt;strong&gt;空结果集&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;如果索引损坏，会返回错误描述&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在我的案例中，它返回了不一致的错误信息，确认 FTS5 索引已损坏。&lt;/p&gt;
&lt;h3&gt;3. 检查 shadow 表&lt;/h3&gt;
&lt;p&gt;FTS5 虚拟表会在底层创建一组 “shadow 表”（以 &lt;code&gt;_data&lt;/code&gt;、&lt;code&gt;_idx&lt;/code&gt;、&lt;code&gt;_content&lt;/code&gt;、&lt;code&gt;_docsize&lt;/code&gt;、&lt;code&gt;_config&lt;/code&gt; 为后缀）。你可以直接查看：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;-- 查看有哪些 shadow 表&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt; FROM&lt;/span&gt;&lt;span&gt; sqlite_master&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;table&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; AND&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt; LIKE&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;messages_%&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这些表的状态在 dump/reload 后可能不一致。&lt;/p&gt;
&lt;h2&gt;根因分析&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;问题出在 &lt;code&gt;.dump&lt;/code&gt; 导出的 SQL 语句顺序上。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.dump&lt;/code&gt; 会导出：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;CREATE VIRTUAL TABLE messages_fts USING fts5(...)&lt;/code&gt; — 创建 FTS5 表&lt;/li&gt;
&lt;li&gt;各种 &lt;code&gt;INSERT&lt;/code&gt; 语句填充主表&lt;/li&gt;
&lt;li&gt;可能还有触发器（用于自动同步主表和 FTS5 索引）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;但在 reload 时，触发器可能会在插入主表时&lt;strong&gt;同时触发 FTS5 索引更新&lt;/strong&gt;，而这些更新与后续的 shadow 表数据发生冲突。在不同架构间，SQLite 内部的某些排序或序列化行为可能有微小差异，进一步加剧了这种不一致。&lt;/p&gt;
&lt;p&gt;另外还发现 &lt;code&gt;sqlite_sequence&lt;/code&gt; 表的值严重异常——autoincrement 计数器显示约 3 万亿，而实际只有不到 15000 行。这也是 dump/reload 过程中的副作用。&lt;/p&gt;
&lt;h2&gt;修复方案&lt;/h2&gt;
&lt;h3&gt;完整修复脚本&lt;/h3&gt;
&lt;p&gt;以下是一个通用的 FTS5 索引修复脚本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# repair_fts.sh - 修复 FTS5 索引&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 用法: bash repair_fts.sh &amp;lt;数据库路径&amp;gt; &amp;lt;FTS表名&amp;gt; &amp;lt;主表名&amp;gt; &amp;lt;内容列&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt; -euo&lt;/span&gt;&lt;span&gt; pipefail&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;DB&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;${1&lt;/span&gt;&lt;span&gt;:?&lt;/span&gt;&lt;span&gt;用法&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; bash repair_fts.sh &amp;lt;db_path&amp;gt; &amp;lt;fts_table&amp;gt; &amp;lt;main_table&amp;gt; &amp;lt;content_columns&amp;gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FTS_TABLE&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;${2&lt;/span&gt;&lt;span&gt;:?&lt;/span&gt;&lt;span&gt;请指定 FTS5 虚拟表名}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;MAIN_TABLE&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;${3&lt;/span&gt;&lt;span&gt;:?&lt;/span&gt;&lt;span&gt;请指定主表名}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;CONTENT_COLS&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;${4&lt;/span&gt;&lt;span&gt;:?&lt;/span&gt;&lt;span&gt;请指定内容列名，如 &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;role, content&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;BACKUP&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;DB&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;.bak.&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt; +%Y%m%d%H%M%S&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;=== SQLite FTS5 索引修复工具 ===&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;数据库: $DB&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;FTS表:  $FTS_TABLE&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;主表:   $MAIN_TABLE&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;列:     $CONTENT_COLS&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 1. 备份&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;[1/5] 备份数据库...&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cp&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;$DB&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;$BACKUP&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;  备份已保存到: $BACKUP&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 2. 诊断&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;[2/5] 诊断当前状态...&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;  主表行数:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sqlite3&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;$DB&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;SELECT COUNT(*) FROM $MAIN_TABLE;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;  FTS5 完整性检查:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RESULT&lt;/span&gt;&lt;span&gt;=$(&lt;/span&gt;&lt;span&gt;sqlite3&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;$DB&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;SELECT * FROM &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FTS_TABLE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;(&apos;integrity-check&apos;);&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt; -z&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;$RESULT&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; ];&lt;/span&gt;&lt;span&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;  ✓ FTS5 索引完好&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    read&lt;/span&gt;&lt;span&gt; -p&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;  索引看起来正常，是否仍要继续？(y/N) &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; -n&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt; -r&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    echo&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    [[&lt;/span&gt;&lt;span&gt; $REPLY&lt;/span&gt;&lt;span&gt; =~&lt;/span&gt;&lt;span&gt; ^&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Yy&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;$ &lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&lt;span&gt; ||&lt;/span&gt;&lt;span&gt; exit&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;else&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;  ✗ 发现问题: $RESULT&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 3. 删除旧 FTS 表及其相关对象&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;[3/5] 删除旧的 FTS 表...&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sqlite3&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;$DB&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt;SQL&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-- 删除触发器（如果存在）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;SELECT &apos;DROP TRIGGER IF EXISTS &apos; || name || &apos;;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FROM sqlite_master WHERE type=&apos;trigger&apos; AND tbl_name=&apos;$MAIN_TABLE&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;AND (name LIKE &apos;%fts%&apos; OR name LIKE &apos;%ai%&apos; OR name LIKE &apos;%ad%&apos; OR name LIKE &apos;%au%&apos;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-- 列出将被删除的相关表&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;SELECT &apos;  将删除: &apos; || name FROM sqlite_master&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;WHERE type=&apos;table&apos; AND name LIKE &apos;&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FTS_TABLE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;%&apos;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;SQL&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sqlite3&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;$DB&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt;SQL&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;DROP TABLE IF EXISTS $FTS_TABLE;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;DROP TABLE IF EXISTS &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FTS_TABLE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;_data;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;DROP TABLE IF EXISTS &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FTS_TABLE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;_idx;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;DROP TABLE IF EXISTS &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FTS_TABLE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;_content;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;DROP TABLE IF EXISTS &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FTS_TABLE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;_docsize;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;DROP TABLE IF EXISTS &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FTS_TABLE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;_config;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;SQL&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;  ✓ 已删除&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 4. 重建 FTS 表和索引&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;[4/5] 重建 FTS 表...&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sqlite3&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;$DB&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt;SQL&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;CREATE VIRTUAL TABLE IF NOT EXISTS &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FTS_TABLE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; USING fts5($CONTENT_COLS, content=&apos;$MAIN_TABLE&apos;, content_rowid=&apos;id&apos;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;INSERT INTO &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FTS_TABLE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FTS_TABLE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;) VALUES(&apos;rebuild&apos;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;SQL&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;  ✓ 已重建&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 5. 验证&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;[5/5] 验证...&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RESULT&lt;/span&gt;&lt;span&gt;=$(&lt;/span&gt;&lt;span&gt;sqlite3&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;$DB&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;SELECT * FROM &lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;FTS_TABLE&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;(&apos;integrity-check&apos;);&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt; -z&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;$RESULT&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; ];&lt;/span&gt;&lt;span&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;  ✓ FTS5 索引已修复！&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    COUNT&lt;/span&gt;&lt;span&gt;=$(&lt;/span&gt;&lt;span&gt;sqlite3&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;$DB&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;SELECT COUNT(*) FROM $MAIN_TABLE;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;  ✓ 索引覆盖 $COUNT 条记录&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;else&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;  ✗ 仍有问题: $RESULT&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;  请从备份恢复: cp $BACKUP $DB&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    exit&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;=== 修复完成 ===&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用方法&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 赋予执行权限&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;chmod&lt;/span&gt;&lt;span&gt; +x&lt;/span&gt;&lt;span&gt; repair_fts.sh&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 针对 messages 表修复&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;bash&lt;/span&gt;&lt;span&gt; repair_fts.sh&lt;/span&gt;&lt;span&gt; ./state.db&lt;/span&gt;&lt;span&gt; messages_fts&lt;/span&gt;&lt;span&gt; messages&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;role, content&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;关键步骤解释&lt;/h3&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;步骤&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;备份&lt;/td&gt;&lt;td&gt;修复前必须备份，万一出问题可以回退&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;诊断&lt;/td&gt;&lt;td&gt;用 FTS5 的 &lt;code&gt;integrity-check&lt;/code&gt; 确认问题&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;删除&lt;/td&gt;&lt;td&gt;彻底清除损坏的 FTS5 表和 shadow 表&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;重建&lt;/td&gt;&lt;td&gt;用 &lt;code&gt;content=&lt;/code&gt; 参数关联主表，&lt;code&gt;rebuild&lt;/code&gt; 命令重建索引&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;验证&lt;/td&gt;&lt;td&gt;再次运行 integrity-check 确认修复成功&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;修复 &lt;code&gt;sqlite_sequence&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;如果 autoincrement 计数器也异常了：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;-- 查看当前值&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;span&gt; FROM&lt;/span&gt;&lt;span&gt; sqlite_sequence;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-- 重置为实际最大值&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;UPDATE&lt;/span&gt;&lt;span&gt; sqlite_sequence &lt;/span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;span&gt; seq &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; MAX&lt;/span&gt;&lt;span&gt;(id) &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; messages) &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-- 或者直接删除，下次插入时会自动重新生成&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;DELETE&lt;/span&gt;&lt;span&gt; FROM&lt;/span&gt;&lt;span&gt; sqlite_sequence &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;messages&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;最终状态&lt;/h2&gt;
&lt;p&gt;修复完成后，数据库恢复正常：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;数据库大小:  111.4 MB&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;消息总数:    9786&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;会话数:      186&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FTS5 索引:   ✓ 健康&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;完整性检查:  ok&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;经验总结&lt;/h2&gt;
&lt;h3&gt;核心教训&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;SQLite + FTS5 跨架构迁移，永远不要用 &lt;code&gt;.dump&lt;/code&gt; / &lt;code&gt;.reload&lt;/code&gt;。直接复制 &lt;code&gt;.db&lt;/code&gt; 文件。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;SQLite 数据库文件是二进制兼容的（前提是字节序相同，x86 和 ARM64 都是小端）。直接 &lt;code&gt;scp&lt;/code&gt; 或 &lt;code&gt;rsync&lt;/code&gt; 就行，不需要转成 SQL 文本再导入。&lt;/p&gt;
&lt;h3&gt;如果你必须用 &lt;code&gt;.dump&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;有时候你确实需要文本格式（比如要合并两个数据库、或者要跨字节序迁移），那么：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;导出时&lt;strong&gt;排除 FTS5 表&lt;/strong&gt;：先 dump 除 FTS 相关表以外的所有内容&lt;/li&gt;
&lt;li&gt;导入主表数据&lt;/li&gt;
&lt;li&gt;在目标数据库上&lt;strong&gt;重新创建 FTS5 虚拟表&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;运行 &lt;code&gt;INSERT INTO fts_table(fts_table) VALUES(&apos;rebuild&apos;);&lt;/code&gt; 重建索引&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;SELECT * FROM fts_table(&apos;integrity-check&apos;);&lt;/code&gt; 验证&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;FTS5 完整性检查速查&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;-- 常规检查（不检查 FTS5！）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;PRAGMA integrity_check;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-- FTS5 专用检查（这才是正确的）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;span&gt; FROM&lt;/span&gt;&lt;span&gt; your_fts_table(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;integrity-check&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-- 返回空 = 正常&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-- 返回内容 = 有问题&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;迁移前检查清单&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt; 备份原始数据库&lt;/li&gt;
&lt;li&gt; 确认迁移方式（推荐直接复制文件）&lt;/li&gt;
&lt;li&gt; 迁移后运行 &lt;code&gt;PRAGMA integrity_check;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt; 如果有 FTS5，运行 &lt;code&gt;SELECT * FROM fts_table(&apos;integrity-check&apos;);&lt;/code&gt;&lt;/li&gt;
&lt;li&gt; 测试读写操作&lt;/li&gt;
&lt;li&gt; 检查 &lt;code&gt;sqlite_sequence&lt;/code&gt; 值是否合理&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;本文记录于 2026-06-11，基于 Hermes Agent 从 x86_64 Arch Linux 迁移到 ARM64 Armbian 的实际经历。希望对遇到类似问题的朋友有所帮助。&lt;/em&gt;&lt;/p&gt;</content:encoded></item></channel></rss>