一文讓你搞懂什么是 RAG
雞哥是一個優秀且苦逼的程序員,每天都被領導無情地摧殘著,就在他感覺身體即將被掏空時,領導又讓他充當交際花,利用美色從某個女老板手里拿到投資。正所謂工欲善其事,必先利其器,領導給雞哥一份文檔,是從女老板秘書手里買來的,里面記錄了女老板近一年的生活軌跡等,讓雞哥在腦海中構建女老板的畫像。
沒過多久,女老板要求在飯桌上洽談合作的事情,那么雞哥自然要打扮一番,可是該穿什么樣的衣服呢?于是他詢問大語言模型。
繪圖2_backup_06221e_backup_09049_backup_111758.png
雞哥發現大模型的回答很官方,都是一堆正確的廢話,不是自己想要的答案。但雞哥很快又想到了新的辦法,把文檔和問題一起發給大語言模型不就行了。
圖片
雞哥按照大模型的建議,一上來就給女老板留下了好印象,然后又憑借三寸不爛之舌侃侃而談,哄得女老板面色紅潤、手舞足蹈,最終順利拿下了 1000 萬的投資。而領導為了表揚雞哥的功績,大手一揮,送給他一面錦旗和 500 塊錢獎金。
正所謂逮住蛤蟆攥出尿,領導又讓雞哥去從另一個女老板手里拿到投資。雞哥還是像之前一樣先從穿搭入手,但這次大語言模型卻沒有給出精確的回答,因為文檔太大了,信息太多、太雜,而答案可能只隱藏在文檔的一個不起眼的角落,導致大模型沒有抓住重點。
于是聰明的雞哥又想到了,那能否不把整個文檔發過去,而是只發和問題相關的部分呢?顯然是可以的,這就是 RAG(Retrieval Augmented Generation)要解決的問題。所以 RAG 的中文翻譯是檢索增強生成,它是一種結合了信息檢索和文本生成的 AI 技術架構,其核心思想是在生成回答之前,先從外部知識庫中檢索相關信息,然后基于這些檢索到的信息來生成更準確、更有根據的回答。
簡單來說,RAG 的工作原理如下:
- 檢索 (Retrieval): 當用戶提出一個問題或給出一段提示時,RAG 系統首先會從外部的知識庫中檢索相關信息。這個知識庫可以包含各種數據,例如公司的內部文檔、產品手冊、最新的新聞文章、數據庫記錄等等。
- 增強 (Augmented): 檢索到的相關信息會和用戶的原始問題一起,被 "增強" 或 "補充" 到輸入給大語言模型的內容中。
- 生成 (Generation): 大語言模型在接收到這些增強的上下文信息后,會生成一個更加準確、相關和基于事實的答案。
那么問題來了,只發和問題相關的部分說起來簡單,但相關這兩個字要如何量化呢?或者說我們要怎么判斷一段文字和用戶的問題是否有關系呢?如果你對機器學習有所了解的話,很容易想到可以像 k 近鄰算法一樣,將文本抽象成空間中的一個點,通過計算兩個點的距離,來判斷它們之間是否相關。
比如有以下四句話:
- "雞哥的穿衣風格咋樣?",將這句話映射之后的點記作 A。
- "雞哥穿衣很時尚、很有品味",將這句話映射之后的點記作 B。
- "雞哥很注重穿搭",將這句話映射之后的點記作 C。
- "雞哥的寶劍也未嘗不鋒利",將這句話映射之后的點記作 D。
顯然 AB 的距離最近,其次是 AC,最后是 AD。
所以我們需要一種新的模型,它的輸入也是一段文字,但輸出是一個數組,存儲了映射之后的點在空間中的坐標,這種模型叫做 Embedding 模型。比如 OpenAI 的 text-embedding-3-small 模型會將文本映射成長度為 1536 的數組,text-embedding-3-large 模型會將文本映射成長度為 3072 的數組,而數組的長度就是空間的維度,維度越高,理論上能夠捕捉到的語義信息就越豐富和細致。
不難發現,數組就是文本的一種量化,當然這個過程是有損失的,數組長度越短,損失的信息就越多。
圖片
文本越相似,它們在空間中的距離就越近,通過兩段文字的距離即可判斷它們是否相關。
回到之前的問題,如果文檔太長了,大語言模型不好處理該怎么辦?顯然這個問題的解決方案已經有了。
- 1)將文檔進行切分,至于方式可以按字數切分、按段落切分、按句子切分等等,這個過程叫做 Chunking。
- 2)對 Chunking 后的每一段文字都做 Embedding,得到固定長度的數組,更專業的說法叫向量,因此這個過程叫做"向量化"或"嵌入"。
- 3)將原始文本和對應的向量保存在向量數據庫中,當輸入一個向量時,數據庫就會返回和輸入向量最近的 n 條數據。
這樣當用戶輸入問題時,先用同樣的 Embedding 模型將問題轉成向量,然后再從向量數據庫中選擇距離最近的 n 條數據,將對應的內容和問題一起發給大模型。到此,一個完整的 RAG 架構就完成了。