自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型! 精華

發(fā)布于 2025-2-24 11:07
瀏覽
0收藏

RAG增強技術分類

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

來源:https://arxiv.org/abs/2402.19473

最近一項關于檢索增強生成(RAG)的調查總結了三種最新發(fā)展的范式:

  • 基礎RAG
  • 高級RAG
  • 模塊化RAG

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

A representative instance of the RAG process applied to question answering. It mainly consists of 3 steps. 1) Indexing. Documents are split into chunks, encoded into vectors, and stored in a vector database. 2) Retrieval. Retrieve the Top k chunks most relevant to the question based on semantic similarity. 3) Generation. Input the original question and the retrieved chunks together into LLM to generate the final answer. 來源 https://arxiv.org/abs/2312.10997

RAG過程應用于問答的一個典型示例。它主要包括3個步驟:

  1. 索引構建:文檔被分割成塊,編碼為向量,并存儲在向量數(shù)據(jù)庫中。
  2. 檢索:根據(jù)語義相似性檢索與問題最相關的前k個文本塊。
  3. 生成:將原始問題和檢索到的文本塊一起輸入到大語言模型中,生成最終答案。

1. Native RAG

標準的RAG過程包括將文本分割成塊,使用Transformer編碼器模型將這些片段嵌入為向量,為這些向量建立索引,然后為大語言模型構建一個提示。這個提示會指示模型根據(jù)用戶的查詢,在搜索階段收集的上下文中生成響應。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

在運行時,使用相同的編碼器模型將用戶的查詢向量化,使用這個向量在索引中進行搜索,確定前k個結果,從數(shù)據(jù)庫中檢索相應的文本塊,并將它們作為大語言模型提示的上下文輸入。

以下是RAG如何讓ChatGPT提升的一個示例。

RAG對ChatGPT的提升示例:解決訓練數(shù)據(jù)范圍之外的問題并生成正確結果。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

來源:https://arxiv.org/abs/2404.10981

現(xiàn)在,讓我們來看看基礎RAG存在的問題。

1.1 基礎RAG的問題

基礎RAG存在問題(紅色虛線框所示)。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

如上圖所示,基礎RAG在上述所有三個步驟中都存在問題(紅色虛線框),有很大的優(yōu)化空間。

1.1.1 索引構建

  • 信息提取不完整:它無法有效地處理非結構化文件(如PDF)中圖像和表格里的有用信息。
  • 分塊策略單一:分塊過程采用 “一刀切 ”的策略,沒有根據(jù)不同文件類型的特點選擇最優(yōu)策略。這導致每個文本塊包含的語義信息不完整,并且沒有考慮到重要細節(jié),如文本中已有的標題。
  • 索引結構優(yōu)化不足:導致檢索功能效率低下。
  • 嵌入模型語義表示能力弱。

1.1.2 檢索

  • 召回上下文相關性不足、準確性低。
  • 召回率低:無法檢索到所有相關段落,從而阻礙了大語言模型生成全面答案的能力。
  • 檢索不準確:查詢可能不準確,或者嵌入模型的語義表示能力較弱,導致無法檢索到有價值的信息。
  • 檢索算法有限:它沒有結合不同類型的檢索方法或算法,如將關鍵詞檢索、語義檢索和向量檢索相結合。
  • 信息冗余:多個檢索到的上下文包含相似信息時,會導致生成的答案中出現(xiàn)重復內容。

1.1.3 生成

  • 整合失敗:可能無法有效地將檢索到的上下文與當前的生成任務相結合,導致輸出不一致。
  • 過度依賴風險:在生成過程中過度依賴增強信息會帶來很高的風險,這可能導致輸出只是簡單地重復檢索到的內容,而沒有提供有價值的信息。
  • 大語言模型生成錯誤:大語言模型可能會生成錯誤、不相關、有害或有偏見的回應。

請注意,這些問題的原因可能是多方面的。例如,如果給用戶的最終回復包含不相關的內容,可能不只是大語言模型的問題。根本原因可能是從PDF中提取文檔不準確,或者嵌入模型無法準確捕捉語義,等等。

2. 邁向高級RAG

基礎RAG與高級RAG的區(qū)別

隨著基礎RAG的局限性日益明顯,人們開始致力于開發(fā)更復雜的系統(tǒng)。高級RAG模型采用更復雜的檢索技術,更好地整合檢索到的信息,并且通常能夠迭代地優(yōu)化檢索和生成過程。

高級RAG的關鍵特征:

  • 先進的檢索算法:例如語義搜索、上下文理解。
  • 增強的檢索數(shù)據(jù)整合:通常帶有上下文和相關性加權。
  • 迭代優(yōu)化能力:能夠提高準確性和相關性。
  • 反饋循環(huán)和學習機制:用于持續(xù)改進。

高級RAG范式包含一系列旨在解決基礎RAG已知局限性的技術。RAG的基本工作流程始于創(chuàng)建一個包含外部數(shù)據(jù)源的索引。這個索引是通過檢索器模型根據(jù)特定查詢檢索相關信息的基礎。最后一步是生成器模型,它將檢索到的信息與查詢相結合,產生所需的輸出。

RAG范式組織了該領域的研究,為提高大語言模型的性能提供了一個簡單而強大的框架。RAG的核心是其搜索機制,這對生成高質量的結果至關重要。因此,從檢索的角度來看,這個范式可以分為四個主要階段:檢索前、檢索、檢索后和生成。

統(tǒng)一的RAG框架及其基本工作流程和范式。

來源:https://arxiv.org/abs/2404.10981

2.1 檢索前優(yōu)化

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

檢索前優(yōu)化主要集中在數(shù)據(jù)索引優(yōu)化和查詢優(yōu)化上。數(shù)據(jù)索引優(yōu)化技術旨在以有助于提高檢索效率的方式存儲數(shù)據(jù),例如:

  • 索引構建:這個過程從索引開始,建立一個有組織的系統(tǒng),以便能夠快速準確地檢索信息。索引的具體方式取決于任務和數(shù)據(jù)類型。例如,句子級索引有助于問答系統(tǒng)精確地定位答案,而文檔級索引則更適合用于總結文檔,以理解其主要概念和思想。
  • 查詢處理:索引構建完成后,進行查詢處理,調整用戶查詢,使其與索引數(shù)據(jù)更好地匹配。這包括查詢重寫,即重新編寫查詢,使其更符合用戶的意圖;查詢擴展,即通過同義詞或相關術語擴展查詢,以獲取更多相關結果;以及查詢規(guī)范化,即解決拼寫或術語上的差異,以實現(xiàn)一致的查詢匹配。
  • 數(shù)據(jù)修改:這對于提高檢索效率也至關重要。這一步包括預處理技術,如去除不相關或冗余的信息,以提高結果的質量;以及用元數(shù)據(jù)等額外信息豐富數(shù)據(jù),以提高檢索內容的相關性和多樣性。

句子窗口檢索

2.2 檢索優(yōu)化

檢索階段的目標是識別最相關的上下文。通常,檢索是基于向量搜索進行的,向量搜索計算查詢和索引數(shù)據(jù)之間的語義相似性。因此,大多數(shù)檢索優(yōu)化技術都圍繞著嵌入模型展開:

  • 搜索與排序:檢索階段是搜索和排序的結合。它專注于從數(shù)據(jù)集中選擇文檔并對其進行優(yōu)先級排序,以提高生成模型輸出的質量。這個階段使用搜索算法在索引數(shù)據(jù)中導航,找到與用戶查詢匹配的文檔。在確定相關文檔后,開始對這些文檔進行初步排序,根據(jù)它們與查詢的相關性進行排序。
  • 微調嵌入模型:根據(jù)特定領域的上下文定制嵌入模型,特別是對于術語不斷演變或包含罕見術語的領域。例如,BAAI/bge-small-en是一個可以微調的高性能嵌入模型。
  • 動態(tài)嵌入:能夠適應單詞使用的上下文,與靜態(tài)嵌入不同,靜態(tài)嵌入為每個單詞使用單個向量。例如,OpenAI的embeddings-ada-02是一個復雜的動態(tài)嵌入模型,能夠捕捉上下文理解。
  • 除了向量搜索,還有其他檢索技術:例如混合搜索,它通常是指將向量搜索與基于關鍵詞的搜索相結合的概念。如果我們的檢索需要精確的關鍵詞匹配,這種檢索技術會很有幫助。

