Advanced RAG 七、查詢優(yōu)化之Multi-Query 多路召回

一、為什么

當用戶沒有正確書寫查詢語句,或者LLM不能夠正確理解用戶查詢語句的含義時,此時LLM生成的答案可能就不夠完整和全面。

二、如何避免

當用戶輸入查詢語句自然語言時,我們讓大模型LLM基于用戶的問題再生成多個查詢語句,這些生成的查詢語句是對用戶查詢語句的補充,它們是從不同的視角來補充用戶的查詢語句的,然后每條查詢語句都會從向量數(shù)據(jù)庫中檢索到一批相關文檔,最后所有的相關文檔都會被喂給LLM,這樣LLM就會生成比較完整和全面的答案。
這樣就可以避免因為查詢語句的差異而導致結果不正確的問題。

三、基本思路

  1. 利用LLM生成N個與原始查詢相關的問題
  2. 將所有問題(加上原始查詢)發(fā)給檢索系統(tǒng)
  3. 通過這種方法,可以從向量數(shù)據(jù)庫中檢索到更多文檔

四、示例代碼

# 多路招回
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))
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容