檢索增強生成

檢索增強生成（Retrieval-augmented generation，縮寫：RAG）是一種使大語言模型（LLM）能夠從外部數據源中檢索並整合新資訊的技術。在RAG框架下，大語言模型首先查閱指定的文檔集合，再對使用者查詢作出回應。這些文檔補充了模型預訓練數據中已有的資訊，使模型能夠利用訓練數據中未包含的領域特定信息和/或最新資訊。例如，該技術可幫助基於大語言模型的聊天機器人訪問企業內部數據，或依據權威來源生成回答。

RAG通過在生成回答前引入資訊檢索環節來提升大語言模型的性能。與僅依賴靜態訓練數據的模型不同，RAG能夠從資料庫、上傳文檔或網路資源中提取相關文本。據《Ars Technica》報導：「RAG本質上是將大語言模型的處理流程與網頁搜索或其他文檔查詢過程相結合，從而幫助模型更準確地遵循事實，以此提升其表現。」該方法有助於減少人工智慧幻覺——此類問題曾導致聊天機器人描述並不存在的政策，或向尋求判例支持的律師推薦虛構的法律案例。

RAG還降低了為納入新數據而重新訓練大語言模型的需求，從而節省計算資源與資金成本。除提升效率外，RAG還使模型能在回答中附帶資訊來源，便於使用者核查引用內容。這種機制增強了透明度，使用者可通過比對檢索到的原始內容來驗證回答的準確性與相關性。

RAG這一術語最早出現於2020年發表的一篇研究論文。

## RAG與LLM的局限性

大語言模型可能提供錯誤信息。例如，谷歌首次演示其大語言模型工具 Google Bard（後更名為Gemini）時，該模型就詹姆斯·韋布空間望遠鏡提供了錯誤信息。這一失誤導致該公司的市值蒸發約1000億美元。RAG可用於預防此類錯誤，但並不能解決所有問題。例如，即使檢索來源本身事實準確，若大語言模型誤解了上下文，仍可能生成錯誤信息。《麻省理工科技評論》舉了一個例子：某AI生成的回答稱「美國曾有一位穆斯林總統，即巴拉克·海珊·歐巴馬」。該模型檢索自一本學術著作，其修辭性書名為Barack Hussein Obama: America's First Muslim President?，但大語言模型未能理解書名中的疑問語氣，從而生成了錯誤陳述。

採用RAG的大語言模型被設計為優先使用新檢索到的資訊。這種技術被稱為「提示詞填充」（prompt stuffing）。在沒有提示詞填充的情況下，大語言模型的輸入僅由使用者生成；而採用提示詞填充時，系統會在此輸入中額外添加相關上下文以引導模型生成回答。該方法在提示詞開頭即提供關鍵資訊，促使模型優先採用所供給的數據，而非依賴預訓練知識。

## 流程

RAG通過引入資訊檢索機制來增強大語言模型的能力，使模型能夠訪問並利用原始訓練集之外的額外數據。Ars Technica指出：「當新資訊出現時，無需重新訓練模型，只需用更新後的資訊擴充模型的外部知識庫即可」（即「增強」）。IBM表示：「在生成階段，大語言模型會結合增強後的提示詞及其對訓練數據的內部表徵來綜合生成回答」。

### 關鍵階段

通常，待引用的數據會被轉換為大語言模型的嵌入向量（embeddings），即以高維向量空間形式表示的數值化表徵。RAG可應用於非結構化（通常為文本）、半結構化或結構化數據（例如知識圖譜）。這些嵌入向量隨後被存儲在向量資料庫中，以支持高效的文檔檢索。

當使用者提出查詢時，系統首先調用文檔檢索器，選取與查詢最相關的文檔用於增強原始輸入。此類相關性比對可採用多種方法實現，具體取決於所使用的索引類型。

模型通過提示工程對使用者原始查詢進行增強，將檢索到的相關資訊一併輸入大語言模型。較新的實現方案還可集成專用的增強模塊，具備將查詢擴展至多個領域、利用記憶機制及自我改進能力從歷史檢索中持續學習等功能。

最終，大語言模型綜合查詢內容與檢索到的文檔生成輸出結果。部分模型還引入額外優化步驟以提升輸出質量，例如對檢索結果進行重排序（re-ranking）、上下文篩選以及微調（finetuning）。

## 改進

上述基礎流程可在RAG工作流的不同階段進行優化。

### 編碼器

這些方法聚焦於將文本編碼為稠密向量或稀疏向量。稀疏向量用於編碼詞語身份，通常具有詞典長度，且大部分元素為零。稠密向量則用於編碼語義，結構更為緊湊且零值較少。多種增強技術可改進向量存儲（資料庫）中相似度的計算方式。

