為什么 RAG 一定需要 Rerank? 原創(chuàng)
今天想和大家深入探討一下檢索增強生成(RAG)中的一個重要環(huán)節(jié)——重排序(Rerank)。
RAG 技術(shù)一直以來都備受關(guān)注,尤其是當(dāng)它與大模型(LLM)結(jié)合后,人們都滿懷期待地認為:這下終于可以輕松解決那些復(fù)雜的問答任務(wù)了!然而,現(xiàn)實往往并不如人意。很多開發(fā)者在完成一個 RAG 流程后,都會感到困惑:為什么它的效果并沒有達到預(yù)期呢?
其實,和大多數(shù)工具一樣,RAG 的使用雖然簡單,但想要真正精通卻并非易事。事實上,RAG 并不僅僅是將文檔存儲到向量數(shù)據(jù)庫中,然后在其上簡單地添加一個 LLM。雖然這種方式在某些情況下可能會奏效,但并不總是有效。
因此,今天我們就來聊聊當(dāng)現(xiàn)有的 RAG 流程無法達到理想效果時,我們該怎么辦。如果你經(jīng)常遇到 RAG 表現(xiàn)欠佳的情況,這里有一個最容易且最快實施的解決方案——重排序(Rerank)。
1、召回率與上下文窗口
在深入探討解決方案之前,我們先來剖析一下傳統(tǒng) RAG(檢索增強生成)流程中存在的問題。在 RAG 的應(yīng)用中,我們常常需要對海量的文本文檔進行語義搜索,這些文檔的數(shù)量可能從幾萬篇到幾百億篇不等。
為了在大規(guī)模搜索中保證足夠的速度,我們通常會采用向量搜索技術(shù)。具體來說,就是將文本轉(zhuǎn)換為向量形式,將它們放置在同一個向量空間中,然后利用余弦相似度等相似性度量方法,來比較這些向量與查詢向量之間的接近程度。
向量搜索的關(guān)鍵在于向量本身。這些向量本質(zhì)上是將文本背后的“含義”壓縮成一個低維向量(通常是 768 維或 1024 維)。然而,這種壓縮過程不可避免地會導(dǎo)致部分信息的丟失。
由于信息丟失,我們常常會遇到這樣的情況:向量搜索返回的前幾篇文檔中,可能遺漏了重要的相關(guān)信息。而這些相關(guān)信息,可能出現(xiàn)在我們設(shè)置的 top_k 閾值之外。
那么,如果這些位置靠后的相關(guān)信息能夠幫助我們的 LLM(大型語言模型)生成更好的回答,我們該怎么辦呢?最直接的方法就是增加返回的文檔數(shù)量(提高 top_k 值),并將這些文檔全部傳遞給 LLM。
這里涉及到的衡量指標是**召回率**,它表示的是“我們檢索到了多少相關(guān)文檔”。召回率并不考慮檢索到的文檔總數(shù),因此我們可以通過返回所有文檔來“操縱”這個指標,從而得到完美的召回率。
然而,我們并不能返回所有文檔。LLM 對于能夠接收的文本量是有限制的,這個限制被稱為**上下文窗口**。例如,Anthropic 的 Claude 這樣的 LLM,其上下文窗口可以達到 100K 個 Token,這意味著我們可以放入幾十頁的文本。
那么,我們是否可以通過返回大量文檔(盡管不能是全部),并“填滿”上下文窗口來提高召回率呢?
答案是否定的。我們不能使用上下文填充的方法,因為這會降低 LLM 的**召回性能**。這里所說的 LLM 的召回率,與我們之前討論的檢索召回率是不同的概念。
研究表明,隨著我們在上下文窗口中放入更多的標記,LLM 的召回率會逐漸降低。當(dāng)我們填滿上下文窗口時,LLM 也不太可能遵循指令,因此上下文填充并不是一個好的解決方案。
這就引出了一個問題:我們可以通過增加向量數(shù)據(jù)庫返回的文檔數(shù)量來提高檢索召回率,但如果把這些文檔全部傳遞給 LLM,就會損害 LLM 的召回率。那么,我們該怎么辦呢?
解決這個問題的方法是,通過檢索大量文檔來最大化檢索召回率,然后通過**最小化**傳遞給 LLM 的文檔數(shù)量來最大化 LLM 的召回率。要做到這一點,我們需要對檢索到的文檔進行重新排序,只保留對 LLM 最相關(guān)的文檔。而實現(xiàn)這一操作的關(guān)鍵,就是**重排序(Rerank)**。
2、Rerank 的強大之處
重排序模型,也被稱為交叉編碼器,是一種特殊的模型。它接收一個查詢和文檔對作為輸入,并輸出一個表示相似度的分數(shù)。我們利用這個分數(shù),根據(jù)文檔與查詢的相關(guān)性對文檔進行重新排序。
在現(xiàn)代檢索系統(tǒng)中,通常采用兩階段檢索的策略。在第一階段,通常會使用一個雙編碼器或稀疏嵌入模型來從大規(guī)模數(shù)據(jù)集中快速檢索出一組相關(guān)文檔。這些模型能夠在海量數(shù)據(jù)中高效地篩選出初步的候選文檔集合。
然后,在第二階段,重排序模型(Rerank)登場。它的任務(wù)是對第一階段檢索到的文檔進行更細致的重新排序。Rerank 模型通過更復(fù)雜的計算,對文檔的相關(guān)性進行更精準的評估,從而提升最終返回結(jié)果的質(zhì)量。
搜索工程師們在兩階段檢索系統(tǒng)中使用 Rerank 已經(jīng)有很長時間了。這種策略的核心在于,從大數(shù)據(jù)集中檢索出一小部分文檔的速度,遠遠快于對大量文檔進行重新排序的速度。簡單來說,Rerank 的運行速度相對較慢,而檢索器的運行速度非常快。
為什么采用兩階段檢索?
采用兩階段檢索的原因主要有以下幾點:
第一、效率與精度的平衡
第一階段(檢索階段):使用雙編碼器或稀疏嵌入模型,能夠在大規(guī)模數(shù)據(jù)集中快速檢索出一組相關(guān)文檔。這些模型的設(shè)計目標是高效地篩選出初步的候選文檔集合,雖然它們的精度可能有限,但速度非??臁?/p>
第二階段(重排序階段):Rerank 模型對第一階段檢索到的文檔進行重新排序。雖然 Rerank 的運行速度較慢,但它能夠更精準地評估文檔的相關(guān)性,從而提升最終返回結(jié)果的質(zhì)量。
第二、資源優(yōu)化
如果直接對大規(guī)模數(shù)據(jù)集進行重新排序,計算成本會非常高昂,且效率低下。通過兩階段檢索,第一階段快速篩選出一小部分文檔,第二階段再對這些文檔進行精細排序,這樣可以顯著降低計算資源的消耗。
第三、靈活性與擴展性
兩階段檢索系統(tǒng)允許在不同階段使用不同的模型和技術(shù)。例如,第一階段可以使用高效的向量檢索模型,第二階段可以使用更復(fù)雜的交叉編碼器模型。這種分階段的策略使得系統(tǒng)更加靈活,可以根據(jù)具體需求進行優(yōu)化和擴展。
重排序模型的作用
重排序模型(Rerank)在兩階段檢索系統(tǒng)中扮演著至關(guān)重要的角色。它通過對第一階段檢索到的文檔進行重新排序,確保最終返回的文檔不僅數(shù)量適中,而且相關(guān)性更高。具體來說,Rerank 的作用包括:
提升相關(guān)性:通過更復(fù)雜的計算,Rerank 能夠更精準地評估文檔與查詢的相關(guān)性,從而提升最終返回結(jié)果的質(zhì)量。
優(yōu)化上下文窗口:由于 LLM 的上下文窗口有限,Rerank 可以幫助我們在有限的上下文窗口中選擇最相關(guān)的文檔,從而最大化 LLM 的性能。
減少噪聲:Rerank 可以去除那些雖然在第一階段被檢索到,但實際相關(guān)性較低的文檔,從而減少噪聲,提高系統(tǒng)的整體性能。
3、為什么要用 Rerank?
如果 Rerank 的速度這么慢,那為什么我們還要使用它呢?答案很簡單:Rerank 比嵌入模型要準確得多。
第一、雙編碼器的局限性
雙編碼器模型的準確性較低,主要有兩個原因:
- 信息壓縮導(dǎo)致的丟失
雙編碼器需要將一個文檔的所有可能含義壓縮成一個單一的向量。這種壓縮過程不可避免地會導(dǎo)致信息丟失。因為向量的維度是固定的,而文檔的含義可能是多維度的。
例如,一個文檔可能包含多種主題和細節(jié),但雙編碼器只能將其壓縮成一個固定維度的向量,這就導(dǎo)致了部分信息的丟失。
- 缺乏查詢上下文
雙編碼器在處理文檔時,沒有查詢的上下文信息。因為在用戶查詢之前,我們已經(jīng)創(chuàng)建了文檔的嵌入向量。這意味著雙編碼器無法根據(jù)具體的查詢來調(diào)整文檔的表示。
例如,同一個文檔在不同的查詢下可能有不同的相關(guān)性,但雙編碼器無法動態(tài)地調(diào)整文檔的向量以適應(yīng)不同的查詢。
第二、Rerank 的優(yōu)勢
相比之下,Rerank 模型具有顯著的優(yōu)勢:
- 直接處理原始信息
Rerank 模型可以直接處理原始的文檔和查詢信息,而不是依賴于壓縮后的向量。這意味著信息丟失更少,能夠更準確地評估文檔與查詢的相關(guān)性。
例如,Rerank 模型可以分析文檔中的具體句子和段落,而不是僅僅依賴于一個固定的向量表示。
- 動態(tài)分析文檔含義
因為 Rerank 是在用戶查詢時運行的,所以可以根據(jù)具體的查詢來分析文檔的特定含義,而不是試圖生成一個通用的、平均的含義。
例如,對于一個包含多種主題的文檔,Rerank 可以根據(jù)用戶的查詢,動態(tài)地提取與查詢最相關(guān)的部分,從而提高相關(guān)性評估的準確性。
第三、Rerank 的代價
盡管 Rerank 模型在準確性上有顯著優(yōu)勢,但它也有一個明顯的代價——時間。
- 雙編碼器模型
雙編碼器模型將文檔或查詢的含義壓縮成一個單一向量。在用戶查詢時,雙編碼器以與處理文檔相同的方式處理查詢。
例如,假設(shè)你有 4000 萬條記錄,使用編碼器模型和向量搜索,同樣的操作可以在不到 100 毫秒內(nèi)完成。
- Rerank 模型
Rerank 模型需要直接處理原始文檔和查詢,計算復(fù)雜度更高,因此速度較慢。
例如,使用像 BERT 這樣的小型重排序模型,在 V100 GPU 上,為了返回一個查詢結(jié)果,可能需要等待 50 多個小時。
4、總結(jié)
盡管 Rerank 模型的運行速度較慢,但其在準確性上的優(yōu)勢使其在許多場景中不可或缺。通過兩階段檢索系統(tǒng),我們可以在第一階段快速篩選出候選文檔,然后在第二階段通過 Rerank 模型進行精細排序,從而在保證效率的同時,顯著提升檢索結(jié)果的質(zhì)量。這種策略在處理復(fù)雜的問答任務(wù)和生成任務(wù)時尤為重要,因為它能夠確保最終返回的文檔不僅數(shù)量適中,而且相關(guān)性更高。
本文轉(zhuǎn)載自公眾號玄姐聊AGI 作者:玄姐
