在快速發展的 AI 驅動應用程序格局中,重新排名已成為提高企業搜索結果的準確性和相關性的關鍵技術。通過使用先進的機器學習算法,重新排名可以優化初始搜索輸出,以更好地與用戶意圖和上下文保持一致,從而顯著提高語義搜索的有效性。這通過提供更準確、更符合上下文的結果來提高用戶滿意度,同時還提高了轉化率和參與度指標。
重新排名在優化檢索增強生成(Retrieval-Augmented Generation,RAG)流程方面也發揮著至關重要的作用,可確保大型語言模型(Large Language Models,LLMs)處理最相關和高質量的信息。重新排名的這一雙重優勢(增強語義搜索和RAG流程)使其成為旨在提供卓越搜索體驗并在數字市場中保持競爭優勢的企業不可或缺的工具。
在本文中,我使用了 NVIDIA NeMo Retriever Reranking NIM。這是一個 transformer 編碼器:Mistral-7B 的 LoRA 微調版本,只使用前 16 層以提高吞吐量。解碼器模型的最后一個嵌入輸出被用作池化策略,并針對排名任務對二進制分類頭進行了微調。
什么是 Reranking?
Reranking 是一種復雜的技術,通過使用 LLMs 的高級語言理解能力來增強搜索結果的相關性。
首先,使用傳統的信息檢索方法(如 BM25 或向量相似度搜索)檢索一組候選文檔或段落。然后將這些候選文檔輸入 LLM,該 LLM 分析查詢和每個文檔之間的語義相關性。LLM 分配相關性分數,從而使文檔重新排序以優先處理最相關的文檔。
此過程不僅僅是通過關鍵字匹配來理解查詢和文檔的上下文和含義,還能顯著提高搜索結果的質量。重新排名通常用作初始快速檢索步驟后的第二階段,以確保僅向用戶展示最相關的文檔。它還可以組合多個數據源的結果,以及集成到 RAG 管道中,以進一步確保上下文適合特定查詢。
要訪問 NVIDIA NeMo Retriever 集合的世界級信息檢索微服務,請參閱 NVIDIA API 目錄。
教程預備知識
要充分利用本教程,您需要了解 LLM 推理管線的基本知識以及以下資源:
設置
要開始使用,請使用NVIDIA API 目錄并按照以下步驟操作:
- 選擇任意型號。
- 選擇Python, 獲取 API 密鑰.
- 將生成的密鑰另存為
NVIDIA_API_KEY
.
從這里,您應該可以訪問端點。
現在,安裝 LangChain、NVIDIA AI Endpoints 和 FAISS:
pip install langchain pip install langchain_nvidia_ai_endpoints pip install faiss - gpu |
加載相關文檔
對于此示例,加載近期關于多模態 LLM 的 NVIDIA 出版物 VILA:視覺語言模型的預訓練。使用此單個 PDF 查看博文中的所有示例,但代碼可以輕松擴展以加載多個文檔。
from langchain_community.document_loaders import PyPDFLoader document = PyPDFLoader( "2312.07533v4.pdf" ).load() |
分割成塊
接下來,將文檔拆分為單獨的塊。
請務必注意chunk_size
參數TextSplitter
設置正確的數據塊大小對于 RAG 性能至關重要,因為 RAG 工作流的成功很大程度上取決于檢索步驟如何找到生成所需的正確上下文。檢索步驟通常會檢查較小的原始文本塊,而不是所有文檔。
整個提示(檢索到的數據塊加上用戶查詢)必須符合LLM的上下文窗口。請勿指定數據塊的大小太大,并將其與估計的查詢大小進行平衡。嘗試不同的數據塊大小,但典型值應為100-600個令牌,具體取決于LLM。
from langchain_text_splitters import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter(chunk_size = 800 , chunk_overlap = 200 ) texts = text_splitter.split_documents(document) |
生成嵌入
接下來,使用NVIDIA AI 基礎端點并將嵌入保存到/embed
以便日后再使用。
對于此任務,請使用 FAISS,這是一個用于高效相似性搜索和密集向量聚類的庫。它包含的算法可以搜索任意大小的向量集,甚至可能不適合內存的向量集。
from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings from langchain_community.vectorstores import FAISS embeddings = NVIDIAEmbeddings() db = FAISS.from_documents(texts, embeddings) |
創建基本的檢索工具
現在,根據文檔創建基本檢索器,并搜索與您的查詢最相關的數據塊。此代碼基于簡單的檢索算法輸出與您的查詢最相關的 45 個數據塊。
retriever = db.as_retriever(search_kwargs = { "k" : 45 }) query = "Where is the A100 GPU used?" docs = retriever.invoke(query) |
添加重新排名步驟
現在,我們使用 NeMo Retriever 重新排名 NIM,添加重新排名步驟。這是一個經過優化的 GPU 加速模型,可以提供給定段落包含回答問題信息的概率分數。根據使用相同查詢,這將重新排名先前提取的數據塊,以確定哪些最相關。
您可以將 NIM 用作 LangChain 上下文壓縮檢索器的輸入,以便通過在返回文檔之前根據查詢上下文壓縮和過濾文檔來改進檢索。
from langchain_nvidia_ai_endpoints import NVIDIARerank from langchain.retrievers.contextual_compression import ContextualCompressionRetriever reranker = NVIDIARerank() compression_retriever = ContextualCompressionRetriever( base_compressor = reranker, base_retriever = retriever ) reranked_chunks = compression_retriever.compress_documents(query) |
重新排序的 NIM 會在論文末尾將最相關的塊識別為與訓練成本相關的段落,其中指定了A100 GPU。
Table 10. The SFT blend we used during the ablation study. B. Training Cost We perform training on 16 A100 GPU nodes, each node has 8 GPUs. The training hours for each stage of the 7B model are: projector initialization: 4 hours; visual language pre-training: 30 hours; visual instruction-tuning: 6 hours. The training corresponds to a total of 5.1k GPU hours. Most of the computation is spent on the pre-training stage. We have not performed training throughput optimizations like sample packing [ 32] or sample length clustering. We believe we can reduce at least 30% of the training time with proper optimization. We also notice that the training time is much longer as we used a high image resolution of 336 ×336 (corresponding to 576 tokens/image). We should be able to |
整合多個數據源的結果
除了提高單個數據源的準確性外,您還可以使用重新排名在 RAG 管道中組合多個數據源。
不妨考慮使用來自語義存儲(如前面的示例)以及BM25存儲的數據的工作流。每個存儲都會獨立查詢,并返回單個存儲認為高度相關的結果。要確定結果的整體相關性,需要重新排名。
以下代碼示例將先前的語義搜索結果與 BM25 結果相結合。combined_docs
按其與查詢的相關性按重新排序的 NIM 進行排序。
all_docs = docs + bm25_docs reranker.top_n = 5 combined_docs = reranker.compress_documents(query = query, documents = all_docs) |
如需了解更多信息(包括設置 BM25 店),請參閱 /langchain-ai/langchain-nvidia GitHub 庫中的完整 Notebook。
連接到 RAG 管道
除了獨立使用重新排名之外,您還可以將其添加到 RAG 管道中,以確保管道使用最相關的塊來增強原始查詢,從而進一步增強響應。
在本例中,連接compression_retriever
上一步到 RAG 管道的對象。
from langchain.chains import RetrievalQA from langchain_nvidia_ai_endpoints import ChatNVIDIA chain = RetrievalQA.from_chain_type( llm = ChatNVIDIA(temperature = 0 ), retriever = compression_retriever ) result = chain({ "query" : query}) print (result.get( "result" )) |
RAG 流程現在使用正確的排名靠前的數據塊,并總結主要見解:
The A100 GPU is used for training the 7B model in the supervised fine-tuning/instruction tuning ablation study. The training is performed on 16 A100 GPU nodes, with each node having 8 GPUs. The training hours for each stage of the 7B model are: projector initialization: 4 hours; visual language pre-training: 30 hours; and visual instruction-tuning: 6 hours. The total training time corresponds to 5.1k GPU hours, with most of the computation being spent on the pre-training stage. The training time could potentially be reduced by at least 30% with proper optimization. The high image resolution of 336 ×336 used in the training corresponds to 576 tokens/image. |
結束語
RAG 已經成為一種強大的方法,結合了 LLMs 和密集向量表示的優勢。通過使用密集向量表示,RAG 模型可以高效擴展,非常適合大型企業應用,如多語言客戶服務聊天機器人和代碼生成代理等。
隨著 LLM 的不斷發展,顯然 RAG 將在推動創新和提供高質量智能系統方面發揮越來越重要的作用,這些系統可以理解和生成類似人類的語言。
在構建自己的 RAG 工作流時,務必要針對特定內容優化塊大小,并選擇具有合適上下文長度的 LLM,從而正確地將向量存儲文檔分割為多個塊。在某些情況下,可能需要多個 LLM 的復雜鏈。要優化 RAG 性能并衡量成功率,請使用一系列可靠的評估器和指標。
有關其他模型和鏈的更多信息,請參閱NVIDIA AI LangChain 端點.
?