RAG全系列之《向量化與向量召回》

0 評(píng)論 794 瀏覽 2 收藏 10 分鐘

在知識(shí)檢索領(lǐng)域,向量化與重排序正成為解決海量數(shù)據(jù)精準(zhǔn)檢索的關(guān)鍵技術(shù)組合。本文深入剖析向量化與重排序技術(shù),從文檔拆分的多種優(yōu)化方法,到向量化模型選擇、相似度計(jì)算的技巧,為你提供一套全面的知識(shí)檢索指南,供大家參考。

向量化與 重排序(rerank)放到一起, 因?yàn)樗麄儍蓚€(gè)搭配起來(lái),解決知識(shí)檢索的問(wèn)題,兩個(gè)是搭配著使用的,今天先介紹一下向量檢索。

向量召回的核心:在海量數(shù)據(jù)中,檢索與跟查詢內(nèi)容相近的內(nèi)容。一般稱為內(nèi)容召回。例如一次性召回 50 條內(nèi)容。

rerank的核心:基于召回的內(nèi)容,再做更加精準(zhǔn)的排序。例如將上面 50 條內(nèi)容,做一次更加精準(zhǔn)重排序,獲取到 top10 內(nèi)容;

向量化

聽(tīng)著這個(gè)名字感覺(jué)很復(fù)雜,其實(shí)思想很簡(jiǎn)單,簡(jiǎn)單理解:就是通過(guò)一種向量化技術(shù),將內(nèi)容映射到空間上,在空間中距離越近就代表含義越相近。解決系統(tǒng)不理解語(yǔ)義的問(wèn)題。實(shí)際會(huì)更復(fù)雜一點(diǎn),下面給大家詳細(xì)介紹一下流程。

文檔拆分(可選)

我們提供給 RAG 的內(nèi)容,如果是長(zhǎng)文檔的話,就是在知識(shí)檢索的時(shí)候,能夠檢索到具體的相關(guān)的部分。

那么這個(gè)時(shí)候,就需要我們先把文檔拆分為一個(gè)個(gè)小塊(chunk),然后針對(duì)每個(gè)小塊進(jìn)行后續(xù)處理。如何將塊拆分得合理,也是個(gè)很頭疼的問(wèn)題。比如公司的規(guī)章制度的手冊(cè),厚厚的一本。如果讓 AI 自動(dòng)切的時(shí)候,他可能會(huì)把前后有關(guān)聯(lián)關(guān)系的兩個(gè)段落甚至一個(gè)句子,拆分到兩個(gè)片段里面了。 后面檢索到其中一個(gè)片段,你人單看這一個(gè)片段,壓根看不懂是什么意思,大模型生成那就是一塌糊涂了。

給大家介紹幾個(gè)目前比較通用的優(yōu)化的切分方法:

人工拆分為小塊

我目前采取的就是這個(gè)方案,因?yàn)槲覀兪瞧髽I(yè)級(jí)的 RAG,對(duì)于準(zhǔn)確性要求更高,所以人工拆分的是最準(zhǔn)確的。

但是這里也有前提,首先有人力配合做這個(gè)事情(人工重新其實(shí)是個(gè)非常痛苦的事情),因?yàn)橐WC每個(gè)知識(shí)點(diǎn)的知識(shí)都要是完備的,不能有遺失。

然后知識(shí)變更不要太頻繁,不然人工剛維護(hù)完,然后多段時(shí)間又要更新,還必須等人工拆分完才能上線,效率就非常低。

但是針對(duì)企業(yè)各種規(guī)章制度、平臺(tái)操作手冊(cè)各種,還是建議大家上人工,先保障效果。剩下的幾個(gè)方法,我只是有了解,還沒(méi)有 實(shí)戰(zhàn)過(guò),如果介紹有偏差,歡迎大家指出。

添加 buffer

在文檔切分的時(shí)候,把切割點(diǎn)前后的內(nèi)容,也冗余到這個(gè)文檔中,這樣就可以避免句子等被切斷,導(dǎo)致語(yǔ)義不全的問(wèn)題。但是這種 buffer 一般都不會(huì)設(shè)置的很大,主要解決句子等被切斷的問(wèn)題。前后段落語(yǔ)義有關(guān)聯(lián)性的,這種方案就不是很好了。

多維度切分

因?yàn)榍幸淮?,可能?dǎo)致一個(gè)句子被切斷。那么就設(shè)置不同的切分長(zhǎng)度,這樣一個(gè)內(nèi)容就會(huì)存在多個(gè)片段中,后續(xù)檢索的時(shí)候,大概率能夠檢索到對(duì)應(yīng)的相對(duì)完整的內(nèi)容。

但是這種切割之后,會(huì)導(dǎo)致重復(fù)內(nèi)容都被檢索出來(lái),候選內(nèi)容變得更多,后續(xù)的重排序壓力就比較大了。

先切大塊,再切小塊

先切分為大塊(例如按照章節(jié)拆分),先大塊級(jí)別做向量檢索,快速找到相關(guān)章節(jié)。找到對(duì)應(yīng)的章節(jié)后,再這個(gè)章節(jié)內(nèi)切分好的小塊找內(nèi)容(可以添加 buffer 方式拆分為小塊)。

這個(gè)適用于大塊與大塊內(nèi)容的確不同的情況,例如公司的規(guī)章制度,有明確的章節(jié)的概念。如果知識(shí)本身就是稀碎,每個(gè)知識(shí)點(diǎn)都是單獨(dú)的,那么拆分大塊就沒(méi)有意義了。

