檢索增強(qiáng)生成 (RAG) 是一種強(qiáng)大的技術(shù),它將信息檢索與生成式 AI 相結(jié)合,以產(chǎn)生更準(zhǔn)確、上下文更豐富的響應(yīng)。本文將探討 15 種高級(jí) RAG 技術(shù),以提高生成式 AI 系統(tǒng)的輸出質(zhì)量和整體性能的魯棒性。這樣做使本文能夠測(cè)試和識(shí)別從預(yù)檢索到生成的適當(dāng)優(yōu)化,本文所提到的優(yōu)化點(diǎn)大多數(shù)基于下圖的流程。

一般來說,傳統(tǒng)的 RAG 系統(tǒng)經(jīng)常會(huì)遇到以下問題:

RAG 中,召回是一個(gè)核心步驟,按照不同優(yōu)化策略和召回的前后關(guān)系,優(yōu)化策略可分以下幾類:

預(yù)檢索優(yōu)化

預(yù)檢索優(yōu)化主要包括提高數(shù)據(jù)索引或知識(shí)數(shù)據(jù)庫中信息的質(zhì)量和可檢索性。由于每個(gè)系統(tǒng)依賴于不同性質(zhì)的信息,預(yù)檢索優(yōu)化策略不一定是萬能的。比如為金融系統(tǒng)設(shè)計(jì)的優(yōu)化策略在旅游機(jī)器人中可能不太有效。預(yù)檢索優(yōu)化包括以下方法

?使用 LLM 提高信息密度

在存儲(chǔ)數(shù)據(jù)前使用 LLM 處理、清洗以及對(duì)數(shù)據(jù)進(jìn)行打標(biāo)。這種改進(jìn)是因?yàn)閬碜援悩?gòu)數(shù)據(jù)源(例如 PDF、抓取的網(wǎng)頁數(shù)據(jù)、音頻轉(zhuǎn)錄)的非結(jié)構(gòu)化數(shù)據(jù)不一定是為 RAG 系統(tǒng)構(gòu)建的,導(dǎo)致信息密度低、噪聲數(shù)據(jù)、信息重復(fù)等

信息密度低迫使 RAG 系統(tǒng)在 LLM 上下文窗口中插入更多的塊,以正確回答用戶查詢,從而增加了 token 的使用和成本。此外,信息密度低會(huì)稀釋相關(guān)信息,以至于 LLM 可能會(huì)給出錯(cuò)誤的回答。GPT-4 在使用少于 70,000 個(gè) token 時(shí)似乎對(duì)這個(gè)問題有相對(duì)的抵抗力,但其他模型可能沒有那么強(qiáng)的魯棒性。

比如當(dāng)原文本來源于網(wǎng)頁時(shí),原始 HTML 包含了大量無關(guān)信息(例如 CSS 類、頁眉/頁腳導(dǎo)航、HTML 標(biāo)簽等冗余信息)。即使在程序化地剝離了 CSS 和 HTML 之后,信息密度仍然很低。因此,為了提高塊中的信息密度,本文嘗試使用 GPT-4 作為事實(shí)提取器,從文檔中提取相關(guān)信息。

對(duì)應(yīng)的 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,在降低噪聲的同時(shí)大大提高了信息密度。

值得注意的是,使用 LLM 提高信息密度是伴隨著風(fēng)險(xiǎn)的,即可能導(dǎo)致部分關(guān)鍵信息丟失。

?使用分層索引檢索

LLM 生成摘要并對(duì)摘要進(jìn)行檢索可以使得檢索過程更為高效。上節(jié)使用 LLM 提高信息密度的方法類似于無損壓縮,而使用 LLM 生成摘要更像有損壓縮。在大型數(shù)據(jù)庫的情況下,一種有效的方法是創(chuàng)建兩個(gè)索引 — 一個(gè)由摘要組成,另一個(gè)由文檔塊組成,并分兩步進(jìn)行搜索,首先通過摘要過濾掉相關(guān)文檔,然后在此相關(guān)組內(nèi)進(jìn)行搜索。

