在现代信息检索系统中,向量存储被广泛用于高效地检索相关文档。向量存储检索器是一种轻量级的包装器,用于将向量存储类转换为符合检索器接口的类。它通过调用向量存储中实现的搜索方法(如相似性搜索和最大边缘相关性搜索)来查询文本。本指南将详细介绍如何从向量存储实例化一个检索器,并指定搜索类型和其他搜索参数。
1. 技术背景介绍
向量存储(Vector Store)以一种优化的方式存储和检索嵌入向量,使得它们在大规模信息检索和推荐系统中非常有用。例如,FAISS是一个高效的相似性搜索库,专注于大规模稠密向量的高效检索。
2. 核心原理解析
向量存储检索器依赖于以下几个组件:
- 文档加载器:用于加载原始文档内容。
- 文本切分器:处理原始文档,使之分割为可管理的小块。
- 嵌入生成器:将文本块转换为嵌入向量。
- 向量存储:如FAISS,用于存储和检索这些嵌入向量。
我们将使用这些组件来构建一个检索器并演示不同的检索方式。
3. 代码实现演示
首先,我们需要创建一个向量存储:
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()
# 查询文档
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?")
设定相似性分数阈值
# 设定相似性分数阈值
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?")
指定返回文档数目
# 限制返回文档数目
retriever = vectorstore.as_retriever(search_kwargs={"k": 1})
# 查询文档
docs = retriever.invoke("what did the president say about ketanji brown jackson?")
print(len(docs)) # 输出 1
4. 应用场景分析
这种检索器广泛应用于聊天机器人、信息检索系统和推荐引擎中,能够快速地为用户提供最相关的文本片段。
5. 实践建议
- 在选择嵌入生成器时,考虑语料的多样性和复杂性,以选择适合的模型。
- 针对不同应用场景,合理配置搜索参数(如相似性分数阈值和返回文档数)。
- 定期更新向量存储,以保持数据的时效性和准确性。
如果遇到问题欢迎在评论区交流。
—END—