2.3 檢索后優(yōu)化

檢索后階段用于優(yōu)化最初檢索到的文檔,以提高文本生成的質量。這個階段包括重新排序和過濾,每個步驟都旨在為最終的生成任務優(yōu)化文檔選擇。

  • 提示壓縮:通過去除不相關的內容并突出重要的上下文來縮短提示的總長度。
  • 重新排序:在重新排序步驟中,對之前檢索到的文檔進行重新評估、評分和重新組織。目的是更準確地突出與查詢最相關的文檔,降低不太相關文檔的重要性。這一步驟包括納入額外的指標和外部知識來源,以提高精度。在這種情況下,由于候選文檔數(shù)量有限,可以有效地使用準確性較高但效率較低的預訓練模型。
  • 過濾:旨在去除不符合指定質量或相關性標準的文檔。這可以通過多種方法實現(xiàn),例如設定一個最低相關性得分閾值,排除相關性低于特定水平的文檔。此外,使用來自用戶的反饋或先前的相關性評估有助于調整過濾過程,確保只有最相關的文檔被保留用于文本生成。

重新排序

3. 高級RAG技術

高級RAG架構的一些關鍵組件。

示意圖中的綠色元素是我們將進一步討論的核心RAG技術,藍色元素是文本。并非所有的高級RAG理念都能在一個示意圖中輕松呈現(xiàn),例如,各種擴展上下文的方法就被省略了——我們將在后續(xù)內容中深入探討。

讓我們來討論這些技術。

4. 檢索前技術

4.1 PDF解析

對于RAG來說,從文檔中提取信息是不可避免的。確保從源文檔中有效提取內容對于提高最終輸出的質量至關重要。

不要低估這個過程。在實施RAG時,解析過程中信息提取不佳會導致對PDF文件中所含信息的理解和利用受限。

PDF解析過程在RAG中的位置如下圖所示:

PDF解析過程(紅色框)在RAG中的位置

在實際工作中,非結構化數(shù)據(jù)比結構化數(shù)據(jù)豐富得多。如果這些大量的數(shù)據(jù)無法被解析,它們的巨大價值就無法實現(xiàn)。

在非結構化數(shù)據(jù)中,PDF文檔占了大部分。有效地處理PDF文檔也可以極大地幫助管理其他類型的非結構化文檔。

本文主要介紹解析PDF文件的方法,提供了有效解析PDF文檔并盡可能多地提取有用信息的算法和建議。

4.1.1 解析PDF的挑戰(zhàn)

PDF文檔是典型的非結構化文檔,然而,從PDF文檔中提取信息是一個具有挑戰(zhàn)性的過程。

與其說PDF是一種數(shù)據(jù)格式,不如更準確地將其描述為一組打印指令。一個PDF文件由一系列指令組成,這些指令告訴PDF閱讀器或打印機在屏幕或紙張上的何處以及如何顯示符號。這與HTML和docx等文件格式形成對比,后者使用諸如??<p>???、??<w:p>???、??<table>???和??<w:tbl>??等標簽來組織不同的邏輯結構,如下圖所示:

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

Html與PDF的對比

解析PDF文檔的挑戰(zhàn)在于準確提取整個頁面的布局,并將內容(包括表格、標題、段落和圖像)轉換為文檔的文本表示形式。這個過程涉及處理文本提取中的不準確之處、圖像識別以及表格中行列關系的混淆。

4.1.2 如何解析PDF文檔

一般來說,解析PDF有三種方法:

  • 基于規(guī)則的方法:根據(jù)文檔的組織特征確定每個部分的樣式和內容。然而,這種方法的通用性不是很強,因為PDF的類型和布局繁多,無法用預定義的規(guī)則涵蓋所有情況。
  • 基于深度學習模型的方法:比如結合目標檢測和OCR模型的流行解決方案。
  • 基于多模態(tài)大模型解析復雜結構或提取PDF關鍵信息的方法。

4.1.3 基于規(guī)則的方法

最具代表性的工具之一是pypdf,它是一種廣泛使用的基于規(guī)則的解析器,是LangChain和LlamaIndex中解析PDF文件的標準方法。

下面嘗試使用pypdf解析《Attention Is All You Need》論文的第6頁。原始頁面如下圖所示:

《Attention Is All You Need》論文的原始第6頁

代碼如下:

import PyPDF2
filename = "1706.03762.pdf"
pdf_file = open(filename, 'rb')
reader = PyPDF2.PdfReader(pdf_file)
page_num = 5
page = reader.pages[page_num]
text = page.extract_text()
print('--------------------------------------------------')
print(text)
pdf_file.close()

執(zhí)行結果如下(為簡潔起見,省略了其余部分):

(py) $ pip list | grep pypdf
pypdf                    3.17.4
pypdfium2                4.26.0
(py) pypdf_test.py
Table 1: Maximum path lengths, per-layer complexity and minimum number of sequential operations
for different layer types. nis the sequence length, dis the representation dimension, kis the kernel
size of convolutions and rthe size of the neighborhood in restricted self-attention.
Layer Type Complexity per Layer Sequential Maximum Path Length
Operations
Self-Attention O(n2·d) O(1) O(1)
Recurrent O(n·d2) O(n) O(n)
Convolutional O(k·n·d2) O(1) O(logk(n))
Self-Attention (restricted) O(r·n·d) O(1) O(n/r)
3.5 Positional Encoding
Since our model contains no recurrence and no convolution, in order for the model to make use of the
order of the sequence, we must inject some information about the relative or absolute position of the
tokens in the sequence. To this end, we add "positional encodings" to the input embeddings at the
bottoms of the encoder and decoder stacks. The positional encodings have the same dimension dmodel
as the embeddings, so that the two can be summed. There are many choices of positional encodings,
learned and fixed [9].
In this work, we use sine and cosine functions of different frequencies:
PE(pos,2i)=sin(pos/100002i/d model)
PE(pos,2i+1)=cos(pos/100002i/d model)
where posis the position and iis the dimension. That is, each dimension of the positional encoding
corresponds to a sinusoid. The wavelengths form a geometric progression from 2πto10000·2π. We
chose this function because we hypothesized it would allow the model to easily learn to attend by
relative positions, since for any fixed offset k,PEpos+kcan be represented as a linear function of
PEpos.
...
...
...

根據(jù)PyPDF的檢測結果可以發(fā)現(xiàn),它將PDF中的字符序列序列化為一個長序列,沒有保留結構信息。換句話說,它將文檔的每一行都視為由換行符“\n”分隔的序列,這使得它無法準確識別段落或表格。

這個限制是基于規(guī)則的方法的固有特征。

4.1.4 基于深度學習模型的方法

這種方法的優(yōu)點是能夠準確識別整個文檔的布局,包括表格和段落,甚至可以理解表格內部的結構。這意味著它可以將文檔劃分為定義明確、完整的信息單元,同時保留預期的含義和結構。

然而,它也有一些局限性。目標檢測和OCR階段可能很耗時,因此建議使用GPU或其他加速設備,并采用多進程和多線程進行處理。

這種方法涉及目標檢測和OCR模型,我測試了幾個有代表性的開源框架:

  • Unstructured:它已集成到langchain中。啟用infer_table_structure=True的hi_res策略的表格識別效果很好,但fast策略表現(xiàn)不佳,因為它不使用目標檢測模型,會誤識別許多圖像和表格。
  • Layout-parser:如果需要識別復雜結構的PDF,建議使用最大的模型以獲得更高的準確性,盡管它可能會稍微慢一些。此外,Layout-parser的模型在過去兩年似乎沒有更新。
  • PP-StructureV2:使用各種模型組合進行文檔分析,性能高于平均水平。其架構如下圖所示:

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

所提出的PP-StructureV2框架。它包含兩個子系統(tǒng):布局信息提取和關鍵信息提取。

4.2 上下文豐富

這里的理念是檢索較小的文本塊以提升搜索質量,但為大語言模型增添周圍的上下文信息,以便其進行推理。

有兩種選擇:一種是通過檢索到的較小文本塊周圍的句子來擴展上下文;另一種是將文檔遞歸地分割成多個較大的父文本塊,每個父文本塊包含較小的子文本塊。

