從零開始優化 RAG 流程的終極指南,解決檢索增強生成的核心挑戰

RAG 工作流程劃分

首先,我們將 RAG 工作流程分爲三個部分,以增強我們對 RAG 的理解,並優化每個部分以提高整體性能:

預檢索

在預檢索步驟中,需要準備 LLM 原始訓練數據集之外的新數據(也稱爲外部數據) ,並將其拆分成塊,然後使用向量模型對塊數據進行索引,該模型將數據轉換爲數值表示並將其存儲在向量數據庫中, 此過程創建了 LLM 可以理解的知識庫。

RAG 中的預檢索

檢索

在最重要的檢索步驟中,用戶查詢被轉換爲稱爲嵌入的向量表示,並使用餘弦相似度從向量數據庫中找到相關塊。這會嘗試從向量存儲中找到高度相關的文檔塊。

檢索後

接下來,RAG 模型通過在上下文(查詢 + 上下文)中添加相關檢索數據來增強用戶輸入(或提示)。此步驟使用提示工程技術與 LLM 進行有效溝通。增強的提示允許大型語言模型使用給定的上下文生成對用戶查詢的準確答案。

RAG 中的檢索和後檢索

RAG 優化思路

我們的目標是通過將各種技術應用於不同部分來增強 RAG 工作流程的每個組件。

檢索前優化

預檢索技術包括提高索引數據的質量和塊優化。此步驟也可以稱爲增強語義表示。

增強數據粒度

提高數據質量

‘Garbage in, garbage out’

數據清理在 RAG 框架中起着至關重要的作用。RAG 解決方案的性能取決於數據的清理和組織程度。刪除不必要的信息,例如特殊字符、不需要的元數據或文本。

添加元數據

添加元數據,例如概念和級別標籤,以提高索引數據的質量。

添加元數據信息包括將引用的元數據(例如日期和目的)集成爲塊以便進行過濾,以及合併參考文獻的章節和小節等元數據以提高檢索效率。

以下是元數據有用的一些場景:

元數據很有用,因爲它在向量搜索上帶來了額外的結構化搜索層。

優化索引結構

分塊優化

選擇正確的 chunk_size 是一個關鍵的決定,它可以通過多種方式影響 RAG 系統的效率和準確性:

相關性和粒度

響應生成時間

隨着 chunk_size 的增加,輸入到 LLM 以生成答案的信息量也會增加。雖然這可以確保更全面的背景信息,但也可能會降低系統速度。

挑戰

如果您的塊太小,它可能不包含 LLM 回答用戶查詢所需的所有信息;如果塊太大,它可能包含太多不相關的信息,使 LLM 感到困惑,或者可能太大而無法適應上下文大小。

任務特定分塊

根據下游任務需要確定塊的最佳長度以及每個塊希望有多少重疊。

分塊技術

Small2big 或父文檔檢索

通過拆分和存儲小塊數據來實現 ParentDocumentRetriever 平衡。在檢索過程中,它首先獲取小塊,然後查找這些塊的父 ID,並將這些較大的文檔返回給 LLM。

它在初始搜索階段利用小文本塊,隨後將更大的相關文本塊提供給語言模型進行處理。

遞歸檢索涉及在初始檢索階段獲取較小的塊以捕獲關鍵的語義含義。隨後,在流程的後期階段,將包含更多上下文信息的較大塊提供給 LLM。這種兩步檢索方法有助於在效率和提供豐富的上下文響應之間取得平衡。

步驟:

  1. 該過程涉及將原始大型文檔分解爲更小、更易於管理的單元(稱爲子文檔)和更大的塊(稱爲父文檔)。

  2. 它專注於爲每個子文檔創建嵌入,這些嵌入比整個父塊嵌入更豐富、更詳細。它幫助框架識別包含與用戶查詢相關的信息的最相關子文檔。

  3. 一旦與子文檔建立對齊,它就會檢索與該子文檔關聯的整個父文檔。如圖所示,最終檢索到了父塊。

  4. 檢索父文檔非常重要,因爲它爲理解和響應用戶的查詢提供了更廣泛的背景。框架現在可以訪問整個父文檔,而不再僅僅依賴於子文檔的內容。

Small2big 或父文檔檢索分塊技術

句子窗口檢索

這種分塊技術與上面的非常相似。句子窗口檢索背後的核心思想是根據查詢從自定義知識庫中選擇性地獲取上下文,然後利用該上下文的更廣泛版本來生成更強大的文本。

此過程涉及嵌入一組有限的句子以供檢索,這些句子周圍的附加上下文(稱爲 “窗口上下文”)被單獨存儲並與它們鏈接。一旦確定了最相似的句子,就會在將這些句子發送到大型語言模型 (LLM) 進行生成之前重新整合此上下文,從而豐富整體上下文理解。

解釋句子窗口檢索的工作原理

RAG 中的句子窗口檢索分塊技術

檢索優化

這是 RAG 工作流中最重要的部分,包括根據用戶查詢從向量存儲中檢索文檔。此步驟也可以稱爲對齊查詢和文檔。