?創(chuàng)建假設(shè)性問答對(duì)

在數(shù)據(jù)準(zhǔn)備階段,embedding 的對(duì)象是原始文本(answer),而在請(qǐng)求階段,embedding 的對(duì)象是用戶 query。這使得查詢的 embedding 和結(jié)果的 embedding 是“不對(duì)稱”的。一種方法是使用 GPT-4 為每個(gè)文檔生成一系列假設(shè)/可能的問題和答案對(duì),然后使用生成的問題作為嵌入檢索的塊。在檢索時(shí),系統(tǒng)將檢索問題及其對(duì)應(yīng)的答案并提供給 LLM。因此,查詢的嵌入與生成問題的嵌入的余弦相似度可能會(huì)更高。

例如,在文檔中,某段話的內(nèi)容可能是從多個(gè)角度介紹了 xx 技術(shù)的特點(diǎn),但是未顯式地提到特點(diǎn)、有缺點(diǎn)二詞。傳統(tǒng) RAG 情況下當(dāng)用戶問到 xx 技術(shù)的優(yōu)缺點(diǎn)時(shí),難以匹配到此段落。而如果為這個(gè)段落生成假設(shè)性問題:“xxx 技術(shù)的優(yōu)缺點(diǎn)是什么?有什么特點(diǎn)”,此時(shí) embedding 方法就能準(zhǔn)確匹配到此段落。

上圖展示了對(duì) HTML 提取的信息生成的問答對(duì)示例。值得注意的是,提取問答對(duì)仍然可能造成一定的數(shù)據(jù)信息丟失。

?使用 LLM 對(duì)信息進(jìn)行去重

使用 LLM 作為信息去重器可以提高數(shù)據(jù)索引的質(zhì)量。LLM 通過將塊提煉成更少的塊來去重信息,從而提高獲得理想響應(yīng)的幾率。根據(jù)具體情況,數(shù)據(jù)索引中的信息重復(fù)可能有助于或阻礙 RAG 系統(tǒng)的輸出。一方面,如果生成響應(yīng)所需的正確信息在 LLM 的上下文窗口內(nèi)被重復(fù),它會(huì)增加 LLM 做出理想響應(yīng)的可能性。另一方面,假設(shè)重復(fù)的程度稀釋甚至完全擠出了 LLM 上下文窗口中的所需信息,那么用戶可能會(huì)收到一個(gè)無關(guān)的回答。

本方案通過在 embedding 空間中對(duì)塊進(jìn)行 k-means 聚類來去重信息,以便每個(gè)塊聚類中的總 token 數(shù)在 LLM 的有效上下文窗口內(nèi)。然后,本文可以任務(wù) LLM 從原始聚類中輸出一組新的提煉塊,去除重復(fù)信息。如果一個(gè)給定的聚類包含 N 個(gè)塊,本文期望這個(gè)去重提示輸出<= N 個(gè)新塊,其中任何冗余信息都被去除。

值得注意的是,這種方法可能會(huì)使得從塊到原文的引用這一信息丟失。

?測(cè)試并優(yōu)化最優(yōu)分塊

上述技術(shù)強(qiáng)調(diào)了分塊策略的重要性。但最優(yōu)的分塊策略是特定于具體使用場(chǎng)景的,并且有許多因素會(huì)影響它。找到最優(yōu)分塊策略的唯一方法是對(duì)你的 RAG 系統(tǒng)進(jìn)行廣泛的 A/B 測(cè)試。以下是測(cè)試時(shí)需要考慮的一些最重要因素。

通過對(duì)本 RAG 進(jìn)行 A/B 測(cè)試,本文可以評(píng)估每個(gè)用例的最佳分塊策略。本文主要在由 GPT-4 處理的改進(jìn)信息密集型文檔上測(cè)試了以下分塊策略:

在構(gòu)建 AI 助手時(shí),本文發(fā)現(xiàn)分塊策略的選擇并沒有太大影響(見下表結(jié)果)。1,000 字符的分塊策略,帶有 200 字符的重疊,表現(xiàn)略優(yōu)于其他策略(當(dāng)然,構(gòu)建不同的應(yīng)用可能會(huì)出現(xiàn)不同的測(cè)試結(jié)果)。

檢索/召回優(yōu)化

檢索優(yōu)化涵蓋了高級(jí) RAG 技術(shù)和策略,目標(biāo)是在推理時(shí)提高搜索性能和檢索結(jié)果,并在檢索發(fā)生之前進(jìn)行優(yōu)化(本質(zhì)上,也可以是認(rèn)為檢索過程中的優(yōu)化)。這些策略包含以下幾種:

?使用 LLM 優(yōu)化搜索請(qǐng)求

搜索系統(tǒng)在搜索查詢以特定格式呈現(xiàn)時(shí)往往能達(dá)到最佳效果。LLM 是一種強(qiáng)大的工具,可以為特定的搜索系統(tǒng)定制或優(yōu)化用戶的搜索查詢。為了說明這一點(diǎn),本文來看兩個(gè)例子:優(yōu)化一個(gè)簡(jiǎn)單的搜索查詢和一個(gè)面向?qū)υ捪到y(tǒng)的查詢。

假設(shè)一個(gè)用戶想要搜索 example-news-site.com 上所有關(guān)于比爾·蓋茨或史蒂夫·喬布斯的新聞文章。他們可能會(huì)在 Google 中輸入如下內(nèi)容:(次優(yōu)的 Google 搜索查詢):Articles about Bill Gates or Steve Jobs from example-news-site。可以使用 LLM 來優(yōu)化這個(gè)搜索查詢,具體針對(duì) Google,通過利用 Google 提供的一些高級(jí)搜索功能。(最優(yōu)的 Google 搜索查詢):"Bill Gates" OR "Steve Jobs" -site:example-news-site.com。

這種方法對(duì)于簡(jiǎn)單的查詢是有效的,但對(duì)于對(duì)話系統(tǒng),本文需要進(jìn)一步提升。

盡管上述簡(jiǎn)單的搜索查詢優(yōu)化可以視為一種增強(qiáng),本文發(fā)現(xiàn)使用 LLM 來優(yōu)化對(duì)話系統(tǒng)中的 RAG 搜索查詢是至關(guān)重要的。對(duì)于一個(gè)只能進(jìn)行單輪對(duì)話的簡(jiǎn)單問答機(jī)器人,用戶的問題同時(shí)也是檢索信息以增強(qiáng) LLM 知識(shí)的搜索查詢。但在對(duì)話系統(tǒng)中,情況會(huì)變得更加復(fù)雜。以下是一個(gè)示例對(duì)話:

客戶:“你們的定期存款利率是多少?”
助手:“我們的利率是 XYZ。”
客戶:“哪種信用卡適合旅行?”
助手:“XYZ 信用卡適合旅行,原因是 ABC?!?br /> 客戶:“告訴我更多關(guān)于那個(gè)利率的信息?!?/code>

為了回答用戶的最后一個(gè)問題,可能需要進(jìn)行語義搜索以檢索有關(guān)特定 XYZ 旅行信用卡的信息。那么,搜索查詢應(yīng)該是什么呢??jī)H僅使用最后一條用戶消息是不夠具體的,因?yàn)榻鹑跈C(jī)構(gòu)可能有許多產(chǎn)品會(huì)產(chǎn)生利息。在這種情況下,語義搜索可能會(huì)產(chǎn)生大量潛在的無關(guān)信息,這些信息可能會(huì)擠占 LLM 上下文窗口中的實(shí)際相關(guān)信息。那么,使用整個(gè)對(duì)話記錄作為語義搜索查詢?cè)趺礃幽??這可能會(huì)產(chǎn)生更好的結(jié)果,但仍然可能包括關(guān)于定期存款的信息,這與用戶在對(duì)話中的最新問題無關(guān)。本文發(fā)現(xiàn)的最佳技術(shù)是使用 LLM 根據(jù)對(duì)話生成最優(yōu)的搜索查詢。此場(chǎng)景中用到了一下 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.