4.2.1 句子窗口檢索

在這種方案中,文檔中的每個句子都被單獨嵌入,這使得查詢與上下文的余弦距離搜索具有很高的準確性。

在獲取到最相關的單個句子后,為了更好地對找到的上下文進行推理,我們在檢索到的句子前后擴展k個句子的上下文窗口,然后將這個擴展后的上下文發(fā)送給大語言模型。

綠色部分是在索引中搜索時找到的句子嵌入,整個黑色加綠色的段落被輸入到大語言模型中,以在對提供的查詢進行推理時擴大其上下文。

4.2.2 自動合并檢索器(又名父文檔檢索器)

這個思路與句子窗口檢索器非常相似——搜索更細粒度的信息,然后在將上下文輸入到大語言模型進行推理之前擴展上下文窗口。文檔被分割成較小的子文本塊,這些子文本塊引用較大的父文本塊。

文檔被分割成一個文本塊層次結構,然后將最小的葉文本塊發(fā)送到索引中。在檢索時,我們檢索k個葉文本塊,如果有n個文本塊引用同一個父文本塊,我們就用這個父文本塊替換它們,并將其發(fā)送給大語言模型以生成答案。

在檢索時先獲取較小的文本塊,然后,如果在前k個檢索到的文本塊中有超過n個文本塊鏈接到同一個父節(jié)點(較大的文本塊),我們就用這個父節(jié)點替換輸入到大語言模型的上下文——這就像是自動將幾個檢索到的文本塊合并成一個較大的父文本塊,因此得名。需要注意的是——搜索僅在子節(jié)點索引內進行。

4.3 查詢改寫

在檢索增強生成(RAG)中,我們經(jīng)常會遇到用戶原始查詢的問題,比如措辭不準確或缺乏語義信息。例如,像 “2020年NBA冠軍是洛杉磯湖人隊!告訴我什么是Langchain框架?” 這樣的查詢,如果直接進行搜索,大語言模型可能會給出錯誤或無法回答的響應。

因此,使用戶查詢的語義空間與文檔的語義空間保持一致至關重要。查詢改寫技術可以有效地解決這個問題。它在RAG中的作用如下圖所示:

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

查詢改寫

從位置角度來看,查詢改寫是一種檢索前的方法。請注意,此圖大致展示了查詢改寫在RAG中的位置。在接下來的部分中,我們將看到一些算法可能會改進這個過程。

查詢改寫是使查詢和文檔語義對齊的關鍵技術。例如:

  • 假設文檔嵌入(HyDE):通過假設文檔使查詢和文檔的語義空間對齊。
  • 改寫-檢索-讀取:提出了一種與傳統(tǒng)檢索和讀取順序不同的框架,側重于查詢改寫。
  • 回溯提示法(Step-Back Prompting):允許大語言模型基于高級概念進行抽象推理和檢索。
  • Query2Doc:使用大語言模型的一些提示生成偽文檔,然后將它們與原始查詢合并以構建新的查詢。
  • ITER-RETGEN:提出了一種將前一次生成的結果與前一個查詢相結合的方法。然后檢索相關文檔并生成新的結果。這個過程會重復多次以獲得最終結果。

讓我們深入了解這些方法的細節(jié)。

4.3.1 假設文檔嵌入(HyDE)

論文《Precise Zero-Shot Dense Retrieval without Relevance Labels》提出了一種基于假設文檔嵌入(HyDE)的方法,主要過程如下圖所示:

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

HyDE模型

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

文檔片段已展示。HyDE可用于所有類型的查詢,且無需更改底層的GPT-3和Contriever/mContriever模型。來源:《Precise Zero-Shot Dense Retrieval without Relevance Labels》。

總之,雖然HyDE引入了一種新的查詢改寫方法,但它確實存在一些局限性。它不依賴于查詢嵌入的相似性,而是強調一個文檔與另一個文檔的相似性。然而,如果語言模型對該主題不夠熟悉,它可能并不總能產生最佳結果,有可能導致錯誤增加。

4.3.2 改寫-檢索-讀取

這個想法來自論文《Query Rewriting for Retrieval-Augmented Large Language Models》。它認為,原始查詢,特別是在現(xiàn)實場景中,可能并不總是最適合大語言模型進行檢索的。

因此,該論文建議我們首先使用大語言模型改寫查詢。然后再進行檢索和答案生成,而不是直接從原始查詢中檢索內容并生成答案,如圖4(b)所示:

從左到右,(a)標準的檢索-讀取方法,(b)將大語言模型用作查詢改寫器的改寫-檢索-讀取流程,(c)帶有可訓練改寫器的流程

圖4:從左到右,(a)標準的檢索-讀取方法,(b)將大語言模型用作查詢改寫器的改寫-檢索-讀取流程,(c)帶有可訓練改寫器的流程。來源:《Query Rewriting for Retrieval-Augmented Large Language Models》。

為了說明查詢改寫如何影響上下文檢索和預測性能,考慮這個例子:“2020年NBA冠軍是洛杉磯湖人隊!告訴我什么是Langchain框架?” 這個查詢通過改寫得到了準確處理。

4.3.3 回溯提示法(Step-Back Prompting)

回溯提示法(STEP-BACK PROMPTING)是一種簡單的提示技術,它使大語言模型能夠進行抽象,從包含特定細節(jié)的實例中提取高級概念和基本原理。其思路是將 “回溯問題” 定義為從原始問題派生出來的更抽象的問題。

例如,如果一個查詢包含大量細節(jié),大語言模型很難檢索到相關事實來解決任務。如下圖第一個例子所示,對于物理問題 “如果理想氣體的溫度升高2倍,體積增大8倍,壓力P會發(fā)生什么變化?” 大語言模型在直接推理這個問題時,可能會偏離理想氣體定律的第一原理。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

回溯提示法的示例

回溯提示法的示例,包含由概念和原理引導的抽象和推理兩個步驟。頂部:MMLU高中物理的一個例子,通過抽象檢索到理想氣體定律的第一原理。底部:TimeQA的一個例子,教育歷史的高級概念是抽象的結果。左邊:PaLM-2L無法回答原始問題。思維鏈提示法在中間推理步驟中遇到錯誤(紅色突出顯示)。右邊:PaLM-2L通過回溯提示法成功回答了問題。來源:《TAKE A STEP BACK: EVOKING REASONING VIA ABSTRACTION IN LARGE LANGUAGE MODELS》。

從這種抽象中得出的推理有助于防止在圖5(左)中所示的中間步驟(思維鏈)中出現(xiàn)錯誤。

總之,回溯提示法涉及兩個基本步驟:

  1. 抽象:最初,我們促使大語言模型提出一個關于高級概念或原理的寬泛問題,而不是直接回答查詢。然后我們檢索關于該概念或原理的相關事實。
  2. 推理:大語言模型可以根據(jù)這些關于高級概念或原理的事實推導出原始問題的答案。我們將此稱為抽象推理。

4.3.4 Query2doc

論文《Query2doc: Query Expansion with Large Language Models》介紹了Query2doc。它使用大語言模型的一些提示生成偽文檔,然后將它們與原始查詢相結合,創(chuàng)建一個新的查詢,如下圖所示:

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

Query2doc少樣本提示法

在密集檢索中,新的查詢q+是原始查詢q和偽文檔d’ 的簡單連接,用[SEP]分隔:q+ = concat(q, [SEP], d’)。

Query2doc認為,HyDE隱含地假設了真實文檔和偽文檔用不同的詞表達相同的語義,但這對于某些查詢可能并不成立。

Query2doc和HyDE的另一個區(qū)別是,Query2doc訓練了一個有監(jiān)督的密集檢索器,如論文中所述。

目前,在Langchain或LlamaIndex中尚未發(fā)現(xiàn)Query2doc的復現(xiàn)。

4.3.5 ITER-RETGEN

ITER-RETGEN方法使用生成的內容來指導檢索。它在 “檢索-讀取-檢索-讀取” 流程中迭代地實現(xiàn) “檢索增強生成” 和 “生成增強檢索”。

ITER-RETGEN迭代檢索和生成

