LLM之RAG理論(十四)| RAG 最佳實踐

? ? ? ?RAG 的過程很復雜,包含許多組成部分。我們如何確定現有的 RAG 方法及其最佳組合,以確定最佳 RAG 實踐?

? ? ? 論文 《Searching for Best Practices in Retrieval-Augmented Generation》給出了回答。

本文將從以下三方面進行介紹:

  • 首先,介紹經典的 RAG 流程。

  • 然后,介紹RAG 的每個模塊的最佳實踐。

  • 最后,提供一個全面的評估。

一、經典的RAG流程

經典的 RAG 工作流程一般包括幾個中間處理步驟:

  1. 查詢分類(確定輸入查詢是否需要檢索)

  2. 檢索(高效獲取相關文件)

  3. 重新排名(根據相關性優化檢索到的文檔的順序)

  4. 重新打包(將檢索到的文檔組織成結構化格式)

  5. 摘要(提取關鍵信息以生成響應并消除冗余)

? ? ? ?實現 RAG 還涉及決定如何將文檔拆分為塊,選擇用于語義表示的嵌入,選擇合適的向量數據庫以進行高效的特征存儲,以及尋找有效的微調方法LLMs,如圖 1 所示。

圖 1:檢索增強生成工作流程。每個組件考慮的可選方法以粗體表示,而帶下劃線的方法表示各個模塊的默認選擇。以藍色字體表示的方法表示根據經驗確定的性能最佳的選擇。

二、每個步驟的最佳實踐

2.1 查詢分類

? ? ? ?為什么需要查詢分類?并非所有查詢都需要檢索增強,某些LLMs功能也需要檢索增強。雖然 RAG 可以提高準確性并減少幻覺,但頻繁檢索會增加響應時間。因此,我們首先對查詢進行分類,以確定是否需要檢索。通常,當需要超出模型參數的知識時,建議使用檢索。

? ? ? ?我們可以根據任務是否提供足夠的信息將任務分為 15 種類型,并顯示具體的任務和示例。完全基于用戶提供信息的任務被標記為“充分”,不需要檢索;否則,它們將被標記為 “不足” ,可能需要檢索。

圖 2:不同任務的檢索要求分類。在未提供信息的情況下,我們會根據模型的功能對任務進行區分

此分類過程是通過訓練分類器自動執行的。

圖 3:查詢分類器的結果

2.2 分塊

? ? ?將文檔劃分為較小的塊對于提高檢索準確性和避免 中的LLM長度問題至關重要。通常有三個級別:

  • Token-level令牌級分塊很簡單,但可能會拆分句子,從而影響檢索質量。

  • Semantic-level語義級分塊用于LLM確定斷點,保留上下文但需要更多時間。

  • Sentence-level句子級分塊在保留文本語義與簡潔高效之間取得平衡。

? ? ?在這里,句子級分塊用于平衡簡單性和語義保留。分塊過程從以下四個維度進行評估。

2.2.1 分塊大小

? ? ?塊大小會顯著影響性能。較大的塊提供更多的上下文,增強理解,但會增加處理時間。較小的塊可以提高召回率并縮短時間,但可能缺乏足夠的上下文。

圖 4 :不同數據塊大小的比較

? ? ?如圖 4 所示,使用了兩個主要指標:忠實度和相關性。忠實度衡量反應是幻覺還是與檢索到的文本相匹配。Relevancy 衡量檢索到的文本和響應是否與查詢匹配。

塊組織

2.3 Embedding模型

? ? ? 如圖 6 所示,LLM-Embedder 獲得了與 BAAI/bge-large-en 相當的結果,但大小只有它的三分之一。因此,LLM選擇 -Embedder 是為了平衡性能和大小。

圖 6:namespace-Pt/msmarco 上不同嵌入模型的結果。

2.4 添加元數據

使用標題、關鍵字和假設問題等元數據增強塊可以提高檢索率。

該論文不包括具體的實驗,但將它們留給未來的工作。

2.5 向量數據庫

? ? ?圖 7 提供了五個開源向量數據庫的詳細比較:Weaviate、Faiss、Chroma、Qdrant 和 Milvus。

