從零開始優化 RAG 流程的終極指南,解決檢索增強生成的核心挑戰
RAG 工作流程劃分
首先,我們將 RAG 工作流程分爲三個部分,以增強我們對 RAG 的理解,並優化每個部分以提高整體性能:
預檢索
在預檢索步驟中,需要準備 LLM 原始訓練數據集之外的新數據(也稱爲外部數據) ,並將其拆分成塊,然後使用向量模型對塊數據進行索引,該模型將數據轉換爲數值表示並將其存儲在向量數據庫中, 此過程創建了 LLM 可以理解的知識庫。
RAG 中的預檢索
檢索
在最重要的檢索步驟中,用戶查詢被轉換爲稱爲嵌入的向量表示,並使用餘弦相似度從向量數據庫中找到相關塊。這會嘗試從向量存儲中找到高度相關的文檔塊。
檢索後
接下來,RAG 模型通過在上下文(查詢 + 上下文)中添加相關檢索數據來增強用戶輸入(或提示)。此步驟使用提示工程技術與 LLM 進行有效溝通。增強的提示允許大型語言模型使用給定的上下文生成對用戶查詢的準確答案。
RAG 中的檢索和後檢索
RAG 優化思路
我們的目標是通過將各種技術應用於不同部分來增強 RAG 工作流程的每個組件。
檢索前優化
預檢索技術包括提高索引數據的質量和塊優化。此步驟也可以稱爲增強語義表示。
增強數據粒度
提高數據質量
‘Garbage in, garbage out’
數據清理在 RAG 框架中起着至關重要的作用。RAG 解決方案的性能取決於數據的清理和組織程度。刪除不必要的信息,例如特殊字符、不需要的元數據或文本。
-
刪除不相關的文本 / 文檔:刪除所有不需要 LLM 回答的不相關文檔。同時刪除噪音數據,包括刪除特殊字符、停用詞(常用詞如 “the” 和“a”)和 HTML 標籤。
-
識別和糾正錯誤:包括拼寫錯誤、打字錯誤和語法錯誤。
-
在分割塊中用名稱替換代詞可以增強檢索過程中的語義重要性。
添加元數據
添加元數據,例如概念和級別標籤,以提高索引數據的質量。
添加元數據信息包括將引用的元數據(例如日期和目的)集成爲塊以便進行過濾,以及合併參考文獻的章節和小節等元數據以提高檢索效率。
以下是元數據有用的一些場景:
-
如果你搜索項目並且以新近度爲標準,則可以按日期元數據進行排序。
-
如果你搜索科學論文,並且事先知道你要查找的信息始終位於特定部分,例如實驗部分,則可以將文章部分添加爲每個塊的元數據,並對其進行過濾以僅匹配實驗。
元數據很有用,因爲它在向量搜索上帶來了額外的結構化搜索層。
優化索引結構
-
知識圖譜或圖神經網絡索引利用, 圖數據索引中節點之間的關係,整合圖結構中的信息來捕獲相關上下文。
-
向量索引
分塊優化
選擇正確的 chunk_size
是一個關鍵的決定,它可以通過多種方式影響 RAG 系統的效率和準確性:
相關性和粒度
- 較小的
chunk_size
(如 128)可產生更細粒度的塊。然而,這種粒度存在風險:重要信息可能不在檢索到的頂部塊中,尤其是當similarity_top_k
設置嚴格到 2 時。相反,512 的塊大小很可能包含頂部塊中的所有必要信息,從而確保查詢的答案隨時可用。
響應生成時間
隨着 chunk_size
的增加,輸入到 LLM 以生成答案的信息量也會增加。雖然這可以確保更全面的背景信息,但也可能會降低系統速度。
挑戰
如果您的塊太小,它可能不包含 LLM 回答用戶查詢所需的所有信息;如果塊太大,它可能包含太多不相關的信息,使 LLM 感到困惑,或者可能太大而無法適應上下文大小。
任務特定分塊
根據下游任務需要確定塊的最佳長度以及每個塊希望有多少重疊。
- 諸如總結之類的高級任務需要更大的塊大小,而諸如編碼之類的低級任務則需要較小的塊。
分塊技術
Small2big 或父文檔檢索
通過拆分和存儲小塊數據來實現 ParentDocumentRetriever 平衡。在檢索過程中,它首先獲取小塊,然後查找這些塊的父 ID,並將這些較大的文檔返回給 LLM。
它在初始搜索階段利用小文本塊,隨後將更大的相關文本塊提供給語言模型進行處理。
遞歸檢索涉及在初始檢索階段獲取較小的塊以捕獲關鍵的語義含義。隨後,在流程的後期階段,將包含更多上下文信息的較大塊提供給 LLM。這種兩步檢索方法有助於在效率和提供豐富的上下文響應之間取得平衡。
步驟:
-
該過程涉及將原始大型文檔分解爲更小、更易於管理的單元(稱爲子文檔)和更大的塊(稱爲父文檔)。
-
它專注於爲每個子文檔創建嵌入,這些嵌入比整個父塊嵌入更豐富、更詳細。它幫助框架識別包含與用戶查詢相關的信息的最相關子文檔。
-
一旦與子文檔建立對齊,它就會檢索與該子文檔關聯的整個父文檔。如圖所示,最終檢索到了父塊。
-
檢索父文檔非常重要,因爲它爲理解和響應用戶的查詢提供了更廣泛的背景。框架現在可以訪問整個父文檔,而不再僅僅依賴於子文檔的內容。
Small2big 或父文檔檢索分塊技術
句子窗口檢索
這種分塊技術與上面的非常相似。句子窗口檢索背後的核心思想是根據查詢從自定義知識庫中選擇性地獲取上下文,然後利用該上下文的更廣泛版本來生成更強大的文本。
此過程涉及嵌入一組有限的句子以供檢索,這些句子周圍的附加上下文(稱爲 “窗口上下文”)被單獨存儲並與它們鏈接。一旦確定了最相似的句子,就會在將這些句子發送到大型語言模型 (LLM) 進行生成之前重新整合此上下文,從而豐富整體上下文理解。
解釋句子窗口檢索的工作原理
RAG 中的句子窗口檢索分塊技術
檢索優化
這是 RAG 工作流中最重要的部分,包括根據用戶查詢從向量存儲中檢索文檔。此步驟也可以稱爲對齊查詢和文檔。
查詢重寫
查詢重寫是對齊查詢和文檔的語義的基本方法。
在此過程中,我們利用語言模型 (LLM) 功能重新表述用戶的查詢並再次嘗試。需要注意的是,兩個在人類看來可能相同的問題在嵌入空間中可能看起來並不相似。
多查詢檢索器
多查詢檢索方法利用 LLM 針對給定的用戶輸入查詢從不同角度生成多個查詢,有利於解決具有多個子問題的複雜問題。
對於每個查詢,它會檢索一組相關文檔,並對所有查詢進行唯一聯合以獲得一組更大的潛在相關文檔。
通過對同一個問題產生多種觀點,多查詢檢索器可能能夠克服基於距離的檢索的一些限制並獲得更豐富的結果。
多查詢檢索器
Hyde 或 Query2doc
兩者皆可海德和查詢到文檔是類似的查詢重寫優化。鑑於搜索查詢通常很短、含糊不清或缺乏必要的背景信息,LLM 可以提供相關信息來指導檢索系統,因爲它們通過對數萬億個標記進行預訓練來記憶大量的知識和語言模式。
標準方法和 HyDE 方法之間的差異
StepBack
提示 StepBack 提示該方法鼓勵語言模型超越具體的例子來思考,並關注更廣泛的概念和原則。
此模板複製了 “後退” 提示技術,該技術通過首先提出 “後退” 問題來提高複雜問題的表現。 此技術可以與標準問答 RAG 應用程序結合使用,通過檢索原始問題和後退問題的信息。以下是後退提示的示例。
微調嵌入
微調嵌入模型會顯著影響 RAG 系統中檢索內容的相關性。此過程涉及自定義嵌入模型以增強特定領域上下文中的檢索相關性,尤其是對於處理不斷髮展或罕見術語的專業領域。
- 生成用於訓練和評估的合成數據集
這裏的關鍵思想是,可以使用 GPT-3.5-turbo 等語言模型生成用於微調的訓練數據,以基於文檔塊提出問題。這使我們能夠以可擴展的方式生成合成的正對(查詢、相關文檔),而無需人工貼標。最終數據集將是問題和文本塊的對。
- 微調嵌入
在生成的訓練數據集上微調任何嵌入模型
使用 GPT 通過合成生成的數據集微調嵌入模型
混合搜索
RAG 系統通過智能地集成基於關鍵字的搜索、語義搜索和向量搜索等各種技術來優化其性能。這種方法充分利用了每種方法的獨特優勢,以適應不同的查詢類型和信息需求,確保始終如一地檢索高度相關且上下文豐富的信息。混合搜索的使用是對檢索策略的有力補充,從而提高了 RAG 流程的整體效率。
最常見的模式是將稀疏檢索器(如 BM25)與密集檢索器(如嵌入相似性)相結合,因爲它們的優勢是互補的。這也被稱爲 “混合搜索”。稀疏檢索器擅長根據關鍵字查找相關文檔,而密集檢索器擅長根據語義相似性查找相關文檔。
檢索後優化
重新排序
在將檢索結果發送到 LLM 之前對其進行重新排序顯著提高了 RAG 性能。向量相似性搜索中的高分數並不意味着它總是具有最高的相關性。
核心思想是通過重新排列文檔記錄,將最相關的內容放在最前面,從而限制文檔的總數,不僅解決了檢索過程中上下文窗口擴展的問題,還提高了檢索效率和響應速度。增加查詢引擎中的 similarity_top_k 來檢索更多的上下文段落,重新排名後可以減少到 top_n。
使用 Cohere Reranker 對檢索到的文檔進行重新排序
內容壓縮
檢索到的文檔中的噪聲會嚴重影響 RAG(Retrieval-Augmented Generation) 的性能。因此,與查詢最相關的信息可能被埋藏在大量無關文本中。將整個文檔傳遞到應用程序中可能導致更昂貴的大語言模型(LLM)調用,並生成質量較差的響應。在這種情況下,重點在於壓縮無關上下文、突出關鍵段落,以及減少整體上下文長度。
上下文壓縮旨在解決這一問題。其核心思想很簡單:不是直接返回檢索到的原始文檔,而是根據給定查詢的上下文對文檔進行壓縮,從而僅返回相關信息。這裏的 “壓縮” 既指壓縮單個文檔的內容,也包括完全過濾掉不相關的文檔。
上下文壓縮
Doc Compressor 是一種小型語言模型,用於計算用戶查詢和檢索到的文檔之間的提示互信息(prompt mutual information),從而評估各個元素的重要性。
模塊化 RAG
模塊化 RAG 通過整合多種方法來增強 RAG 的不同組件。例如,引入搜索模塊以進行相似性檢索,並在檢索器中應用微調方法以提高性能。
RAG 融合結合了兩種方法:
-
多查詢檢索 (Multi-Query Retrieval) 利用大語言模型 (LLMs) 從不同角度爲給定的用戶輸入查詢生成多個查詢。這種方法在處理包含多個子問題的複雜問題時具有優勢。
-
重排序檢索文檔 (Rerank Retrieved Documents) 對所有檢索到的文檔進行重新排序,並移除相關性得分較低的文檔,從而提升結果的質量。
圖片所示技術確保了搜索結果能夠匹配用戶的意圖,無論是顯而易見的還是隱含的。它幫助用戶找到更具洞察力和相關性的信息。
最後的一些思考
本文討論了優化 RAG 管道各個部分並增強整體 RAG 性能的各種技術。你可以在 RAG 管道中使用其中一種或多種技術,使其更加準確和高效。希望這些技術能夠幫助你爲你的應用程序構建一個更強大的 RAG 管道。
參考資料:https://luv-bansal.medium.com/advance-rag-improve-rag-performance-208ffad5bb6a
文章到此還沒完,感覺上面是比較常見的內容,下面繼續分享同濟大學 Haofen Wang 的關於檢索增強生成的報告:《Retrieval-Augmented Generation (RAG): Paradigms, Technologies, and Trends》 ,RAG 範式、技術和趨勢。
溫故而知新!https://raw.githubusercontent.com/Tongji-KGLLM/RAG-Survey/main/assets/RAG_Slide_ENG.pdf
RAG 範式、技術和趨勢
RAG 概述
爲什麼會有 RAG?
RAG (檢索增強生成) 的出現主要是因爲傳統的 LLM 存在一些不足之處:
-
幻覺(生成虛假信息)
-
過時的信息
-
參數化知識效率低
-
缺乏專業領域的深入知識
-
推理能力弱
對於企業應用來說,還需要綜合考慮:
-
領域支持的精準回答
-
數據頻繁更新的需求
-
生成內容需要可追溯、可解釋
-
可控的成本
-
隱私數據保護
因此,RAG 的核心思想是:在生成答案時,首先從大量文檔中檢索相關信息,再基於這些信息進行答案生成。通過附加外部知識庫,避免了爲每個特定任務重新訓練整個大型模型。這使得 RAG 特別適用於知識密集型任務。
RAG 與 Fine-tuning(FT)
RAG 與 Fine-tuning (FT) 的比較:
-
RAG:像是爲模型提供一本帶有信息檢索的定製教科書,非常適合特定領域的查詢。
-
FT:像是通過時間積累將知識內化的學生,更適合模仿特定結構、風格或格式。
RAG 和 FT 不是互相排斥的,而是互補的。結合使用可以提升模型的整體性能。
RAG 應用場景
RAG 非常適合以下場景:
-
長尾數據
-
頻繁更新的知識
-
需要驗證和可追溯性的答案
-
專業領域知識
-
數據隱私保護
RAG 範式的演變
RAG 可以分爲三種範式:
-
Naive RAG:傳統的 RAG 流程,包括 Indexing、Retrieval 和 Generation。
-
Advanced RAG:在傳統 RAG 流程基礎上,增加了預檢索和檢索後處理,包括 query 改寫、routing 路由、query 擴展等。
-
Modular RAG:更加靈活的結構,引入了具體的功能模塊,如查詢搜索引擎、多個答案融合等,結合微調、強化學習等技術。
RAG 的三個關鍵問題
-
檢索粒度:可以是 token、短語、chunk、段落、實體或知識圖譜。
-
什麼時候檢索:選擇合適的時機進行檢索。
-
如何利用檢索到的信息:在推理過程中如何將檢索到的信息集成到生成模型中。
關於檢索什麼層級的內容,我們可以從檢索粒度的粗細,以及數據結構化的高低來看業界研究結果。
-
Chunk 級別,非結構化數據,搜索會召回大量信息,但是準確度低,會包含冗餘信息
-
知識圖譜,豐富的語義和結構化數據,檢索效率低,效果嚴重依賴 KG 的質量
-
KNN-LMM 擅長處理長尾和跨域問題,計算效率高,但需要大量存儲
如何使用檢索到的內容 在推理過程中,將檢索到的信息集成到生成模型的不同層中
按照檢索的頻率從低到高,有:
-
一次檢索,只檢索一次,效率高,但可能導致檢索結果相關度低
-
自適應檢索,平衡效率和檢索效果
-
每 N 個 token 檢索 1 次,會導致檢索次數過多,並召回大量冗餘信息
RAG 技術發展樹
關鍵技術
數據索引優化
-
Small-2-Big:在 sentence 級別進行 embedding。
-
Sliding Window:滑動窗口,確保覆蓋整個文本,避免語義歧義。
-
Summary:先通過摘要檢索,再從文檔中提取文本塊。
-
Meta 信息:添加諸如頁面、時間、類型、標題等 meta 信息,以增強信息量。
核心就是數據很多,通過 meta 過濾,可以減少範圍,提高精度。
結構化檢索文檔庫
可以通過以下方式進行檢索:
-
Summary → Document:通過摘要檢索替代文檔檢索,增加準確性。
-
Document → Embedded Objects:檢索嵌入的對象(如 PDF 中的表格、圖表等)。
-
知識圖譜(KG):通過 GraphRAG 提取實體構建子圖,生成回答。
Query 優化
-
Query Rewriting:將查詢改寫成多個子查詢,以獲得更好的檢索效果。
-
Query Clarification:通過澄清技術進一步優化查詢。
Embedding 嵌入模型優化
- 選擇合適的商業 embedding 供應商或使用像 BAAI 的 BGE 模型進行微調。
檢索流程優化
-
Iterative 檢索:迭代式檢索。
-
Adaptive 檢索:自適應檢索,平衡效率和效果。
Hybrid (RAG+Fine-tuning) 融合
RAG 和 Fine-tuning 可以結合使用,以更好地生成和檢索答案。
RAG 評估方法
-
評測方法層面,可以檢索和生成獨立評測,也可以端到端進行評測
-
RAG 的評估辦法很豐富,主要包括三個質量分數:上下文相關度、答案忠實度、答案相關度
-
評估涉及四項核心能力:魯棒性、拒識能力、信息整合能力和反事實解釋
-
評估框架方面,有 RGB、RECALL 等基準指標,以及 RAGAS、ARES、TruLens 等自動化評估工具,可以較全面地衡量 RAG 模型的性能。
評估指標
-
檢索質量:
-
Hit Rate (HR):命中率,衡量檢索中相關文檔的比例。
-
Mean Reciprocal Rank (MRR):平均倒數排名。
-
NDCG:歸一化折扣累積增益。
-
Precision:精確率。
-
Recall:召回率。
-
R-Rate:再次出現率。
-
-
生成質量:
-
Context Relevance:上下文相關性。
-
Answer Faithfulness:答案忠實度。
-
Answer Relevance:答案相關性。
-
Accuracy:準確性。
下面補充一些信息: 具體來說,評估方法主要圍繞其兩個關鍵組件:檢索(Retrieval)和生成(Generation)。評估這些組件的性能涉及到多個質量分數和能力,這些分數和能力共同反映了 RAG 模型在信息檢索和生成過程中的效率。
-
核心能力
-
魯棒性:處理錯誤召回內容的能力。
-
拒識能力:拒絕不相關信息的能力。
-
信息整合能力:如何整合檢索到的信息。
-
反事實解釋:生成結果的可解釋性。
評估工具
-
RAGAS
-
ARES
-
TruLens
RAG 技術棧與工業界實踐
當前有流行的開發框架,如 LangChain、LlamaIndex、AutoGen,方便開發 RAG 應用。
在工業界,許多應用已經開始使用 RAG 技術。
RAG 的挑戰與展望
RAG 技術框架
未來研究熱點
-
技術框架:提升檢索效率
-
多模態擴展:將 RAG 從文本擴展到多模態。
-
生態建設:擴展 RAG 下游任務,改善生態建設。
挑戰
-
長上下文:如何處理長上下文信息。
-
與 FT 的協同:如何將 RAG 和 FT 結合使用。
-
RAG 的魯棒性:如何處理錯誤召回的內容。
-
如何應用 LLM:如何最大限度地利用 LLM。
-
隱私保護:如何保障隱私數據。
多模態擴展#
將 RAG 從文本擴展到多模態
RAG 開發生態建設
擴展 RAG 下游任務,改善生態建設
參考資料:https://www.cnblogs.com/xiaoqi/p/18075992/rag-survey
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/jynBvVpc3av2d6WIFMCWtQ