ITER-RETGEN迭代檢索和生成。在每次迭代中,ITER-RETGEN利用前一次迭代的模型輸出作為特定上下文,幫助檢索更相關的知識,這可能有助于改進模型生成(例如,在圖中糾正赫西·霍根的身高)。為簡潔起見,我們在圖中僅展示兩次迭代。實線箭頭將查詢與檢索到的知識連接起來,虛線箭頭表示檢索增強生成。來源:《Enhancing Retrieval-Augmented Large Language Models with Iterative Retrieval-Generation Synergy》。

如上圖所示,對于給定的問題q和檢索語料庫D = k6zqhab033oa(其中d代表一個段落),ITER-RETGEN連續(xù)執(zhí)行T次檢索生成迭代。

在每次迭代t中,我們首先使用前一次迭代的生成結果yt-1,將其與q相結合,并檢索前k個段落。接下來,我們促使大語言模型M生成一個輸出yt,該輸出將檢索到的段落(表示為Dyt-1||q)和q納入提示中。因此,每次迭代可以表述如下:

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

最后一個輸出yt將作為最終響應產生。

與Query2doc類似,目前在Langchain或LlamaIndex中尚未發(fā)現(xiàn)其復現(xiàn)。

4.4 語義分塊

解析文檔后,我們可以獲得結構化或半結構化數(shù)據(jù)?,F(xiàn)在的主要任務是將它們分解為較小的塊,以提取詳細特征,然后嵌入這些特征來表示它們的語義。它在RAG中的位置如下圖所示:

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

最常用的分塊方法是基于規(guī)則的,采用固定塊大小或相鄰塊重疊等技術。對于多層次文檔,我們可以使用Langchain提供的RecursiveCharacterTextSplitter,它允許定義多層次分隔符。

然而,在實際應用中,由于預定義規(guī)則(塊大小或重疊部分的大?。┹^為僵化,基于規(guī)則的分塊方法很容易導致諸如檢索上下文不完整或塊大小過大包含噪聲等問題。

因此,對于分塊來說,最理想的方法顯然是基于語義進行分塊。語義分塊旨在確保每個塊包含盡可能多的語義獨立信息。

本文將探索語義分塊的方法,解釋其原理和應用。我們將介紹三種類型的方法:

  1. 基于嵌入的方法
  2. 基于模型的方法
  3. 基于大語言模型的方法

4.4.1 基于嵌入的方法

LlamaIndex和Langchain都提供了基于嵌入的語義分塊器。其算法思路大致相同。

4.4.2 基于模型的方法

4.4.2.1 樸素BERT

回想一下BERT的預訓練過程。設計了一個二元分類任務——下一句預測(NSP),來教會模型兩個句子之間的關系。在這里,兩個句子同時輸入到BERT中,模型預測第二個句子是否跟隨第一個句子。

我們可以應用這個原理來設計一種簡單的分塊方法。對于一個文檔,將其拆分為句子。然后,使用滑動窗口將兩個相鄰句子輸入到BERT模型中進行NSP判斷,如圖3所示:

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

如果預測分數(shù)低于預設閾值,則表明兩個句子之間的語義關系較弱。這可以作為一個文本分割點,如圖中句子2和句子3之間所示。

這種方法的優(yōu)點是可以直接使用,無需訓練或微調。

然而,這種方法在確定文本分割點時只考慮了前后句子,忽略了更遠片段的信息。此外,這種方法的預測效率相對較低。

4.4.2.2 跨段注意力(Cross Segment Attention)

論文《Text Segmentation by Cross Segment Attention》提出了三種關于跨段注意力的模型,如圖4所示:

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

跨段注意力模型

在跨段BERT模型(左)中,我們將潛在分割點周圍的局部上下文(左邊k個標記和右邊k個標記)輸入到模型中。在BERT+雙向長短期記憶網(wǎng)絡(Bi-LSTM)模型(中)中,我們首先使用BERT模型對每個句子進行編碼,然后將句子表示輸入到Bi-LSTM中。在分層BERT模型(右)中,我們首先使用BERT對每個句子進行編碼,然后將輸出的句子表示輸入到另一個基于Transformer的模型中。來源:《Text Segmentation by Cross Segment Attention》。

上圖(a)展示了跨段BERT模型,它將文本分割定義為一個逐句分類任務。潛在分割點的上下文(兩側的k個標記)被輸入到模型中。對應于[CLS]的隱藏狀態(tài)被傳遞到softmax分類器,以對潛在分割點的分割進行決策。

該論文還提出了另外兩個模型。一個使用BERT模型獲取每個句子的向量表示。然后將多個連續(xù)句子的這些向量表示輸入到Bi-LSTM(圖(b))或另一個BERT(圖(c))中,以預測每個句子是否是文本分割邊界。

當時,這三個模型取得了最先進的結果,如下圖所示:

文本分割和語篇分割的測試集結果

圖5:文本分割和語篇分割的測試集結果。來源:《Text Segmentation by Cross Segment Attention》。

4.4.2.3 SeqModel

跨段模型獨立地對每個句子進行向量化,沒有考慮任何更廣泛的上下文信息。論文《Sequence Model with Self-Adaptive Sliding Window for Efficient Spoken Document Segmentation》中提出的SeqModel對其進行了進一步改進。

SeqModel使用BERT同時對幾個句子進行編碼,在計算句子向量之前對更長的上下文內的依賴關系進行建模。然后它預測每個句子之后是否發(fā)生文本分割。此外,該模型利用自適應滑動窗口方法在不犧牲準確性的情況下提高推理速度。SeqModel的示意圖如下所示:

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

SeqModel架構和自適應滑動窗口推理方法  來源:《Sequence Model with Self-Adaptive Sliding Window for Efficient Spoken Document Segmentation》

4.4.3 基于大語言模型的方法

論文《Dense X Retrieval: What Retrieval Granularity Should We Use?》引入了一種新的檢索單元——命題。命題被定義為文本中的原子表達式,每個命題封裝一個獨特的事實,并以簡潔、自包含的自然語言格式呈現(xiàn)。

那么我們如何獲得這個所謂的命題呢?在論文中,它是通過構建提示并與大語言模型交互來實現(xiàn)的。

LlamaIndex和Langchain都實現(xiàn)了相關算法,下面以LlamaIndex為例進行演示。

一般來說,這種使用大語言模型構建命題的分塊方法實現(xiàn)了更精細的分塊。它與原始節(jié)點形成了從小(命題)到大(原始文本塊)的索引結構,從而為語義分塊提供了一種新思路。

然而,這類方法依賴大語言模型,成本相對較高。

如果條件允許,可以持續(xù)采用并關注基于大語言模型的方法。

4.5 數(shù)據(jù)修改

檢索增強雙指令調優(yōu)(Retrieval Augmented Dual Instruction Tuning,RA-DIT)和背誦增強生成(RECITation-augmented gEneration,RECITE)強調通過內部數(shù)據(jù)修改進行增強。

RA-DIT區(qū)分了用于大語言模型的微調數(shù)據(jù)集和檢索器的數(shù)據(jù)集,旨在增強大語言模型的上下文理解能力,以及檢索器與查詢的匹配能力。

另一方面,RECITE利用段落提示和合成的問題 - 段落對,來增加生成的背誦內容和回復的多樣性及相關性。這種方法試圖拓寬模型的知識庫并提高其回復的準確性。

用于改進零樣本評估的通用提示檢索(Universal Prompt Retrieval for Improving Zero-Shot Evaluation,UPRISE)和“生成而非檢索”(Generate rather than Retrieve,GENREAD)則致力于優(yōu)化外部數(shù)據(jù)。

UPRISE將原始任務數(shù)據(jù)轉換為結構化格式,并優(yōu)化提示選擇,以提高檢索結果。

相比之下,GENREAD采用的基于聚類的提示方法,會根據(jù)問題生成文檔并進行聚類,以消除不相關數(shù)據(jù),同時用多樣化的上下文信息豐富輸入內容。這項技術旨在通過為生成模型提供更豐富的信息,來提升其性能。

此外,KnowledGPT致力于通過實體鏈接,用結構化、語義豐富的信息擴充原始文本數(shù)據(jù)。這種擴充過程不僅使數(shù)據(jù)結構更緊密、更易于查詢,還提高了模型的檢索效率。它利用精確的鏈接知識,增強模型的理解能力和生成相關回復的能力,從而提升其整體性能。

4.6 查詢路由

查詢路由是指大語言模型根據(jù)用戶查詢做出決策,決定下一步操作的過程。這些操作通常包括總結信息、根據(jù)某些數(shù)據(jù)索引進行搜索,或者嘗試多種不同路徑,然后將它們的輸出合成為一個答案。

查詢路由器還用于選擇索引,或者更廣泛地說,選擇數(shù)據(jù)存儲位置,以確定將用戶查詢發(fā)送到何處。比如,我們可能有多種數(shù)據(jù)來源,例如經(jīng)典的向量存儲、圖數(shù)據(jù)庫或關系數(shù)據(jù)庫;又或者我們有索引層級結構,對于多文檔存儲,一個典型的例子是擁有一個摘要索引和另一個文檔塊向量索引。

定義查詢路由器包括設置它可以做出的選擇。

路由選項的選擇是通過調用大語言模型來完成的,模型以預定義的格式返回結果,這些結果用于將查詢路由到指定的索引。如果涉及復雜的行為,查詢會被路由到子鏈,甚至如下面多文檔代理方案所示,被路由到其他智能體。

LlamaIndex和LangChain都支持查詢路由功能。

5. 檢索技術

5.1 融合檢索/混合搜索

這是一個相對成熟的思路,即結合基于關鍵詞的傳統(tǒng)搜索(如像tf-idf這樣的稀疏檢索算法,或者搜索行業(yè)標準的BM25算法)和現(xiàn)代語義搜索或向量搜索的優(yōu)勢,并將其融合在一個檢索結果中。

這里唯一的技巧是如何恰當?shù)亟Y合具有不同相似度分數(shù)的檢索結果。這個問題通常借助逆序排名融合(Reciprocal Rank Fusion)算法來解決,該算法會對檢索結果重新排序,以生成最終輸出。

