3. mcFaiss基本概念
3.1. 向量数据
人工智能算法可以将物理世界的人/物/场景所产生的各种非结构化数据(如语音、图片、视频、语言文字、行为等)进行抽象,变成多维度的向量。 这些向量如同数学空间中的坐标,标识了各个实体和实体关系。非结构化检索则是对这些生成的向量进行搜索,从而找到对应实体或者近似实体的过程。
图 3.1 向量索引
3.2. 向量索引
3.2.1. 支持GPU加速的索引
mcFaiss继承了Faiss所有向量索引在CPU上的实现,提供了多种向量索引算法,包括:IVF、LSH、PQ、HNSW等;提供了多种向量索引的实现,包括:IndexFlat、IndexIVFFlat、IndexLSH、IndexPQ等。 同时,mcFaiss也提供了Faiss向量GPU索引在MXMACA上的实现,包括:GpuIndexFlat、GpuIndexIVFFlat、GpuIndexPQ、GpuIndexSQ等。
3.2.2. 选择索引的建议
不同的索引适用于不同的场景,通常来说Flat的索引适用于数据量相对较小的场景,并且可以提供100%的召回。
IVFFlat的索引适用于数据量较大的场景,并且通过调整 nlist 和 nprobe 参数的设定在召回和搜索效率之间寻找平衡。在更大数据量的规模情况下,则可以考虑使用PQ/SQ量化来进一步提高搜索效率。
3.3. 向量间的距离
3.3.1. 浮点向量的距离
3.3.1.1. 欧氏距离
欧氏距离是最常见的距离度量方式,在向量索引中为了方便计算,通常使用以下计算公式:
实际数学意义上的欧氏距离还需要再计算一个平方根,但是在实际的向量搜索中,由于平方根是一个单调递增的函数,因此在搜索时可以省略平方根的计算,直接比较平方距离即可。
3.3.1.2. 内积距离
内积距离通常表达的是两个向量之间的相似度,内积距离的计算公式如下:
3.3.1.3. 余弦距离
余弦距离的计算公式如下:
而在Faiss等向量索引的计算中,并没有直接支持余弦距离,通常通过将A和B向量进行归一化,使得上述公式的分母为1,那么此时余弦距离等价于内积距离。
3.3.2. 二值向量的距离
mcFaiss也支持二值向量的距离计算和相关索引。二值向量的距离计算方式有:Hamming距离、Jaccard距离等。mcFaiss提供了多种二值向量的索引,包括:IndexBinaryFlat、IndexBinaryIVF等。