- 什么是 RAG?
- 為什么使用 RAG?
- LLM 微調 和 RAG?
- 實戰
什么是 RAG?
RAG 在論文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中被引入,原論文是這樣描述的:
探索了一種 通用的 檢索增強生成(RAG)微調方案 —— 這種模型結合了 預訓練的參數化記憶 和 非參數化記憶,用于語言生成。提出的 RAG 模型中,參數化記憶是一個預訓練的 seq2seq 模型,而 非參數化記憶是一個由預訓練神經檢索器訪問的維基百科稠密向量索引。
以提示“地球上的第一種哺乳動物是什么時候出現的?”為例,RAG 可能會提取關于“哺乳動物”、“地球歷史”和“哺乳動物進化”的文檔。這些支持性文檔隨后被連接為上下文,與原始輸入一起輸入到 seq2seq 模型中,該模型生成實際輸出。
因此,RAG 擁有兩種知識來源:seq2seq 模型在其參數中存儲的知識(參數化記憶)以及 RAG 從文檔庫中檢索到的段落所存儲的知識(非參數化記憶)。
圖 1:概覽。將一個預訓練的檢索器(查詢編碼器 + 文檔索引)與一個 預訓練的 seq2seq 模型(生成器)相結合,并進行端到端微調。對于查詢 xxx,我們使用 最大內積搜索(MIPS)找到前 KKK 篇文檔 ziz_izi?。在得到最終預測 yyy 時,將 zzz 視為潛在變量,并對不同文檔下的 seq2seq 預測結果進行邊際化處理。
每個步驟可以大致分解為:
- 檢索:根據查詢從源中尋找相關信息。例如,根據問題從數據庫中獲取相關的維基百科文本段落。
- 構建/索引文檔庫(預處理):把外部知識源(比如維基百科)拆分成文檔/段落,編碼成向量 并 建立檢索索引(如向量索引,支持 MIPS/ANN 查詢)。
- 查詢編碼與檢索:把輸入查詢 xxx 用檢索器的查詢編碼器編碼,進行向量檢索,返回前 KKK 個最相關的文檔 z1,...,zKz_1,...,z_Kz1?,...,zK?。
- 增強:使用相關檢索到的信息來修改輸入到生成模型(例如 LLM)中的內容。將檢索到的文檔與生成器結合,即把檢索到的文檔作為 條件信息 喂入 預訓練的 seq2seq 生成器。這里有兩種常見形式:
- RAG-Sequence(或 RAG-固定):對整個輸出序列都使用同一組檢索段落作為上下文。
- RAG-Token(或 RAG-逐 token):生成每個 token 時可使用不同的檢索段落(更細粒度)。
- 生成:根據輸入生成輸出。例如,在 LLM 的情況下,根據輸入提示生成一段文本。
- 生成與邊際化(推理):將文檔 zzz 視為潛在變量,計算最終輸出的概率為對不同檢索文檔的邊際化 p(y∣x)=∑zp(z∣x)p(y∣x,z)\;p(y|x)=\sum_z p(z|x)\,p(y|x,z)p(y∣x)=∑z?p(z∣x)p(y∣x,z)。實現上可以對每個 ziz_izi? 生成 p(y∣x,zi)p(y|x,z_i)p(y∣x,zi?) 再加權求和,得到最終預測。
- 端到端微調(訓練):將檢索器(查詢編碼器)和生成器一起端到端微調,使得檢索更契合生成任務、生成更能利用檢索到的證據。訓練時通常會最大化邊際似然或相應損失。
- (可選)輸出后處理與可追溯性:返回生成文本同時附加證據來源(即用到的檢索片段),便于驗證與更新知識庫。
為什么使用 RAG?
Retrieval Augmented Generation: Streamlining the creation of intelligent natural language processing models
LLM(大型語言模型)的參數,本質上代表了人類使用詞語構造句子的一般模式。參數化的知識讓 LLM 在回答通用問題時非常有用,但對于想深入探索某類特定信息的用戶來說,這種方式并不夠。
RAG(檢索增強生成)可以將生成式 AI 服務與外部資源連接起來,尤其是那些包含最新技術細節的資源。它被稱為一種“通用微調方案”,因為幾乎任何 LLM 都可以用它來連接幾乎任何外部資源。
- 使用自定義數據。許多 基礎 LLMs 使用互聯網規模文本數據進行訓練。這意味著它們具有強大的語言建模能力,然而,它們 通常缺乏特定領域的知識。RAG 系統可以向 LLMs 提供 特定領域的數據,如醫療信息或公司文檔,從而 根據特定用例定制它們的輸出。
- RAG 會為模型 提供可引用的來源,就像科研論文中的腳注一樣,讓用戶能夠核查模型的說法。
- 防止幻覺。LLMs 非常出色,但它們容易產生潛在的幻覺,也就是說,生成看似正確但實際上不正確的內容。RAG 管道可以通過提供事實性(檢索到的)輸入來幫助 LLMs 生成更符合事實的輸出。即使從 RAG 管道生成的答案看起來不正確,由于檢索功能,也可以獲取其來源的資料。
- RAG 的真正優勢在于其靈活性。改變預訓練語言模型所知的內容需要用新文檔重新訓練整個模型。而使用 RAG,只需更換其用于知識檢索的文檔,就能控制它所知的內容。通過用舊版維基百科數據集替換原始數據集,并詢問諸如“冰島的總理是誰?”等問題來測試這一行為。結果顯示,RAG 利用替換進來的語料庫中的知識調整了其答案,盡管參數化知識保持不變。這種適應方法在事實隨時間變化的情況下非常有價值。
RAG 也可以是一個比在特定數據上微調 LLM 更快的解決方案。
LLM 微調 和 RAG?
LLM 微調(Fine-tuning):在下游數據上更新模型參數,使模型直接 在內部參數中編碼任務或領域知識。包括全量微調,也包括參數高效微調(如 LoRA、Prompt-Tuning、Adapters 等,統稱 PEFT)。LoRA 是典型方法之一,能顯著減少可訓練參數并節省顯存。
RAG(Retrieval-Augmented Generation):把 外部非參數化知識庫(文檔/段落向量索引)與生成模型結合,在 推理時檢索相關文檔并以此條件化生成,生成端對不同檢索結果做邊際化或融合以產出答案;檢索庫可以獨立更新,從而實現 更新知識而不重訓模型。RAG 在知識密集型任務上被提出并驗證效果優于僅參數化模型。
維度 | LLM 微調(全量/PEFT) | RAG(檢索增強生成) |
---|---|---|
知識存儲位置 | 模型參數(內隱) | 外部索引(顯式)+ 模型(局部決策) |
更新知識 | 需重訓或增量微調 | 更新索引即可(無需重訓模型) |
推理延遲 | 較低(單次前向) | 增加檢索與文檔處理延遲(檢索/編碼/聚合)。 |
計算/成本(訓練) | 全量微調高;PEFT 低(顯存 & 存儲節省) | 檢索器訓練 + 生成器微調(可僅微調生成器或與檢索器聯合微調),索引構建有成本 |
可解釋性 / 溯源 | 較差(內部權重難溯源) | 好:可返回支持文檔作證據。 |
抗幻覺 / 事實準確性 | 依賴模型及數據;難以快速修正錯誤 | 更易 grounding,若檢索到高質量文檔,生成更事實性 |
小樣本/數據效率 | PEFT 在少數據下表現好 | 依賴檢索質量;在少標注下可借外部知識補充 |
工程復雜度 | 相對簡單(若僅單模型部署) | 復雜:需索引/檢索服務、向量數據庫、檢索器與生成器協同 |
最佳適用場景 | 任務固定、知識靜態、可承受模型更新成本 | 知識頻繁更新、需要來源/可解釋性、知識密集型 QA 與事實生成 |
實戰
本地 RAG 教程
使用 smolagents、LlamaIndex、LangGraph 來構建 RAG 工具的完整例子,見 HF Agent Course