這種技術(shù)的一個(gè)變體是查詢擴(kuò)展,其中由 LLM 生成多個(gè)子搜索查詢。這種變體在具有混合檢索系統(tǒng)的 RAG 系統(tǒng)中特別有用,該系統(tǒng)結(jié)合了來自不同結(jié)構(gòu)的數(shù)據(jù)存儲(chǔ)(例如,SQL 數(shù)據(jù)庫+獨(dú)立的向量數(shù)據(jù)庫)的搜索結(jié)果。其他提示工程技術(shù)如step-back prompting``和HyDE也可以與這種方法結(jié)合使用。

?HyDE:假設(shè)性文檔 embedding

預(yù)檢索優(yōu)化策略中提到了查詢和文檔內(nèi)容的 embedding 可能存在不對(duì)稱的問題。通過應(yīng)用 HyDE,我們還可以在檢索階段實(shí)現(xiàn)更大的語義相似性。

預(yù)檢索優(yōu)化中的方法是為每個(gè)段落生成對(duì)應(yīng)的問答對(duì)。而在 HyDE 中,我們預(yù)先為用戶的問題生成多個(gè)假設(shè)性的回答,再用假設(shè)性回答去進(jìn)行檢索而不是使用用戶查詢。這個(gè)想法是,在具有查詢-文檔不對(duì)稱的 RAG 系統(tǒng)中,假設(shè)文檔或片段將比用戶查詢本身具有更大的語義相似性。用到的 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.

?使用查詢路由

查詢路由器是我們見過的更受歡迎的高級(jí) RAG 技術(shù)之一。其思想是當(dāng) RAG 系統(tǒng)使用多個(gè)數(shù)據(jù)源時(shí),利用 LLM 將搜索查詢路由到適當(dāng)?shù)臄?shù)據(jù)庫。這涉及在提示中預(yù)定義路由決策選項(xiàng),并解析 LLM 的路由決策輸出,以便在代碼中使用。

為了降低成本并提高 RAG 的質(zhì)量,本文開發(fā)了一種 RAG 決策模式,因?yàn)椴⒎撬胁樵兌夹枰?RAG 查找。因此,識(shí)別何時(shí) LLM 可以獨(dú)立回答查詢而無需外部知識(shí),可以提高效率。一個(gè)不太明顯的例子是,當(dāng)回答用戶查詢所需的所有信息已經(jīng)存在于最近的對(duì)話歷史中。在這種情況下,LLM 只需重復(fù)或稍微改述之前所說的內(nèi)容。例如:”你能把你最后的信息翻譯成西班牙語嗎?”或”請(qǐng)像我五歲一樣解釋最后的信息。”這兩種查詢都不需要新的檢索,因?yàn)?LLM 可以簡(jiǎn)單地使用其內(nèi)置功能回答這些查詢。

在實(shí)現(xiàn)的過程中,只需要對(duì)不同的分支采用不同的 prompt 即可。

檢索后優(yōu)化

檢索后優(yōu)化涵蓋了在檢索發(fā)生之后但在最終響應(yīng)生成之前所采用的策略或技術(shù)。此時(shí)一個(gè)關(guān)鍵的考慮因素是:即使已經(jīng)部署了所有的檢索前和檢索策略,也不能保證檢索到的文檔包含 LLM 回答查詢所需的所有相關(guān)信息。這是因?yàn)闄z索到的文檔可能是以下任意或所有類別的混合物:

檢索后優(yōu)化策略包含以下幾個(gè)方面:

?使用重排模型

Cuconasu 等人的研究《The Power of Noise: Redefining Retrieval for RAG Systems[1]》表明:related but irrelevant documents are the most harmful to RAG systems。他們發(fā)現(xiàn)“在某些情況下,準(zhǔn)確率下降超過-67%。更重要的是,僅添加一個(gè)相關(guān)文檔就會(huì)導(dǎo)致準(zhǔn)確率急劇下降,峰值達(dá)到-25%。

