<aside> 💡

它不是一个数据库,而是一个向量相似性搜索的算法库。

</aside>

Indexing

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

  1. 适合高维数据,提供了快速且精度较高的搜索,但构建索引的开销较大。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
    

metrics