最近寫的RAG內(nèi)容已經(jīng)挺多了,然而內(nèi)容逐漸變得零散,我今天給大家總結(jié)一下RAG的有關(guān)內(nèi)容,同時給大家把有關(guān)內(nèi)容串起來。當(dāng)然,串起來的更多是概述和摘記,讓大家對RAG的基礎(chǔ)有更整體的了解,詳情大家可以根據(jù)需要再展開了解,我也會在合適的位置加上原文鏈接。
之前的文章算下來是三萬多字,加上這篇應(yīng)該能超過4萬了,也特此記錄一下自己在RAG這塊的學(xué)習(xí)和實(shí)踐經(jīng)驗(yàn)。
內(nèi)容目錄:
概念。
從baseline到技術(shù)拓展。(basleine和高級RAG升級)
調(diào)優(yōu)方案。(論文視角和實(shí)踐視角)
效果評估。
微調(diào)和RAG的權(quán)衡。
RAG是否會消亡。(本文私貨)
概念
首先還是得介紹什么是RAG(Retrieval-Augmented Generation)指的是通過將檢索模型和生成模型結(jié)合在一起,從而提高了生成內(nèi)容的相關(guān)性和質(zhì)量。說到概念,嚴(yán)謹(jǐn)?shù)?,我照舊摘錄來自一篇綜述的解釋:
In the era of Large Language Models, the specific definition of RAG refers to the model, when answering questions or generating text, first retrieving relevant information from a vast corpus of documents. Subsequently, it utilizes this retrieved information to generate responses or text, thereby enhancing the quality of predictions.
說白了就是有檢索和對檢索的使用,基本都可以說是RAG了(極端的,某種程度上,詞典匹配,也算是一種RAG)。
正因?yàn)樾枰瑱z索以及后續(xù)大模型的使用,所以RAG和原來常規(guī)的深度學(xué)習(xí)研究不太一樣,他不是一個深度模型,更像是一個系統(tǒng),系統(tǒng)里面可以有多個組件,一般的結(jié)構(gòu)可用下面這張圖來表示。
但概念解釋我不想止步于此,在這里我想進(jìn)一步挖掘,RAG這個概念的起源。早在2020年就已經(jīng)有人提及RAG的概念(Retrieval-augmented generation for knowledge-intensive nlp tasks,他的首版發(fā)布在arxiv于2020年5月,如果有更早的歡迎大家再提出)(這篇論文后面有時間,我也想拿出來詳細(xì)講講),當(dāng)年還是seq2seq的時代,但實(shí)驗(yàn)就已經(jīng)發(fā)現(xiàn),通過檢索,能快速從海量知識中找到和原本問題相關(guān)的知識,借助知識帶來的信息能讓最終的生成效果能夠得以提升。
從baseline到技術(shù)拓展
baseline
最基礎(chǔ)的RAG,就是上圖左邊的Naive RAG,基本只包含兩個部分,即檢索和生成,為了讓大家更好地理解RAG整體結(jié)構(gòu),我自己寫了一版基礎(chǔ)RAG項(xiàng)目,這里最大程度還原最基礎(chǔ)RAG的結(jié)構(gòu),同時也給了一定的調(diào)優(yōu)空間,github地址:https://github.com/ZBayes/basic_rag,講解我分成了兩篇文章:
心法利器[104] | 基礎(chǔ)RAG-向量檢索模塊(含代碼)
心法利器[105] 基礎(chǔ)RAG-大模型和中控模塊代碼(含代碼)
里面有幾個比較關(guān)鍵的點(diǎn),著重拿出來講一下。
這個項(xiàng)目是奔著大型RAG項(xiàng)目去寫的。所以里面會劃分服務(wù)而不是一個流程全部寫完,注意看服務(wù)和代碼文件的拆分,還有具體服務(wù)是怎么串起來的。
服務(wù)是用tornado寫的簡單版,當(dāng)然換成別的服務(wù)組件也可以,例如flask、fastapi等。
里面有幾個部分:離線的灌數(shù)據(jù)模塊,一般就是腳本;檢索模塊是在線的檢索,目前使用的是最簡單的向量召回;大模型模塊用的是一個chatglm,直接封裝服務(wù)就好了。
很多位置我都為后續(xù)的迭代留了空間,例如向量檢索這里,我切分了很多層,searcher、vec_searcher、vec_index,就是給了很多空間,一個searcher可以有很多不同的索引和索引類型,vec_searcher是向量檢索,下面可以有多個vec_index,對應(yīng)不同的向量模型。
技術(shù)拓展
有關(guān)RAG的拓展,往往會在naive基礎(chǔ)上分為兩個階段,高級RAG和模塊化RAG。
高級的RAG能很大程度優(yōu)化原始RAG的問題,在索引、檢索和生成上都有更多精細(xì)的優(yōu)化,主要的優(yōu)化點(diǎn)會集中在索引、向量模型優(yōu)化、檢索后處理等模塊進(jìn)行優(yōu)化,模塊化RAG是對高級RAG的一種升級,這里面集成了大量優(yōu)化策略,并將這些策略進(jìn)行重組,形成完整的模塊獨(dú)立完成特定功能,很多內(nèi)容和前面的高級RAG提及的內(nèi)容很接近,只是更加模塊化,如搜索模塊、記憶模塊、額外生成模塊、任務(wù)適配模塊、對齊模塊、驗(yàn)證模塊等,因?yàn)镽AG本身是一個高度組織性的項(xiàng)目,因此在迭代過程中,是允許且需要對這些模塊進(jìn)行優(yōu)化和調(diào)整的,可以增減、調(diào)整各個模塊。
具體有什么調(diào)優(yōu)方案,我在下一個章節(jié)展開說。
調(diào)優(yōu)方案
說到調(diào)優(yōu),無論是學(xué)術(shù)界還是工業(yè)界,可謂是八仙過海各顯神通,但是科研和工業(yè)界各自會呈現(xiàn)不同的傾向性,所以這里我分兩個大塊來講,分別是學(xué)術(shù)界和工業(yè)界的思路。
學(xué)術(shù)界
學(xué)術(shù)界自然離不開綜述,1月份我對綜述(Retrieval-Augmented Generation for Large Language Models: A Survey)進(jìn)行了詳細(xì)的講解,字?jǐn)?shù)有7千多(前沿重器[41] | 綜述-面向大模型的檢索增強(qiáng)生成(RAG)),文章里對RAG的升級路徑進(jìn)行了詳細(xì)解釋,其中重點(diǎn)從檢索模塊、生成模塊、整體等角度對RAG目前的關(guān)鍵技術(shù)進(jìn)行了講解,為RAG的調(diào)優(yōu)提供了大量思路。簡單摘錄一下:
檢索模塊重在關(guān)注向量模型的合理表征(領(lǐng)域微調(diào)和下游任務(wù)微調(diào))、query和文檔語義空間的匹配(query改寫、實(shí)體mask等策略)、大模型和檢索模塊協(xié)同的優(yōu)化。
生成模塊關(guān)注檢索的后處理(重點(diǎn)信息提取、檢索結(jié)果重排)、生成結(jié)果的處理等角度。
整體調(diào)優(yōu)從調(diào)優(yōu)階段(入手點(diǎn))、數(shù)據(jù)來源和調(diào)優(yōu)思路三個角度來分析具體的調(diào)優(yōu)方法。
里面的內(nèi)容過多,不好展開,詳情大家可以看我的講解(前沿重器[41] | 綜述-面向大模型的檢索增強(qiáng)生成(RAG))或者是綜述原文(Retrieval-Augmented Generation for Large Language Models: A Survey)。
另外值得提起的是兩篇RAG比較有代表性的文章,這里給出我的解讀以及思考,分別是self-RAG(前沿重器[42] | self-RAG-大模型決策的典型案例探究)和CRAG(前沿重器[43] | 谷歌中科院新文:CRAG-可矯正的檢索增強(qiáng)生成),具體他們是怎么做的以及我是怎么分析和看待的,都在這里了。
工業(yè)界
工業(yè)界也有一篇綜述,不過里面體提到的方案和思路更加偏向應(yīng)用,所以我想把這篇放在工業(yè)界(https://pub.towardsai.net/advanced-rag-techniques-an-illustrated-overview-04d193d8fec6),我也寫了解讀文章(前沿重器[40] | 高級RAG技術(shù)——博客閱讀)。
和前面的綜述類似,這里也提到了基礎(chǔ)RAG、高級RAG和區(qū)別,然后就展開解釋各個模塊的優(yōu)化了:
離線文檔處理。
文檔內(nèi)容增強(qiáng)。
索引構(gòu)建和選擇。
檢索策略多樣性和合并。
查詢后處理。
多輪和聊天引擎。
查詢路由和智能體。
響應(yīng)合成。
模型微調(diào)。
這些結(jié)構(gòu)里,能看到很多現(xiàn)實(shí)應(yīng)用才會遇到的特定問題,例如檢索策略多樣性和合并,工業(yè)界和學(xué)術(shù)界的視角差異還是很大的,工業(yè)界更傾向于拆分分別處理,既能更方便特異化處理提升上限,也方便進(jìn)行分工推進(jìn)工作,而學(xué)術(shù)界其實(shí)并沒有那么擅長尤其是這種橫向的拆分,確實(shí)是不夠?qū)W術(shù)優(yōu)雅。
而且,我自己也根據(jù)自己的經(jīng)驗(yàn)提供了很多優(yōu)化思路,專門有寫文章(心法利器[106] 基礎(chǔ)RAG-調(diào)優(yōu)方案),盡管現(xiàn)在來看還有很多可以聊的部分(后面有機(jī)會我再寫?。?,但這篇也很實(shí)用了,希望對大家有多幫助,里面提了很多實(shí)踐和分析數(shù)據(jù)才會發(fā)現(xiàn)的優(yōu)化點(diǎn)。我是分為檢索調(diào)優(yōu)、prompt、后處理、微調(diào)這幾個方面去談的。
除此之外,知識的處理也是一個非常重要的一環(huán),尤其現(xiàn)在大模型出來后,文檔處理能力提升還挺明顯的,我正好寫了一篇文章,主要是串講知識的處理和使用流程,同時介紹了里面的常用方案,大家可以在有個大框架的基礎(chǔ)上進(jìn)一步深入學(xué)習(xí)(心法利器[110] | 知識文檔處理和使用流程)。
有一篇比較取巧地query拓展的文章(前沿重器[38] | 微軟新文query2doc:用大模型做query檢索拓展),屬于對搜索有用,現(xiàn)在視角看對RAG領(lǐng)域也有很大的優(yōu)化收益,所以在這里也重提,非常推薦大家在早期項(xiàng)目上使用這個方案,雖然多了一次大模型調(diào)用的代價(jià),但是效果提升還挺明顯,值得推薦。趁此機(jī)會也補(bǔ)充說明一下,在之前已經(jīng)有一篇類似的論文,HyDE(Precise Zero-Shot Dense Retrieval without Relevance Labels),這篇我沒出解讀,感覺重復(fù)不少,我就不重寫了,但仍很推薦大家也讀讀看。
效果評估
效果評估是算法的重要一環(huán),我也對這塊內(nèi)容進(jìn)行了詳細(xì)調(diào)研和經(jīng)驗(yàn)總結(jié)(心法利器[109] | RAG效果評估經(jīng)驗(yàn))。類似的,我也是從學(xué)術(shù)界和實(shí)際場景應(yīng)用兩個角度分別闡述兩者的評估方案,并從快速驗(yàn)證、穩(wěn)定評估和問題定位三個角度,給出實(shí)踐場景下的建議。
方案選擇和權(quán)衡
RAG只是大模型的一種使用方法,檢索技術(shù)能快速從海量知識中找到和原本問題相關(guān)的知識,借助知識帶來的信息能讓最終的生成效果能夠得以提升,因此RAG本質(zhì)上并非大模型的專屬,從而可以發(fā)現(xiàn)大模型不是非RAG不可,RAG也不是非大模型不可,RAG只是大模型的一種打開方式,他所解決的,是對知識的依賴,這可以是知識的可見性(能懂大模型之前沒見過或者沒學(xué)好的東西)、及時性(新知識)、存在性(不會的能拒絕)等問題。
而它的使用時機(jī),以及和微調(diào)之間的權(quán)衡,詳細(xì)地討論可以參考這篇文章(心法利器[108] | 微調(diào)與RAG的優(yōu)缺點(diǎn)分析),在這里我有通過論文、社區(qū)等角度匯總了多方觀點(diǎn),并通過案例分析的方式給出了我的答案。
RAG(檢索增強(qiáng)生成)會不會消亡呢
另外,我想在這里駁斥一個社區(qū)經(jīng)常談及的問題:“RAG(檢索增強(qiáng)生成)會不會消亡呢?”(https://www.zhihu.com/question/637421964),這個問題的背景是目前的大模型Context Length變大,RAG就可能會消失。這個問題我本想專門寫文章,但又感覺不夠長,寫一半成了廢案,于是就放在這里吧,還挺合適的。
第一,這個問題能問出來,說明對RAG背后所希望解決的問題理解不足吧,RAG所要解決的是知識依賴的問題,知識依賴這個事和大模型Context Length的關(guān)系并不緊密。
第二,知識依賴這不只是大模型的問題,而是整個領(lǐng)域都要面對的問題。在很早之前(都是21年那會的文章了),我就寫過一篇文章(心法利器[45] | 模型需要的信息提供夠了嗎),從一個更高角度來聊信息傳遞給模型的重要性,模型要是不知道,那讓他干的事就很可能會辦不好,而向模型傳遞信息,一般有兩個方法,一個是訓(xùn)練,一個是特征,對應(yīng)到現(xiàn)在大模型的場景,那就是微調(diào)和prompt,前者通過大量相似相關(guān)的數(shù)據(jù)案例告訴模型讓模型照著預(yù)測,后者則是把規(guī)則描述講給模型聽或者把關(guān)鍵信息直接傳給模型,降低他的推理壓力,只要關(guān)鍵信息沒有提供給模型,那效果就好不了,過去的bert是這樣,現(xiàn)在的大模型也是這樣。
第三,同樣是模型的問題。無論是大模型,還是之前的小模型,對信息反饋的及時性,仍舊不足。大家或多或少都會發(fā)現(xiàn),一些去年前期發(fā)布的開源模型,或多或少都對新的知識并不了解,其根本問題就是,沒有學(xué)習(xí)到新知識,要學(xué)習(xí)新知識,不得不經(jīng)過嚴(yán)格的訓(xùn)練和評估才能上線,且還要面對遺忘的問題,要做實(shí)時的難度非常大,這里就是第二點(diǎn)提出的微調(diào)方向。要解決這種,不得不依賴外部信息的支持,然后通過第二點(diǎn)提到的prompt的方式輸入到模型中,而這些知識,無法繞開檢索來進(jìn)行。舉個例子,某些商店的上架商品信息,天氣日期、新聞等的一些實(shí)時性要求高的知識,就只能通過數(shù)據(jù)庫來存儲,數(shù)據(jù)庫的更新可以非常敏捷,查詢后配合prompt交給大模型來解決了。
綜上,只要上面的知識依賴、知識更新問題沒有解決,那RAG就仍有一席之地。至于RAG內(nèi)部說到的搜索,可以說是從來沒大火過但是又一直在喝湯的領(lǐng)域了。
審核編輯;黃飛
-
大模型
+關(guān)注
關(guān)注
2文章
2423瀏覽量
2640
原文標(biāo)題:近期RAG技術(shù)總結(jié)和串講(4w字RAG文章紀(jì)念)
文章出處:【微信號:zenRRan,微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論