更令人驚訝的是,同一研究人員發(fā)現(xiàn)不相關(guān)的文檔“如果放置得當(dāng),實(shí)際上有助于提高這些系統(tǒng)的準(zhǔn)確性?!蹦切?gòu)建 RAG 系統(tǒng)的人應(yīng)該關(guān)注這類研究,但也應(yīng)對(duì)自己的系統(tǒng)進(jìn)行徹底的 A/B 測(cè)試,以確認(rèn)研究結(jié)果是否適用于他們的系統(tǒng)。Cuconasu 的研究還表明,將最相關(guān)的文檔放置在提示中最接近查詢的位置可以提高 RAG 的性能。針對(duì)這個(gè)現(xiàn)象,重排序模型優(yōu)化了給定查詢的塊搜索結(jié)果的優(yōu)先級(jí)。這種技術(shù)在與混合檢索系統(tǒng)和查詢擴(kuò)展結(jié)合使用時(shí)效果很好。相對(duì)于向量召回,重排模型的性能略差,但是更能挖掘出 query 和召回文檔之間的相關(guān)性。

?prompt compression

LLMs 可以處理每個(gè)塊中的信息,以過濾、重新格式化甚至壓縮最終進(jìn)入生成提示的信息。LLMLingua[2]?是這種方法的一個(gè)有前途的框架。LLMLingua 使用一個(gè)小型語言模型,如 GPT2-small 或 LLaMA-7B,來檢測(cè)并移除提示中不重要的 tokens。它還使得在黑箱 LLMs 中使用壓縮提示進(jìn)行推理成為可能,實(shí)現(xiàn)了高達(dá) 20 倍的壓縮率,同時(shí)性能損失最小。LongLLMLingua[3]?更進(jìn)一步,通過在進(jìn)行壓縮時(shí)考慮輸入查詢,移除一般不重要和對(duì)查詢不重要的 tokens。值得注意的是,除了完全理解和使用壓縮提示來回答查詢(例如,作為 RAG 的一部分),即使提示對(duì)人類不可讀,GPT-4 也可以用于逆向或解壓輸入。

?Corrective Rag

Corrective RAG[4]?是一種由 Yan 等人首次提出的方法,其中 T5-Large 模型被訓(xùn)練用于在將結(jié)果提供給大型語言模型(LLM)以生成最終響應(yīng)之前,識(shí)別 RAG 結(jié)果是否正確/相關(guān)、模棱兩可或不正確。未通過正確/相關(guān)或模棱兩可分類閾值的 v z 結(jié)果將被丟棄。與使用經(jīng)過微調(diào)的 Llama-2 7B 模型和 Self-RAG 的批判方法相比,使用 T5-Large 模型要輕量得多,并且可以與任何大型語言模型結(jié)合使用。

生成優(yōu)化

生成優(yōu)化包括改進(jìn)生成最終用戶響應(yīng)的大型語言模型調(diào)用。這里最容易實(shí)現(xiàn)的成果是迭代提示并確定插入到生成提示中的最佳分塊數(shù)量。我們使用 GPT-4 對(duì) 1000、3500 和 7000 個(gè) token 的檢索上下文 / 分塊進(jìn)行了 A/B 測(cè)試。我們發(fā)現(xiàn),將 3500 個(gè) token 的檢索上下文插入到檢索增強(qiáng)生成(RAG)提示中比其他選項(xiàng)略好。我們懷疑這個(gè)發(fā)現(xiàn)并非普遍適用,每個(gè)用例都有不同的最佳數(shù)量。在這一點(diǎn)上,可以考慮評(píng)估和改進(jìn)大型語言模型適當(dāng)處理它可能接收的不同類型文檔(相關(guān)的、有關(guān)聯(lián)的、不相關(guān)的等)的能力。理想情況下,一個(gè) retrieval-robust 的 LLM 系統(tǒng)應(yīng)當(dāng)具備以下特性:

?思維鏈

