從《紅樓夢》的視角看大模型知識庫 RAG 服務的 Rerank 調優

背景介紹

在之前的文章 有道 QAnything 源碼解讀 中介紹了有道 RAG 的一個主要亮點在于對 Rerank 機制的重視。

從目前來看,Rerank 確實逐漸成為 RAG 的一個重要模塊,在這篇文章中就希望能講清楚為什么 RAG 服務需要 Rerank 機制,以及如何選擇最合適的 Rerank 模型。最終以完整的《紅樓夢》知識庫進行實踐。

至于為什么要用紅樓夢,答案就是作為讀了很多遍《紅樓夢》的忠實粉絲,問題的答案是不是靠譜一眼就能判斷,問題相關的片段也能快速定位,就像定位 bug 一樣快。

Rerank 是什么

以有道 QAnything 的架構來看 Rerank 在 RAG 服務中所處的環節
在這里插入圖片描述
可以看到有道 QAnything 中的 Rerank 被稱為為 2nd Retrieval, 主要作用是將向量檢索的內容進行重新排序,將更精準的文章排序在前面。通過向大模型提供更精準的文檔,從而提升 RAG 的效果。

在目前的 2 階段檢索(Embedding + Rerank)設計下,Embedding 模型只需要保證召回率,從海量的文檔中獲取到備選文檔列表,不需要保證順序的絕對準確。而 Rerank 模型負責對少量的備選文檔列表的順序進行精調,優中選優確定最終傳遞給大模型的文檔。

打個簡單的比方,目前的 Embedding 檢索類似學校教育篩選中的實驗班,從大量的學生中撈出有潛質的優秀學生進行培養。而 Rerank 則從實驗班中對學生進一步精細排序,選出少數能上清北的重點培養。

為什么不能一步到位

Embedding 檢索時會獲得問題與文本之間的相似分,以往的 RAG 服務直接基于相似分進行排序,但是事實上向量檢索的相似分是不夠準確的。

原因是 Embedding 過程是將文檔的所有可能含義壓縮到一個向量中,方便使用向量進行檢索。但是文本壓縮為向量必然會損失信息,從而導致最終 Embedding 檢索的相似分不夠準確。參考 Pipecone 對應的圖示如下所示:

在這里插入圖片描述

可以看到 Embedding 過程包含兩步:

  1. 運行單個 Transformer 計算以創建查詢向量。
  2. 將查詢向量與具有余弦相似性的文檔向量進行比較,獲取相似文檔。

而 Rerank 階段不會向量化,而是將查詢與匹配的單個文檔 1 對 1 的計算相似分,沒有向量化帶來的信息損失,必然會得到更好的效果,對應的過程如下所示:

在這里插入圖片描述

那直接執行 Rerank 是否可行呢?肯定也是不行的,Rerank 需要 1 對 1 計算相似分的,在海量的文檔中一一比對查找文檔,效率肯定是不能接受的。

除了這個原因以外,拆分 Rerank 階段也提供了更加靈活的篩選文檔的能力,比如之前介紹過的 Ragflow 就是在 Rerank 中使用 0.3 * 文本匹配得分 + 0.7 * 向量匹配得分 加權得出綜合得分進行排序,Rerank 階段可以提供類似這種靈活的選擇手段。

支持超大上下文的模型是否可以避免 Rerank

我們之所以需要提供準確的文檔,一般是因為大模型提供的窗口有限,無法塞入過多的文檔。但是目前有模型提供了更大的上下文窗口,重排是否就可有可無了呢。

Pipecone 提供的曲線圖可以看到 GPT 3.5 中存在如下所示現象:
在這里插入圖片描述

隨著塞入大模型上下文的文檔數增加,大模型從文檔中召回信息的準確性會下降。

以我實際碰到的一個例子來看,兩次檢索與重排得到的都是同樣順序的文本內容,而且需要召回的信息都出現在排名第一的位置上。當我選擇加入大模型上下文中的文檔數量為 10 時,大模型最終的回答如下所示:
在這里插入圖片描述

但是減少加入上下文的數量為 5 時,大模型最終的答案如下所示:
在這里插入圖片描述

可以看到,加入大模型的文檔過多,召回信息的準確性確實會下降。所以超大上下文窗口并不是解決所有問題的靈丹妙藥。

Rerank 模型的選擇

目前開源的 Rerank 模型選擇不如 Embedding 模型那么多,主要是下面幾個:

  • 智源提供的 BGE 系列
  • 有道提供的 BCE 模型
  • Cohere 提供的 CohereRerank 系列

