Faiss向量检索工具使用

Faiss向量检索工具使用

  • 2023年2月27日,马骁勇创建

提纲:

  1. 向量检索工具简介(是什么,做什么),Faiss库简介。
  2. Faiss库的基本组件。
  3. 用Faiss库实现简单的文本匹配。

向量检索简单说是以向量为输入,希望在向量库中查询到最相近的目标向量。向量检索可以用于文本检索、文本匹配、图文检索等,主要是依靠深度学习模型的表示向量能够获得相比普通字符更大的表示空间,进而获得更精准的检索效果。

Faiss向量检索工具使用_第1张图片

上图为使用向量检索工具构建检索模型的基本流程:

  1. 训练一个向量表示模型。
  2. 对需要检索的目标进行向量表示,生成向量索引库。
  3. 对于新的检索,采用同样的表示模型生成表示向量,通过向量检索工具查询距离最近的向量。

Faiss向量检索库使用

安装Faiss:pip install faiss-cpu 或GPU版本(默认使用CPU)pip install faiss-gpu

本例中,向量的维度为64,数据库规模为100000,待检索的查询词数量为10000,xb为数据库的对应向量库,维度100000*64,xq为查询词的向量表示,维度10000*64。

import numpy as np
d = 64                           # dimension
nb = 100000                      # database size
nq = 10000                       # nb of queries
np.random.seed(1234)             # make reproducible
xb = np.random.random((nb, d)).astype('float32')
xb[:, 0] += np.arange(nb) / 1000.
xq = np.random.random((nq, d)).astype('float32')
xq[:, 0] += np.arange(nq) / 1000.

Faiss检索首先选择一个索引器,例如常见的IndexFlatL2,基于L2距离(欧式距离)的暴力穷举搜索,将目标向量库加入索引器完成索引器的“训练”(对IndexFlatL2来说,实际不需要训练)。

import faiss                   # make faiss available
index = faiss.IndexFlatL2(d)   # build the index
print(index.is_trained)
index.add(xb)                  # add vectors to the index
print(index.ntotal)

使用索引器对查询词的向量表示进行检索,返回最近的k个向量在向量库中的索引号以及和查询词向量之间的距离。

k = 4                          # we want to see 4 nearest neighbors
D, I = index.search(xb[:5], k) # sanity check
print(I)
print(D)
D, I = index.search(xq, k)     # actual search
print(I[:5])                   # neighbors of the 5 first queries
print(I[-5:])                  # neighbors of the 5 last queries

备注:

  1. IndexFlatL2是最常见的暴力搜索索引器,希望获得加速效果可换用其他索引器,常见的有IndexIVFFlat(需要训练,有精度损失)。常见索引器参考:
    1. Faiss indexes · facebookresearch/faiss Wiki (github.com)
    2. Guidelines to choose an index · facebookresearch/faiss Wiki (github.com)
  2. L2距离和内积距离(inner product)是Faiss索引器最主要使用的两种向量距离评价方式。余弦距离可以通过内积距离实现,索引器可使用IndexFlatIP(或其他使用METRIC_INNER_PRODUCT内积距离的索引器),查询向量和目标向量库都需经过faiss.normalize_L2() 进行标准化。(向量距离越近,余弦距离越接近1,L2距离接近0)

参考:

  1. 向量检索简述 - 知乎 (zhihu.com)
  2. Getting started · facebookresearch/faiss Wiki (github.com)

你可能感兴趣的:(NLP,深度学习,python,深度学习,自然语言处理)