15 種高級 RAG 技術:從預檢索到生成全面提升 RAG 效果
本文主要由文章《15 Advanced RAG Techniques from Pre-Retrieval to Generation》總結並添加了一些自己的理解。
檢索增強生成 (RAG) 是一種強大的技術,它將信息檢索與生成式 AI 相結合,以產生更準確、上下文更豐富的響應。本文將探討 15 種高級 RAG 技術,以提高生成式 AI 系統的輸出質量和整體性能的魯棒性。這樣做使本文能夠測試和識別從預檢索到生成的適當優化,本文所提到的優化點大多數基於下圖的流程。
一般來說,傳統的 RAG 系統經常會遇到以下問題:
-
信息密度:檢索到的文檔可能不包含足夠的相關信息。
-
檢索準確性:系統可能無法檢索最相關的文檔。
-
響應質量:生成的響應可能不準確或缺少上下文。先進的 RAG 技術通過優化 RAG 管道的每個階段來應對這些挑戰,從而實現:更高的系統效率、更好地滿足用戶需求、最優語義搜索以及更相關準確的回覆。
RAG 中,召回是一個核心步驟,按照不同優化策略和召回的前後關係,優化策略可分以下幾類:
-
預檢索優化
-
檢索 / 召回策略
-
檢索後優化
-
生成優化
預檢索優化
預檢索優化主要包括提高數據索引或知識數據庫中信息的質量和可檢索性。由於每個系統依賴於不同性質的信息,預檢索優化策略不一定是萬能的。比如爲金融系統設計的優化策略在旅遊機器人中可能不太有效。預檢索優化包括以下方法
-
使用 LLM 提高信息密度
-
使用分層索引檢索
-
創建假設性問答對
-
使用 LLM 對信息進行去重
-
測試並優化最優分塊
使用 LLM 提高信息密度
在存儲數據前使用 LLM 處理、清洗以及對數據進行打標。這種改進是因爲來自異構數據源(例如 PDF、抓取的網頁數據、音頻轉錄)的非結構化數據不一定是爲 RAG 系統構建的,導致信息密度低、噪聲數據、信息重複等
信息密度低迫使 RAG 系統在 LLM 上下文窗口中插入更多的塊,以正確回答用戶查詢,從而增加了 token 的使用和成本。此外,信息密度低會稀釋相關信息,以至於 LLM 可能會給出錯誤的回答。GPT-4 在使用少於 70,000 個 token 時似乎對這個問題有相對的抵抗力,但其他模型可能沒有那麼強的魯棒性。
比如當原文本來源於網頁時,原始 HTML 包含了大量無關信息(例如 CSS 類、頁眉 / 頁腳導航、HTML 標籤等冗餘信息)。即使在程序化地剝離了 CSS 和 HTML 之後,信息密度仍然很低。因此,爲了提高塊中的信息密度,本文嘗試使用 GPT-4 作爲事實提取器,從文檔中提取相關信息。
對應的 prompt 中,system 指令爲:
You are a data processing assistant. Your task is to extract meaningful information from a scraped web page from XYZ Corp. This information will serve as a knowledge base for further customer inquiries. Be sure to include all possible relevant information that could be queried by XYZ Corp's customers. The output should be text-only (no lists) separated by paragraphs.
以上流程中,原始 HTML 約有 55000 tokens,而使用 GPT4 提取後的信息約有 330tokens,在降低噪聲的同時大大提高了信息密度。
值得注意的是,使用 LLM 提高信息密度是伴隨着風險的,即可能導致部分關鍵信息丟失。
使用分層索引檢索
由 LLM 生成摘要並對摘要進行檢索可以使得檢索過程更爲高效。上節使用 LLM 提高信息密度的方法類似於無損壓縮,而使用 LLM 生成摘要更像有損壓縮。在大型數據庫的情況下,一種有效的方法是創建兩個索引 — 一個由摘要組成,另一個由文檔塊組成,並分兩步進行搜索,首先通過摘要過濾掉相關文檔,然後在此相關組內進行搜索。
創建假設性問答對
在數據準備階段,embedding 的對象是原始文本(answer),而在請求階段,embedding 的對象是用戶 query。這使得查詢的 embedding 和結果的 embedding 是 “不對稱” 的。一種方法是使用 GPT-4 爲每個文檔生成一系列假設 / 可能的問題和答案對,然後使用生成的問題作爲嵌入檢索的塊。在檢索時,系統將檢索問題及其對應的答案並提供給 LLM。因此,查詢的嵌入與生成問題的嵌入的餘弦相似度可能會更高。
例如,在文檔中,某段話的內容可能是從多個角度介紹了 xx 技術的特點,但是未顯式地提到特點、有缺點二詞。傳統 RAG 情況下當用戶問到 xx 技術的優缺點時,難以匹配到此段落。而如果爲這個段落生成假設性問題:“xxx 技術的優缺點是什麼?有什麼特點”,此時 embedding 方法就能準確匹配到此段落。
上圖展示了對 HTML 提取的信息生成的問答對示例。值得注意的是,提取問答對仍然可能造成一定的數據信息丟失。
使用 LLM 對信息進行去重
使用 LLM 作爲信息去重器可以提高數據索引的質量。LLM 通過將塊提煉成更少的塊來去重信息,從而提高獲得理想響應的幾率。根據具體情況,數據索引中的信息重複可能有助於或阻礙 RAG 系統的輸出。一方面,如果生成響應所需的正確信息在 LLM 的上下文窗口內被重複,它會增加 LLM 做出理想響應的可能性。另一方面,假設重複的程度稀釋甚至完全擠出了 LLM 上下文窗口中的所需信息,那麼用戶可能會收到一個無關的回答。
本方案通過在 embedding 空間中對塊進行 k-means 聚類來去重信息,以便每個塊聚類中的總 token 數在 LLM 的有效上下文窗口內。然後,本文可以任務 LLM 從原始聚類中輸出一組新的提煉塊,去除重複信息。如果一個給定的聚類包含 N 個塊,本文期望這個去重提示輸出 <= N 個新塊,其中任何冗餘信息都被去除。
值得注意的是,這種方法可能會使得從塊到原文的引用這一信息丟失。
測試並優化最優分塊
上述技術強調了分塊策略的重要性。但最優的分塊策略是特定於具體使用場景的,並且有許多因素會影響它。找到最優分塊策略的唯一方法是對你的 RAG 系統進行廣泛的 A/B 測試。以下是測試時需要考慮的一些最重要因素。
-
embedding 模型的最優輸入長度:不同的模型具備不同的最優的輸入長度。例如,來自 sentence transformers 的 embedding 模型在處理單個句子時表現出色,而 text-embedding-ada-002 則可以處理更大的輸入。chunk 的大小應理想地根據所使用的特定 embedding 模型進行調整,反之亦然。
-
文檔的語義信息:根據文檔的信息密度、格式和複雜性,chunk 可能需要達到一定的最小尺寸,以包含足夠的上下文信息,從而對 LLM 有用。然而,這是一種平衡的藝術。如果 chunk 過大,可能會在 embedding 中稀釋相關信息,從而降低在語義搜索中檢索到該 chunk 的幾率。如果文檔沒有自然的分割點(例如,用子標題分段的教科書章節),並且文檔是基於任意字符限制(例如 500 字符)進行 chunk 分割的,那麼關鍵的上下文信息可能會被拆分開。在這種情況下,應考慮重疊。例如,採用 50% 重疊率的 chunking 策略意味着文檔中兩個相鄰的 500 字符 chunk 將有 250 字符的重疊。在決定重疊率時,應考慮信息重複和 embedding 更多數據的成本。
-
模型的總結能力:雖然 GPT-4 似乎能夠處理許多大塊內容,但小模型可能表現不佳。此外,在許多大塊內容上運行推理可能成本高昂。
-
存儲成本:embedding 向量必須存儲在某個地方,而較小的塊大小會導致相同數據量下更多的嵌入,這意味着增加的存儲需求和成本。更多的嵌入也可能增加語義搜索所需的計算資源,這取決於語義搜索的實現方式(精確最近鄰 vs. 近似最近鄰)。
通過對本 RAG 進行 A/B 測試,本文可以評估每個用例的最佳分塊策略。本文主要在由 GPT-4 處理的改進信息密集型文檔上測試了以下分塊策略:
-
1,000 字符的分塊,帶有 200 字符的重疊
-
500 字符的分塊,帶有 100 字符的重疊
-
段落(處理後的文檔中存在段落分隔)
-
句子(使用 spaCy 進行分割)
-
假設性問題生成(從上文詳細描述的生成的假設性問題索引中嵌入問題)
在構建 AI 助手時,本文發現分塊策略的選擇並沒有太大影響(見下表結果)。1,000 字符的分塊策略,帶有 200 字符的重疊,表現略優於其他策略(當然,構建不同的應用可能會出現不同的測試結果)。
檢索 / 召回優化
檢索優化涵蓋了高級 RAG 技術和策略,目標是在推理時提高搜索性能和檢索結果,並在檢索發生之前進行優化(本質上,也可以是認爲檢索過程中的優化)。這些策略包含以下幾種:
-
使用 LLM 優化搜索請求
-
HyDE:假設性文檔 embedding
-
使用查詢路由
使用 LLM 優化搜索請求
搜索系統在搜索查詢以特定格式呈現時往往能達到最佳效果。LLM 是一種強大的工具,可以爲特定的搜索系統定製或優化用戶的搜索查詢。爲了說明這一點,本文來看兩個例子:優化一個簡單的搜索查詢和一個面向對話系統的查詢。
假設一個用戶想要搜索 example-news-site.com 上所有關於比爾 · 蓋茨或史蒂夫 · 喬布斯的新聞文章。他們可能會在 Google 中輸入如下內容:(次優的 Google 搜索查詢):Articles about Bill Gates or Steve Jobs from example-news-site
。可以使用 LLM 來優化這個搜索查詢,具體針對 Google,通過利用 Google 提供的一些高級搜索功能。(最優的 Google 搜索查詢):"Bill Gates" OR "Steve Jobs" -site:example-news-site.com
。
這種方法對於簡單的查詢是有效的,但對於對話系統,本文需要進一步提升。
儘管上述簡單的搜索查詢優化可以視爲一種增強,本文發現使用 LLM 來優化對話系統中的 RAG 搜索查詢是至關重要的。對於一個只能進行單輪對話的簡單問答機器人,用戶的問題同時也是檢索信息以增強 LLM 知識的搜索查詢。但在對話系統中,情況會變得更加複雜。以下是一個示例對話:
客戶:“你們的定期存款利率是多少?”
助手:“我們的利率是 XYZ。”
客戶:“哪種信用卡適合旅行?”
助手:“XYZ 信用卡適合旅行,原因是 ABC。”
客戶:“告訴我更多關於那個利率的信息。”
爲了回答用戶的最後一個問題,可能需要進行語義搜索以檢索有關特定 XYZ 旅行信用卡的信息。那麼,搜索查詢應該是什麼呢?僅僅使用最後一條用戶消息是不夠具體的,因爲金融機構可能有許多產品會產生利息。在這種情況下,語義搜索可能會產生大量潛在的無關信息,這些信息可能會擠佔 LLM 上下文窗口中的實際相關信息。那麼,使用整個對話記錄作爲語義搜索查詢怎麼樣呢?這可能會產生更好的結果,但仍然可能包括關於定期存款的信息,這與用戶在對話中的最新問題無關。本文發現的最佳技術是使用 LLM 根據對話生成最優的搜索查詢。此場景中用到了一下 prompt:
You are examining a conversation between a customer of Example bank and an Example bank chatbot. A documentation lookup of Example bank's policies, products, or services is necessary for the chatbot to respond to the customer. Please construct a search query that will be used to retrieve the relevant documentation that can be used to respond to the user.
這種技術的一個變體是查詢擴展,其中由 LLM 生成多個子搜索查詢。這種變體在具有混合檢索系統的 RAG 系統中特別有用,該系統結合了來自不同結構的數據存儲(例如,SQL 數據庫 + 獨立的向量數據庫)的搜索結果。其他提示工程技術如step-back prompting``和HyDE
也可以與這種方法結合使用。
HyDE:假設性文檔 embedding
預檢索優化策略中提到了查詢和文檔內容的 embedding 可能存在不對稱的問題。通過應用 HyDE,我們還可以在檢索階段實現更大的語義相似性。
預檢索優化中的方法是爲每個段落生成對應的問答對。而在 HyDE 中,我們預先爲用戶的問題生成多個假設性的回答,再用假設性回答去進行檢索而不是使用用戶查詢。這個想法是,在具有查詢 - 文檔不對稱的 RAG 系統中,假設文檔或片段將比用戶查詢本身具有更大的語義相似性。用到的 prompt 如下:
Please generate a 1000 character chunk of text that hypothetically could be found on Example banks website that can help the customer answer their question.
使用查詢路由
查詢路由器是我們見過的更受歡迎的高級 RAG 技術之一。其思想是當 RAG 系統使用多個數據源時,利用 LLM 將搜索查詢路由到適當的數據庫。這涉及在提示中預定義路由決策選項,並解析 LLM 的路由決策輸出,以便在代碼中使用。
爲了降低成本並提高 RAG 的質量,本文開發了一種 RAG 決策模式,因爲並非所有查詢都需要 RAG 查找。因此,識別何時 LLM 可以獨立回答查詢而無需外部知識,可以提高效率。一個不太明顯的例子是,當回答用戶查詢所需的所有信息已經存在於最近的對話歷史中。在這種情況下,LLM 只需重複或稍微改述之前所說的內容。例如:"你能把你最後的信息翻譯成西班牙語嗎?" 或 "請像我五歲一樣解釋最後的信息。" 這兩種查詢都不需要新的檢索,因爲 LLM 可以簡單地使用其內置功能回答這些查詢。
在實現的過程中,只需要對不同的分支採用不同的 prompt 即可。
檢索後優化
檢索後優化涵蓋了在檢索發生之後但在最終響應生成之前所採用的策略或技術。此時一個關鍵的考慮因素是:即使已經部署了所有的檢索前和檢索策略,也不能保證檢索到的文檔包含 LLM 回答查詢所需的所有相關信息。這是因爲檢索到的文檔可能是以下任意或所有類別的混合物:
-
Relevant documents
-
Related but irrelevant documents
-
irrelevant and unrelated documents
-
Counterfactual documents(即與正確相關文檔相矛盾的文檔)
檢索後優化策略包含以下幾個方面:
-
使用重排模型
-
prompt compression
-
Corrective RAG
使用重排模型
Cuconasu 等人的研究《The Power of Noise: Redefining Retrieval for RAG Systems[1]》表明:related but irrelevant documents are the most harmful to RAG systems。他們發現 “在某些情況下,準確率下降超過 - 67%。更重要的是,僅添加一個相關文檔就會導致準確率急劇下降,峯值達到 - 25%。
更令人驚訝的是,同一研究人員發現不相關的文檔 “如果放置得當,實際上有助於提高這些系統的準確性。” 那些構建 RAG 系統的人應該關注這類研究,但也應對自己的系統進行徹底的 A/B 測試,以確認研究結果是否適用於他們的系統。Cuconasu 的研究還表明,將最相關的文檔放置在提示中最接近查詢的位置可以提高 RAG 的性能。針對這個現象,重排序模型優化了給定查詢的塊搜索結果的優先級。這種技術在與混合檢索系統和查詢擴展結合使用時效果很好。相對於向量召回,重排模型的性能略差,但是更能挖掘出 query 和召回文檔之間的相關性。
prompt compression
LLMs 可以處理每個塊中的信息,以過濾、重新格式化甚至壓縮最終進入生成提示的信息。LLMLingua[2] 是這種方法的一個有前途的框架。LLMLingua 使用一個小型語言模型,如 GPT2-small 或 LLaMA-7B,來檢測並移除提示中不重要的 tokens。它還使得在黑箱 LLMs 中使用壓縮提示進行推理成爲可能,實現了高達 20 倍的壓縮率,同時性能損失最小。LongLLMLingua[3] 更進一步,通過在進行壓縮時考慮輸入查詢,移除一般不重要和對查詢不重要的 tokens。值得注意的是,除了完全理解和使用壓縮提示來回答查詢(例如,作爲 RAG 的一部分),即使提示對人類不可讀,GPT-4 也可以用於逆向或解壓輸入。
Corrective Rag
Corrective RAG[4] 是一種由 Yan 等人首次提出的方法,其中 T5-Large 模型被訓練用於在將結果提供給大型語言模型(LLM)以生成最終響應之前,識別 RAG 結果是否正確 / 相關、模棱兩可或不正確。未通過正確 / 相關或模棱兩可分類閾值的 RAG 結果將被丟棄。與使用經過微調的 Llama-2 7B 模型和 Self-RAG 的批判方法相比,使用 T5-Large 模型要輕量得多,並且可以與任何大型語言模型結合使用。
生成優化
生成優化包括改進生成最終用戶響應的大型語言模型調用。這裏最容易實現的成果是迭代提示並確定插入到生成提示中的最佳分塊數量。我們使用 GPT-4 對 1000、3500 和 7000 個 token 的檢索上下文 / 分塊進行了 A/B 測試。我們發現,將 3500 個 token 的檢索上下文插入到檢索增強生成(RAG)提示中比其他選項略好。我們懷疑這個發現並非普遍適用,每個用例都有不同的最佳數量。在這一點上,可以考慮評估和改進大型語言模型適當處理它可能接收的不同類型文檔(相關的、有關聯的、不相關的等)的能力。理想情況下,一個 retrieval-robust 的 LLM 系統應當具備以下特性:
-
當檢索到的上下文相關時,應提高模型性能。
-
當檢索到的上下文不相關甚至與事實相反時,不應損害模型性能。
-
未知穩健性:當 LLM 收到一個它沒有相應知識來回答的查詢,並且在檢索到的文檔中未找到相關信息時,以‘未知’迴應來承認其侷限性的能力。
思維鏈
思維鏈(Chain-of-thought, CoT)提示通過推理增加了在存在噪聲或無關上下文的情況下,LLM 得出正確響應的可能性。研究人員 Wenhao Yu 等人進一步發展了這一理念,提出了鏈式筆記(chain-of-noting[5]),他們微調了一個模型以生成 “每個檢索到的文檔的連續閱讀筆記。這一過程允許對文檔與所提問題的相關性進行深入評估,並有助於綜合這些信息以構建最終答案。” 微調的模型是 LLaMA-7B,訓練數據是使用 ChatGPT 創建的。
通過 Self-RAG 使系統具備自我反思能力
Self-RAG 是另一種基於微調的方法,其中語言模型在生成過程中被訓練輸出特殊的反思標記。反思標記可以是檢索標記或批評標記。研究人員 Asai 等人詳細描述了他們的方法:
“給定一個輸入提示和之前的生成內容,Self-RAG 首先確定是否通過檢索到的段落來增強後續生成會有所幫助。如果是,它會輸出一個檢索標記,按需調用檢索模型。隨後,Self-RAG 並行處理多個檢索到的段落,評估其相關性,然後生成相應的任務輸出。接着,它生成批評標記來批評自己的輸出,並選擇在事實性和整體質量方面最好的一個。”
通過微調忽略不相關內容
鑑於 LLM 通常沒有明確地爲 RAG 進行訓練或調優,因此可以對模型進行微調以適應這種用例,合理地說可以提高模型忽略無關上下文的能力。論文《Making Retrieval-Augmented Language Models Robust to Irrelevant Context[6]》通過實驗證明,即使是 1,000 個例子也足以訓練模型,使其在面對無關上下文時保持魯棒性,同時在有相關上下文的例子上保持高性能。
此論文還探索了使用自然語言推理(NLI)模型來識別無關的上下文。由於有些情況下無關的 RAG 上下文會對 LLM 的性能產生負面影響。NLI 模型可以用來過濾掉無關的上下文。這種技術的工作原理是,僅在假設(即使用問題和 LLM 生成的答案)被分類爲由前提(即檢索到的上下文或 RAG 結果)所蘊涵時,才使用檢索到的上下文。
其他 Advanced RAG 策略
關於 RAG 的文獻非常廣泛且不斷擴展。
-
微調 embedding 模型
-
使用知識圖譜(即 GraphRAG[7])
-
使用長上下文 LLM(例如 Gemini 1.5 或 GPT-4 128k)代替分塊和檢索
總結
隨着檢索增強生成(RAG)系統的快速發展,它爲增強對話式 AI 和其他生成式 AI 應用提供了許多機會。本文的實驗和研究突顯了先進的 RAG 技術在以下方面的潛力:
-
信息密度
-
檢索準確性
-
用戶響應質量
如果正確實施,這些技術可以爲企業帶來更高的成本效益,並改善客戶體驗。但爲了跟上快速湧現的最佳實踐,軟件工程師和數據科學家需要及時、可信賴的資源作爲參考。
參考資料
[1]
The Power of Noise: Redefining Retrieval for RAG Systems: https://arxiv.org/abs/2401.14887
[2]
LLMLingua: https://www.microsoft.com/en-us/research/blog/llmlingua-innovating-llm-efficiency-with-prompt-compression/
[3]
LongLLMLingua: https://arxiv.org/abs/2310.06839
[4]
Corrective RAG: https://arxiv.org/abs/2401.15884
[5]
chain-of-noting: https://arxiv.org/abs/2311.09210
[6]
Making Retrieval-Augmented Language Models Robust to Irrelevant Context: https://arxiv.org/abs/2310.01558
[7]
GraphRAG: https://github.com/microsoft/graphrag
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/QmqERxtYMIvoKdhe2nN4dw