引言
在现代信息检索系统中,如何高效检索相关文档一直是一个关键问题。一种常用的方法是利用 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---