一、為什么
當用戶沒有正確書寫查詢語句,或者LLM不能夠正確理解用戶查詢語句的含義時,此時LLM生成的答案可能就不夠完整和全面。
二、如何避免
當用戶輸入查詢語句自然語言時,我們讓大模型LLM基于用戶的問題再生成多個查詢語句,這些生成的查詢語句是對用戶查詢語句的補充,它們是從不同的視角來補充用戶的查詢語句的,然后每條查詢語句都會從向量數(shù)據(jù)庫中檢索到一批相關文檔,最后所有的相關文檔都會被喂給LLM,這樣LLM就會生成比較完整和全面的答案。
這樣就可以避免因為查詢語句的差異而導致結果不正確的問題。
三、基本思路
- 利用LLM生成N個與原始查詢相關的問題
- 將所有問題(加上原始查詢)發(fā)給檢索系統(tǒng)
- 通過這種方法,可以從向量數(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))