IVF_RABITQ 索引

最近更新时间:2025-12-24 19:51:52

我的收藏

索引介绍

IVF_RABITQ 是一种基于二进制量化的索引算法,能够高效地将浮点数(FP32)向量转换为二进制表示,最高实现1:32的压缩比,大幅降低存储成本。
同时,保持相对较高的检索召回率。在内存受限场景下,可作为 IVF_FLAT 的高效替代方案。

倒排文件索引(IVF)

倒排文件索引,通过 k-means 聚类算法将高维向量空间划分为若干个区域(簇)。每个区域(簇)都有一个中心点作为该区域的代表。所有向量被分配到距离最近的簇中。当查询向量时,首先计算查询向量与所有簇中心点的距离,选择距离最近的簇进行深入搜索,将查询向量与该簇内每个成员向量进行精确距离计算,大幅缩减搜索范围。

量化索引 RaBitQ

RaBitQ 是一种具有理论保证的先进的二进制量化方法。RaBitQ 通过向量归一化对角度信息进行编码。在 IVF_RABITQ 中,数据向量根据其最近的 IVF 中心点进行归一化,从而提高了量化过程的精度。

其中,o 是原始向量,q 是查询向量,c 是每一个簇的中心向量。
∣∣(or​−c)∣∣:表示簇中原始向量到其对应簇中心的距离。这部分可以在索引构建阶段进行预计算并存储,从而避免重复计算。
∣∣(qr−c)∣∣:表示查询向量到其对应簇中心的距离。
⟨q,o⟩ 表示向量 q 和向量 𝑜 之间的内积 (Inner Product)。

IVF + RaBitQ 融合机制

IVF_RABITQ 索引将 IVF 的高效聚类与 RaBitQ 先进的二进制量化相结合。
序号
关键技术
核心能力
效果
1
倒排文件 (IVF)
将整个向量空间划分为预定义的簇(倒排列表),并快速定位查询向量所在的最近邻簇。
极大缩小搜索范围,提升检索效率。
2
RaBitQ 多比特量化
将簇内的每个原始向量,转化为一个紧凑的二进制编码。该编码捕获了向量相对于簇中心的方向信息。
将复杂的浮点计算简化为高效的位运算,使簇内距离计算速度极快。同时,多比特支持(1-9bit)提供了精度与效率的灵活权衡。
3
可选的精度细化
额外存储一份原始向量的高精度表示,用于对初步结果进行重新排序。
利用高精度数据执行最终的距离计算,更准确地识别真正近邻,显著提高召回率(代价是增加部分存储开销)。

索引参数

在构建和使用 IVF_RABITQ 索引时,以下核心参数的配置直接决定了索引的检索速度、召回率及存储效率。
参数
参数含义
参数设置
nlist
聚类数量
定义了 IVF 算法将整个向量空间划分成的聚类(或称“簇”)的数量。
值越高:空间划分越精细,查询速度越快,但索引构建开销越大。
值越低:索引构建成本越低,但查询延迟越高。
通常建议根据单个分片中的向量数量来设置:
[sqrt(单分片数据量) * 4, sqrt(单分片数据量) * 16]
bits
量化比特数
指定了 RaBitQ 量化过程中,每个向量维度被压缩成的二进制表示所使用的比特数,直接决定了量化精度和存储空间。
值越高:量化精度越高,召回率越优,但存储需求越大。
值越低:存储空间越小,计算速度越快,但召回率越低。
取值范围 [1,9],默认值为1。

nprobe
搜索簇数量
控制每次查询时实际扫描的最近邻簇数量。
值越高:召回率越高,但查询延迟增加。
值越低:查询速度越快,但召回率可能下降。
取值范围[1,nlist]。

创建 IVF_RABITQ 索引

在创建集合时,将 index_type 指定为 IVF_RABITQ,并配置相应的索引参数 nlist 与 bits。如下以 Python SDK 为例,具体信息,请参见 新建 Collection
import tcvectordb
from tcvectordb.model.enum import FieldType, IndexType, MetricType
from tcvectordb.model.index import Index, VectorIndex, FilterIndex, IVFRABITQParams

index = Index()
index.add(FilterIndex('id', FieldType.String, IndexType.PRIMARY_KEY))
index.add(VectorIndex(name='vector',
dimension=64,
index_type=IndexType.IVF_RABITQ,
metric_type=MetricType.IP,
params=IVFRABITQParams(nlist=100, bits=6)))

修改当前索引类型为 IVF_RABITQ

修改当前索引类型为 IVF_RABITQ,需通过 modify_vector_index() 接口,将 index_type 指定为 IVF_RABITQ,并配置索引参数 nlist 与 bits。如下以 Python SDK 为例,具体接口介绍,请参见 修改向量索引

import tcvectordb
from tcvectordb.model.enum import MetricType
from tcvectordb.model.index import Index, VectorIndex

#create a database client object
client = tcvectordb.RPCVectorDBClient(url='http://10.0.X.X:80', username='root', key='eC4bLRy2va******************************', read_consistency=ReadConsistency.EVENTUAL_CONSISTENCY, timeout=30)
#设置需更新的字段,或增加新的字段
res = client.modify_vector_index(
database_name='db-test',
collection_name='book-vector',
vector_indexes=[
VectorIndex(
index_type=IndexType.IVF_RABITQ,
params={
"nlist": 160,
"bits": 7
},
),
],
rebuild_rules={
"dropBeforeRebuild": True,
"throttle": 1,
}
)
print(res)

向量相似性检索

向量检索时,需通过 search() 接口,配置查询参数 nprobe,如下以 Python SDK 为例,具体接口介绍,请参见 向量相似性检索

import tcvectordb
from tcvectordb.model.document import Document, Filter, SearchParams
doc_lists = client.search(
database_name='db-test',
collection_name='book-vector',
vectors=[[0.3123, 0.43, 0.213],[0.315, 0.4, 0.216],[0.40, 0.38, 0.26]],
params=SearchParams(nprobe=60),
limit=3
)