? ? ? Milvus 在評估的數據庫中脫穎而出,滿足所有基本標準,并且在性能上優于其他開源選項。

圖 7:各種矢量數據庫的比較。

2.6 檢索

? ? ? ?對于用戶查詢,檢索模塊會根據其相似性從預先構建的語料庫中選擇與查詢最相關的前 k 個文檔。

下面評估了三種與檢索相關的技術及其組合:

  • 查詢重寫 :此技術改進了查詢以更好地匹配相關文檔。受 Rewrite-Retrieve-Read 框架的啟發 ,我們提示LLM重寫查詢以提高性能。

  • 查詢分解:此方法根據從原始查詢中提取的子問題檢索文檔。這些子問題通常更復雜,更難理解和處理。

  • 偽文檔生成 :此方法根據用戶的查詢生成假設文檔,并使用假設答案的嵌入來檢索類似的文檔。一個值得注意的實現是 HyDE。

圖 8:TREC DL19/20 上不同檢索方法的結果。每種方法的最佳結果都用粗體顯示,第二種方法用下劃線表示。

? ? ?圖 8 顯示,監督方法的性能明顯優于無監督方法。通過將 HyDE 和混合搜索相結合,LLM-Embedder 獲得了最高分。

? ? ?因此,建議使用 HyDE + 混合搜索作為默認檢索方法。混合搜索結合了稀疏檢索 (BM25) 和密集檢索 (原始嵌入),實現了高性能和相對較低的延遲。

2.7 重排序

? ? ? ?初始搜索后, 重新排名階段會增強檢索到的文檔的相關性,確保最相關的信息顯示在列表頂部。考慮了兩種主要方法:

  • DLM 重排序:此方法使用深度語言模型 (DLM) 進行重新排名。這些模型經過微調,可將文檔與查詢的相關性分類為“true”或“false”。在微調期間,使用帶有相關性注釋的查詢和文檔對模型進行訓練。在推理過程中,根據 “true” 標簽的概率對文檔進行排序。

  • TILDE 重排序:TILDE 通過預測模型詞匯中每個詞的概率來獨立計算每個查詢詞的可能性。通過將查詢詞的預計算對數概率相加來對文檔進行評分,從而在推理過程中實現快速重新排名。TILDEv2 通過僅對文檔中存在的術語進行索引、使用 NCE 損失和擴展文檔來改進這一點,從而提高效率并減小索引大小。

圖 9:MS MARCO Passage 排名數據集的開發集上不同重新排名方法的結果。對于每個查詢,將對 BM25 檢索到的前 1000 個候選段落進行重新排序。延遲以每個查詢的秒為單位。

? ? ? ?如圖 9 所示, 建議使用 monoT5 作為平衡性能和效率的綜合方法。 RankLLaMA 非常適合那些尋求最佳性能的人,而 TILDEv2 適合在固定集上快速實驗。

2.8 重新包裝

? ? ? ?后續流程(如LLM響應生成)的性能可能會受到文檔提供順序的影響。

? ? ? ?為了解決這個問題,我們在重新排名后的工作流程中加入了一個緊湊的重新打包模塊,有三種方法:

  • “forward” 方法根據重新排序階段的相關性分數按降序重新打包文檔。

  • “reverse”方法將它們按升序排列。

  • 受 Lost in the Middle 啟發的 “sides” 選項在相關信息位于輸入的開頭或結尾時表現最佳。

? ? ?由于這些重新打包的方法主要影響后續模塊,因此在下面的 review 部分介紹它們的評估。

三、總結

? ? ? ?檢索結果可能包含冗余或不必要的信息,這可能會阻止 生成LLM準確的響應。此外,較長的提示可能會減慢推理過程。因此,在 RAG 過程中,匯總檢索到的文檔的有效方法至關重要。

? ? ? ?提取式壓縮器將文本分割成句子,根據重要性對它們進行評分和排名。Generative Compressor 綜合來自多個文檔的信息,以重新措辭并生成連貫的摘要。這些任務可以是基于查詢的,也可以是非基于查詢的。

