如何使用 Vectorstore 作为高效的文档检索器

131 阅读2分钟

引言

在现代信息检索系统中,如何高效检索相关文档一直是一个关键问题。一种常用的方法是利用 Vectorstore 来构建检索器。本文将探讨如何从 Vectorstore 实例化一个检索器,指定检索类型,并设置诸如阈值分数和 top-k 等附加搜索参数。

主要内容

实例化 Vectorstore 检索器

要从 Vectorstore 构建一个检索器,您可以使用其 as_retriever 方法。以下是一个示例流程。

创建一个 In-memory FAISS Vectorstore

我们首先需要实例化一个 Vectorstore。在这里,我们将使用一个内存中的 FAISS Vectorstore。

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()  # 使用OpenAI生成嵌入
vectorstore = FAISS.from_documents(texts, embeddings)  # 创建FAISS向量存储

实例化检索器

retriever = vectorstore.as_retriever()  # 从向量存储创建检索器

这样,我们就创建了一个检索器,可以用于查询相关文本。

使用 MMR 搜索

默认情况下,向量存储检索器使用相似性搜索。如果底层向量存储支持最大边际相关性 (MMR) 搜索,你可以指定它为搜索类型:

retriever = vectorstore.as_retriever(search_type="mmr")  # 设置检索类型为MMR

传递搜索参数

相似性分数阈值

可以设置相似性分数阈值,只返回分数高于该阈值的文档。

retriever = vectorstore.as_retriever(
    search_type="similarity_score_threshold", search_kwargs={"score_threshold": 0.5}
)

指定返回文档数量 Top-k

也可以限制检索器返回的文档数量。

retriever = vectorstore.as_retriever(search_kwargs={"k": 1})  # 设置返回一个文档

代码示例

# 使用API代理服务提高访问稳定性
docs = retriever.invoke("what did the president say about ketanji brown jackson?")
print(len(docs))  # 输出文档数量

常见问题和解决方案

  • 网络限制:由于某些地区的网络限制,开发者在使用网络API时可能需要考虑使用API代理服务,以提高访问的稳定性。
  • 搜索准确性问题:在特定情况下,相似性检索可能会返回不相关文档。此时可以通过调节 search_kwargs 参数进行优化。

总结和进一步学习资源

通过利用 Vectorstore 作为检索器,我们可以高效地进行文档检索,同时根据需要自定义搜索参数。关于 FAISS、OpenAI Embeddings 和其他相关工具,读者可以参考以下资料进行深入学习。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---