index选择
考虑因素:候选向量的数量级、index所占内存的大小、检索所需时间(是离线检索还是在线检索)、index构建时间、检索的召回率。
Flat :暴力检索 | IVFx Flat :倒排暴力检索 | PQx :乘积量化 | IVFxPQy 倒排乘积量化 | LSH 局部敏感哈希 | HNSWx | |
---|---|---|---|---|---|---|
优点 | 该方法是Faiss所有index中最准确的,召回率最高的方法,没有之一; | IVF利用倒排索引思想,拿出每个聚类中心下的向量ID,每个中心ID后面挂上一堆非中心向量,每次查询向量的时候找到最近的几个中心ID,分别搜索这几个中心下的非中心向量。通过减小搜索范围,提升搜索效率。 | 利用乘积量化的方法,改进了普通k-means,将一个向量的维度切成x段,每段分别进行k-means。因此速度很快,而且占用内存较小,召回率也相对较高(切4段) | 工业界大量使用此方法,各项指标都均可以接受。 | 不同于传统哈希尽量不产生碰撞,局部敏感哈希依赖碰撞来查找近邻。高维空间的两点若距离很近,那么设计一种哈希函数对这两点进行哈希值计算,使得他们哈希值有很大的概率是一样的,若两点之间的距离较远,他们哈希值相同的概率会很小。不同距离度量的哈希函数不同,不是所有距离度量(如内积)都能找到对应局部敏感哈希。 - 训练非常快,支持分批导入,index占内存很小,检索也比较快 | 基于图检索的改进方法,检索速度极快,10亿级别秒出检索结果,而且召回率几乎可以媲美Flat,能达到惊人的97%。检索的时间复杂度为loglogn,几乎可以无视候选向量的量级了。并且支持分批导入,极其适合线上任务,毫秒级别体验。 |
缺点 | 速度慢,占内存大。 | 速度也还不是很快 | 召回率相较于暴力检索,下降较多。 | 召回率非常拉垮。在候选语料比较多的时候(百万级别),检索也不是特别快,大概是秒级别的。 | 构建索引极慢,占用内存极大(是Faiss中最大的,大于原向量占用的内存大小) | |
使用情况 | 向量候选集很少,在50万以内,并且内存不紧张。 | 向量候选集很少,在50万以内,并且内存不紧张。 | 内存及其稀缺,并且需要较快的检索速度,不那么在意召回率 | 同PQx | 候选向量库非常大,离线检索,内存资源比较稀缺的情况 | 不在乎内存,并且有充裕的时间来构建index |
是否GPU | ||||||
是否训练 | 否 | 是,因为倒排索引需要训练k-means,因此需要先训练index,再add向量 | 是,因为倒排索引需要训练k-means,因此需要先训练index,再add向量 | 同PQx | 否 | 否 |
参数 | IVFx中的x是k-means聚类中心的个数 | PQx中的x为将向量切分的段数,因此,x需要能被向量维度整除,且x越大,切分越细致,时间复杂度越高 | 同PQx | HNSWx中的x为构建图时每个点最多连接多少个节点,x越大,构图越复杂,查询越精确,当然构建index时间也就越慢,x取4~64中的任何一个整数。 |