一 傳統(tǒng)方法
之前的文章已經(jīng)介紹過(guò)向量數(shù)據(jù)庫(kù)在RAG(Retrieval Augmented Generative)中的應(yīng)用,本文將會(huì)討論另一個(gè)重要的工具-Embedding模型。
一般來(lái)說(shuō),構(gòu)建生產(chǎn)環(huán)境下的RAG系統(tǒng)是直接使用Embedding模型對(duì)用戶輸入的Query進(jìn)行向量化表示,并且從已經(jīng)構(gòu)建好的向量數(shù)據(jù)庫(kù)中檢索出相關(guān)的段落用戶大模型生成。但是這種方法很明顯會(huì)受到Embedding模型性能的影響,比如是否支持多語(yǔ)言、跨語(yǔ)言檢索、訓(xùn)練數(shù)據(jù)的質(zhì)量等。因此,以改進(jìn)Embedding模型為目標(biāo)提升RAG系統(tǒng)性能一般會(huì)有兩種做法:
方法1,在使用向量模型獲取密集向量后,再使用Cross-encoder作為精排模型,對(duì)第一次召回的結(jié)果進(jìn)行重排,以提高最終結(jié)果的質(zhì)量。
方法2,使用稀疏向量搭配密集向量進(jìn)行召回。密集向量即對(duì)整個(gè)文本進(jìn)行向量化表示產(chǎn)生的向量,稀疏向量則是對(duì)原始文本的編碼表示,如TF-IDF,BM25等。其中,稀疏向量可以幫助識(shí)別和捕捉特定的語(yǔ)義信息,比如文本中的關(guān)鍵詞,而密集向量則可以提供更豐富的語(yǔ)義表達(dá),是通過(guò)大量長(zhǎng)文本學(xué)習(xí)而來(lái)的。通過(guò)同時(shí)將這兩種向量進(jìn)行召回,可以獲得更豐富、更全面的信息,從而提升 RAG 的效果。
方法1和方法2既可以獨(dú)立使用,也可以搭配使用,這就大大增加了算法工程師的武器庫(kù),通過(guò)搭積木的方式來(lái)提高RAG系統(tǒng)的效果。
二 Reranker模型剖析
本文主要討論二階段檢索的方法,對(duì)于稀疏向量的討論不在本文范圍之內(nèi)。
使用精排模型的原因
原因之一,向量數(shù)據(jù)庫(kù)中存儲(chǔ)大量的向量數(shù)據(jù),而想要從大量數(shù)據(jù)中精確地檢索出最相似的向量勢(shì)必會(huì)帶來(lái)極大的延遲,這在任何應(yīng)用中都是無(wú)法接受的,因此向量數(shù)據(jù)庫(kù)一般都會(huì)通過(guò)建立索引來(lái)優(yōu)化查找過(guò)程,這實(shí)際上是一種近似檢索而非精確檢索,是準(zhǔn)確與效率的折衷方案。如果數(shù)據(jù)庫(kù)中沒(méi)有那么多的向量,或者全表檢索的時(shí)間損耗能夠接受,則完全沒(méi)必要用近似檢索,但這在實(shí)際生產(chǎn)系統(tǒng)中是不可能的。
其二,LLM受限于上下文長(zhǎng)度的限制,所以能利用到的向量片段數(shù)量是有限的,盡管現(xiàn)在越來(lái)越多的研究使得LLM的上下文窗口越來(lái)越長(zhǎng),如改進(jìn)位置編碼或者注意力機(jī)制等,但也有實(shí)驗(yàn)表明再長(zhǎng)的上下文輸入給大模型總會(huì)由遺失或者處理不好的情況,稱為“Lost in middle”現(xiàn)象。因此,更好的辦法是把更有用的上下文篩選出來(lái),重點(diǎn)在于提升質(zhì)而不是量。
精排模型結(jié)構(gòu)
下面有兩個(gè)模型,分別是Bi-Encoder和Cross-Encoder。左邊的Bi-Encoder實(shí)際上就是我們常見(jiàn)的向量化模型,需要注意的是模型的結(jié)構(gòu)并不是有2個(gè)Bert,而是只有1個(gè)Bert模型,但是對(duì)于兩個(gè)句子分別做了向量化表示,最終比較這兩個(gè)向量的相似度。這里‘Bi’表示的是處理的過(guò)程,而不是實(shí)際的結(jié)構(gòu)。
而精排模型用到的Cross-Encoder結(jié)構(gòu)則是把兩個(gè)句子的輸入concat到一起,最終預(yù)測(cè)這兩個(gè)句子是否相關(guān),有點(diǎn)類似于Bert訓(xùn)練時(shí)的next sentence prediction(NSP)。不難發(fā)現(xiàn),這實(shí)際上就是一個(gè)分類模型,而且并不會(huì)產(chǎn)生具體的向量表示,只會(huì)產(chǎn)生一個(gè)介于0和1之間的值,用于表示句子對(duì)的相似性。而且,在使用時(shí),需要將Query與待查詢的句子拼接到一起再輸入給模型,所以這就決定了輸入的句子對(duì)數(shù)量不能太多,否則帶來(lái)的計(jì)算耗時(shí)將會(huì)是無(wú)法估量的。
精排模型的本質(zhì)
直觀上來(lái)講,用Bi-Encoder“目的更加通用”,是為了得到輸入的向量化表示,這些向量不僅有大小,還有方向,因此就有這么一個(gè)學(xué)習(xí)向量化時(shí)遇到的經(jīng)典例子:$國(guó)王-男人=女王-女人$。
而使用了Cross-Encoder的精排模型,因?yàn)檩斎氩糠职藘蓚€(gè)原始的句子,因此是從文本空間直接表示句子的相似度,而不是到了向量空間再表示。具體而言就是:傳統(tǒng)的向量是經(jīng)過(guò)了模型輸出之后再根據(jù)不同的算子計(jì)算向量之間的相似度,而這個(gè)模型是句子對(duì)由模型得到端到端的結(jié)果。
能否再使用一次向量比較?或者說(shuō)一階段后再對(duì)檢索出的向量計(jì)算精確的相似度有意義嗎?
意義不大。因?yàn)檫@時(shí)候就算再計(jì)算精確的向量相似度,也只是在經(jīng)過(guò)轉(zhuǎn)換后的向量空間進(jìn)行比較,因?yàn)檫@個(gè)空間比較“通用”,必定有所損失,無(wú)法在某種程度上準(zhǔn)確表示所有的向量。
精排模型為什么準(zhǔn)呢?
如前面說(shuō)的,Bi-Encoder必須將所有的文檔都映射到一個(gè)向量中,這個(gè)過(guò)程會(huì)丟失信息。而且,檢索時(shí)query和已有的向量是沒(méi)有交互的,是離線的狀態(tài),只是通過(guò)額外的相似度計(jì)算方法得到比較相似的向量,對(duì)query來(lái)說(shuō),缺乏必要的上下文信息。
而剛好精排模型是同時(shí)對(duì)兩個(gè)句子進(jìn)行編碼的,這時(shí)候?qū)uery來(lái)說(shuō)會(huì)含有上下文信息,而且從原始空間映射到隱空間是一個(gè)句子對(duì)而不是單獨(dú)的句子,也更保證最終得到的相似度包含用戶查詢的文檔信息。但是相對(duì)的,精排模型的結(jié)構(gòu)決定了它的計(jì)算是實(shí)時(shí)的,而且計(jì)算量會(huì)比單純的相似度計(jì)算大不少。
現(xiàn)有的精排模型
現(xiàn)有開(kāi)源的Reranker模型已經(jīng)非常多了,國(guó)內(nèi)比較出門的有Jina-8k、bge-reranker以及bce-reranker等,且更新得非???,目前看起來(lái)就是哪個(gè)最新用哪個(gè),基本差異不大。值得一提的是Jina的模型是基于Alibi改進(jìn)的注意力機(jī)制,所以能支持8K的上下文窗口,而bce本身只支持512k的上下文窗口,但是對(duì)較長(zhǎng)的上下文進(jìn)行切分,并且以其中一段最好的得分作為最終的相似度。bge模型沒(méi)看過(guò)源碼,等以后有時(shí)間針對(duì)這幾個(gè)模型再研究一番。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-858911.html
總結(jié)
雖然目前二階段方法用來(lái)提升RAG的性能表現(xiàn)越來(lái)越受到關(guān)注,但是具體來(lái)看,其中所含的技術(shù)都是早就有的內(nèi)容。Cross-Encoder這種架構(gòu)在當(dāng)時(shí)顯得比較雞肋,只能用來(lái)比較句子的相似度,甚至無(wú)法輸出向量,在大部分自然語(yǔ)言處理場(chǎng)景中都不受待見(jiàn),誰(shuí)能想到在如今又煥發(fā)生機(jī)了呢?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-858911.html
到了這里,關(guān)于【高級(jí)RAG技巧】使用二階段檢索器平衡檢索的效率和精度的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!