<aside> 💡
它不是一个数据库,而是一个向量相似性搜索的算法库。
</aside>
FAISS 提供了多种索引类型,选择最常用的索引类型取决于具体的应用场景和需求。
1. 小规模数据集或需要精确搜索:Flat
IndexFlatL2
特点: 简单易用,提供精确的搜索结果。langchain 默认使用。
import faiss
import numpy as np
d = 128
nb = 1000
np.random.seed(1234)
xb = np.random.random((nb, d)).astype('float32')
index = faiss.IndexFlatL2(d)
index.add(xb)
xq = np.random.random((10, d)).astype('float32')
D, I = index.search(xq, 5)
2. 适合大规模数据集,能够在速度和精度之间取得平衡。IVFFlat
IndexIVFFlat
使用倒排文件和聚类技术,提高搜索效率。首先会将数据进行聚类,然后在查询时只在相关的簇中进行搜索,从而减少比较的数量,提高搜索速度。
quantizer: 用于聚类的量化器(通常是 IndexFlatL2)。d: 向量的维度。nlist: 聚类中心的数量,即簇的数量。metric: 距离度量方式(如 faiss.METRIC_L2 表示欧氏距离)。nlist = 100
quantizer = faiss.IndexFlatL2(d)
index = faiss.IndexIVFFlat(quantizer, d, nlist, faiss.METRIC_L2)
index.train(xb)
index.add(xb)
IndexIVFPQ
nlist = 100
m = 8 # PQ 码字数
quantizer = faiss.IndexFlatL2(d)
index = faiss.IndexIVFPQ(quantizer, d, nlist, m, 8)
index.train(xb)
index.add(xb)
适合高维数据,提供了快速且精度较高的搜索,但构建索引的开销较大。HNSW
def _create_hnsw_index(self):
"""
创建 HNSW 索引实例。
:return: 创建的 HNSW 索引实例。
"""
index = faiss.IndexHNSWFlat(self.d, self.hnsw_m)
if self.metric == faiss.METRIC_INNER_PRODUCT:
faiss.normalize_L2(index)
return index