- 通過優化向量相似度計算可提升性能。點積可增強相似度評分，而近似最近鄰搜索（ANN）相比K近鄰演算法（KNN）能提高檢索效率。
- 晚交互（Late Interactions）技術可在檢索後更精確地進行詞語比對，有助於優化文檔排序並提升搜索相關性，從而提高準確性。
- 混合向量方法可將稠密向量表示與稀疏獨熱編碼向量相結合，利用稀疏點積在計算效率上優於稠密向量運算的優勢。
- 其他檢索技術通過優化文檔選擇方式來提升準確性。部分方法將SPLADE等稀疏表示與查詢擴展策略相結合，以提高搜索準確率與召回率。

### 以檢索器為中心的方法

這些方法旨在提升向量資料庫中文檔檢索的質量：

- 通過「逆完形填空任務」（ICT）對檢索器進行預訓練，該技術通過預測文檔中被遮蔽的文本來幫助模型學習檢索模式。
- 有監督的檢索器優化使檢索機率與生成模型的似然分布對齊。具體做法是：針對給定提示檢索前k個向量，評估生成回答的困惑度，並通過最小化檢索器選擇結果與模型似然分布之間的KL散度來優化檢索效果。
- 重排序技術可在訓練過程中優先選擇最相關的檢索文檔，從而優化檢索器性能。

### 語言模型

RAG專用的Retro語言模型。每個Retro模塊由注意力層、分塊交叉注意力層和前饋網路層組成。黑色文字框表示正在被處理的數據，藍色文字表示執行處理的演算法。

通過針對檢索器重新設計語言模型，一個規模縮小25倍的網路即可獲得與更大模型相當的困惑度表現。由於該方法（Retro）需從頭開始訓練，因此產生了原始RAG方案所避免的高昂訓練成本。其假設是：在訓練過程中注入領域知識後，Retro無需過多關注領域細節，可將有限的參數資源專注於語言語義建模。重新設計的語言模型結構如圖所示。

有報告指出Retro難以復現，因此研究者對其進行了改進以提升可復現性。改進後的版本稱為Retro++，併集成了上下文內RAG能力。

### 分塊策略

分塊涉及將數據切分為向量的各種策略，以便檢索器能夠從中定位細節資訊。

不同數據格式具有特定模式，合理的分塊策略可充分利用這些模式。

三種主要分塊策略包括：

- 固定長度重疊分塊：實現簡單高效。相鄰分塊間的重疊有助於維持跨塊的語義連貫性。
- 基於語法的分塊：可將文檔按句子邊界切分。spaCy或NLTK等庫可輔助實現。
- 基於文件格式的分塊：特定文件類型具有天然分塊結構，應予以尊重。例如，代碼文件宜以完整函數或類為單位進行分塊與向量化；HTML文件應保持`<table>标签或base64编码的<img>`元素完整；PDF文件也需考慮類似因素。Unstructured或LangChain等庫可協助實現此類分塊。

### 混合搜索

有時僅依靠向量資料庫搜索可能遺漏回答使用者問題所需的關鍵事實。一種緩解策略是：先執行傳統文本搜索，將結果與向量搜索返回的文本塊合併，再將融合後的混合文本輸入語言模型進行生成。

### 評估與基準測試

RAG系統通常使用專門設計的基準測試進行評估，以檢驗可檢索性、檢索準確率與生成質量。常用數據集包括BEIR（涵蓋多領域資訊檢索任務的測試套件）以及Natural Questions或Google QA（用於開放域問答評估）。

## 挑戰

RAG並不能完全防止大語言模型產生幻覺。據Ars Technica報導：「這（RAG）並非直接解決方案，因為大語言模型在回應中仍可能圍繞檢索到的源材料產生幻覺。」

儘管RAG提升了大語言模型（LLM）的準確性，但它並未消除所有挑戰。其局限性之一在於：雖然RAG減少了頻繁重新訓練模型的需求，但並未完全消除這一需求。此外，大語言模型可能難以識別自身是否缺乏足夠資訊來提供可靠回答。若未經專門訓練，模型即便在應當表明不確定性的情況下仍可能生成答案。據IBM指出，當模型缺乏評估自身知識局限性的能力時，此類問題便可能出現。

### RAG投毒

RAG系統可能檢索到事實正確但具有誤導性的來源，從而導致解讀錯誤。在某些情況下，大語言模型可能從來源中提取語句而未考慮其上下文，進而得出錯誤結論。此外，當面對相互矛盾的資訊時，RAG模型可能難以判斷哪個來源更為準確。此類局限性的最壞結果是，模型可能融合多個來源的細節，生成將過時資訊與更新資訊以誤導性方式混合的回答。據《麻省理工科技評論》指出，這些問題的產生源於RAG系統可能對其檢索到的數據產生誤讀。