Zvec v0.8.0 正式发布
版本亮点: Zvec v0.8.0 聚焦查询性能、索引构建成本和跨平台体验。本次更新大范围重构了量化器与距离计算,重点优化 INT4 内核和 Linux ARM64 性能;降低 IVF、DiskANN 建图与合并的峰值内存,加速 HNSW RaBitQ 构建;新增 Intel Mac、Windows ARM64 支持,并让中文全文检索通过内置 Jieba 资源开箱即用。
完整变更请查看 GitHub Release Notes。
平台支持
Intel Mac 和 Windows ARM64
v0.8.0 新增 macOS x86_64 与 Windows ARM64 构建支持。Intel Mac 用户获得对应的构建、wheel 和 SDK;Windows ARM64 使用 MSVC 构建,并增加原生 Python 3.11–3.14 wheel 和 ARM64 SDK 发布流程。详细的平台支持说明和矩阵请参见 链接。
DiskANN 扩展到 Windows 和移动端
DiskANN 本次新增三个平台方向:
| 平台 | 新增能力 |
|---|---|
| Windows | 基于 I/O 完成端口的异步、无缓冲读取 |
| Android | 基于可移植 pread 的磁盘读取 |
| iOS | 基于可移植 pread 的磁盘读取 |
这让需要将索引放在磁盘上的应用,在 Windows 桌面和移动端也有了 DiskANN 选择。
RaBitQ 新增 Windows x86_64 支持
RaBitQ 索引现已适配 Windows x86_64 环境。同时,本次更新将 RaBitQ-Library 升至 v0.7.0 版本,构建目标也切换为上游模块化的 core/FastScan。
中文全文检索与易用性
Jieba 词典内置,中文分词开箱即用
中文全文检索不再需要单独部署默认词典或在导入 Python 模块时注册词典路径。v0.8.0 将 Jieba 默认词典和 HMM 模型以 LZ4 压缩资源的形式内置到原生库中,Python wheel 与原生 SDK 都可以直接使用。
默认词典解析后共享,用户词典则在分词器实例之间保持隔离。如果需要加入产品名、业务术语或专有名词,可以通过 user_dict_path 补充,不必替换默认词典。
文档 ID 支持 UTF-8
文档 ID 和集合名的命名规则更加灵活:
- 文档 ID:支持有效 UTF-8,长度为 1–1,024 字节。
- 集合名:支持有效 UTF-8,长度为 1–256 字节。
- 字段名:保留原有 ASCII 字符集,长度上限扩展到 64 字节。
文档 ID 和集合名仍会排除控制字符及指定分隔符;以上长度均以字节计算。
索引构建与内存
IVF 和 DiskANN 建图更省内存
索引最终能放进内存,并不意味着建图过程也能承受同样的内存预算。训练、向量转换、编码和多段合并中的临时副本,都可能推高峰值内存。
v0.8.0 针对 IVF 和 DiskANN 的构建流程,减少了重复向量拷贝,使用流式方式读取合并输入,限制临时编码批次的大小,并在构建完成后更早释放中间状态。
这些改动降低了建图和合并时的峰值内存,让内存受限环境更容易完成索引构建和 Optimize。
HNSW RaBitQ 建图更快
HNSW RaBitQ 在邻居筛选过程中会多次访问原始向量。本版本复用已经读取的向量,并批量执行 Flat 提供方的查找与分段加锁,减少重复读取和锁竞争,加速图构建。
同时,构建器复用 Optimize 线程池,RaBitQ、DiskANN 的嵌套训练也会遵守配置的并发数,减少内部训练任务超出线程预算的情况。
多种索引接入共享页缓存
本版本引入了缓冲存储,并将 HNSW、IVF 和 DiskANN 接入共享页缓存。索引可以通过批量页读取和页面固定来访问数据,DiskANN 在缓存压力下也可以回退到直接 I/O。
底层存储读取统一迁移到 MemoryBlock,使读取数据的生命周期与持有它的内存块保持一致。这为缓存复用、批量读取和并发访问提供了更稳固的基础。
查询性能
Turbo:多种量化格式和距离度量共同受益
向量检索需要反复计算查询向量与候选向量之间的距离,底层计算内核的效率会直接影响查询性能。v0.8.0 对量化器和距离计算做了大范围重构,将 Flat、HNSW、IVF 和 DiskANN 的相关计算路径迁移到 Turbo 框架。
这次更新覆盖多种量化格式和距离度量,并扩展了 AVX2、AVX512、AVX512-FP16、SSE 和 ARM NEON 内核及运行时分派。INT4 内核和 Linux ARM64 场景大幅度受益于本次重构,让压缩向量的距离计算更高效,也让 ARM 服务器上的检索更快,部分场景性能最高提升 131.8%(此处以 GIST 1M、L2 距离、INT8 量化、HNSW 索引、16 核 Linux ARM64 为例)。
Uniform 量化:减少逐点分数反算
本版本新增 Uniform UINT4,并将 Uniform UINT4、UINT7、UINT8 量化器接入数据库层和 HNSW。
Uniform 量化对所有数据点使用统一的 Min/Max 范围,查询时不再需要逐点反算分数,从而减少计算开销、加速检索。
这一选择也有召回率上的权衡:所有点共享一个量化范围,可能使部分数据的量化误差增大,进而降低 Recall。选择 Uniform 量化时,可以结合自己的数据分布,评估查询速度与召回率的取舍。
PQ INT4、FastScan 与 OPQ
Turbo 的量化能力也在继续扩展:
- PQ INT4:以 4 bit 编码表示子空间中的量化结果,提供更紧凑的 PQ 存储选择。
- PQ FastScan:通过打包后的分块扫描加速 4 bit PQ 距离计算,并提供 SIMD 与标量实现。
- OPQ 预处理:在 PQ 量化前对向量进行旋转,改善向量在不同子空间中的分布,为压缩与召回率提供更多调优空间。
这些能力位于 Turbo 框架中;本次更新还统一了多个 PQ 量化器的公共训练与序列化逻辑。
减少精排和结果转换开销
精排通常需要对粗排候选再次计算距离。除了优化计算内核,本版本还减少了候选传递、导出以及 ID 反查的开销。
新增的 Collection.query_internal_ids() 面向只读集合,直接返回内部 ID,减少精排链路中的 ID 反查成本。HNSW 和 Vamana 可以使用 FP16 或 UINT8 向量进行精排,并通过 scale_factor 控制候选数量,在精排成本与召回率之间调整。
Vamana 图布局与预取优化
Vamana 更新了图和向量的内存布局,优化搜索状态与预取,并修正了入口点选择。两遍建图现在默认开启,通过第二遍构建改善图质量。
稳定性与正确性
本版本修复了多项与并发、索引维护和过滤相关的问题:
- 并发读取:修复
fetch()、query()与分段切换或 Flush 并发时的崩溃、遗漏数据问题,并修正 Flat 缓存与键映射迭代器的生命周期。 - 索引重建:包含已删除记录的索引,在重建时正确保留向量与行号之间的对应关系。
- 训练与量化:正确传递 IVF 的
n_iters,修复合并训练中 Turbo 数据源的解码,以及 INT4 评分元数据的取值。 - 过滤查询:修复深层 OR 表达式、
LIKE前后缀重叠、倒排索引后缀匹配和空数组查询;支持过滤后的 IVF 主键暴力检索。 - 浮点范围边界:在优化器将倒排条件转为正排过滤时保留 FLOAT、DOUBLE 的精确边界,确保严格大于、小于等比较不会错误纳入边界值。
- 全文索引持久化:在删除辅助列族前持久化已封存的全文倒排数据,并加强 WAL 恢复、Schema 处理与解码。
升级说明
Jieba 全局词典配置接口已移除。 如果使用过 zvec.init(jieba_dict_dir=...)、set_default_jieba_dict_dir() 或 get_default_jieba_dict_dir(),升级时需要调整调用。对应的 C 配置访问器、C 默认词典目录接口,以及 C++ 全局配置字段和注册接口也已移除。
使用内置默认词典时,直接删除这些配置即可。需要自定义主词典时,可以使用字段级的 FtsIndexParam.extra_params.jieba_dict_dir 或环境变量 ZVEC_JIEBA_DICT_DIR,字段级配置优先;需要补充业务词汇时,使用 user_dict_path。
完整变更与关联 PR 可查看 v0.8.0 Release Notes。