一、为什么
当用户没有正确书写查询语句,或者LLM不能够正确理解用户查询语句的含义时,此时LLM生成的答案可能就不够完整和全面。
二、如何避免
当用户输入查询语句自然语言时,我们让大模型LLM基于用户的问题再生成多个查询语句,这些生成的查询语句是对用户查询语句的补充,它们是从不同的视角来补充用户的查询语句的,然后每条查询语句都会从向量数据库中检索到一批相关文档,最后所有的相关文档都会被喂给LLM,这样LLM就会生成比较完整和全面的答案。
这样就可以避免因为查询语句的差异而导致结果不正确的问题。
三、基本思路
- 利用LLM生成N个与原始查询相关的问题
- 将所有问题(加上原始查询)发给检索系统
- 通过这种方法,可以从向量数据库中检索到更多文档
四、示例代码
# 多路招回
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))