【插件發布】Vault Curate — 中文友善的 Obsidian 语意搜寻外挂(本地 WebGPU + AI 整理层,皆 opt-in)

分享一个我自己花几个月写 + dogfood 的 Obsidian 外挂,Vault Curate

之前看到中文圈在问「Obsidian 中文搜寻方案」的讨论,市面上的语意搜寻外挂多半用多语通用模型(MiniLM 那系列的
distilled),中文准度真的不算好——人名、宗教词、生活杂事的查询命中率都偏低。我自己 dogfood 过,差距大到「能不能用」的程度。

Vault Curate 想做什么

一句话:用「意思」搜笔记,不只是关键字,而且对中文友善。

两个我比较在意的设计:

1. 中文用纯中文训练模型

内建 bge-small-zh-v1.5(纯中文训练,~110 MB 第一次自动下载)。比起多语 distilled 模型在中文人名 / 宗教词 /
口语的命中率大幅提升。也支援英文搜寻,只是不是优化重点。

2. AI 整理层 opt-in,预设关闭

新版有个 AI curation 区(用 clustering 自动把笔记分主题群、用 LLM 命名每群,产出 Map of Content;也可以为单篇笔记生
description),但预设是关的。要进 Settings 自己打开,然后手动触发才会跑。

我的立场是:你的 vault 不应该在你不知情的情况下被改。AI 可以帮你发现新分群、看见冷笔记,但要不要采用是你的决定。

技术细节

  • 三路融合搜寻(RRF k=60 合流):BM25 纯 TS CJK trigram + 语意 embedding + Jaro-Winkler 模糊比对
  • 三种 embedding mode:Built-in(装置端 WebGPU、预设、零设定)/ Ollama(本机 daemon)/ OpenAI-compatible(自选 endpoint)
  • Discover Hot/Cold:根据连结密度 + recency 自动分类笔记,主动推荐你忘了的「冷笔记」
  • WebGPU 加速:342 篇 / 5004 chunks 索引约 1m23s(WASM fallback 也能跑,约 27 分钟)

安装

Obsidian Settings → Community plugins → 搜 “Vault Curate” → Install → Enable。第一次开会跳一个 Welcome 视窗带你建索引。

欢迎试用、回馈、开 issue,特别是中文 vault 的 edge case,我会持续调整。

4 个赞

插件不错试一试联想能力如何

1 个赞

谢谢,若是有使用上的问题或是想提供新功能建议,欢迎在这里提出 :slight_smile:

建议新增两项功能优化:一是支持鼠标悬浮时触发预览功能,二是增加当前文档锁定机制,以确保不会因点击关联文档而导致当前关联的文档信息发生变更。

1 个赞

感谢细看与回馈!目前状态:

  1. Hover 预览
    你说得对,目前 Discover 与 Search 结果清单没有接 Obsidian 原生的
    Page Preview API(registerHoverLinkSource)。意思是即使你在
    Settings → Core plugins 开了 Page preview,hover 我们的搜寻结果也
    不会跳预览。这是缺口,下一版会补上。

  2. 当前文档锁定
    我猜你描述的情境是:在 A 笔记看到一串 Discover 推荐,临时点开
    推荐中的 B 看一眼 → Discover 自动跟着 active file 切换成 B 的
    结果,A 的 discovery 列表就消失了。是的,目前确实是这个行为。

    一个过渡解法是切到 Discover 的「全域模式」(Global),它
    跟着当前 file 变,是把整个 vault 的 Cold notes 对你 Hot pool 做
    排序,不是你想要的「锁 A」,但用例有部分重叠。

    你提到的「锁定 A」可以做成 Pin 机制,会评估加进 backlog。

延续上次的建议(hover 预览 + 锁定当前笔记),今天顺手就做了 :slight_smile:

v1.0.3(UX patch)

  • Hover 预览:Search / Discover 结果 Cmd/Ctrl + hover 跳出 Obsidian
    原生 Page Preview。
  • 锁定 Discover:sidebar 加 :pushpin: 按钮锁定当前笔记,可以点关联结果偷看
    而不打断 discovery context。删除或切到 Global 模式自动解除锁定。
  • 调整 :内建 WebGPU embedding + AI 整理时 LLM 模型 dropdown ,有些人会一直停在 Loading。

哥你真是厉害,我先去试试新版了。多谢

1 个赞

列表标题显示有问题:如果正文有标题会显示正文标题而不是文档标题

1 个赞

哈哈,这算是设计上的规则,因为有些人的文件会有 YAML 定义,而档案名称以英数字编写,所以我的设计逻辑是:

  1. frontmatter 的 title: 栏位 ← 最优先
  2. 第一个 H1 heading ← H1
  3. file.basename ← 档名 fallback

您这个档案因为 YAML 没有 title
但有 H1 症状描述,所以就先抓这个了~

因为有些我的笔记有固定的模版,正文里面的标题都是一样的,推送机制结果就给我全部推送一样的,而不是基于文件名。
另外问一个:是否后续增加关联图,或者关联图上的编辑。哈哈

1 个赞

谢谢指出 — 这个 case 我之前没想到。H1 fallback 原本是为了
「档名是英数字编号 + 正文有更可读 H1」的场景设计的,但你
这种「模板生成的笔记 H1 大量重复」的情境,反而让 list 看起
来全长一样。

下版(1.0.4)会加 collision detection:同一个 H1 在 vault
里出现多次时,自动退回 file.basename。Frontmatter title:
优先级保持最高(这是 user 显式标记的,不参与防呆)。

是否后续增加关联图,或者关联图上的编辑

这个想法挺有意思 — 因为 semantic similarity 本来就内部算好
了,画 graph 在技术上不是问题。但 UI 工程量蛮大(layout、
节点交互、编辑),所以会放进 backlog 慢慢评估,短期不会
优先做。目前 Discover panel 的 Top-K 列表算是「graph 的一
维投影」。

1 个赞

这个厉害,语义搜索了

1 个赞