在LangChain中,這一功能在Ensemble Retriever類中實現(xiàn)。通過組合我們定義的一系列檢索器(例如,一個faiss向量索引和一個基于BM25的檢索器),并使用RRF算法進行重新排序。

LlamaIndex中實現(xiàn)的方式也非常相似。

混合搜索通常能提供更好的檢索結果,因為它結合了兩種互補的搜索算法,同時考慮了查詢與存儲文檔之間的語義相似性和關鍵詞匹配情況。

6. 檢索后技術

6.1 提示壓縮

RAG過程可能會遇到兩個問題:

  • 大語言模型通常存在上下文長度限制。因此,輸入文本越長,處理過程就越耗時且成本越高。
  • 檢索到的上下文可能并不總是有用的。有可能一個較大文本塊中只有一小部分與答案相關。在某些情況下,可能需要組合多個文本塊才能回答特定問題。即使經(jīng)過重新排序,這個問題仍然存在。

針對大語言模型的提示壓縮是解決這些問題的一種方法。本質上,其目標是保留提示中的關鍵信息,使輸入的令牌更有價值。這種方法可以提高模型的性能并降低成本,如下圖右下角所示。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

值得注意的是,如上圖中紫色虛線所示,一些壓縮器也可以直接應用于檢索到的上下文。

總體而言,提示壓縮方法主要可分為四類:

  • 基于信息熵的方法,如Selective Context、LLMLingua、LongLLMLingua。這些方法使用一個小型語言模型來計算原始提示中每個令牌的自信息或困惑度,然后刪除困惑度較低的令牌。
  • 基于軟提示調整的方法,如AutoCompressor和GIST。這些方法需要對大語言模型的參數(shù)進行微調,以使其適用于特定領域,但不能直接應用于黑盒大語言模型。
  • 先從大語言模型進行數(shù)據(jù)蒸餾,然后訓練模型生成更具解釋性的文本摘要。這些摘要可以在不同語言模型之間轉移使用,并應用于不需要梯度更新的黑盒大語言模型。代表性方法有LLMLingua - 2和RECOMP。
  • 基于令牌合并或令牌修剪的方法,如ToMe和AdapLeR。這些方法通常需要在推理過程中對模型進行微調或生成中間結果。

鑒于第四類方法最初是為像ViT或BERT這樣的較小模型提出的,本文將介紹前三類方法中代表性算法的原理。

6.1.1 選擇性上下文(Selective Context)

下圖展示了大語言模型在無需完整上下文或完整對話歷史的情況下,也能響應用戶查詢。即使省略了相關信息,大語言模型仍然可以生成預期的回復。這可能歸因于大語言模型能夠從上下文線索以及預訓練期間獲得的先驗知識中推斷出缺失信息。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

因此,通過過濾掉信息含量較低的內容來優(yōu)化上下文長度,同時又不影響性能是可行的。這就是選擇性上下文的核心思路。

選擇性上下文使用一個小型語言模型(SLM)來確定給定上下文中詞匯單元(如句子、短語或令牌)的自信息,然后利用這些自信息來評估它們的信息價值。通過有選擇地保留自信息較高的內容,選擇性上下文為大語言模型提供了更簡潔高效的上下文表示,同時不會影響其在不同任務上的性能。

6.1.2 LLMLingua

LLMLingua指出,選擇性上下文常常忽略了壓縮內容之間的相互聯(lián)系,以及大語言模型與用于提示壓縮的小型語言模型之間的相關性。LLMLingua正是針對這些問題而設計的。

具體來說,如下圖所示,LLMLingua使用一個預算控制器,為原始提示的各個組成部分(如指令、示例和問題)動態(tài)分配不同的壓縮率。它還進行粗粒度的示例級壓縮,以在高壓縮率下仍能保持語義完整性。此外,LLMLingua引入了一種令牌級迭代算法,用于細粒度的提示壓縮。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

與選擇性上下文相比,LLMLingua可以更有效地保留提示中的關鍵信息,同時考慮令牌之間的條件依賴關系。它可以將提示壓縮20倍。

6.1.3 指令調整(Instruction Tuning)

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

(LLMLingua方法的框架圖)展示了指令調整也是LLMLingua中的關鍵步驟。其目的是最小化用于壓縮提示的小型語言模型與大語言模型之間的分布差異。

6.1.4 LongLLMLingua

LLMLingua的問題在于,它在壓縮過程中沒有考慮用戶問題,這可能會保留不相關的信息。

LongLLMLingua旨在通過將用戶問題納入壓縮過程來解決這個問題。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

如上圖所示,LongLLMLingua提出了四個新組件,以增強大語言模型對關鍵信息的感知:

  • 問題感知的粗粒度和細粒度壓縮
  • 文檔重新排序機制
  • 動態(tài)壓縮率
  • 子序列恢復算法

6.1.5 AutoCompressor

與前面提到的方法不同,AutoCompressor是一種基于軟提示的方法。

它通過擴展詞匯表,并利用“摘要令牌”和“摘要向量”巧妙地對現(xiàn)有模型進行微調,以壓縮上下文信息。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

AutoCompressor通過遞歸生成摘要向量來處理長文檔,這些摘要向量作為軟提示傳遞給后續(xù)的所有文本段。

上圖展示了AutoCompressor的架構,其操作步驟如下:

  1. 擴展詞匯表:這一步驟包括向模型的現(xiàn)有詞匯表中添加“摘要令牌”。這些令牌使模型能夠將大量信息壓縮成較小的向量。
  2. 分割文檔:待處理的文檔被分割成小的文本段,每個文本段都附加有摘要令牌。這些令牌還攜帶前序文本段的摘要信息,形成摘要積累。
  3. 微調訓練:使用無監(jiān)督訓練方法,利用“下一個單詞預測”任務對模型進行微調。該任務的目標是根據(jù)當前令牌之前的令牌和當前文本段之前的摘要向量,預測下一個單詞。
  4. 反向傳播:AutoCompressor對每個文本段使用時間反向傳播(BPTT)和梯度檢查點技術,以最小化計算圖的大小。對整個文檔進行反向傳播,使模型能夠學習完整上下文的關聯(lián)。

6.1.6 LLMLingua-2

LLMLingua - 2指出,基于像LLaMa - 7B這樣的因果語言模型的信息熵來刪除令牌或詞匯單元進行提示壓縮,存在兩個問題:

  • 用于確定信息熵的小型語言模型與提示壓縮的目標不一致。
  • 它僅利用單向上下文,這可能無法涵蓋提示壓縮所需的所有信息。