主要評估三種方法:

  • Recomp: 它具有抽取式和生成式壓縮機。提取式壓縮器選擇有用的句子,而生成式壓縮器則綜合來自多個文檔的信息。

  • LongLLMLingua:它通過關注與查詢相關的關鍵信息來改進 LLMLingua。

  • 選擇性上下文 :它通過識別和刪除輸入上下文中的冗余信息來提高效率 LLM。

圖 10:不同摘要方法之間的比較。

? ? ?如圖 10 所示, 建議使用 Recomp, 因為它的性能非常出色。雖然 LongLLMLingua 表現不佳,但它在沒有經過這些實驗數據集訓練的情況下表現出更好的泛化能力。因此,我們可以將其視為一種替代方法。

四、生成器微調

? ? ? ?圖 11 顯示,使用混合相關和隨機文檔 (Mgr) 訓練的模型在提供黃金文檔或混合上下文時表現最佳。

? ? ? ?因此, 在訓練過程中混合相關和隨機上下文可以提高生成器對不相關信息的魯棒性,同時確保有效使用相關上下文。

圖 11:生成器微調的結果。

五、綜合評估

? ? ?以前的評估是針對每個模塊單獨進行的,但現在這些模塊被整合在一起以進行綜合評估。

圖 12:尋找最佳 RAG 實踐的結果。正在調查包含在盒裝模塊中的模塊,以確定最佳方法。帶下劃線的方法表示所選的實現。“Avg”(平均分數)是根據所有任務的 Acc、EM 和 RAG 分數計算的,而平均延遲是每個查詢的秒數。最佳分數以粗體突出顯示。

如圖 12 所示,得出了以下關鍵見解:

  • 查詢分類模塊: 該模塊不僅提高了效果和效率,而且將總分從 0.428 分提高到平均分 0.443,并將查詢延遲從 16.41 秒降低到 11.58 秒。

  • 檢索模塊: 雖然 “Hybrid with HyDE” 方法的 RAG 得分最高,為 0.58,但其計算成本很高 ,每次查詢需要 11.71 秒。 因此,建議使用 “Hybrid” 或 “Original” 方法,因為它們可以減少延遲,同時保持可比的性能。

  • 重排序模塊: 缺少重新排名模塊會導致性能顯著下降。MonoT5 獲得了最高的平均分,證明了它在提高檢索文檔的相關性方面的有效性。這表明重新排名在提高生成響應的質量方面發揮著關鍵作用。

  • 重新包裝模塊: 反向配置表現出卓越的性能,RAG 得分為 0.560。這表明,將更相關的上下文放在更靠近查詢位置的位置會產生最佳結果。

  • 摘要模塊:Recomp 展示了卓越的性能,盡管刪除摘要模塊可以以更低的延遲獲得類似的結果。盡管如此,Recomp 仍然是首選,因為它解決了生成器的最大長度限制。

六、結論

總體而言,推薦了兩種不同的 RAG 系統實施策略:

  • 最佳性能實踐:為了獲得最佳性能,包括查詢分類模塊,使用 “Hybrid with HyDE” 方法進行檢索,采用 monoT5 進行重新排序,選擇 “Reverse” 進行重新打包,并使用 Recomp 進行匯總。

  • 平衡效率實踐:為了平衡性能和效率,包括一個查詢分類模塊,實施 Hybrid 方法進行檢索,使用 TILDEv2 進行重新排序,選擇 “Reverse” 進行重新打包,并使用 Recomp 進行匯總。

? ? ?需要注意的是,上面提到的評估主要基于公共數據集,它在其他數據集(比如私有企業數據集)上的表現需要進一步評估。

本文的主要價值在于它為研究 RAG 最佳實踐提供了有價值的想法和方法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74277.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74277.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74277.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

利用knn算法實現手寫數字分類

利用knn算法實現手寫數字分類 1.作者介紹2.KNN算法2.1KNN(K-Nearest Neighbors)算法核心思想2.2KNN算法的工作流程2.3優缺點2.4 KNN算法圖示介紹 3.實驗過程3.1安裝所需庫3.2 MNIST數據集3.3 導入手寫數字圖像進行分類3.4 完整代碼3.5 實驗結果 1.作者介…

