Faiss (异步)
Facebook AI 相似性搜索 (Faiss) 是一个用于高效相似性搜索和密集向量聚类的库。它包含在任意大小的向量集合中进行搜索的算法,甚至可以处理可能不适合 RAM 的向量。它还包括用于评估和参数调优的支持代码。
请参见 FAISS 库 论文。
您需要使用 pip install -qU langchain-community
安装 langchain-community
才能使用此集成。
本笔记本展示了如何使用与 FAISS
向量数据库相关的功能,使用 asyncio
。
LangChain 实现了同步和异步向量存储功能。
请参见 同步
版本 这里。
%pip install --upgrade --quiet faiss-gpu # For CUDA 7.5+ Supported GPU's.
# OR
%pip install --upgrade --quiet faiss-cpu # For CPU Installation
我们想使用 OpenAIEmbeddings,因此我们必须获取 OpenAI API 密钥。
<!--IMPORTS:[{"imported": "TextLoader", "source": "langchain_community.document_loaders", "docs": "https://python.langchain.com/api_reference/community/document_loaders/langchain_community.document_loaders.text.TextLoader.html", "title": "Faiss (Async)"}, {"imported": "FAISS", "source": "langchain_community.vectorstores", "docs": "https://python.langchain.com/api_reference/community/vectorstores/langchain_community.vectorstores.faiss.FAISS.html", "title": "Faiss (Async)"}, {"imported": "OpenAIEmbeddings", "source": "langchain_openai", "docs": "https://python.langchain.com/api_reference/openai/embeddings/langchain_openai.embeddings.base.OpenAIEmbeddings.html", "title": "Faiss (Async)"}, {"imported": "CharacterTextSplitter", "source": "langchain_text_splitters", "docs": "https://python.langchain.com/api_reference/text_splitters/character/langchain_text_splitters.character.CharacterTextSplitter.html", "title": "Faiss (Async)"}]-->
import getpass
import os
if "OPENAI_API_KEY" not in os.environ:
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
# Uncomment the following line if you need to initialize FAISS with no AVX2 optimization
# os.environ['FAISS_NO_AVX2'] = '1'
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
loader = TextLoader("../../../extras/modules/state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
db = await FAISS.afrom_documents(docs, embeddings)
query = "What did the president say about Ketanji Brown Jackson"
docs = await db.asimilarity_search(query)
print(docs[0].page_content)
带分数的相似性搜索
有一些特定于 FAISS 的方法。其中之一是 similarity_search_with_score
,它允许您返回不仅是文档,还有查询与它们之间的距离分数。返回的距离分数是 L2 距离。因此,分数越低越好。
docs_and_scores = await db.asimilarity_search_with_score(query)
docs_and_scores[0]
还可以使用 similarity_search_by_vector
搜索与给定嵌入向量相似的文档,该方法接受嵌入向量作为参数,而不是字符串。
embedding_vector = await embeddings.aembed_query(query)
docs_and_scores = await db.asimilarity_search_by_vector(embedding_vector)