
这篇把 TriviumDB 的 QuIVer ANN 索引和 hnswlib、FAISS HNSW、FAISS IVF-PQ、USearch 放在同一台机器上,用同一批数据、同一批查询、同一套指标,实测 Recall@10 和 QPS 的权衡曲线。所有数字都是本机跑出来的,跑法、参数、环境都在文末,可以照着重跑。结论的边界先划清楚,再给数字。 测试环境(本文所有跑分在同一台机器上完成,完整清单见 §2.3) 组件配置CPUIntel Core i5-13490F(10 核 20 线程;本机实际只暴露 16 逻辑处理器,AVX2)内存2 × 16 GB DDR5-6000(A-DATA XPG Lancer CL36,双通道)显卡NVIDIA GeForce RTX 4060 Ti 16 GB(CPU-only,未参与计算)存储C 盘:Crucial P3 Plus 1TB(CT1000P3PSSD8,NVMe),另有 SanDisk Ultra 3D NVMe;跑分数据/索引在 C 盘桌面系统Windows 11 ANN 跑分对内存带宽很敏感,DDR5-6000 双通道和 DDR4-3200 的 QPS 能差出百分之几十;SSD 影响构建和冷数据读取。显卡这轮不参与计算,列出来是免得有人以为开了 GPU。
先说场景。TriviumDB 的定位是 AI 嵌入式记忆引擎,服务 RAG、Agent 记忆、语义缓存这类用 LLM embedding 的应用。
同机、同数据、同查询、同指标的前提下,实测结论:
一句话定位:TriviumDB 的向量检索在 Cohere-1M 这类目标场景里是第一梯队,同召回下吞吐约为 HNSW 类的 2.9×,内存只有其 1/4.7;但 MiniLM-1M 等其它 LLM embedding 上优势不保证。它的护城河在三位一体和零运维,不在所有数据通吃。
"能不能用"和"快不快"是两件事。RAG、Agent 记忆、语义缓存里,向量检索在主链路上:一次问答 LLM 生成要几百毫秒到几秒,召回这一步可能要并行打几万甚至上百万次相似度计算。基座慢,上层再花哨也救不回来。
TriviumDB 的卖点不是"又一个向量库",而是"一个嵌入式文件同时管向量+图+文档"。那它作为向量引擎本身到底硬不硬?如果向量检索被纯向量库甩开一个量级,三位一体的价值就站不住。所以这篇只把向量检索拎出来,和同生态位的纯向量库对撞,用同一台机器、同一批数据、同一套指标,看清楚行在哪、不行在哪。
方案 | 形态 | 索引算法 | 版本 |
|---|---|---|---|
TriviumDB | 嵌入式数据库(Rust,napi/pyo3 绑定) | QuIVer:2-bit BQ 签名图导航 + Vamana 拓扑 + f32 精排 | 0.7.4(本地 fork,commit 74d719d) |
hnswlib | 纯向量库(C++,Python 绑定) | HNSW | 0.8.0 |
FAISS HNSW | 纯向量库(C++,Python 绑定) | HNSW Flat | 1.15.0 |
FAISS IVF-PQ | 纯向量库(同上) | OPQ + IVF-PQ + Refine | 1.15.0 |
USearch | 纯向量库(C++,Python 绑定) | HNSW | 2.26.0 |
VSAG | 纯向量库(C++,Python 绑定) | HNSW / HGraph | 0.0.11(本机无法运行,见 §7.3) |
选的都是嵌入式方案(无独立进程、无网络),和 TriviumDB 同一生态位,也是官方脚本 benches/bench_baselines.py 原生支持的库(脚本链接)。
为什么没有 LevelDB / RocksDB / SQLite?它们是嵌入式方案,但定位是 KV / 关系型存储,原生不做 ANN 近邻搜索。拿它们比 Recall@10-QPS,得自己在外层接暴力扫描或向量索引,比的是"组装方案"而不是库本身的向量检索能力。本文只比开箱即用的向量检索库/数据库,所以不纳入。
ef/nprobe 从松到紧扫出来的,不是挑单点。TRIVIUM_MT_THREADS=16,TriviumDB 的 rayon 池默认就是 16)。项目 | 配置 |
|---|---|
CPU | Intel Core i5-13490F(10 核 20 线程,本机仅暴露 16 逻辑处理器,AVX2) |
内存 | 2 × 16 GB DDR5-6000(A-DATA XPG Lancer CL36,双通道) |
显卡 | NVIDIA GeForce RTX 4060 Ti 16 GB(本文 CPU-only,未参与计算) |
存储 | C 盘:Crucial P3 Plus 1TB(CT1000P3PSSD8,NVMe);另有 SanDisk Ultra 3D NVMe。跑分数据/索引在 C 盘桌面 |
系统 | Windows 11 |
跑分日期 | 2026-08-17 ~ 08-18(两个窗口,同一台机器) |
线程 | MT=16(本机可用逻辑处理器数,全库统一) |
Rust | rustc 1.97.1 / cargo 1.97.1,RUSTFLAGS="-C target-cpu=native",release + LTO |
Python | 3.13.14(managed venv) |
关键 Python 库 | numpy 2.5.2 · hnswlib 0.8.0 · faiss-cpu 1.15.0 · usearch 2.26.0 · pyvsag 0.0.11(无法加载) |
Node.js | v22.22.2(仅环境声明;基准全走 Rust/Python 原生路径,CPU-only) |
CPU-only:所有方案只在 CPU 跑(i5-13490F 无 AVX-512,AVX2 是共同起点),不用 GPU、不用量化推理加速。这也是嵌入式方案的真实使用场景。
项目 | 值 |
|---|---|
规模 | 1,000,000 训练 / 1,000 查询 |
维度 | 768 |
分布 | Cohere embed-english-v2.0 的 Wikipedia embedding,典型的 cosine-native 对比学习 embedding,低秩流形 + 语义簇结构 |
来源 | HuggingFace: YoKONCy/Cohere-1M-wikipedia-768d |
度量 | 余弦(数据已归一化) |
选它有两个原因。它是 TriviumDB 论文的主评测数据集,也是官方基准脚本的默认配置,脚本里所有参数网格都是为 768 维设计的。更重要的是它代表 TriviumDB 的目标场景,AI 嵌入式记忆里的向量就是这种分布。用目标场景的数据做场景内对比,才公平。
为了不把主场优势包装成全面优势,额外跑了两个边界外的数据集作对照:
数据集 | 规模 | 维度 | 分布 | 预期 |
|---|---|---|---|---|
SIFT-128 | 1M / 10k 查询 | 128 | 非负直方图特征(欧氏原生) | 边界外 |
GloVe-100 | 1.18M / 10k 查询 | 100 | 低维词向量(高固有维度) | 边界外/边缘 |
预期依据:QuIVer 论文(arXiv:2605.02171)在多数据集评测里给了明确的适用边界,BQ 原生拓扑对 cosine-native 对比学习 embedding 高度有效(5 个数据集 ≥88% Recall@10 @ ef=64),对 CLIP 类多模态数据中等有效(71–78%),对欧氏原生或无结构分布实证不适合(<15%)。论文把这概括为"不可能三角"。第七节用本机实测验证这条边界。
脚本:scripts/prepare_all.py。所有数据集统一 L2 归一化 + 余弦度量;SIFT 原始是欧氏,归一化后按余弦重算了精确 Top-10 GT。
口径说明:SIFT/GloVe 的查询集从 10,000 条抽样到 1,000 条。官方脚本的暴力基准在 10k 查询 × 1M 基座下要 ~40GB 相似度矩阵,超出 32GB 内存;用固定种子确定性抽样,同批查询用于所有库。Cohere-1M 官方查询集本身就是 1,000 条,不用抽。
在 Moonlight 的 QuIVer 评测解读页(https://www.themoonlight.io/zh/review/quiver-rethinking-ann-graph-topology-via-training-free-binary-quantization)里,论文的 9 个数据集被分成四档:
论文档位 | 数据集 | 我们的实测覆盖 |
|---|---|---|
SOTA(≥91% @ ef=64) | MiniLM-1M、Cohere-1M、DBpedia-1M | Cohere-1M ✅;MiniLM-1M ✅(本轮新增);DBpedia-1M 未跑 |
High(78%) | RedCaps-1M(CLIP) | 未跑(需手动 Zenodo 数据) |
Usable(50–55%) | GloVe-100、Synthetic-LR | GloVe-100 ✅ |
Collapse(<6%) | SIFT-128、GIST-960、Random-Sphere | SIFT-128 ✅ |
所以"数据集在不在论文列表里"不能直接回答"是不是 QuIVer 优势区"。MiniLM/Cohere/DBpedia 才是论文声称的优势区,GloVe 只是可用,SIFT/GIST/随机是崩溃区。我们已有 Cohere(优势)、SIFT/GloVe(边界),本轮补跑了 MiniLM-1M,结果见第七节。
所有 HNSW 类统一 M=32、ef_construction=128(TriviumDB 的 QuIVer 也是 m=32、ef_c=128、α=1.2,默认参数对齐),只扫查询参数 ef(9 档)。
FAISS IVF-PQ 用 nlist=1024、k_factor=10、m_pq=96(768 ÷ 96 = 8 个子量化器,官方脚本为 768 维设计的典型值),扫 nprobe(8 档)。
库 | 构图参数 | 扫描参数 | 度量 |
|---|---|---|---|
hnswlib | M=32, ef_c=128 | ef × 9 | cosine |
FAISS HNSW | M=32, ef_c=128 | ef × 9 | IP(归一化后等价 cosine) |
FAISS IVF-PQ | nlist=1024, m_pq=96, k_factor=10 | nprobe × 8 | IP + Refine 精排 |
USearch | connectivity=32, expansion_add=128 | ef × 9 | cos |
TriviumDB | m=32, ef_c=128, α=1.2 | ef × 9 | cosine(BQ 粗筛 + f32 精排) |

图里每条线都是各自 ef/nprobe 完整扫描扫出来的,不是挑点。三个点:
下表 MT-QPS / 1T-QPS 是 Recall@10=90% 处对 ef/nprobe 曲线线性插值得到的,和图表完全自洽。同机、同数据、同查询、MT=16 线程。
库 | MT-QPS @ R@10≈90% | 1T-QPS @ R@10≈90% | 备注 |
|---|---|---|---|
TriviumDB(QuIVer) | 73,258 | 8,618 | 自带三位一体 / 免训练量化 |
hnswlib | 25,352 | 4,379 | HNSW,M=32 |
FAISS HNSW | 25,615 | 5,850 | HNSW Flat,M=32 |
USearch | 19,133 | 2,665 | HNSW,M=32 |
FAISS IVF-PQ | 5,490 | 811 | 压缩内存最小 / 需 OPQ 训练 |
横向比:同召回下 TriviumDB 的 MT 吞吐约为 hnswlib 的 2.89×、FAISS HNSW 的 2.86×。纵向比:开多线程后 TriviumDB 从 1T 8,618 涨到 MT 73,258,约 8.5× 扩展比;hnswlib 从 4,379 到 25,352,约 5.8×。QuIVer 的多线程扩展效率也更高。

图:同召回下 TriviumDB(紫)领先 HNSW 类约 2.9×,USearch 居中,FAISS IVF-PQ 走极致压缩路线吞吐最低。
库 | 构建耗时 | 索引内存 | 备注 |
|---|---|---|---|
hnswlib | 166.2 s | 3,189 MB | HNSW,M=32 |
FAISS HNSW | 161.8 s | 3,189 MB | HNSW Flat,M=32 |
FAISS IVF-PQ | 967.6 s | 3,021 MB(PQ 码 92 MB + f32 精排 2,930 MB) | 含 OPQ 训练,约为 HNSW 类的 6× |
USearch | 186.3 s | 3,189 MB | HNSW,M=32 |
TriviumDB | 53.96 s | Hot 675 MB | 免训练量化;构建约为 HNSW 类的 1/3,内存约为其 1/4.7 |
内存口径:baseline 是脚本估算值(向量 2,930 MB + 邻接 244 MB),TriviumDB 是
index.stats().hot_bytes实测值,两边不完全一致,只看量级。1M×768 的 f32 原向量本身就要 ~3 GB,TriviumDB 的 hot 区(签名索引)只要 675 MB,全量 f32 精排按需从冷区读,这是"2-bit 签名 + 冷热分离"的收益。
构建速度上,TriviumDB 的 BQ 量化免训练,对归一化向量取符号位就行,构建时间和 HNSW 同类甚至更快。IVF-PQ 要先跑 OPQ 训练,单这一步就把构建拉到近 16 分钟。

图:左 — 构建耗时(对数),TriviumDB 54 s 约为 HNSW 类的 1/3、IVF-PQ 的 1/18;右 — 索引内存(对数),TriviumDB Hot 675 MB 约为其它库的 1/4.7。

图:边界数据集上 TriviumDB Recall 封顶远低于 hnswlib(ef=800 口径),与论文"不可能三角"一致。

图:SIFT-128 同机同查询下,TriviumDB(紫)ef 拉到 800,Recall 也封顶在 43% 左右,hnswlib / FAISS HNSW 已到 99%+。

图:GloVe-100 上 TriviumDB 封顶约 69% 后不再随 ef 上升,HNSW 类 ~97%。这两条完整曲线比单点更能说明边界。
数据集 | TriviumDB QuIVer Recall@10 封顶(ef=800) | hnswlib 同口径 | 论文预期 |
|---|---|---|---|
SIFT-128(128 维,非负直方图 / 欧氏原生) | 43.4% | 99.9% | <15%(欧氏口径) |
GloVe-100(100 维,低维词向量 / 高固有维度) | 69.4% | 97.2% | 边界外 / 边缘 |
QuIVer 在 LLM embedding 之外的数据上不做任何承诺。如果你的数据不是 embedding 分布(图像直方图、低维词向量、高固有维度),请选 HNSW 类方案。这条边界是论文主动划的,本文用本机实测验证了它,这也是"不可能三角"的代价。
口径说明:SIFT-128 上 QuIVer 封顶 43.4%,比论文"<15%(欧氏口径)"高,因为本文对 SIFT 做了 L2 归一化 + 余弦度量,和主场 Cohere 口径统一,归一化削弱了欧氏直方图的极端性。严格按论文的欧氏原生口径,塌得更彻底。GloVe-100 的 69.4% 说明低维 / 高固有维度是 QuIVer 的软肋。
为什么?QuIVer 的签名是 2-bit 二进制量化(BQ),对归一化后的向量按每维符号位拼成二进制签名做粗筛。SIFT 是图像局部直方图特征,归一化后几乎每维都大于 0,所有向量的符号签名几乎全为 1,签名失去判别力,粗筛退化成近似随机。GloVe 只有 100 维,符号位本来就少,量化信息量不足,天花板压在 70% 上下。论文把这套规律概括为"不可能三角":激进压缩(2-bit BQ)、高吞吐、全数据兼容,三者只能取二。QuIVer 选了前两个,代价是放弃对 SIFT/GloVe 这类分布的通吃。

论文和评测页都把 MiniLM-1M 放在 SOTA 优势区,所以补跑了它(1M×384 维,all-MiniLM-L6-v2,同查询 1000 条,同 16 线程)。结果和 Cohere-1M 很不一样:
库 | R@10≈90% 时的 MT-QPS(插值) | 达到 ~90% 的实际档位 |
|---|---|---|
hnswlib | ≈11,541 | ef=20,R@10=92.3% |
FAISS HNSW | ≈8,128 | ef=20,R@10=93.1% |
TriviumDB | ≈2,687 | ef=80,R@10=91.0% |
MiniLM-1M 上 TriviumDB 的吞吐没有超过 HNSW,约是 hnswlib 的 1/4、FAISS HNSW 的 1/3。它的 recall 能到 90% 以上,不是 SIFT 那种崩塌,但要达到同等 recall 需要更大的 ef,QPS 被精排和导航成本拖低。
口径说明:MiniLM 的 USearch 基线因为构建耗时过长没跑完,上表只有完成的两家 HNSW。TriviumDB 和 baseline 在同一台机器同一轮会话里交替跑完,但构建和搜索有重叠,绝对 QPS 会受并发影响。本文不做跨机器推广。
这个结果说明,"LLM embedding = QuIVer 优势区"不能一概而论。Cohere-1M 是强主场,MiniLM-1M 在本机是反例。论文评测页的优势区间可能依赖具体 embedding 分布、有效维度、查询难度和实现版本,引用"优势区"之前以自己的数据复测为准。
_pyvsag.cpython-310-x86_64-linux-gnu.so),Windows 上无法 import,官方脚本如实输出 [跳过]。同机原则下不拿别机数字顶替。index.stats().hot_bytes 实测值,不完全一致,只看量级。这些没跑的项不影响核心结论。DBpedia-1M 未跑只影响优势区覆盖面的完整度,不影响"Cohere 强主场 + MiniLM 反例 + SIFT/GloVe 边界"这条结论;MiniLM 的 USearch 没跑完,但有 hnswlib/FAISS HNSW 两个对照,足够支撑该节判断。想更完整的话可以后续补 DBpedia-1M 和 MiniLM USearch,但不阻塞这篇文章。
下面是可以直接照抄的命令。先按 §2.3 准备好官方脚本和数据集,再依次跑外部库基线、IVF-PQ 补充、TriviumDB 本体,最后解析汇总画图。
TriviumDB)benches/bench_baselines.pybenches/bench_cohere1m.rsscripts/prepare_all.pyREADME_QUIVER.mdpython -c "import os; print(os.cpu_count())" 确认你的可用核数,统一口径。pyvsag 0.0.11 的 wheel 只打包了 Linux 原生库,Windows 无法 import,官方脚本会输出 [跳过]。本文没有用别机的 VSAG 数字顶替,保住"只报同机对比"的底线。所有 QPS 是 1,000 条查询 × 1M 基座下的实测吞吐均值;Recall@10 以精确暴力 Top-10 为 ground truth。换机器、换版本、换数据分布,数字都会变。本文结论只在上述环境和 LLM embedding(Cohere-1M / MiniLM-1M)场景下成立。
注:本文代码与数字基于 2026-08-17 ~ 08-18 本机两个窗口的实测(环境见 §2.3),不构成任何性能担保;换机器、换版本、换数据分布结果都会变。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。