由于主要考慮開源可使用的模型,因此先排除了 CohereRerank 系列模型,結合搜索的信息確定備選的模型如下所示:

  • bce-reranker-base_v1 有道 BCE 系列只提供了這一款 Rerank 模型,上個月 huggingface 下載量 8.7k
  • bge-reranker-large 這一款為 BGE 系列的經典 Rerank 模型,評價比較高,上個月 huggingface 下載量 33.2k
  • bge-reranker-v2-m3 這一款為智源目前推薦的多種場景的建議模型,上個月 huggingface 下載量 69.4k

參考的信息源主要是:

  • 有道 QAnything 測評
  • 智源的 Rerank 測評
  • llamaIndex 測評文章
  • ninehills 的博客

那個模型表現最好呢?

有道在 網站 上放出來的測評結果如下所示:
在這里插入圖片描述

可以看到測評得到的結果是 bce-reranker-base_v1 是略勝一籌的,當然大家都知道各家官方上給出的都是對自己有利的測評結果,但是其中對友商的測評結果大概率還是可以相信的,可以看到 bge-reranker-v2-m3 小幅領先 bge-reranker-large

另外一個測評是來自于 智源網站 提供的
在這里插入圖片描述

可以看到表現最好是 bge-rerank-v2-minicpm-28, 但是看了下 hugggingface 上模型大小為 10G 左右,相對 2G 左右的 bge-reranker-large 資源開銷大太多了。

綜合下載量和測評結果,bge-reranker-v2-m3 看來是當前最佳選擇,bge-reranker-large 和 bce-reranker-base_v1 可以作為備選。實際表現如何還需要進一步驗證。

動手實踐

具體的實現可以直接參考 langchain-chatchat 中的 Rerank 模塊。

此模塊主要實現的就是加載 Rerank 模型,然后計算文檔塊與問題的相似分,之后根據此相似分進行重排。

接下來的實踐過程相對簡單,將完整的《紅樓夢》導入知識庫,分片向量化,為了方便在本地的普通 CPU 筆記本上運行,我接入了百度提供的在線大模型 API 進行測試。而 Embedding 模型我使用的是 stella-base-zh-v3-1792d。

在本次測試中,我主要驗證了兩種場景:

  1. 多 Rerank 模型的效果比較,主要關注同樣的文檔使用 Rerank 模型排序后的順序差異,看哪個 Rerank 排序的結果最符合人的預期;
  2. 選擇 Rerank 模型的優勝者和無 Rerank 情況進行比較,確認是否吊打無 Rerank 的情況;
多 Rerank 模型比較

實際基于 Kimi 生成了 15 個問題,具體的問題如下所示:

  1. 紅樓夢中,賈寶玉和林黛玉第一次見面是在哪一年?
  2. 請列舉《紅樓夢》中賈府的四位主要女性角色。
  3. 《紅樓夢》中,王熙鳳為什么被稱為“鳳姐”?
  4. 賈寶玉的通靈寶玉有什么特殊之處?
  5. 林黛玉的詩作中,有一首描寫春天的詩,請找出并描述其內容。
  6. 在《紅樓夢》中,賈母為何偏愛賈寶玉?
  7. 描述《紅樓夢》中薛寶釵的性格特點。
  8. 請找出《紅樓夢》中關于“大觀園”的描述,并說明其在故事中的意義。
  9. 《紅樓夢》中,賈寶玉和林黛玉的關系是如何發展的?
  10. 請列出《紅樓夢》中提到的幾種不同的茶。
  11. 紅樓夢中,林黛玉的死因是什么?
  12. 請列舉《紅樓夢》中賈府的幾位仆人,并描述他們的角色。
  13. 《紅樓夢》中,賈寶玉和薛寶釵的婚姻是如何安排的?
  14. 紅樓夢中,賈元春的封號是什么?
  15. 請描述《紅樓夢》中賈寶玉的人生觀和價值觀。

測試中除了 Rerank 模型外,其他部分都保持一致,最終測試下來,結論如下:

  1. bge-reranker-v2-m3 模型表現最好,bce-reranker-base_v1 和 bge-reranker-large 在不同問題中各有勝負。
  2. bge-reranker-large 的相似分很容易出現接近 1 的高分,與實際人的直覺不完全一致
  3. bce-reranker-base_v1 的相似分相對更均衡,經常在 0.4 ~ 0.7 之間,與常規的人的直覺更接近

當然這個測試偏向簡單驗證,有一定的主觀判斷,而且問題的數量不夠多,如果進行模型選型還是需要根據自己的數據集和問題進行進一步測試。

部分的問題的結果展示如下,下面測試結果中的第一個百分比為 Rerank 模型給出的相似分,第二個百分比為原始 Embedding 模型給出的相似度評分,可以看到其中的判斷差異:

問題 1. 紅樓夢中,賈寶玉和林黛玉第一次見面是在哪一年?

bce-reranker-base_v1
在這里插入圖片描述

bge-reranker-large
在這里插入圖片描述

bge-reranker-v2-m3
在這里插入圖片描述

