關(guān)于RAG檢索增強(qiáng)的右側(cè)優(yōu)化方案——企業(yè)級應(yīng)用中怎么提升RAG的檢索準(zhǔn)確度 原創(chuàng)
“ RAG最終的評判標(biāo)準(zhǔn)只有一個——召回精度,RAG所有的技術(shù)都是圍繞著怎么更快更準(zhǔn)確的召回數(shù)據(jù)?!?/strong>
RAG增強(qiáng)檢索的核心指標(biāo)只有一個——召回準(zhǔn)確率;對于RAG技術(shù)來說,最重要的事情就是其召回數(shù)據(jù)的準(zhǔn)確性;而怎么提升其召回準(zhǔn)確率,方法只有兩個,一個是左側(cè)增強(qiáng),一個是右側(cè)增強(qiáng)。
所謂的左側(cè)增強(qiáng)就是文檔處理處理,怎么更好的處理復(fù)雜文檔;而右側(cè)增強(qiáng)就是召回側(cè)的召回策略。
今天,我們就來討論一下RAG的召回策略問題。
RAG的召回策略
數(shù)據(jù)召回本質(zhì)上就是數(shù)據(jù)查詢的一種方式,RAG比較特殊的一點就是不僅僅支持傳統(tǒng)的字符匹配檢索,同時支持基于向量計算的語義檢索方式。
對RAG技術(shù)剛?cè)腴T的人來說,召回方式很簡單;不就是把用戶問題通過嵌入模型進(jìn)行向量化,然后把向量化的結(jié)果去向量數(shù)據(jù)庫中進(jìn)行匹配即可。
這種方式雖然沒錯,但其效果往往卻不盡人意;因此,在企業(yè)級應(yīng)用中會有更多的召回策略。
今天,我們就來列舉幾個常見的召回策略。

意圖識別
對RAG應(yīng)用來說有一個非常不可控的因素就是——用戶;因為沒人能控制用戶的輸入行為,因此這里就會有一個問題。就是用戶的提問很不專業(yè),比如說可能存在錯別字,詞不達(dá)意,或者一堆廢話的長篇大論。
由于上述原因就會導(dǎo)致一個問題,由于用戶的意圖不清晰,導(dǎo)致進(jìn)行語義匹配時,無法準(zhǔn)確命中目標(biāo),甚至無法召回數(shù)據(jù);這也是為什么有些新手會遇到明明庫中有數(shù)據(jù),但獲取的結(jié)果卻是空的。

因此,在用戶提出問題時,我們首先要做的并不是直接embedding,然后進(jìn)行相似度計算;而是應(yīng)該把用戶的輸入提交給模型,讓模型去優(yōu)化用戶的問題,以此來獲取更精確的問題,然后提升召回準(zhǔn)確度。
問題分解成多個子問題
當(dāng)然,只對用戶問題進(jìn)行優(yōu)化雖然能部分提升召回準(zhǔn)確度,但有一個問題就是一個問題的覆蓋范圍有限;簡單來說就是,同一句話可以有多個不同的表達(dá)方式,我們應(yīng)該針對一個問題,從多個維度進(jìn)行召回。
而這就需要用到問題分解的方法論,具體執(zhí)行流程就是,把用戶的問題輸入給模型,然后讓模型去理解問題,然后再圍繞這個問題,再提出多個相似性的問題。

然后再通過這多個問題,從多個維度去數(shù)據(jù)庫中進(jìn)行召回,這樣就能大大提升召回精度,并且能夠覆蓋更廣的范圍。
假設(shè)性文檔召回——hyDE
所謂的假設(shè)性文檔召回,就是大模型和人類一樣,通過訓(xùn)練之后它有一定的知識基礎(chǔ);一些常識性問題,不需要RAG大模型也可以進(jìn)行簡單回答;因此,為了提升召回的準(zhǔn)確率,我們可以先讓大模型對用戶的問題進(jìn)行簡單的回答,然后用大模型回答的結(jié)果當(dāng)做條件(問題),去數(shù)據(jù)庫中進(jìn)行檢索。

這種方式就類似于,你遇到一個問題,老師給你提供了一個大概的思路,然后你按照這個思路去找資料,解決問題;這樣找資料的方向更明確,結(jié)果也更準(zhǔn)確。
上下文召回
所謂的上下文召回就類似于大模型的記憶功能;我們都知道大模型是沒有記憶的,因此需要把每輪對話給保存下來,然后作為上下文讓大模型來回答問題。
同樣,在RAG中也可以使用這種方式;舉例來說,用戶連續(xù)兩個問題可能語義上并不相關(guān),但內(nèi)在上卻有聯(lián)系;比如說,用戶的第一個問題是現(xiàn)在的油價情況,第二個問題是國產(chǎn)車的市場價;從語義上來說,兩個問題關(guān)聯(lián)性不大,畢竟一個是問油價,一個是問車價;但通過這兩句話我們應(yīng)該都能明白,用戶大概率是想買車或者換車。
但對大模型來說,這兩個問題的雖然有一定的關(guān)聯(lián)性,但關(guān)聯(lián)性并不強(qiáng),因此如果把兩個問題放一塊;然后讓模型根據(jù)這兩個問題,去優(yōu)化出一個新的相關(guān)性問題,這樣準(zhǔn)確度是不是會更高。
而這就是上下文召回,通過給模型提供上下文,讓模型能夠更好地生成新的問題或相關(guān)性問題,這樣就能大概率提升召回的準(zhǔn)確度。

rerank——重排序
通過以上多個召回策略召回數(shù)據(jù)之后,可能會面臨一個問題那就是召回的數(shù)據(jù)太多,甚至很多可能是重復(fù)的數(shù)據(jù);因此,我們需要對召回數(shù)據(jù)進(jìn)行去重,并進(jìn)行重排,以此來提升召回數(shù)據(jù)的準(zhǔn)確性。
當(dāng)然,雖然以上召回策略能夠提升RAG的準(zhǔn)確度,但同樣也會帶來很多問題,因此我們在使用的過程中需要多注意和調(diào)整。
比如說,由于召回的鏈路過長,導(dǎo)致響應(yīng)慢的問題 ,因此我們需要控制模型的輸出長度,以及生成問題的個數(shù)和問題長度等。比如拆分子問題時,只需要生成三到五條問題,且每個問題的長度不超過十個字等等。
當(dāng)然,關(guān)于RAG的召回策略還有很多,我們可以在不同的業(yè)務(wù)場景中選擇合適的召回策略;而以上幾個策略,相對來說比較簡單,且易于實現(xiàn),成本可控。
本文轉(zhuǎn)載自??AI探索時代?? 作者:DFires

















