jvector
融合 HNSW 与 DiskANN 的下一代 ANN 图索引,支持超大规模向量内存压缩与磁盘存储
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
融合 HNSW 与 DiskANN 的下一代 ANN 图索引,支持超大规模向量内存压缩与磁盘存储
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
在 RAG 系统每秒处理上万条向量检索的今天,HNSW 已成为行业标配。但当你面对百万级甚至亿级向量数据集时,HNSW 的内存占用开始变得难以承受——一个 10 亿条 1536 维向量的索引,可能需要数百 GB 内存。
JVector 正是为解决这个问题而生:由 Cassandra/Lucene 专家 Jonathan Ellis 主导开发,JVector 融合了 HNSW 的分层导航结构与 DiskANN 的 Vamana 图算法,首次将图索引的搜索对数时间复杂度带入了超大规模向量场景,同时支持磁盘级存储和内存级速度的兼得。
精确最近邻搜索(KNN)在高维空间中注定昂贵——2D/3D 有效的四叉树、KD 树等空间分割算法,在高维下退化为线性扫描,这就是所谓「维度诅咒」。ANN(近似最近邻)用可接受的精度损失换取对数时间复杂度,是目前工程上唯一可行的方案。
ANN 索引主要分为两类:
HNSW 和 DiskANN 各有短板:HNSW 内存开销大,DiskANN 搜索时需要多次 I/O。JVector 的核心创新是将 HNSW 的多层结构与 Vamana 图的构建算法结合,同时支持内存和磁盘两种部署模式。
JVector 的搜索链路采用独特的两轮设计:
第一轮(内存内):使用 Product Quantization(PQ)或 Binary Quantization(BQ)在压缩域内做初筛。JVector 额外支持各向异性加权(Anisotropic Weighting),可以在精度损失很小的情况下大幅压缩内存占用。
第二轮(磁盘/内存):对第一轮候选结果,用原始 float32 向量或 NVQ(非均匀向量量化)做精排。NVQ 是 2025 年新提出的技术,通过非均匀量化策略在高维场景下优于传统 PQ。
在索引构建侧,JVector 的并发控制机制实现了线程数的线性扩展:在多核机器上,增加核心数量几乎可以等比加速索引构建速度,这对于需要频繁更新索引的生产环境意义重大。
代码包结构也体现了这一设计思想:
jvector-base:Java 11 兼容的基础代码,所有 ANN 核心算法实现jvector-twenty:Java 20+ SIMD 矢量加速代码,利用 JVM Vector API 做批量化向量运算jvector-native:JNI 层,支持硬件级 SIMD 优化jvector-multirelease:多版本 JAR 打包,将不同 JDK 版本的优化代码打包进同一个 artifactjvector-examples:示例代码,含 VectorIntro 入门教程和完整 Benchmark 套件JVector 实现了三种量化策略:
Product Quantization (PQ):将高维向量分段,分别做 k-means 聚类,用聚类中心 ID 替代原始向量。可将内存压缩 8-32 倍,同时支持 fused PQ 模式(将 PQ 码书直接写入图邻接表,减少 I/O)。
Binary Quantization (BQ):将向量二值化,内存压缩率更高(32 倍),适合对精度要求不高的场景。
NVQ(Non-Uniform Vector Quantization):2025 年新提出,在高维(大于等于 768 维)场景下精度优于 PQ,同时保持了合理的压缩率。这是 JVector 独有的实现。
这些技术的组合使用,使得 JVector 可以在 64GB 内存机器上索引 10 亿条 1536 维向量,而同等数据量 HNSW 可能需要 512GB 以上内存。
JVector 是一个嵌入式 Java 库,没有 Web UI、没有 REST API,也没有 Docker 一键部署。项目以 Maven 多模块结构发布,使用方式是在 Java/Maven 项目中引入依赖:
<dependency>
<groupId>io.github.jbellis</groupId>
<artifactId>jvector</artifactId>
<version>4.0.0-rc.9</version>
</dependency>
入门路径:文档中的 VectorIntro.java 案例,代码量不到 100 行,涵盖向量创建、索引构建、检索全流程。
JDK 要求为 20+(解锁 SIMD 矢量优化),但也兼容 Java 11(使用 mvn -Pjdk11 profile)。
JVector 不是面向终端用户的 SaaS 产品,而是一个需要集成到 Java 应用中的底层库。这意味着:
与 Qdrant、Milvus、Weaviate 等专用向量数据库相比,JVector 更像是给想在自有系统里内嵌向量搜索能力的开发者准备的底层轮子,而非开箱即用的服务。
2024 年以来,向量数据库赛道竞争激烈,各家都在努力降低内存占用、提升吞吐量。JVector 的出现代表了一个重要方向:用更少的资源做更多的事——通过对 PQ/NVQ 量化技术的深度优化,在保持 ANN 搜索对数时间复杂度的同时,将内存需求降低一个数量级。
数据表明,在 SIFT、GloVe 等标准数据集上,JVector 的搜索 QPS 是 HNSW 的 2-3 倍,同时内存占用减少 60% 以上。这对于在有限硬件上跑大规模 RAG 系统的团队来说,是值得关注的技术选型。
项目信息: Apache-2.0 开源协议,主语言 Java,DataStax 团队维护(DataStax 也是 Apache Cassandra 的主要贡献者),GitHub stars 1717(持续增长中)。