問題中大模型最后都沒有正確回答,因為沒有檢索到正確的內容,但是 bge-reranker-v2-m3 確實給出了相當低的相似分,表明沒有正確的內容,而其他模型在這種情況下都沒體現出這個特征。

問題 13. 《紅樓夢》中,賈寶玉和薛寶釵的婚姻是如何安排的?

bce-reranker-base_v1
在這里插入圖片描述

bge-reranker-large
在這里插入圖片描述

bge-reranker-v2-m3
在這里插入圖片描述

這個比較明顯,bce-reranker-base_v1 和 bge-reranker-large 都沒能將正確的片段排序在最前面,而 bge-reranker-v2-m3 排序最靠前的片段才是符合預期的。而大模型的回答也體現出這種差異,回答明確提到了婚姻是由賈母等長輩決定的。

而且可以看到 bge-reranker-large 中由于上下文排序不合適導致大模型的幻覺更加嚴重了,連林黛玉意外遠嫁都幻想出來了。

有無 Rerank 機制的比較

同樣創建了一批問題進行測試,Rerank 模型選擇的是 bge-reranker-v2-m3,實際測試確實效果還是比較明顯的,Rerank 后前面的回答相關性明顯更強,比如:

無 Rerank 原始版本
在這里插入圖片描述

Rerank 版本
在這里插入圖片描述

可以看到 Rerank 后給出了更準確的信息,大模型的回答中也會包含更多細節,回答質量也會更高。

總結

從本次《紅樓夢》的實踐來看,Rerank 機制的效果還是比較明顯的。通過額外的精細重排,給大模型提供了更精準的上下文,從而提升大模型知識庫回答的質量。

從本次測試的情況來看,開源模型 bge-reranker-v2-m3 表現更勝一籌,當然實際的表現與數據集和問題都有很大關系,大家實際使用時可以基于自己的知識庫與問題進行有針對性的測試。

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

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

相關文章

Redisson-分布式鎖單Redis節點模式

Redisson-分布式鎖單Redis節點模式 為什么要用分布式鎖? 使用分布式鎖的主要目的是為了解決多線程或多進程并發訪問共享資源時可能出現的競爭條件和數據一致性問題。舉一些實際場?: 數據庫并發控制:在分布式系統中,多個節點同…

虛擬機上部署java微服務

在Windows服務器上安裝Ubuntu系統,先安裝虛擬機,然后再虛擬機上安裝Ubuntu系統 啟動虛擬機上的Ubuntu系統,然后安裝jdk。安裝好的Ubuntu系統是帶桌面版的,需要打開 “終端” 控制臺,通過命令行交互的方式部署程序&…

git 合并多個commit 使分支保持一次提交

1.控制臺輸入 git log 查看commit歷史 找到歷史提交sha 2.控制臺輸入 git rebase -i d0c5de8f7ca8e58fef347b36dd6b0f42f551cdb4 進入變基 3.輸入英文i進入VM輸入模式 4.保留第一行的pick 后面的pick改為s 5.esc退出輸入模式 6.輸入:wq保存退出 7.輸入英文i進入VM輸入模式…

從0開始實現一個博客系統 (SSM 實現)

相關技術 Spring Spring Boot Spring MVC MyBatis Html Css JS 實現功能 用戶注冊 - 密碼加鹽加密 (md5 加密)前后端用戶信息存儲 - 令牌技術用戶登錄 - (使用 攔截器 做登錄校驗)博客的增刪改查后端數據返回前端, 采用 SpringBoot 做統一功能處理和統一異常處理 數據…

軟考-程序員 知識點與部分真題梳理

軟考-程序員 知識點與部分真題梳理 參照《程序員教程》第五版劃分類別; 持續更新中… 計算機系統基礎知識 如何理解和處理浮點數的加減法運算 在計算機科學中,處理浮點數的表示和運算是基礎且關鍵的,尤其是在進行科學計算、圖形處理和數據分…

V2I(車與基礎設施)介紹

V2I(車與基礎設施)介紹 一、V2I技術概述 V2I(Vehicle-to-Infrastructure)技術,全稱汽車與基礎設施通訊,也被稱為信號燈系統。它通過無線通信技術,為車載智能交通運輸系統設立了專門的通信頻段…

【網絡】為什么udp協議報頭有長度字段,而tcp沒有

引言: 在網絡通信中,UDP(用戶數據報協議)和TCP(傳輸控制協議)是兩種常用的傳輸層協議。它們在設計和功能上有一些不同之處,其中之一就是報頭中的長度字段。本文將深入探討UDP和TCP協議中長度字…

SpringCloud Alibaba詳解:打造高可用的分布式系統

SpringCloud Alibaba是一個基于Spring Cloud的微服務開發框架,它集成了阿里巴巴的一系列中間件和工具,能夠快速構建高可用的分布式系統。在本文中,將詳細介紹如何使用SpringCloud Alibaba來打造高可用的分布式系統,并通過代碼案例…

