對(duì)于Advanced RAG系統(tǒng)你不得不知道的三個(gè)階段優(yōu)化技巧 原創(chuàng)
我閱讀了一篇有關(guān)"Advanced RAG"的論文,在閱讀這篇論文后,我發(fā)現(xiàn)其中的一些概念和技術(shù)具有很高的實(shí)用價(jià)值。接下來(lái),我將結(jié)合我在公司的實(shí)踐經(jīng)驗(yàn),分享以下RAG系統(tǒng)的三個(gè)階段的優(yōu)化:
- 預(yù)檢索和數(shù)據(jù)索引技術(shù)
- 檢索技術(shù)
- 檢索后處理
預(yù)檢索和數(shù)據(jù)索引技術(shù)
使? LLM 增加信息密度
如果來(lái)?異構(gòu)數(shù)據(jù)源(例如 PDF、抓取的?絡(luò)數(shù)據(jù)、?頻記錄)的?結(jié)構(gòu)化數(shù)據(jù)沒有經(jīng)過(guò)特定處理,信息密度比較低下,包含不相關(guān)的信息和/或噪?,或者有很多信息重復(fù),這使得 RAG 系統(tǒng)在 LLM 上下?窗?中插?更多塊以正確回答??查詢,從?增加令牌的使?和成本。此外,低信息密度會(huì)稀釋相關(guān)信息,以?于LLM可能會(huì)做出錯(cuò)誤的回應(yīng)。GPT-4 似乎對(duì)這個(gè)問(wèn)題有相對(duì)的抵抗? 當(dāng)使?少于 70,000 個(gè)令牌時(shí),但其他模型可能不那么強(qiáng) ?。
比如我們之前在用爬蟲爬取用戶網(wǎng)頁(yè)的時(shí)候,但原始 HTML 包含?量不相關(guān)的信息(例如 CSS 類、標(biāo)頭/?腳導(dǎo)航、HTML 標(biāo)簽、??之間的冗余信息)。即使通過(guò)編程?式剝離 CSS 和 HTML,信息密度仍然很低。因此,為了提?我們塊中的信息密度,我們嘗試使? GPT-4 作為事實(shí)提取器,從?檔中收集相關(guān)信息。刪除 CSS 和 HTML 標(biāo)簽后,我們使?類似于下?的 LLM 調(diào)?來(lái)處理每個(gè)抓取的??,然后將其分塊并插?到我們的知識(shí)庫(kù)中:
fact_extracted_output = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{
"role": "system",
"content": "You are a data processing assistant. Your task is to extract meaningful information from a scraped web page from sendme. 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 sendme's customers. The output should be text-only (no lists) separated by paragraphs.",
},
{
"role": "user",
"content": "<scraped web page>"
},
],
temperature=0
)
信息丟失的?險(xiǎn)使用大型語(yǔ)言模型(LLMs)來(lái)提高信息密度的風(fēng)險(xiǎn)在于,關(guān)鍵信息可能會(huì)丟失。所以使用這種策略的時(shí)候你需要對(duì)知識(shí)信息密度有個(gè)判斷,以防輸入內(nèi)容已經(jīng)信息密集而經(jīng)過(guò)LLM處理后丟失了一部分信息。
應(yīng)?分層索引檢索
通過(guò)利? LLM ?成的摘要的多層檢索系統(tǒng)可以提?搜索效率. 分層索引檢索的實(shí)踐利??檔摘要 來(lái)簡(jiǎn)化相關(guān)信息的識(shí)別,以便?成響應(yīng)。
這些摘要?檔?持對(duì)?型數(shù)據(jù)庫(kù)進(jìn)??效搜索。與僅創(chuàng)建由?檔塊組成的單個(gè)數(shù)據(jù)索引不同,由 ?檔摘要組成的附加數(shù)據(jù)索引創(chuàng)建了第?層過(guò)濾機(jī)制,該機(jī)制可從摘要與搜索查詢?關(guān)的?檔中 排除?檔塊。
生成假設(shè)性問(wèn)題提高檢索對(duì)稱性
LLM 還可以將?檔轉(zhuǎn)換為適合 RAG 系統(tǒng)中使?的嵌?模型和查詢的格式。?種?法是使? GPT-4 為每個(gè)?檔?成假設(shè)/可能的問(wèn)答對(duì)列表,然后使??成的問(wèn)題作為要嵌?檢索的塊。
在檢索時(shí),系統(tǒng)將檢索問(wèn)題及其對(duì)應(yīng)的答案并提供給LLM。因此,查詢的嵌?可能與?成的問(wèn)題 的嵌?具有更?的余弦相似度。這種相似性降低了在分塊過(guò)程中丟失相關(guān)上下?的?險(xiǎn)。因此, 每個(gè)問(wèn)答對(duì)都是獨(dú)?的,理論上將包含所有所需的上下?。
我們?cè)谧约旱腞AG推薦系統(tǒng)中,當(dāng)用戶上傳一個(gè)文檔時(shí),可以指定是否生成QA, 檢索的時(shí)候會(huì)對(duì)QA和chunk同時(shí)進(jìn)行召回,從而提高檢索的對(duì)稱性。Langchain和llamaindex 都有對(duì)應(yīng)的QA生成的工具,你可以參考相關(guān)文檔,主要是參考它們的prompt. 這里給出一個(gè)示例prompt:
generated_question_answer_pairs = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{
"role": "system",
"content": "Analyze the provided text or html from Example bank’s website and create questions an Example bank customer could ask a chatbot about the information in the text. You should not create a question if it does not have a useful/informative answer to it that would be helpful for a customer. For every question, please formulate answers based strictly on the information in the text. Use Q: for questions and A: for answers. Do not write any other commentary. Questions should not reference html sections or links. Create as many useful Q&A pairings as possible.",
},
{
"role": "user",
"content": "<scraped web page>"
},
],
temperature=0
)
假設(shè)性問(wèn)題指數(shù)的?險(xiǎn)和替代?案
使?這種先進(jìn)的 RAG 技術(shù),信息丟失的?險(xiǎn)仍然存在。對(duì)于信息密度?的?檔,LLM 可能?法 ?成?夠的問(wèn)答對(duì)來(lái)涵蓋??可能對(duì)?檔中的信息提出的?系列查詢。
此外,根據(jù)?檔存儲(chǔ)的??,使? LLM 處理和轉(zhuǎn)換每個(gè)?檔以緩解查詢?檔不對(duì)稱可能會(huì)成本過(guò) ?。
最后,根據(jù) RAG 系統(tǒng)的流量,更有效的解決?案可能是反向?法,稱為假設(shè)?檔嵌? (HyDE), ?于轉(zhuǎn)換??查詢?不是?檔。我們將在下?的檢索技術(shù)部分進(jìn)?步討論 HyDE。
測(cè)試并優(yōu)化你的分塊策略
找到最佳分塊策略的唯??法是對(duì)您的 RAG 系統(tǒng)進(jìn)??泛的 A/B 測(cè)試。以下是測(cè)試時(shí)要考慮的?些最重要的因素。
嵌?模型
不同的嵌?模型在不同輸???下具有不同的性能特征。例如,句?轉(zhuǎn)換器的嵌?模型在嵌?單 個(gè)句???表現(xiàn)出?,? text-embedding-ada-002 可以處理更?的輸?。理想情況下,塊?? 應(yīng)根據(jù)所使?的特定嵌?模型進(jìn)?量?定制,反之亦然。
嵌?內(nèi)容的性質(zhì)
根據(jù)?檔的信息密度、格式和復(fù)雜程度,塊可能需要達(dá)到?定的最???,才能包含?夠的上 下?,以供 LLM 使?。然?,這是?個(gè)平衡?為。如果塊太?,它們可能會(huì)稀釋嵌?中的相關(guān) 信息,從?降低語(yǔ)義搜索期間該塊的檢索?率。
如果您的?檔不包含?然斷點(diǎn)(例如,教科書章節(jié)中帶有副標(biāo)題),并且?檔根據(jù)任意字符限制 (例如 500 個(gè)字符)進(jìn)?分塊,則存在關(guān)鍵上下?信息被拆分的?險(xiǎn)。在這種情況下,應(yīng)考慮重 疊。例如,重疊率為 50% 的分塊策略意味著?檔中兩個(gè)相鄰的 500 個(gè)字符的塊將相互重疊 250 個(gè)字符。在決定重疊率時(shí),應(yīng)考慮信息重復(fù)和嵌?更多數(shù)據(jù)的成本。
要嵌?的查詢的復(fù)雜性或類型
如果您的 RAG 系統(tǒng)處理?段落的查詢,那么將數(shù)據(jù)分成?段落是有意義的。但是,如果查詢只 有?個(gè)詞,那么?塊??可能不利于最佳信息檢索。這時(shí)候可以使用混合檢索來(lái)提升信息檢索能力。
我們的經(jīng)驗(yàn)
通過(guò)在我們由 LLM 提供?持的 RAG 評(píng)估系統(tǒng)的幫助下進(jìn)??泛的 A/B 測(cè)試,我們可以評(píng)估每 個(gè)?例的最佳分塊策略。
我們測(cè)試了以下分塊策略,主要針對(duì) GPT-4 處理的改進(jìn)的信息密集型?檔:
- 1,000 個(gè)字符的塊,其中有 200 個(gè)字符的重疊
- 500 個(gè)字符的塊,100 個(gè)字符的重疊
- 段落(處理后的?檔中存在段落中斷)
- 句?(使? spaCy 拆分)
- 假設(shè)性問(wèn)題(從上?詳述的?成的假設(shè)性問(wèn)題索引中嵌?問(wèn)題)
在我們的RAG推薦系統(tǒng)中,采? 200 個(gè)字符重疊策略的 1,000 個(gè)字符塊的表現(xiàn)略優(yōu)于其他策略。
檢索技術(shù)
使?假設(shè)?檔嵌?(HyDE)修復(fù)查詢?檔不對(duì)稱
正如我們?cè)陬A(yù)檢索技術(shù)部分中提到的,我們可以利? LLM 來(lái)解決查詢?檔不對(duì)稱問(wèn)題并改善檢 索結(jié)果。我們還可以通過(guò)應(yīng)? HyDE 在檢索階段實(shí)現(xiàn)更?的語(yǔ)義相似度。
image-20240905175950117
我們通過(guò)在檢索發(fā)?之前的推理時(shí)間請(qǐng)求 LLM ?成?個(gè)假設(shè)?檔或?檔塊來(lái)回答查詢來(lái)實(shí)現(xiàn)這 ?點(diǎn)。下?是?個(gè)?例提?,我們將其與 1000 個(gè)字符的分塊策略?起使?來(lái)?成?于語(yǔ)義搜索 的假設(shè)?檔:
prompt = "Please generate a 1000 character chunk of text that hypothetically could be found on Example bank's website that can help the customer answer their question."
然后嵌?該假設(shè)?檔或塊,并?它代替??查詢進(jìn)?語(yǔ)義搜索。這個(gè)想法是,在查詢?檔不對(duì) 稱的 RAG 系統(tǒng)中,假設(shè)?檔或塊與所需塊的語(yǔ)義相似度將?于??查詢本?。
使? LLM 優(yōu)化搜索查詢
請(qǐng)看以下?例對(duì)話:
客?:“你們的存單利率是多少?” 助理:“我們的利率是 XYZ?!?顧客:“哪種信?卡適合旅??”
助理:“XYZ 信?卡適合出于 ABC 原因的旅?” 客?:“告訴我更多關(guān)于這個(gè)利率的信息”
為了回答??的最后?個(gè)問(wèn)題,可能需要進(jìn)?語(yǔ)義搜索來(lái)檢索有關(guān)特定 XYZ 旅?信?卡的信息。那么,搜索查詢應(yīng)該是什么??jī)H僅使?最后?個(gè)??消息是不夠具體的,因?yàn)?融機(jī)構(gòu)可能有許 多產(chǎn)品會(huì)產(chǎn)?利息。在這種情況下,語(yǔ)義搜索會(huì)產(chǎn)??量可能不相關(guān)的信息,這些信息可能會(huì)擠 占 LLM 上下?窗?中的實(shí)際相關(guān)信息。
那么將整個(gè)對(duì)話記錄?作語(yǔ)義搜索查詢?cè)趺礃??這可能會(huì)產(chǎn)?更好的結(jié)果,但它們?nèi)钥赡馨c 對(duì)話中??最新問(wèn)題?關(guān)的信息。
到?前為?,我們發(fā)現(xiàn)的最佳?法是使? LLM 以對(duì)話作為輸?來(lái)?成最佳搜索查詢。對(duì)于上?的 ?例對(duì)話,提?如下所?:
systemPrompt = "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í)現(xiàn)查詢路由或 RAG 決策器模式
查詢路由器是我們?過(guò)的更流?的?級(jí) RAG 技術(shù)之?。其理念是當(dāng) RAG 系統(tǒng)使?多個(gè)數(shù)據(jù)源 時(shí),使? LLM 將搜索查詢路由到適當(dāng)?shù)臄?shù)據(jù)庫(kù)。這涉及在提?中預(yù)定義路由決策選項(xiàng),并解析 LLM 的路由決策輸出,以便可以在代碼中使?。
為了幫助降低成本并提? RAG 的質(zhì)量,我們開發(fā)了這種技術(shù)的變體,稱之為 RAG 決策模 式。
?個(gè)不太明顯的例?是,回答??查詢所需的所有信息都已存在于最近的對(duì)話歷史記錄中。在這 種情況下,LLM 只需重復(fù)或稍微改述之前的內(nèi)容。例如,“您能將您最后?條消息翻譯成西班? 語(yǔ)嗎?”或“請(qǐng)像我五歲?孩?樣解釋?下最后?條消息?!边@兩個(gè)查詢都不需要進(jìn)?新的檢 索,因?yàn)?LLM 只需使?其內(nèi)置功能即可回答查詢。
在我們的案例中,當(dāng) RAG 決策者決定對(duì)于給定的??查詢不需要進(jìn)?完整的 RAG 查找時(shí),我們 會(huì)?不提及 RAG 結(jié)果或?檔的prompt來(lái)處理用戶的query。
另?種?法可能是讓單個(gè) LLM 代理決定是否通過(guò)函數(shù)調(diào)?或其他機(jī)制(例如,在??RAG ) ? 不是委托給單獨(dú)的 LLM 調(diào)?。
檢索后處理( Post-Retrieval )
檢索后優(yōu)化涵蓋檢索發(fā)?之后但在最終響應(yīng)?成之前采?的策略或技術(shù)。
此時(shí)需要考慮的?個(gè)重要問(wèn)題是:即使部署了上述所有預(yù)檢索和檢索策略,仍然?法保證我們檢 索到的?檔將包含 LLM 回答查詢所需的所有相關(guān)信息。這是因?yàn)闄z索到的?檔可以是以下任意或所有類別的混合:
- 相關(guān)?檔(即包含回答??查詢所需信息的?檔)
- 相關(guān)但不相關(guān)的?件
- 不相關(guān)和不相關(guān)的?件
- 反事實(shí)?件(即與正確的相關(guān)?件相?盾的?件)
有研究表明相關(guān)但不相關(guān)的?檔對(duì) RAG 系統(tǒng)的危害最?研究?員發(fā)現(xiàn)“在某些情況下,準(zhǔn)確度會(huì)下降超過(guò) -67%。更重要的是,僅添加?份相關(guān)?檔就會(huì)導(dǎo)致準(zhǔn)確度急劇下降,峰值為 -25%……實(shí)證分析表明,引?語(yǔ)義?致但不相關(guān)的?檔會(huì)增加?層復(fù)雜性,可能會(huì)誤導(dǎo) LLM 得出正確的答案?!?/p>
也許更令?驚訝的是,同樣的研究?員發(fā)現(xiàn)與查詢?關(guān)和不相關(guān)的?檔“如果放置正確,實(shí)際上 有助于提?這些系統(tǒng)的準(zhǔn)確性。
通過(guò)Rerank確定搜索結(jié)果的優(yōu)先級(jí)
研究表明,將最相關(guān)的?檔放在提?中最靠近查詢的位置可以提? RAG 的性能。
重新排序模型可優(yōu)化給定查詢的區(qū)塊搜索結(jié)果的優(yōu)先級(jí)。此技術(shù)與混合檢索系統(tǒng)和查詢擴(kuò)展相結(jié) 合時(shí)效果很好。
使?上下?提?壓縮優(yōu)化搜索結(jié)果
LLM可以處理每個(gè)塊中的信息,以過(guò)濾、重新格式化甚至壓縮數(shù)據(jù)塊生成提示符的最后幾位信息。
LLMLingua是實(shí)現(xiàn)這種方法的一個(gè)很有前途的框架。LLMLingua使用一個(gè)小的語(yǔ)言模型,如GPT2-small或LLaMA-7B,以檢測(cè)和刪除不重要的提示中的令牌。它還支持使用黑盒中的壓縮提示符進(jìn)行推理llm,以最小的性能損失實(shí)現(xiàn)高達(dá)20倍的壓縮。LongLLMLingua通過(guò)考慮輸入查詢,進(jìn)一步使其適用于RAG系統(tǒng)在執(zhí)行壓縮以刪除通常不重要的令牌時(shí)對(duì)正在討論的查詢不重要。
值得注意的是,除了充分理解和使用壓縮提示回答查詢(例如,作為RAG的一部分),即使提示不是 人類可讀的GPT-4也可用于反轉(zhuǎn)或解壓縮輸入。
使? corrective RAG 對(duì)檢索到的?檔進(jìn)?評(píng)分和過(guò)濾
corrective RAG 通過(guò)訓(xùn)練 T5-Large 模型來(lái)識(shí)別 RAG 結(jié)果對(duì)于給定問(wèn)題??是正確/相關(guān)、模糊還是不正確,然后將結(jié)果提供給 LLM 以?成最終答案。未通過(guò)分類為正確/相關(guān)或模糊的閾值的 RAG 結(jié)果將被丟棄。
與使? Self-RAG 進(jìn)?微調(diào)的 Llama-2 7B 模型所使?的批評(píng)?法相?,使? T5-Large 模型更加輕量,并且可以與任何?型語(yǔ)?模型結(jié)合使?。
總結(jié)
下面給出一些簡(jiǎn)單的結(jié)論,這些結(jié)論可以根據(jù)你的實(shí)際需求應(yīng)用到項(xiàng)目中:
- 信息密度:使用 GPT-4 提取信息后,信息量顯著減少,信息密度提高。
- 檢索效率:層次索引檢索和假設(shè)問(wèn)題索引顯著提高了檢索效率和結(jié)果的相關(guān)性。
- 分塊策略:1,000 字符分塊與 200 字符重疊的策略表現(xiàn)最佳。
- 假設(shè)文檔嵌入:使用假設(shè)文檔嵌入進(jìn)行語(yǔ)義搜索,提高了檢索結(jié)果的準(zhǔn)確性。
- 查詢路由和 RAG 決策模式:識(shí)別出不需 RAG 查找的查詢,避免了不必要的計(jì)算資源消耗。
- 重新排序和壓縮:重新排序搜索結(jié)果和使用 LLM 壓縮生成提示,提高了生成響應(yīng)的質(zhì)量和效率。
- 評(píng)分和過(guò)濾:使用 T5-Large 模型評(píng)分和過(guò)濾 RAG 結(jié)果,顯著提高了響應(yīng)的準(zhǔn)確性。
本文轉(zhuǎn)載自公眾號(hào)AI 博物院 作者:longyunfeigu
