Facebook AI 相似度搜索(Faiss) 是一个用于高效相似度搜索和密集向量聚类的库。它包含可在任意大小向量集合中进行搜索的算法,甚至可处理无法全部装入内存的向量集。它还提供用于评估和参数调优的辅助代码。 参见 The FAISS Library 论文。Faiss 文档。 使用此集成前,请通过
pip install -qU langchain-community 安装 langchain-community。
本 Notebook 展示如何使用 asyncio 与 FAISS 向量数据库相关的功能。
LangChain 实现了同步和异步两种向量存储函数。
同步版本请参见此处。
OpenAIEmbeddings,因此需要获取 OpenAI API Key。
带评分的相似度搜索
FAISS 有一些特有方法。其中之一是similarity_search_with_score,它不仅返回文档,还返回查询与文档之间的距离分数。返回的距离分数为 L2 距离,因此分数越低越好。
similarity_search_by_vector 搜索与给定嵌入向量相似的文档,该方法接受嵌入向量作为参数,而非字符串。
保存与加载
您也可以保存和加载 FAISS 索引。这样就不必每次使用时都重新创建索引。序列化与反序列化为字节
您可以通过这些函数对 FAISS 索引进行 pickle 序列化。如果您使用的嵌入模型大小为 90MB(例如 sentence-transformers/all-MiniLM-L6-v2 或其他模型),生成的 pickle 文件大小将超过 90MB,因为模型大小也包含在总大小中。为解决此问题,可使用以下函数。这些函数仅序列化 FAISS 索引,文件大小会小得多。如果您希望将索引存储在 SQL 等数据库中,这非常有用。合并
您也可以合并两个 FAISS 向量存储。带过滤的相似度搜索
FAISS 向量存储也支持过滤。由于 FAISS 原生不支持过滤,我们需要手动实现。做法是先获取比k 更多的结果,然后对其进行过滤。您可以基于元数据过滤文档。在调用任何搜索方法时,还可以设置 fetch_k 参数,以确定过滤前要获取的文档数量。以下是一个简单示例:
page = 1 的结果。
max_marginal_relevance_search 同样支持此功能。
similarity_search 时设置 fetch_k 参数。通常建议将 fetch_k 参数设置得远大于 k 参数。这是因为 fetch_k 参数是过滤前要获取的文档数量。如果将 fetch_k 设置得太小,可能没有足够的文档可供过滤。
$eq(等于)$neq(不等于)$gt(大于)$lt(小于)$gte(大于或等于)$lte(小于或等于)$in(在列表中)$nin(不在列表中)$and(所有条件都匹配)$or(任一条件匹配)$not(条件取反)
删除
您也可以删除指定 id。注意,要删除的 id 应为 docstore 中的 id。通过 MCP 将这些文档连接到 Claude、VSCode 等,获取实时答案。