C語言-適配器模式詳解與實踐

文章目錄 C語言適配器模式詳解與實踐1. 什么是適配器模式?2. 為什么需要適配器模式?3. 實際應用場景4. 代碼實現4.1 UML 關系圖4.2 頭文件 (sensor_adapter.h)4.3 實現文件 (sensor_adapter.c)4.4 使用示例 (main.c) 5. 代碼分析5.1 關鍵設計點5.2 實現特…

Rust函數、條件語句、循環

文章目錄 函數**語句與表達式**條件語句循環 函數 Rust的函數基本形式是這樣的 fn a_func(a: i32) -> i32 {}函數名是蛇形風格,rust不在意函數的聲明順序,只需要有聲明即可 函數參數必須聲明參數名稱和類型 語句與表達式 這是rust非常重要的基礎…

maptalks圖層交互 - 模擬 Tooltip

maptalks圖層交互 - 模擬 Tooltip 圖層交互-模擬tooltip官方文檔 <!DOCTYPE html> <html><meta charsetUTF-8 /><meta nameviewport contentwidthdevice-width, initial-scale1 /><title>圖層交互 - 模擬 Tooltip</title><style typet…

好吧好吧,看一下達夢的模式與用戶的關系

單憑個人感覺&#xff0c;模式在達夢中屬于邏輯對象合集&#xff0c;回頭再看資料 應該是一個用戶可以對應多個模式 問題來了&#xff0c;模式的ID和用戶的ID一樣嗎&#xff1f; 不一樣 SELECT USER_ID,USERNAME FROM DBA_USERS WHERE USERNAMETEST1; SELECT ID AS SCHID, NA…

python socket模塊學習記錄

python黑馬程序員 通過python內置socket模塊&#xff0c;在電腦本地開發一個服務器&#xff0c;一個客戶端&#xff0c;連接后進行連續的聊天。服務器和客戶端均可輸入exit&#xff0c;主動退出連接。 服務器開發.py import socket# 創建Socket對象 socket_server socket.s…

7-2 sdut-C語言實驗-逆序建立鏈表

7-2 sdut-C語言實驗-逆序建立鏈表 分數 20 全屏瀏覽 切換布局 作者 馬新娟 單位 山東理工大學 輸入整數個數N&#xff0c;再輸入N個整數&#xff0c;按照這些整數輸入的相反順序建立單鏈表&#xff0c;并依次遍歷輸出單鏈表的數據。 輸入格式: 第一行輸入整數N;&#xff…

針對永磁電機(PMM)的d軸和q軸電流,考慮交叉耦合補償,設計P1控制器并推導出相應的傳遞函數

電流控制回路:針對永磁電機(PMM)的d軸和q軸電流&#xff0c;考慮交叉耦合補償&#xff0c;設計P1控制器并推導出相應的傳遞函數。 1. 永磁電機&#xff08;PMM&#xff09;的數學模型 在同步旋轉坐標系&#xff08; d ? q d - q d?q 坐標系&#xff09;下&#xff0c;永磁同…

ROS多機通信(四)——Ubuntu 網卡 Mesh 模式配置指南

引言 使用Ad-hoc加路由協議和直接Mesh模式配置網卡實現的網絡結構是一樣的&#xff0c;主要是看應用選擇&#xff0c; Ad-Hoc模式 B.A.T.M.A.N. / OLSR 優點&#xff1a;靈活性高&#xff0c;適合移動性強或需要優化的復雜網絡。 缺點&#xff1a;配置復雜&#xff0c;需手動…

chap1:統計學習方法概論

第1章 統計學習方法概論 文章目錄 第1章 統計學習方法概論前言章節目錄導讀 實現統計學習方法的步驟統計學習分類基本分類監督學習無監督學習強化學習 按模型分類概率模型與非概率模型 按算法分類按技巧分類貝葉斯學習核方法 統計學習方法三要素模型模型是什么? 策略損失函數與…

爬蟲案例-爬取某站視頻

