上一篇說,備料台上該放的是一張清單,要用的時候才去冰箱拿。RAG 就是這件事最常見、也最成熟的實作。
假設你要查一本 300 頁的手冊。正常人不會從第一頁重讀到最後一頁,而是先翻目錄、找到關鍵的那幾頁,再帶著那幾頁回答問題。RAG(Retrieval-Augmented Generation)走的就是這個流程:文件先被切成較小的 Chunk,轉成能表示語意的 Embedding 存進向量資料庫;使用者提問時,系統先去搜尋最相關的幾段,再把那幾段交給模型整理成答案,必要時附上來源。
好處不只是省 Token。Lewis 等人當年提出 RAG,針對的是一個更根本的問題:模型參數裡的知識是靜態、不透明的,不重新訓練就改不了。把知識搬到外部索引之後,要更新只需要換索引。順帶的效果才是把整份 PDF 塞進去所帶來的那些麻煩——重要資訊被無關文字淹沒,Token、延遲與成本一起上升。
但檢索本身也會壞,而且壞得很安靜。
語意相似不等於正確。 Embedding 找的是「像」,不是「對」。問「這個功能什麼時候停用」,很可能撈回一段講「什麼時候啟用」的文字——因為兩句話在向量空間裡幾乎貼在一起。這就是 Day 02 那件事在檢索層重演一次:系統算的還是合理性,不是真實性。
切塊會切壞東西。 切在句子中間、把表格攔腰截斷都很常見;chunk 切太小會失去脈絡,切太大又會稀釋重點。而且就算正確的段落被撈出來了,塞十段進去,Day 03 的 lost in the middle 照樣會發生。
所以 RAG 出問題時,要把檢索和生成分開評:檢索看「該找到的那幾段有沒有被撈出來」,生成看「拿到正確段落之後有沒有答對」。這就是 Day 08 說的「分清楚是哪一站出的錯」——兩者混在一起,分數掉了你不會知道該修哪一邊。
檢索錯了,後面寫得再流暢,也只是拿錯課本作答。