Skip to content

Faiss数据库使用技巧

相似性搜索

Faiss默认使用欧几里得距离计算相关性,这种计算的前提是向量只有 2 维,并且向量的每个值范围是 [0, 1],扩展到三维向量空间中(向量的范围是 [0, 1]),两个向量/点之间最大距离为 √3,并不是 √2,所以直接用默认的算法,可能会出现负数得分,在 N 维向量空间下,两点的最大距离是 √N,所以出现负数的概率大大增加。 可以通过relevance_score_fn参数,传入自定义算法,进行优化,算法如下:

python
def _euclidean_relevance_score_fn(distance: float) -> float:
    return 1.0 / (1.0 + distance)

注意:在使用 LangChain 封装的向量数据库时,一定要注意测试和校验下文本嵌入模型生成向量的数值范围,避免出现明显的错误。由于向量数据库目前更新太快,而且 LangChain 封装了太多的第三方组件(数百个),在很多场合下,LangChain 可能没有对每一种情况进行测试,有可能会出现一些莫名其妙的计算结果。

带过滤的相似性搜索

在绝大部分向量数据库中,除了存储向量数据,还支持存储对应的元数据,这里的元数据可以是文本原文、扩展信息、页码、归属文档id、作者、创建时间等等任何自定义信息,一般在向量数据库中,会通过元数据来实现对数据的检索。

bash
向量数据库记录 = 向量(vector)+元数据(metadata)+id

Faiss原生并不支持过滤,所以在LangChain封装的Faiss中对过滤功能进行了相应的处理。首先获取比 k 更多的结果 fetch_k(默认为 20 条),然后先进行搜索,接下来再搜索得到的 fetch_k 条结果上进行过滤,得到 k 条结果,从而实现带过滤的相似性搜索。

而且Faiss的搜索都是针对 元数据 的,在Faiss中执行带过滤的相似性搜索非常简单,只需要在搜索时传递filter参数即可,filter可以传递一个元数据字典,也可以接收一个函数(函数的参数为元数据字典,返回值为布尔值)

删除指定数据

Faiss中,支持删除向量数据库中特定的数据,目前仅支持传入数据条目 id 进行删除,并不支持条件筛选(但是可以通过条件筛选找到符合的数据,然后提取 id 列表,然后批量删除)。

保存和加载本地数据

除了从文本和文档列表中加载数据到向量数据库,Faiss还支持将整个数据库持久化到本地文件,亦或者从本地文件一键加载数据,这样就不需要在每次使用向量数据库的时候重新创建,可以极大提升向量数据库的使用效率,两个方法如下:

  1. save_local():将向量数据库持久化到本地,传递 folder_path 和 index 分别代表文件夹路径与索引名字。
  2. load_local():将本地的数据加载到向量数据库,传递 folder_path、embeddings 和 index 分别代表文件夹路径、嵌入模型、索引名字。

苏ICP备20040768号