如何使用向量数据库作为检索器
向量存储检索器是一种 检索器,它使用 向量数据库 来检索文档。它是向量数据库类的一个轻量级包装器,使其符合检索器的 接口。它使用向量数据库实现的搜索方法,如相似性搜索和 MMR,来查询向量数据库中的文本。
在本指南中,我们将涵盖
- 如何从向量数据库实例化检索器;
- 如何为检索器指定搜索类型;
- 如何指定额外的搜索参数,例如阈值分数和 top-k。
从向量数据库创建检索器
你可以使用向量数据库的 .as_retriever 方法从向量数据库构建检索器。让我们来看一个例子。
首先,我们实例化一个向量数据库。我们将使用内存中的 FAISS 向量数据库
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("state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(texts, embeddings)
然后我们可以实例化一个检索器
retriever = vectorstore.as_retriever()
这将创建一个检索器(具体来说是一个 VectorStoreRetriever),我们可以在通常的方式中使用它
docs = retriever.invoke("what did the president say about ketanji brown jackson?")
最大边际相关性检索
默认情况下,向量存储检索器使用相似性搜索。如果底层向量数据库支持最大边际相关性搜索,你可以将其指定为搜索类型。
这有效地指定了底层向量数据库上使用的方法(例如,similarity_search
、max_marginal_relevance_search
等)。
retriever = vectorstore.as_retriever(search_type="mmr")
docs = retriever.invoke("what did the president say about ketanji brown jackson?")
传递搜索参数
我们可以使用 search_kwargs
将参数传递给底层向量数据库的搜索方法。
相似度分数阈值检索
例如,我们可以设置相似度分数阈值,并且只返回得分高于该阈值的文档。
retriever = vectorstore.as_retriever(
search_type="similarity_score_threshold", search_kwargs={"score_threshold": 0.5}
)
docs = retriever.invoke("what did the president say about ketanji brown jackson?")
指定 top k
我们还可以限制检索器返回的文档数量 k
。
retriever = vectorstore.as_retriever(search_kwargs={"k": 1})
docs = retriever.invoke("what did the president say about ketanji brown jackson?")
len(docs)
1