這些問題的核心在于,信息熵可能并非壓縮的最佳度量方式。

LLMLingua - 2的總體架構如下圖所示:

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

為了解決問題1,LLMLingua - 2引入了數(shù)據(jù)蒸餾過程。這個過程從大語言模型中提取知識,以在不丟失關鍵信息的情況下壓縮提示。同時,它構建了一個提取式文本壓縮數(shù)據(jù)集。在這個數(shù)據(jù)集上進行訓練有助于使小型語言模型有效地與提示壓縮目標對齊。

為了解決問題2,LLMLingua - 2將提示壓縮視為一個令牌分類問題。這種方法確保了壓縮后的提示與原始提示的保真度。它使用Transformer編碼器作為基礎架構,從完整的雙向上下文中捕獲提示壓縮所需的所有信息。

6.1.7 RECOMP(檢索、壓縮、前置,Retrieve, COMpress, Prepend)

RECOMP引入了兩種經(jīng)過訓練的壓縮器:提取式壓縮器和抽象式壓縮器。提取式壓縮器從檢索到的文檔中選擇有用的句子,而抽象式壓縮器則結合多個文檔的信息來生成摘要。

在本文討論的方法中,LongLLMLingua可能是一個更優(yōu)的選擇,我們已經(jīng)在研究項目中實現(xiàn)了它。此外,LLMLingua - 2也可以嘗試,它在速度和內存使用方面具有優(yōu)勢。

6.2 重新排序

重新排序在檢索增強生成(RAG)過程中起著至關重要的作用。在基礎的RAG方法中,可能會檢索到大量的上下文,但并非所有這些上下文都與問題相關。重新排序可以對文檔進行重新排序和篩選,將相關的文檔置于前列,從而提高RAG的有效性。

6.2.1 重新排序介紹

在RAG的重新排序中,任務是評估這些上下文的相關性,并將最有可能提供準確和相關答案的上下文(紅色框標記的部分)排在前面。

如下圖所示,重新排序的任務就像一個智能過濾器。當檢索器從索引集合中檢索出多個上下文時,這些上下文與用戶查詢的相關性可能各不相同。有些上下文可能非常相關(用紅色框突出顯示),而其他上下文可能只是略微相關,甚至不相關(分別用綠色和藍色框突出顯示)。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

重新排序的任務是評估這些上下文的相關性,并優(yōu)先考慮那些最有可能提供準確和相關答案的上下文。這使得大語言模型在生成答案時,能夠優(yōu)先處理排名靠前的上下文,從而提高回復的準確性和質量。

簡單來說,重新排序就像是在開卷考試中,幫助我們從一堆學習資料中選擇最相關的參考內容,以便更高效、準確地回答問題。

本文描述的重新排序方法主要可分為以下兩類:

  • 重新排序模型:這些模型考慮文檔與查詢之間的交互特征,以更準確地評估它們的相關性。
  • 大語言模型:大語言模型的出現(xiàn)為重新排序開辟了新的可能性。通過深入理解整個文檔和查詢,大語言模型能夠更全面地捕捉語義信息。

6.2.2 使用重新排序模型作為重新排序器

與嵌入模型不同,重新排序模型將查詢和上下文作為輸入,直接輸出相似度分數(shù),而不是嵌入向量。需要注意的是,重新排序模型是使用交叉熵損失進行優(yōu)化的,這使得相關性分數(shù)不受特定范圍的限制,甚至可以是負數(shù)。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

目前,可用的重新排序模型并不多。一種選擇是Cohere提供的在線模型,可以通過API訪問。也有一些開源模型,如bge-reranker-base和bge-reranker-large等。

使用命中率(Hit Rate)和平均倒數(shù)排名(Mean Reciprocal Rank,MRR)指標進行評估的結果如下圖所示:

從這個評估結果中,我們可以看出:

  • 無論使用哪種嵌入模型,重新排序都顯示出更高的命中率和MRR,這表明重新排序的顯著作用。
  • 目前,最好的重新排序模型是Cohere的模型,但它是付費服務。開源的bge-reranker-large模型與Cohere的模型能力相似。
  • 嵌入模型和重新排序模型的組合也會產生影響,因此開發(fā)人員在實際過程中可能需要嘗試不同的組合。

6.2.3 使用大語言模型作為重新排序器

現(xiàn)有的涉及大語言模型的重新排序方法大致可分為三類:使用重新排序任務微調大語言模型、使用提示讓大語言模型進行重新排序,以及在訓練過程中使用大語言模型進行數(shù)據(jù)增強。

使用提示讓大語言模型進行重新排序的方法成本較低。下面以已集成到LlamaIndex中的RankGPT為例進行演示。

RankGPT的思路是使用大語言模型(如ChatGPT或GPT-4等其他大語言模型)進行零樣本列表式段落重新排序。它應用排列生成方法和滑動窗口策略,高效地對段落進行重新排序。

如下面的圖所示,論文提出了三種可行的方法。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

前兩種方法是常規(guī)方法,即給每個文檔打分,然后根據(jù)這個分數(shù)對所有段落進行排序。

第三種方法,即排列生成,是本文提出的。具體來說,該模型不依賴外部分數(shù),而是直接對所有候選段落進行端到端的排序。換句話說,它直接利用大語言模型的語義理解能力,對所有候選段落進行相關性排名。

然而,通常候選文檔的數(shù)量非常大,而大語言模型的輸入是有限的。因此,通常無法一次性輸入所有文本。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

因此,如上圖所示,引入了滑動窗口方法,該方法遵循冒泡排序的思路。每次僅對前4個文本進行排序,然后移動窗口,對后續(xù)4個文本進行排序。遍歷整個文本后,我們可以得到性能最佳的前幾個文本。

6.3 過濾

知識鏈(Chain-of-Knowledge,COK)提出了漸進式推理修正技術,旨在利用檢索到的知識迭代優(yōu)化推理依據(jù)。這個方法構成了一個持續(xù)優(yōu)化的過程,顯著提高了內容生成中所用信息的相關性和質量。

Self-RAG引入了自我反思機制,以有效地過濾掉不相關的內容。通過使用批判令牌,這種方法評估檢索到的段落的相關性、支持度和實用性,確保只有高質量的信息被整合到內容生成過程中。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

此外,帶令牌過濾的解碼器融合(Fusion-in-Decoder with Token Filtering,F(xiàn)iD-TF)(上圖)和RECOMP致力于從檢索到的文檔中去除不相關或冗余的令牌和信息。FiD-TF采用動態(tài)機制來識別和消除不必要的令牌,提高信息處理效率。而RECOMP則將文檔壓縮成簡潔的摘要,專注于為生成過程選擇最相關的內容。這些方法通過確保僅使用相關和有用的信息,簡化了內容生成工作流程,從而提高了生成內容的整體質量和相關性。

6.4 Self-RAG

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

讓我們考慮一個常見的場景:參加開卷考試。我們通常有兩種策略:

  • 方法1:對于熟悉的題目,快速作答;對于不熟悉的題目,打開參考書查找,快速找到相關部分,在腦海中整理和總結,然后在試卷上作答。
  • 方法2:對于每一道題目,都查閱書籍。找到相關章節(jié),在腦海中整理和總結,然后在試卷上寫下答案。

顯然,方法1是更優(yōu)的選擇。方法2可能會耗費時間,還可能引入不相關或錯誤的信息,這可能會導致困惑和錯誤,即使是在我們原本熟悉的領域。

然而,方法2是經(jīng)典RAG過程的體現(xiàn),而方法1代表了Self-RAG過程,本文將進一步探討Self-RAG。

下圖展示了RAG和Self-RAG主要過程的對比:

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

Self-RAG由三個步驟組成:

  1. 按需檢索:當模型需要檢索時,例如查詢 “美國各州的名字是怎么來的?”(上圖右上角),模型的輸出將包含一個 [Retrieve] 令牌。這表明需要檢索與該查詢相關的內容。相反,當被要求寫 “寫一篇關于你最棒的暑假的文章”(上圖右下角)時,模型會選擇直接生成答案,而無需檢索。
  2. 并行生成:模型使用提示和檢索到的內容來生成輸出。在這個過程中,有三種反思令牌會表明檢索到的內容的相關性。
  3. 評估與選擇:對步驟2中生成的內容進行評估,并選擇最佳的部分作為輸出。