查詢重寫

查詢重寫是對齊查詢和文檔的語義的基本方法。

在此過程中,我們利用語言模型 (LLM) 功能重新表述用戶的查詢並再次嘗試。需要注意的是,兩個在人類看來可能相同的問題在嵌入空間中可能看起來並不相似。

多查詢檢索器

多查詢檢索方法利用 LLM 針對給定的用戶輸入查詢從不同角度生成多個查詢,有利於解決具有多個子問題的複雜問題。

對於每個查詢,它會檢索一組相關文檔,並對所有查詢進行唯一聯合以獲得一組更大的潛在相關文檔。

通過對同一個問題產生多種觀點,多查詢檢索器可能能夠克服基於距離的檢索的一些限制並獲得更豐富的結果。

多查詢檢索器

Hyde 或 Query2doc

兩者皆可海德和查詢到文檔是類似的查詢重寫優化。鑑於搜索查詢通常很短、含糊不清或缺乏必要的背景信息,LLM 可以提供相關信息來指導檢索系統,因爲它們通過對數萬億個標記進行預訓練來記憶大量的知識和語言模式。

標準方法和 HyDE 方法之間的差異

StepBack

提示 StepBack 提示該方法鼓勵語言模型超越具體的例子來思考,並關注更廣泛的概念和原則。

此模板複製了 “後退” 提示技術,該技術通過首先提出 “後退” 問題來提高複雜問題的表現。 此技術可以與標準問答 RAG 應用程序結合使用,通過檢索原始問題和後退問題的信息。以下是後退提示的示例。

微調嵌入

微調嵌入模型會顯著影響 RAG 系統中檢索內容的相關性。此過程涉及自定義嵌入模型以增強特定領域上下文中的檢索相關性,尤其是對於處理不斷髮展或罕見術語的專業領域。

  1. 生成用於訓練和評估的合成數據集

這裏的關鍵思想是,可以使用 GPT-3.5-turbo 等語言模型生成用於微調的訓練數據,以基於文檔塊提出問題。這使我們能夠以可擴展的方式生成合成的正對(查詢、相關文檔),而無需人工貼標。最終數據集將是問題和文本塊的對。

  1. 微調嵌入

在生成的訓練數據集上微調任何嵌入模型

使用 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 融合結合了兩種方法:

  1. 多查詢檢索 (Multi-Query Retrieval) 利用大語言模型 (LLMs) 從不同角度爲給定的用戶輸入查詢生成多個查詢。這種方法在處理包含多個子問題的複雜問題時具有優勢。

  2. 重排序檢索文檔 (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 應用場景

RAG 非常適合以下場景:

RAG 範式的演變

RAG 可以分爲三種範式:

  1. Naive RAG:傳統的 RAG 流程,包括 Indexing、Retrieval 和 Generation。

  2. Advanced RAG:在傳統 RAG 流程基礎上,增加了預檢索和檢索後處理,包括 query 改寫、routing 路由、query 擴展等。

  3. Modular RAG:更加靈活的結構,引入了具體的功能模塊,如查詢搜索引擎、多個答案融合等,結合微調、強化學習等技術。

RAG 的三個關鍵問題

  1. 檢索粒度:可以是 token、短語、chunk、段落、實體或知識圖譜。

  2. 什麼時候檢索:選擇合適的時機進行檢索。

  3. 如何利用檢索到的信息:在推理過程中如何將檢索到的信息集成到生成模型中。

關於檢索什麼層級的內容,我們可以從檢索粒度的粗細,以及數據結構化的高低來看業界研究結果。

X 軸結構化從低到高,Y 軸從精細到粗粒度。 三個代表:

如何使用檢索到的內容 在推理過程中,將檢索到的信息集成到生成模型的不同層中

檢索的時機

按照檢索的頻率從低到高,有:

RAG 技術發展樹

關鍵技術

數據索引優化

核心就是數據很多,通過 meta 過濾,可以減少範圍,提高精度。

結構化檢索文檔庫

可以通過以下方式進行檢索:

Query 優化

Embedding 嵌入模型優化

檢索流程優化

Hybrid (RAG+Fine-tuning) 融合

RAG 和 Fine-tuning 可以結合使用,以更好地生成和檢索答案。

相關研究總結

RAG 評估方法

評估指標

核心能力

評估工具

RAG 技術棧與工業界實踐

當前有流行的開發框架,如 LangChain、LlamaIndex、AutoGen,方便開發 RAG 應用。

在工業界,許多應用已經開始使用 RAG 技術。

工業界也有很多 RAG 應用。

在這裏插入圖片描述

RAG 的挑戰與展望

RAG 技術框架

未來研究熱點

挑戰

多模態擴展#

將 RAG 從文本擴展到多模態

RAG 開發生態建設

擴展 RAG 下游任務,改善生態建設

參考資料:https://www.cnblogs.com/xiaoqi/p/18075992/rag-survey

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/jynBvVpc3av2d6WIFMCWtQ