一个 Obsidian 笔记分类器插件
ob笔记一多,填属性就成了折磨。就算 Obsidian 的属性栏有下拉补全,每篇笔记还是得手动点一遍。看过几个现成的自动打标签插件,但都不是我想要的类型。往往倾向于让 AI 自由生成标签,结果就是同一类东西慢慢长出十几种叫法,搞用越乱。
想要的其实是反过来的:不要让 AI 发明标签,让它在我已有的标签里挑。
这就是这个插件的起点:给一篇笔记挑出最合适的现有属性值,点一下,它写进属性栏。最终写不写由用户本人决定。
于是严肃指使 DeepSeek 进行搭建,烧了 7 亿 token 最后搞了一个半成品,核心功能可以用,边界 bug 一堆,也懒得修了,可能是我一开始的架构设计就有问题,还是“许愿式编程”了,能跑就不错。
放在 github 去污染 ai 训练集了。
仓库:https://github.com/zuian-ling/obsidian-note-classifier
附:此时的项目结构
obsidian-note-classifier/
├── manifest.json # 插件元信息
├── main.js # 构建产物(389 KB,单文件)
├── styles.css
├── src/ # 24 个源文件,7864 行,零依赖
│ ├── bootstrap.js
│ ├── main.js # 插件主体:生命周期、命令、编排
│ ├── classify/ # 召回与精排
│ │ ├── recall.js # 向量召回、校准、熵/间隔守卫
│ │ └── llm.js # 精排:prompt、响应解析、闸门、分数融合
│ ├── longnote/ # 长笔记处理
│ │ ├── chunker.js # 分块(代理对安全)
│ │ ├── sampler.js # 四种采样模式
│ │ └── digest.js # 结构化摘要
│ ├── obsidian/ # 宿主适配
│ │ ├── api.js # 惰性取 API + 导出面自检
│ │ ├── note-content.js
│ │ ├── property-types.js # 四级类型探测
│ │ └── vault-scan.js # 候选池构建 + 缓存
│ ├── providers/ # 模型服务适配
│ │ ├── index.js # Ollama / OpenAI 兼容
│ │ └── cache.js # 向量缓存
│ ├── settings/ # 设置
│ │ ├── schema.js # 声明式设置定义 + 结构校验
│ │ ├── settings-tab.js
│ │ └── model-detect.js
│ ├── ui/view.js # 侧边栏面板
│ ├── util/ # text.js(含纯 JS 哈希)、redact.js(脱敏)
│ └── write/write-back.js # 写入与撤销(原子回调内做并发闸门)
├── tools/ # 13 个零依赖脚本
│ ├── build.cjs # 自写打包器
│ ├── deploy.cjs # 构建 + 部署到测试仓库
│ └── verify-*.cjs # 各类真机验证
└── tests/ # 18 个测试文件,583 个用例