向量化

就是將拆分好的 知識(shí)點(diǎn),轉(zhuǎn)換為空間坐標(biāo)。這里其實(shí)就有模型的事情,就是大家長(zhǎng)聽(tīng)說(shuō)的embedding模型。不同的embedding轉(zhuǎn)換出來(lái)的空間向量差異是非常大的。

這里需要特別注意的就是需要基于語(yǔ)言選擇,我們是中文,就建議選擇針對(duì)中文優(yōu)化過(guò)的embedding模型。我自己試過(guò)火山的embedding模型、OpenAI 的text-embedding-3-large模型,針對(duì)中文效果都還可以。

檢索

準(zhǔn)備工作都完成了,這個(gè)時(shí)候來(lái)了一個(gè)查詢之后,我們把需要查詢的內(nèi)容也進(jìn)行向量化,用于后續(xù)檢索。

相似度計(jì)算

一般我們計(jì)算的都是余弦相似度,大家不理解也不太重要,知道怎么用就行,畢竟這里大家也改不了啥。

但是這里就有個(gè)坑了,就是稀疏與稠密的關(guān)系了,這個(gè)是向量檢索效果最復(fù)雜的地方。

給大家舉個(gè)例子,需要檢索美食攻略,標(biāo)題【深圳福田區(qū)有哪些日式料理,排隊(duì)人不多的】。因?yàn)橄蛄炕前凑照湓掁D(zhuǎn)化為了空間坐標(biāo),他就缺少了關(guān)鍵信息例如福田區(qū)、日式。 做向量檢索的時(shí)候,【深圳福田韓國(guó)料理人過(guò)多】、【北京日式料理,人不多又好吃】這樣的稠密矩陣相似度就很高,但是顯然他不是我們要的內(nèi)容。

比較簡(jiǎn)單的方式,是提升稀疏名詞的權(quán)重,例如日式、福田區(qū),在整個(gè)知識(shí)庫(kù)中出現(xiàn)是比較低頻的,能否適當(dāng)在用戶檢索這些內(nèi)容的時(shí)候,給這些名詞加上更高的權(quán)重? 這個(gè)就是稀疏矩陣的意義。

我們可以綜合稀疏與稠密矩陣的檢索結(jié)果,然后綜合權(quán)衡,獲得最終排序的結(jié)果。

進(jìn)階的知識(shí)檢索

剛才那個(gè)例子,用了稀疏+稠密之后,其實(shí)檢索效果也不太好,對(duì)于高準(zhǔn)確率場(chǎng)景的話,還是不夠用的。給大家介紹兩個(gè)熱門的的進(jìn)階做法

標(biāo)量過(guò)濾

我們提前給知識(shí)點(diǎn)打標(biāo),然后基于用戶的查詢也抽取標(biāo)簽,這樣就可以更加準(zhǔn)確了。例如對(duì)于知識(shí)點(diǎn)打標(biāo)上所處位置、菜系兩個(gè)標(biāo)簽。

用戶查詢【深圳福田區(qū)有哪些日式料理,排隊(duì)人不多的】的時(shí)候,系統(tǒng)自動(dòng)識(shí)別【深圳】、【日式料理】?jī)蓚€(gè)標(biāo)簽,然后基于這兩個(gè)標(biāo)簽過(guò)濾知識(shí),針對(duì)過(guò)濾后的知識(shí),進(jìn)行向量檢索。

我目前用的這個(gè)方法,針對(duì)這種特點(diǎn)標(biāo)簽的,效果會(huì)很好。但是這個(gè)會(huì)比較考驗(yàn)知識(shí)點(diǎn)打標(biāo)準(zhǔn)確性、用戶提問(wèn)抽取標(biāo)簽的能力,這個(gè)不同行業(yè)不同,大家自己探索下自己的玩法。

知識(shí)圖譜

知識(shí)圖譜解決的各個(gè)實(shí)體有關(guān)系的,簡(jiǎn)單舉個(gè)例子。三國(guó)演義中,劉備、關(guān)羽、張飛這三個(gè)人的關(guān)系是什么,然后用戶問(wèn)劉備的三弟用的是什么武器,如果只是做內(nèi)容檢索,很難檢索到這個(gè)類似的表達(dá)。

我們建立劉備、關(guān)羽、張飛就作為三個(gè)實(shí)體(角色),然后把他們兄弟關(guān)系作為圖與圖之間關(guān)系維護(hù)起來(lái)。才能解決這個(gè)問(wèn)題。

但是人工建立圖譜是一個(gè)非常非常非常大的工作量,現(xiàn)在基本都是讓 AI 大模型自動(dòng)抽取實(shí)體與關(guān)系,但是各家抽取的準(zhǔn)確性都還沒(méi)有辦法實(shí)際使用。

我自己用了阿里的 KAG、light RAG,都無(wú)法直接應(yīng)用到生成環(huán)境,所以需要再優(yōu)化一下,才能做到開(kāi)箱即用。當(dāng)前用起來(lái),都需要自己再進(jìn)行個(gè)性化的調(diào)優(yōu)。

本文由 @尋走 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)作者許可,禁止轉(zhuǎn)載

題圖來(lái)自Unsplash,基于CC0協(xié)議

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 目前還沒(méi)評(píng)論,等你發(fā)揮!