Facebook AI 相似度搜索 (Faiss) 是一个用于高效相似度搜索和密集向量聚类的库。它包含的算法可以在任何大小的向量集中进行搜索,甚至可以处理不适合 RAM 的向量集。它还包括用于评估和参数调整的支持代码。 参见 The FAISS Library 论文。Faiss 文档。 您需要通过
pip install -qU langchain-community 安装 langchain-community 才能使用此集成 本笔记本演示了如何使用 asyncio 操作 FAISS 向量数据库的相关功能。LangChain 实现了同步和异步的向量存储函数。 请参阅 同步 版本。OpenAIEmbeddings,所以我们必须获取 OpenAI API 密钥。
带分数的相似度搜索
有一些 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 应该是文档存储中的 ID。以编程方式连接这些文档到 Claude、VSCode 等,通过 MCP 获取实时答案。