第十一課,end關鍵字、簡單while循環嵌套、初識for循環

一,end關鍵字 end關鍵字用于在print輸出的內容后面聲明結束的字符,我們之前學過并且十分了解print是默認輸出內容之后跟著換行的,如果我們不希望換行而希望使用其它字符來代替換行,就可以用end關鍵字來實現 特殊的,en…

k8s筆記 | 高度調度

CronJob計劃任務 簡介:在k8s中周期性運行計劃任務,與linux中的crontab相同;注意點 CornJob執行的時間是controller-manager的時間,所以一定要確保controller-manager的時間是準確的,另外cornjob cron表達式 文章參…

xjoi題庫一級三段題解(c語言版)

浮點數 時間:0.2 空間:32M 題目描述: 小鸚鵡正在學習浮點數,你跟他說一個浮點數,他立刻就能學會。 輸入一個浮點數,輸出這個浮點數。 輸入格式: 輸入一個浮點數 輸出格式: 輸出一個…

2024.5.25AcWing刷題記錄-排序篇

一、786. 第k個數 - AcWing題庫 三路快速排序 import random def func(nums, start, end):if start > end:return idx random.randint(start, end)base nums[idx]i, j, m start, start, end 1while j < m:if nums[j] < base:nums[i], nums[j] nums[j], nums[i]…

Redis機制-Redis緩存穿透,擊穿,雪崩理解等問題的理解和學習

目錄 一 緩存穿透問題 二 緩存擊穿問題 三 緩存雪崩問題&#xff1a; 圖1 正常的Redis緩存流程 一 緩存穿透問題 我們都知道Redis是一個存儲鍵值對的非關系型數據庫&#xff0c;那么當用戶進行查詢的時候&#xff0c;勢必會從前端發起請求&#xff0c;從而數據從Redis緩存…

內網穿透--Frp-簡易型(速成)-上線

免責聲明:本文僅做技術交流與學習... 目錄 frp項目介紹: 一圖通解: ?編輯 1-下載frp 2-服務端(server)開啟frp口 3-kali客戶端(client)連接frp服務器 4-kali生成馬子 5-kali監聽 6-馬子執行-->成功上線 frp項目介紹: GitHub - fatedier/frp: A fast reverse proxy…

論文精讀-SwinIR Image Restoration Using Swin Transformer

論文精讀-SwinIR: Image Restoration Using Swin Transformer SwinIR:使用 Swin Transformer進行圖像恢復 參數量&#xff1a;SR 11.8M、JPEG壓縮偽影 11.5M、去噪 12.0M 優點&#xff1a;1、提出了新的網絡結構。它采用分塊設計。包括淺層特征提取&#xff1a;cnn提取&#…

Verilog實戰學習到RiscV - 1 : Yosys 綜合

Yosys 綜合 實例 一般 FPGA IDE 的第一步都是RTL 綜合&#xff08;Synthesis&#xff09;。之后就能看到數字電路圖了。然后可以做RTL 級的仿真模擬。 直接上代碼&#xff0c;這里我們看一個簡單的加法器來學習。 module adder(input [7:0] a,input [7:0] b, input …

Java延時隊列取消未支付的訂單 之 重啟服務任務丟失

一、定義延遲任務類 package com.activity.domain;import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit;/*** 延遲任務類*/ public class DelayedCancellation implements Delayed {private String order;private final long delayTime; // 延遲時間p…

鏈表類型的無界阻塞隊列-LinkedBlockingQueue

一:LinkedBlockingQueue介紹 1:LinkedBlockingQueue是一個基于鏈表實現的阻塞隊列,默認情況下,該阻塞隊列的大小為Integer.MAX_VALUE,由于這個數值特別大,所以 LinkedBlockingQueue 也被稱作無界隊列,代表它幾乎沒有界限,隊列可以隨著元素的添加而動態增長,但是如果沒…

智能體之斯坦福AI小鎮(Generative Agents: Interactive Simulacra of Human Behavior)

相關代碼地址見文末 論文地址&#xff1a;Generative Agents: Interactive Simulacra of Human Behavior | Proceedings of the 36th Annual ACM Symposium on User Interface Software and Technology 1.概述 論文提出了一種多個智能體進行協同&#xff0c;進而模擬可信的人…

Python燃氣輪機汽車鋼棒整流電路控制圖統計模型過程潛力分析

&#x1f3af;要點 &#x1f3af;活塞模擬器&#xff1a;&#x1f58a;控制圖過程能力分析&#xff1a;Cp 對過程提供在規格上限和下限內的輸出的潛力度量&#xff0c;Cpk中心過程能力指數&#xff0c;Cpl估計僅包含規格下限過程能力&#xff0c;Cpu估計僅包含規格上限過程能力…