向量数据库 IVF_RABITQ 索引

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)

八、向量相似性检索

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

import tcvectordbfrom 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 )

赞 (0)
上一篇 4天前
下一篇 4天前