思維鏈(Chain-of-thought, CoT)提示通過推理增加了在存在噪聲或無關(guān)上下文的情況下,LLM 得出正確響應(yīng)的可能性。研究人員 Wenhao Yu 等人進(jìn)一步發(fā)展了這一理念,提出了鏈?zhǔn)焦P記(chain-of-noting[5]),他們微調(diào)了一個(gè)模型以生成“每個(gè)檢索到的文檔的連續(xù)閱讀筆記。這一過程允許對(duì)文檔與所提問題的相關(guān)性進(jìn)行深入評(píng)估,并有助于綜合這些信息以構(gòu)建最終答案。”微調(diào)的模型是 LLaMA-7B,訓(xùn)練數(shù)據(jù)是使用 ChatGPT 創(chuàng)建的。

?通過 Self-RAG 使系統(tǒng)具備自我反思能力

Self-RAG 是另一種基于微調(diào)的方法,其中語言模型在生成過程中被訓(xùn)練輸出特殊的反思標(biāo)記。反思標(biāo)記可以是檢索標(biāo)記或批評(píng)標(biāo)記。研究人員 Asai 等人詳細(xì)描述了他們的方法:

“給定一個(gè)輸入提示和之前的生成內(nèi)容,Self-RAG 首先確定是否通過檢索到的段落來增強(qiáng)后續(xù)生成會(huì)有所幫助。如果是,它會(huì)輸出一個(gè)檢索標(biāo)記,按需調(diào)用檢索模型。隨后,Self-RAG 并行處理多個(gè)檢索到的段落,評(píng)估其相關(guān)性,然后生成相應(yīng)的任務(wù)輸出。接著,它生成批評(píng)標(biāo)記來批評(píng)自己的輸出,并選擇在事實(shí)性和整體質(zhì)量方面最好的一個(gè)?!?/p>

?通過微調(diào)忽略不相關(guān)內(nèi)容

鑒于 LLM 通常沒有明確地為 RAG 進(jìn)行訓(xùn)練或調(diào)優(yōu),因此可以對(duì)模型進(jìn)行微調(diào)以適應(yīng)這種用例,合理地說可以提高模型忽略無關(guān)上下文的能力。論文《Making Retrieval-Augmented Language Models Robust to Irrelevant Context[6]》通過實(shí)驗(yàn)證明,即使是 1,000 個(gè)例子也足以訓(xùn)練模型,使其在面對(duì)無關(guān)上下文時(shí)保持魯棒性,同時(shí)在有相關(guān)上下文的例子上保持高性能。

此論文還探索了使用自然語言推理(NLI)模型來識(shí)別無關(guān)的上下文。由于有些情況下無關(guān)的 RAG 上下文會(huì)對(duì) LLM 的性能產(chǎn)生負(fù)面影響。NLI 模型可以用來過濾掉無關(guān)的上下文。這種技術(shù)的工作原理是,僅在假設(shè)(即使用問題和 LLM 生成的答案)被分類為由前提(即檢索到的上下文或 RAG 結(jié)果)所蘊(yùn)涵時(shí),才使用檢索到的上下文。

其他 Advanced RAG 策略

關(guān)于 RAG 的文獻(xiàn)非常廣泛且不斷擴(kuò)展。

總結(jié)

隨著檢索增強(qiáng)生成(RAG)系統(tǒng)的快速發(fā)展,它為增強(qiáng)對(duì)話式 AI 和其他生成式 AI 應(yīng)用提供了許多機(jī)會(huì)。本文的實(shí)驗(yàn)和研究突顯了先進(jìn)的 RAG 技術(shù)在以下方面的潛力:

如果正確實(shí)施,這些技術(shù)可以為企業(yè)帶來更高的成本效益,并改善客戶體驗(yàn)。但為了跟上快速涌現(xiàn)的最佳實(shí)踐,軟件工程師和數(shù)據(jù)科學(xué)家需要及時(shí)、可信賴的資源作為參考。

本文章轉(zhuǎn)載微信公眾號(hào)@差分隱私

#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)