文章目錄 1、下載FFmpeg2、爬取代碼3、效果圖 1、下載FFmpeg FFmpeg是一套可以用來記錄、轉換數字音頻、視頻&#xff0c;并能將其轉化為流的開源計算機程序。 點擊下載: ffmpeg 安裝并配置 FFmpeg 步驟&#xff1a; 1.下載 FFmpeg&#xff1a; 2.訪問 FFmpeg 官網。 3.選擇 Wi…

車載以太網網絡測試-22【傳輸層-DOIP協議-5】

目錄 1 摘要2 DoIP時間參數2.1 ISO 13400定義的時間參數2.2 參數示例 3 DoIP節點內部狀態機4 UDSonIP概述5 總結 1 摘要 本文繼續對DOIP協議進行介紹&#xff0c;主要是DOIP相關的時間參數、時間參數定義以及流程示例。推薦大家對上文專題進行回顧&#xff0c;有利于系統性學習…

(論文總結)思維鏈激發LLM推理能力

研究背景&動機 背景:擴大模型規模已被證實具有提升模型性能和模型效率的功效&#xff0c;但是LLM對于完成推理、算術任務仍有較大不足。 動機:從之前的應用和研究中得知&#xff0c;可以用生成自然語言解釋、使用神經符號等形式語言的方法來提高大模型的算術推理能力&…

前后端開發概述:架構、技術棧與未來趨勢

一、前后端開發的基本概念 1.1 什么是前后端開發&#xff1f; 前后端開發是 Web 開發的兩個核心部分&#xff0c;各自承擔不同的職責&#xff1a; 前端&#xff08;Frontend&#xff09; 負責網頁的用戶界面&#xff08;UI&#xff09;和用戶體驗&#xff08;UX&#xff09;…

anythingLLM結合searXNG實現聯網搜索

1、docker-compose 部署searXNG GitHub - searxng/searxng-docker: The docker-compose files for setting up a SearXNG instance with docker. cd /usr/local git clone https://github.com/searxng/searxng-docker.git cd searxng-docker 2、修改 .env文件 # By default…

人形機器人科普

人形機器人&#xff08;Humanoid Robot&#xff09;是一種模仿人類外形和行為的機器人&#xff0c;通常具有頭部、軀干、雙臂和雙腿等結構。它們的設計目標是與人類環境無縫交互&#xff0c;執行復雜的任務&#xff0c;甚至在某些領域替代人類工作。 1. 人形機器人的定義與特點…

【CICD】Ansible知識庫

一、主機清單配置 1. 配置文件路徑 默認路徑 /etc/ansible/hosts 這是 Ansible 的全局默認庫存文件路徑&#xff0c;但許多用戶可能不會直接使用它。項目目錄或自定義路徑 用戶通常會為不同項目創建獨立的庫存文件&#xff0c;例如&#xff1a; 當前目錄下的 hosts、inventor…

ArkUI-List組件

列表是一個復雜的容器&#xff0c;當列表項達到一定數量&#xff0c;使得列表內容超出其范圍的時候&#xff0c;就會自動變為可以滾動。列表適合用來展現同類數據類型。 List的基本使用方法 List組件的構建聲明是這個樣子的 List(value?: {space?:number | string, initial…

Ubuntu實時讀取音樂軟件的音頻流

文章目錄 一. 前言二. 開發環境三. 具體操作四. 實際效果 一. 前言 起因是這樣的&#xff0c;我需要在Ubuntu中&#xff0c;實時讀取正在播放音樂的音頻流&#xff0c;然后對音頻進行相關的處理。本來打算使用的PipewireHelvum的方式實現&#xff0c;好處是可以直接利用Helvum…

【yolo】YOLO訓練參數輸入之模型輸入尺寸

模型輸入尺寸是YOLO訓練和推理過程中非常重要的參數之一。YOLO要求輸入圖像的尺寸是固定的&#xff0c;通常為正方形&#xff08;如416416、640640等&#xff09;。這個尺寸直接影響模型的性能和速度。以下是對模型輸入尺寸的詳細介紹&#xff1a; 1. 模型輸入尺寸的作用 統一…