Advanced RAG 七、查询优化之Multi-Query 多路召回

一、为什么

当用户没有正确书写查询语句,或者LLM不能够正确理解用户查询语句的含义时,此时LLM生成的答案可能就不够完整和全面。

二、如何避免

当用户输入查询语句自然语言时,我们让大模型LLM基于用户的问题再生成多个查询语句,这些生成的查询语句是对用户查询语句的补充,它们是从不同的视角来补充用户的查询语句的,然后每条查询语句都会从向量数据库中检索到一批相关文档,最后所有的相关文档都会被喂给LLM,这样LLM就会生成比较完整和全面的答案。
这样就可以避免因为查询语句的差异而导致结果不正确的问题。

三、基本思路

  1. 利用LLM生成N个与原始查询相关的问题
  2. 将所有问题(加上原始查询)发给检索系统
  3. 通过这种方法,可以从向量数据库中检索到更多文档

四、示例代码

# 多路招回
from langchain_chroma import Chroma
from langchain_classic.retrievers import MultiQueryRetriever
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

from Common import get_models

llm,embeddings_model = get_models()

loader = TextLoader("./deepseek百度百科.txt",encoding="utf-8")
docs = loader.load()

splitter = RecursiveCharacterTextSplitter(chunk_size=600, chunk_overlap=100)
chunks = splitter.split_documents(docs)

vectorstore = Chroma.from_documents(documents=chunks, embedding=embeddings_model)

retriever = vectorstore.as_retriever()

# 检索测试
# relevant_docs = retriever.invoke("deepseek的应用场景")
# print(relevant_docs)
import logging
logging.basicConfig()
logging.getLogger("langchain.retrievers.multi_query").setLevel(logging.INFO)
retrieval_from_llm = MultiQueryRetriever.from_llm(llm=llm, retriever=retriever)

unique_docs = retrieval_from_llm.invoke("deepseek的应用场景")
print(unique_docs)
print(len(unique_docs))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容