索引介绍
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 tcvectordbfrom tcvectordb.model.enum import FieldType, IndexType, MetricTypefrom tcvectordb.model.index import Index, VectorIndex, FilterIndex, IVFRABITQParamsindex = 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 tcvectordbfrom tcvectordb.model.enum import MetricTypefrom tcvectordb.model.index import Index, VectorIndex#create a database client objectclient = 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)
向量相似性检索
import tcvectordbfrom tcvectordb.model.document import Document, Filter, SearchParamsdoc_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)