6.5 校正檢索增強生成(Corrective RAG)

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

讓我們考慮一個常見的場景:參加開卷考試。通常,我們有三種策略:

  • 方法1:對于熟悉的題目快速作答。對于不熟悉的題目,查閱參考書。快速定位相關部分,在腦海中組織和總結,然后在試卷上寫下答案。
  • 方法2:對于每一個題目,都查閱書籍。找到相關部分,在腦海中總結,然后在試卷上寫下答案。
  • 方法3:對于每一個題目,查閱書籍并確定相關部分。在形成答案之前,將收集到的信息分為三類:正確、錯誤和模糊。分別處理每一類信息。然后,基于這些處理后的信息,在腦海中編輯和總結。最后在試卷上寫下答案。

方法1涉及Self-RAG,而方法2是經(jīng)典的RAG過程。

最后,本文將介紹方法3,即校正檢索增強生成(Corrective Retrieval Augmented Generation,CRAG)。

6.5.1 CRAG的動機

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

這些例子表明,低質量的檢索器容易引入大量不相關的信息,這會阻礙生成器獲取準確的知識,并可能誤導它們。

上圖說明,大多數(shù)傳統(tǒng)的RAG方法沒有考慮文檔與問題的相關性,只是簡單地合并檢索到的文檔。這可能會引入不相關的信息,從而阻礙模型獲取準確的知識,并可能誤導它,導致產生幻覺的問題。

此外,大多數(shù)傳統(tǒng)的RAG方法將整個檢索到的文檔作為輸入。然而,這些檢索到的文檔中很大一部分文本通常對生成來說并非必要,不應該同等地參與到RAG中。

6.5.2 CRAG的關鍵思想

CRAG設計了一個輕量級的檢索評估器,用于評估針對特定查詢檢索到的文檔的整體質量。它還使用網(wǎng)絡搜索作為補充工具來改進檢索結果。

CRAG是即插即用的,可以與各種基于RAG的方法無縫集成。其整體架構如下圖所示:

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

CRAG在RAG中的位置

如圖所示,CRAG通過引入一個檢索評估器來評估檢索到的文檔與查詢之間的關系,從而增強了傳統(tǒng)的RAG。

可能有3種判斷結果:

  • 如果判斷為“正確”,這意味著檢索到的文檔包含查詢所需的必要內容,那么使用知識精煉算法來重寫檢索到的文檔。
  • 如果檢索到的文檔“錯誤”,這意味著查詢和檢索到的文檔不相關。因此,我們不能將該文檔發(fā)送給大語言模型。在CRAG中,會使用網(wǎng)絡搜索引擎來檢索外部知識。
  • 對于“模糊”的情況,這意味著檢索到的文檔可能接近但不足以提供答案。在這種情況下,需要通過網(wǎng)絡搜索獲取更多信息。所以會同時使用知識精煉算法和搜索引擎。

最后,經(jīng)過處理的信息會被轉發(fā)給大語言模型以生成回復。下圖正式描述了這個過程:

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

注意,網(wǎng)絡搜索不會直接使用用戶輸入的查詢進行搜索。相反,它會構建一個提示,并以少樣本的方式呈現(xiàn)給GPT-3.5 Turbo,以獲得用于搜索的查詢。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

6.5.3 檢索評估器的改進

檢索評估器可以看作是一個評分分類模型。這個模型用于確定查詢和文檔之間的相關性,類似于RAG中的重排序模型。

通過整合更多符合現(xiàn)實場景的特征,可以改進這種相關性判斷模型。例如,科學論文問答RAG包含許多專業(yè)術語,而旅游領域的RAG往往有更口語化的用戶查詢。

通過在檢索評估器的訓練數(shù)據(jù)中添加場景特征,它可以更好地評估檢索到的文檔的相關性。其他特征,如用戶意圖和編輯距離,也可以被納入,如下圖所示:

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

此外,考慮到T5-Large獲得的結果,輕量級模型似乎也能夠取得不錯的效果。這為CRAG在小型團隊或公司中的應用帶來了希望。

6.5.4 檢索評估器的分數(shù)和閾值

如前所述,不同類型的數(shù)據(jù)閾值不同。此外,我們可以發(fā)現(xiàn),模糊和錯誤的閾值基本在 -0.9左右,這表明大多數(shù)檢索到的知識與查詢相關。完全丟棄這些檢索到的知識并僅僅依賴網(wǎng)絡搜索可能并不可取。

6.6 RAG融合

RAG融合首先使用大語言模型生成多個衍生查詢。這一步拓寬了對初始用戶輸入的理解,確保從各個角度全面探索查詢主題。接下來,向量搜索為原始查詢和衍生查詢識別相關文檔,匯編各種相關信息。

在文檔檢索之后,逆序排名融合(RRF)算法根據(jù)相關性對文檔進行重新排序。然后將這些文檔組合起來,形成一個全面且相關的信息源。

在最后階段,這個組合數(shù)據(jù)集和所有查詢由一個大語言模型進行處理。該模型綜合這些輸入,生成一個表達清晰且與上下文相關的回復。通過這種系統(tǒng)的方法,RAG融合提高了回復的準確性和全面性,顯著提升了對用戶查詢的回答質量。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

7. 生成技術

7.1 增強

“演示-搜索-預測”(Demonstrate-Search-Predict,DSP)引入了一個框架,旨在生成多個檢索查詢,以總結和回答問題,該框架利用從不同段落聚合的信息。這個框架采用“多重搜索組合”(CombSUM)來計算不同檢索列表中段落的累積概率得分,便于從多個來源匯編全面的回復。

“可插拔獎勵驅動上下文適配器”(Pluggable Reward-Driven Contextual Adapter,PRCA)概述了一個獎勵驅動階段,在這個階段,根據(jù)生成器的反饋來優(yōu)化提煉后的上下文。利用強化學習,這個階段根據(jù)提供相關上下文所獲得的獎勵來調整PRCA的參數(shù)。目的是微調提取的上下文,以滿足生成器的特定要求,從而優(yōu)化生成過程。

“檢索并插入”(REtrieve and PLUG,REPLUG)提出了一種在黑盒大語言模型進行最終預測之前,將檢索到的文檔添加到輸入上下文前面的方法。它引入了一種集成策略來并行編碼檢索到的文檔,克服了大語言模型上下文長度的限制,并通過分配更多計算資源來提高準確性。這種方法通過確保大語言模型能夠訪問更廣泛的相關信息來改進生成過程。

RECITE實現(xiàn)了一種自一致性技術,該技術涉及獨立生成多個復述內容,并采用多數(shù)投票系統(tǒng)來確定最合適的答案。這種方法旨在提高答案的可靠性和準確性,從而提高輸出的質量和可信度。

7.2 定制

參數(shù)知識引導(Parametric Knowledge Guiding,PKG)框架是一種定制大語言模型輸出的方法。通過使用預訓練模型在內部生成背景知識,PKG無需傳統(tǒng)的外部檢索過程。這種方法直接將特定領域或任務的知識集成到生成步驟中,顯著增強了大語言模型根據(jù)給定上下文或要求生成回復的能力。

Self-RAG提供了一種策略,在可定制的解碼算法中融入反思令牌。這種技術允許根據(jù)特定任務動態(tài)調整模型的檢索和生成行為,有助于生成更通用的回復。根據(jù)需求,這種方法可以針對準確性或創(chuàng)造性進行調整,在生成滿足不同需求的輸出時提供靈活性。

“子圖檢索增強生成”(SUbgraph Retrieval-augmented GEneration,SURGE)通過應用圖文本對比學習實現(xiàn)定制。這種方法確保生成的對話回復與檢索到的子圖中包含的知識緊密對齊,產生特定、相關且深深植根于對話上下文的回復。通過保持檢索到的知識與生成的文本之間的一致性,SURGE能夠生成準確反映子圖詳細知識的輸出,提高回復的相關性和特定性。

8. 聊天引擎

構建一個優(yōu)秀的RAG系統(tǒng),使其能夠針對單個查詢多次有效工作,下一個重要的部分是聊天邏輯,這需要考慮對話上下文,就像大語言模型出現(xiàn)之前的經(jīng)典聊天機器人那樣。

