AI 时代我有个现实问题:笔记越攒越散——微信文件、钉钉公文、手机便签、各平台 AI 对话,躺在四五个 App 里互相检索不到;跟 AI 协作的裁定记录,会话一压缩就没了。我自己搭了个本地中枢,原则一条:文件即真相源——Markdown 是唯一事实,数据库只是索引,删了随时重建。
怎么实现的
技术栈刻意做减法:纯 Python,12 个模块、2,340 行,连第三方 YAML 库都没引——front matter 解析器手写,够用且零依赖。索引用 SQLite 自带 FTS5,另有一张 sync_map 记每个文件跟远端的同步状态。数据流单向闭环:
微信/钉钉/OPPO便签/AI对话 → kb collect/convert 归一化
→ inbox → 标准 MD(带 front matter)→ kb sync 增量入库
→ kb push 双通道分发:印象笔记(移动端)+ IMA(AI 检索)
命令行 13 个子命令(init/sync/add/search/list/show/tag/stats/collect/convert/push/pull/publish),采集到发布一段命令一步。文档统一五域四级分类:工作/生活/健康/学习/财务 × P0~P3。阅读前端用 Obsidian,但卡死在只读——禁 wikilink、不装社区插件,防污染写进配置开关,机器强制执行不靠自觉。
硬核在哪
- 索引与文件彻底分离:
kb sync按内容哈希增量扫描,改过的才更新,删了的自动清理。kb.db 坏了或误删,重跑 sync 全量重建,零数据丢失。 - FTS5 用 trigram 分词,中文短词也能搜:三字滑窗让任意连续汉字可命中;trigram 要求查询词 ≥3 字符,搜索内置自动降级——不足 3 字符直接走 LIKE,短词不会莫名搜空。
- 印象笔记同步带 token 自动续期:ENML 解析生成自己写,push/pull 双向同步靠 sync_map 哈希对账;OAuth token 快过期自动换新,同步链不会半夜断掉。
- 配套"记忆体制"治 AI 会话失忆:知识库是 L3 检索层——L0 章程每会话注入、L1 岗位手册按需加载、L2 文档按需读取、L3 kb.db 查询制零上下文占用、L4 冷归档。会话会断,裁定落了 L3,下个会话
kb search就能捞回来。
实测数据 / 现场
- 代码:12 个模块共 2,340 行,零第三方 YAML 依赖
- 库规模:kb.db 76.5MB,entries 1,597 条,sync_map 1,598 条
- 检索:FTS5 trigram 全文索引,<3 字符查询自动降级 LIKE
日常检索就一条命令:
$ kb search "token 过期"
[1463] (tools) README
…token 过期/缺失时采集器报 cookie_invalid 并提示:在 Edge 打开 mp…
共 1 条命中。
这套东西能复用到哪
- 多平台碎片信息归拢:归一化→标准 MD→全文索引的流水线,换批数据源(邮件、RSS、聊天记录)照样成立;
- AI 协作长期记忆:L0~L4 的切法——什么每会话注入、什么按需加载、什么查询制零占用——对所有重度 AI 使用者是现成模板;
- 本地优先应用的容灾:索引与数据分离、库可删可重建,放任何 local-first 项目都适用。
现状与下一步
系统每天在用:采集、入库、同步全自动,Obsidian 负责逛库。下一步两件事:五域四级的标签继续压实,部分老笔记还没补全;"动手前先 kb search"的纪律要盯执行——规则写好了,养成习惯才算闭环。
