KB-METABOLISM · 设计全景

一个会遗忘的知识库是怎么运转的

只有入口的库必然腐烂——熵增是默认方向,代谢是唯一对抗。本页是整个系统的一张图:知识的一生、决定生死的信号经济,以及协议从 v1 到 v2 时对抗式审查修掉的四个陷阱。

01

知识的一生

核心比喻是代谢:给只进不出的笔记库补上两个器官——消化(资料 → 判断)与排泄(无用 → 墓地)。每篇笔记都走这条流水线:

入口
捕捉 + 入口税
kb add / kb_add
写不出"什么时候会再用"(use_when)→ 只能进 inbox 等死;疑似重复 → 查重税拦下
定层
分诊
kb triage
给每篇定 L0 / L1 / inbox,AI 可提案,定层写进 frontmatter
活着
使用留信号
kb_search / kb_read / kb_cite
一切检索走"门",每次读取/引用/注入追加进日志——被使用 = 续命
每周
法医验尸
kb digest
扫描全库:零信号 + 零活反链 + 长期未变更 → 列入处决名单(只提案)
判决权归人
人过堂
kb review
逐条 y 处决 / n 赦免 / p 升级。AI 永远无删除权,UI 也没有删除按钮
可反悔
墓地
kb execute → git mv
移入 _graveyard/,git 兜底随时还魂
真相层(属于你,不属于工具)Markdown 文件 + git 历史 + 信号日志 access.log.jsonl——卸载工具毫发无损
派生层(随时可删重建)SQLite 索引 / FTS 全文 / 向量——kb index 一键重建

四层存活等级

L0 核心 ≤100 条硬上限
终态交付物:每条 = 一句可复述的判断 + 何时再用。由消化(kb chew)从高频 L1 提炼,判断必须出自人口。
L1 资料 能检索到即可
AI 读的细节层。超过衰减窗口零信号 → 上处决名单。被反复读取的 L1 是"有营养的",进消化名单。
inbox 暂存 30 天大限
说不出用途的内容在这等待自证价值:要么升级(kb promote / 过堂 p 键),要么到期进名单。
_graveyard git 可反悔
已掩埋。随时可真删,也随时可还魂——删除的不可逆性被 git 拆除了。
02

信号经济:生死怎么判

"默认过期,使用续命。"不同的使用方式给不同长度的免死窗口——这是整个系统的货币体系(协议 v2):

kb_cite
被引用进产出 · 免死 180 天
agent 声明"回答里真用上了"
kb_read
被读取全文 · 免死 90 天
人或 agent 经门读全文
kb_inject
被注入且真相关 · 免死 30 天
hooks 自动注入摘要(idf 加权 + 标题命中判准)
search / ui
不续命
检索命中、管理台浏览——看见 ≠ 使用

法医上榜规则(协议 v2,五条同时成立)

以下条件同时成立(AND),才进处决名单:
90 天无读取kb_read 信号
180 天无引用kb_cite 信号
30 天无注入kb_inject 信号
0 活反链只有活源发出的链接算担保
>90 天内容未变更重命名/批量提交不算触碰
上榜候审

inbox 层例外:kb_expires 过期即上榜(出路是升级)。L0 永不上榜(只能被新判断"挤位"淘汰)。上榜 ≠ 死——人不勾选就是赦免。

03

从 v1 到 v2:对抗式审查修掉的四个陷阱

2026-07 的一次第一性原理对抗式审查,在真实 vault 上实测出四个结构性陷阱。它们已全部修复并固化进协议 v2 与回归测试——留在这里是因为每一个都是"会遗忘的系统"的普适教训。

教训 1

便利层会饿死自己的信号经济

v1 陷阱 hooks 自动注入摘要满足了信息需求,但注入被规定为"不算使用";会续命的走门读取靠 agent 自觉。结果:不算数的信号狂奔,算数的信号为零——摘要一眼够用的最有用笔记,恰恰永远拿不到读取信号,必死。
v2 修法 先把注入判准做严(idf 加权覆盖 ≥50% 且标题命中,正文碰瓷与常用字都拦住),再让 kb_inject 成为第三档存活证据(30 天)。顺序不能反:判准不严,注入续命就是滥发免死金牌。
教训 2

批量操作会把全库年龄清零

v1 陷阱 "多久没动"取自 git 最后提交。一次目录迁移、一次批量补 frontmatter,全库"最后触碰"变成昨天——体检报告 100% 活跃,法医失明 90 天。系统自己生产假阴性。
v2 修法 年龄 = 最后一次真实内容变更:全仓单趟 git 扫描,纯重命名走别名链不算触碰、超过阈值的批量提交整体跳过、被过滤光的回退出生时间。体检与法医同一口径。

顺带修掉两个"路径对不上就静默回退"的实现暗礁:中文文件名的 git 转义(quotepath)、vault 是仓库子目录时的路径前缀——任一存在,年龄机制都在无声失效。

教训 3

反链不能等于永生

v1 陷阱 有一条反链 = 永不上榜。教程系列互链整簇担保;一张列 300 条链接的索引页 = 发 300 张永久免死金牌;死透的笔记发出的链接与活笔记等权。
v2 修法 反链降级为活源担保:只有自身活着(近期有信号或正被编辑)的笔记发出的链接才算数;创作目录(outputDirs)的引用是铁证不降级。只算一层不做图迭代——死簇互链同批上榜,被使用的索引页仍保护子节点。
教训 4

只造死亡通道,不造晋升通道

v1 陷阱 协议要求 inbox"30 天内升级或进名单",但工具链里根本没有"升级"动作——死亡零摩擦(到期自动上榜),晋升全系统摩擦最高(手改 frontmatter)。过期 inbox 赦免后层级不变,下周继续上榜,钉子户吃光每周审批预算。
v2 修法 kb promote 一个动作四个入口:CLI、过堂 p 键、MCP 工具(用户明说才代办)、管理台按钮。入口税照收(必须给 use_when)、只升不降。协议边界不变:晋升可以代办,死亡永远不行。
04

质检:检索的自体基准

检索排序即司法(注入发免死金牌、消化候选依赖读取),所以它必须可测量。kb bench 用入口税收上来的 kb_use_when 当真值——那句"什么时候会再用到"就是未来查询的预演,每条笔记天然自带测试用例,零标注、零 LLM、随库自动更新。同一套用例跑纯字面 / 纯语义 / RRF 混合三策略,胜负手清单直接回答"embedding 值不值、融合有没有帮倒忙"。

铁律:评测永不留信号——在这个系统里,跑一遍 benchmark 等于给全库发免死金牌,所以 bench 直调纯函数、不走门,由测试断言保证。额外收获:全军覆没的用例往往不是检索的错,而是 use_when 写得太抽象——基准同时审计了入口税的质量

05

永久不变量

  1. 文件 + git 是真相,SQLite 里的一切可丢弃重建
  2. 访问日志是唯一不可再生数据(追加式 JSONL,随 vault 走)
  3. 检索必须走门;没有日志就没有衰减判定
  4. AI 提案、人判决、git 兜底可反悔;删除永远不给 AI,UI 无删除按钮
  5. 零 LLM 时内核完整;判断力是插件
  6. vault 自包含:拷走目录 = 带走整个系统;secrets 永不进 git、永不经过 API
  7. 协议有版本:约定演进必须可迁移——协议 > 工具
延伸阅读:协议规范 v2 · hooks 生效机制图解 · 为什么需要代谢