作品 · Works

Vane

2025未开源Rust向量检索HNSWBM25混合检索
Vane

嵌入式混合检索库,定位「sqlite-vec 的嵌入式形态 + Tantivy 级 BM25 + 一体化 RRF 混合排序」,面向 AI Agent 本地记忆库、RAG 边缘检索层与浏览器端隐私语义搜索三类场景。单一 Rust 核心约 1.4 万行,经 napi-rs 出 Node 绑定、预留 C ABI 给 Go cgo、wasm-bindgen 出浏览器端(OPFS / IndexedDB 降级)。

项目特点

  • 混合检索一体化:vector / text / hybrid 三种查询模式,hybrid 默认 RRF 融合(k=60);10 万 × 384 维数据下 hybrid topK=10 P99 小于 50ms,批量写入 ≥ 5k docs/s,冷启动小于 1s。
  • 过滤不牺牲召回:标量 pre-filter 编译为 roaring 位图直接传入 HNSW 遍历与 WAND 推进(拒绝 post-filter);位图基数小于 2×topK 时自动回退暴力精确扫描,保证 100% 召回。CI 硬门禁 hybrid recall@10 ≥ 0.95。
  • 中文检索一等公民:自实现 jieba 算法内核(前缀 DAG + HMM Viterbi),配约 20 万词剪枝词典(双数组 Trie + zstd,1–1.5MB);自定义词表经「暂存 → reindex 状态机」原子生效,杜绝新旧分词身份混排的静默错误。
  • VFS 是架构脊柱:core 零 std::fs、零 mmap(CI 门禁强制),rename 原子切换 manifest 保证崩溃一致;同一套代码跑 std-fs / OPFS / IndexedDB / memory 四种后端。

技术难点

HNSW 的删除难题。 图索引原地删除会破坏近邻结构、随时间腐化召回率。Vane 采用分段不可变 HNSW(M=16 / ef_construction=200):段一旦封存不再修改,删除只打 tombstone 位图,段合并时整图重建——用不可变性根除图维护的运维负担。

BM25 的 top-k 效率。 全文侧自研 Block-Max WAND:vbyte 变长编码 posting list,每 128 个文档一个跳块、记录块内 BM25 分数上界用于剪枝,跳过不可能进入 top-k 的块;结果与暴力基线 100% 一致。

可移植性与正确性的兼得。 浏览器端没有可靠的文件系统语义,崩溃恢复策略必须自己实现:VFS trait 抽象 + manifest 原子切换,让崩溃一致性逻辑与后端无关;CI 强制 core 不碰 std::fs 与 mmap,从依赖上杜绝「某个后端偷偷用不了」的退化。