這是支持后續(xù)問題、指代消解或與先前對話上下文相關的任意用戶命令所必需的。它通過查詢壓縮技術來解決,該技術會同時考慮聊天上下文和用戶查詢。

一如既往,實現(xiàn)上述上下文壓縮有幾種方法:

  • 一種流行且相對簡單的是ContextChatEngine,它首先檢索與用戶查詢相關的上下文,然后將其與內存緩沖區(qū)中的聊天歷史一起發(fā)送給大語言模型,以便大語言模型在生成下一個答案時能夠了解先前的上下文。
  • 稍微復雜一點的是CondensePlusContextMode,在每次交互中,聊天歷史和最后一條消息會被濃縮成一個新的查詢,然后這個查詢會進入索引,檢索到的上下文會與原始用戶消息一起傳遞給大語言模型以生成答案。

值得注意的是,LlamaIndex中還支持基于OpenAI智能體的聊天引擎,提供了更靈活的聊天模式,Langchain也支持OpenAI的功能API。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

9. RAG中的智能體

智能體(Langchain和LlamaIndex都支持)幾乎在第一個大語言模型API發(fā)布時就出現(xiàn)了,其核心思想是為具備推理能力的大語言模型提供一組工具和一個待完成的任務。這些工具可能包括一些確定性函數(shù),比如任何代碼函數(shù)、外部API,甚至其他智能體。這種大語言模型鏈式調用的想法正是LangChain名稱的由來。

智能體本身是一個龐大的領域,在RAG概述中不可能對這個主題進行深入探討。所以我將繼續(xù)以基于智能體的多文檔檢索為例,并簡要介紹一下OpenAI Assistants,因為它是一個相對較新的事物,在最近的OpenAI開發(fā)者大會上作為GPTs推出,并且在下面描述的RAG系統(tǒng)中發(fā)揮作用。

OpenAI Assistants基本上實現(xiàn)了許多圍繞大語言模型所需的工具,這些工具我們之前在開源項目中才能看到,比如聊天歷史記錄、知識存儲、文檔上傳接口,也許最重要的是函數(shù)調用API。后者提供了將自然語言轉換為對外部工具的API調用或數(shù)據(jù)庫查詢的能力。

在LlamaIndex中有一個OpenAIAgent類,它將這種先進的邏輯與ChatEngine和QueryEngine類相結合,提供基于知識和感知上下文的聊天功能,以及在一次對話輪次中進行多個OpenAI函數(shù)調用的能力,這真正帶來了智能體的智能行為。

讓我們來看一下多文檔智能體方案,這是一個相當復雜的設置,涉及為每個文檔初始化一個智能體(OpenAIAgent),該智能體能夠進行文檔總結和經(jīng)典的問答操作,還有一個頂級智能體,負責將查詢路由到文檔智能體并進行最終答案的合成。

每個文檔智能體有兩個工具,一個向量存儲索引和一個摘要索引,它會根據(jù)路由過來的查詢決定使用哪一個。

對于頂級智能體來說,所有文檔智能體都算是工具。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

說明多文檔智能體的方案,涉及查詢路由和智能體行為模式

這個方案展示了一個先進的RAG架構,其中每個相關智能體都要做出很多路由決策。這種方法的好處是能夠比較不同文檔及其摘要中描述的不同解決方案或實體,同時具備經(jīng)典的單文檔總結和問答機制,這基本上涵蓋了最常見的與文檔集合聊天的用例。

從圖中可以猜到,這種復雜方案的缺點是速度有點慢,因為智能體內部與大語言模型有多次來回迭代。需要注意的是,在RAG流程中,調用大語言模型始終是耗時最長的操作,而搜索在設計上已經(jīng)針對速度進行了優(yōu)化。

10. 編碼器和大語言模型微調

這種方法涉及微調RAG流程中涉及的兩個深度學習模型中的一些參數(shù),一個是負責嵌入質量,進而影響上下文檢索質量的Transformer編碼器;另一個是負責充分利用提供的上下文來回答用戶查詢的大語言模型(幸運的是,后者是很好的少樣本學習器)。

如今一個很大的優(yōu)勢是可以使用像GPT-4這樣的高端大語言模型來生成高質量的合成數(shù)據(jù)集。

但我們應該始終意識到,采用專業(yè)研究團隊在經(jīng)過仔細收集、清理和驗證的大型數(shù)據(jù)集上訓練的開源模型,并使用小型合成數(shù)據(jù)集進行快速微調,可能會降低模型的整體能力。

10.1 編碼器微調

我對編碼器微調這種方法也持一定的懷疑態(tài)度,因為針對搜索優(yōu)化的最新Transformer編碼器已經(jīng)相當高效。

所以我在LlamaIndex的筆記本設置中測試了bge-large-en-v1.5(撰寫本文時在MTEB排行榜上排名前4)微調后的性能提升,結果顯示檢索質量提高了2%。雖然提升幅度不大,但知道有這個選擇還是不錯的,特別是如果我們正在為特定領域的數(shù)據(jù)集構建RAG。

10.2 排序器微調

如果我們不完全信任基礎編碼器,另一個不錯的傳統(tǒng)選擇是使用交叉編碼器對檢索結果進行重新排序。

它的工作方式如下:我們將查詢和檢索到的前k個文本塊分別通過SEP標記分隔后傳遞給交叉編碼器,并對其進行微調,使其對相關文本塊輸出1,對不相關的輸出0。

這里可以找到這種微調過程的一個很好的示例,結果顯示通過交叉編碼器微調,成對得分提高了4%。

10.3 大語言模型微調

最近OpenAI開始提供大語言模型微調API,LlamaIndex有一個關于在RAG設置中微調GPT-3.5-turbo的教程,目的是從GPT-4中“提取”一些知識。其思路是獲取一個文檔,使用GPT-3.5-turbo生成一些問題,然后使用GPT-4根據(jù)文檔內容為這些問題生成答案(構建一個由GPT-4驅動的RAG流程),接著在這個問答對數(shù)據(jù)集上微調GPT-3.5-turbo。用于評估RAG流程的Ragas框架顯示,在忠實度指標上提高了5%,這意味著微調后的GPT-3.5-turbo模型在生成答案時比原始模型更好地利用了提供的上下文。

Meta AI Research最近的論文《檢索增強雙指令調整》(Retrieval Augmented Dual Instruction Tuning,RA-DIT)展示了一種更復雜的方法,提出了一種在查詢、上下文和答案三元組上同時微調大語言模型和檢索器(論文中是雙編碼器)的技術。有關實現(xiàn)細節(jié),請參考這個指南。

這項技術用于通過微調API微調OpenAI的大語言模型和Llama2開源模型(在論文中),在知識密集型任務指標上提高了約5%(與使用RAG的Llama2 65B相比),在常識推理任務上也有幾個百分點的提升。

11. 評估

有幾種評估檢索增強生成(RAG)系統(tǒng)性能的框架,它們都采用了一些獨立的指標,如整體答案相關性、答案有據(jù)性、忠實度和檢索上下文相關性。

2W8000字揭秘RAG:從基礎到高級的逆襲,徹底重塑大模型!-AI.x社區(qū)

不同RAG評估框架的比較

上一節(jié)提到的Ragas框架,將忠實度和答案相關性作為生成答案的質量指標,并使用經(jīng)典的上下文精度和召回率來評估RAG方案中的檢索部分。

這里可以找到一個簡單的檢索器評估流程示例,該示例在編碼器微調部分有應用。

OpenAI的烹飪書中展示了一種更先進的方法,它不僅考慮命中率,還考慮平均倒數(shù)排名(一種常見的搜索引擎指標),以及生成答案的指標,如忠實度和相關性。

LangChain有一個相當先進的評估框架LangSmith,在其中可以實現(xiàn)自定義評估器,并且它還可以監(jiān)控RAG流程中的運行軌跡,從而讓我們的系統(tǒng)更加透明。

如果我們使用LlamaIndex進行構建,有一個??rag_evaluator?? llama pack,它提供了一個快速工具,可使用公共數(shù)據(jù)集評估我們的RAG流程。

本文轉載自??柏企科技圈??,作者:柏企 


已于2025-2-24 12:16:24修改
收藏
回復
舉報
回復
相關推薦