鍵.png)
使用NestJS和Prisma構(gòu)建REST API:身份驗(yàn)證
預(yù)檢索優(yōu)化主要包括提高數(shù)據(jù)索引或知識(shí)數(shù)據(jù)庫中信息的質(zhì)量和可檢索性。這里所需的技術(shù)和工作量在很大程度上取決于數(shù)據(jù)的性質(zhì)、來源和規(guī)模。例如,優(yōu)化信息密度可以提高用戶體驗(yàn),通過生成更準(zhǔn)確的響應(yīng)并減少token數(shù)來降低成本。但是,我們?nèi)绾卧谙到y(tǒng)之間進(jìn)行優(yōu)化變化呢?針對(duì)旅行行業(yè)聊天機(jī)器人增強(qiáng)檢索的優(yōu)化可能會(huì)在金融人工智能助手中產(chǎn)生驚人的逆效果,因?yàn)槊總€(gè)系統(tǒng)依賴于不同性質(zhì)和獨(dú)特監(jiān)管框架的信息。在預(yù)檢索階段,LLMs為我們提供了許多優(yōu)化信息的方式,使我們能夠根據(jù)目標(biāo)測(cè)試和微調(diào)不同的方法。以下是五種值得在預(yù)檢索階段探索的基于LLM的高級(jí)RAG技術(shù)。
您可以通過使用LLMs在存儲(chǔ)之前處理、清潔和標(biāo)記數(shù)據(jù),顯著提高RAG系統(tǒng)的性能。這種改進(jìn)是因?yàn)閬碜援悩?gòu)數(shù)據(jù)源(例如PDF、抓取的網(wǎng)絡(luò)數(shù)據(jù)、音頻轉(zhuǎn)錄)的非結(jié)構(gòu)化數(shù)據(jù)未必為RAG系統(tǒng)而構(gòu)建,會(huì)導(dǎo)致以下問題:
低信息密度會(huì)迫使RAG系統(tǒng)向LLM上下文窗口中插入更多塊以正確回答用戶查詢,增加token使用和成本。此外,低信息密度會(huì)使相關(guān)信息稀釋到LLM可能錯(cuò)誤回復(fù)的程度。當(dāng)使用低于70,000個(gè)token時(shí),GPT-4似乎相對(duì)抵抗這個(gè)問題,但其他模型可能沒有那么強(qiáng)大。以下是我們最近遇到的一個(gè)場(chǎng)景,當(dāng)在RAG系統(tǒng)上工作時(shí)可能很容易發(fā)生:我們作為主要數(shù)據(jù)源抓取了數(shù)百個(gè)網(wǎng)頁,但原始HTML包含大量不相關(guān)信息(例如CSS類、頁眉/頁腳導(dǎo)航、HTML標(biāo)記、頁面之間的冗余信息)。即使在程序化剝離CSS和HTML后,信息密度仍然很低。因此,為了提高我們塊中的信息密度,我們嘗試使用GPT-4作為從文檔中提取相關(guān)信息的事實(shí)提取器。在剝離CSS和HTML標(biāo)記后,我們使用了類似下面的LLM調(diào)用來處理每個(gè)抓取的網(wǎng)頁,然后將它們分塊并插入到我們的知識(shí)庫中。
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 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.”,
},
{“role”: “user”, “content”: <scraped web page>},
],
temperature=0)
以下是經(jīng)過我們管道處理的匿名抓取??內(nèi)容?例。從左列開始,我們發(fā)現(xiàn)原始 HTML 代碼段 的有?信息密度較低。
在程序化剝離CSS、JS和HTML后,中央片段的情況有所改善,但仍不包含高質(zhì)量信息?,F(xiàn)在,看看右側(cè)片段,其中包含經(jīng)過GPT-4處理的事實(shí)提取內(nèi)容,注意信息密度的飛躍。這是我們?cè)诜謮K和嵌入過程中使用的方法。值得注意的是,單個(gè)網(wǎng)頁文本在不同階段的token計(jì)數(shù)如下:
盡管token數(shù)量最顯著的減少(20倍)是通過對(duì)CSS、JS和HTML進(jìn)行編程剝離實(shí)現(xiàn)的,但應(yīng)用于剝離后的HTML的GPT-4事實(shí)提取步驟始終將標(biāo)記數(shù)量進(jìn)一步減少了500%。我們嘗試了一個(gè)流程,其中保留HTML標(biāo)記,以防HTML結(jié)構(gòu)中存在某種語義含義,但在我們的案例中,我們的RAG評(píng)估指標(biāo)顯示,去除標(biāo)記后性能有所提升。警告:信息丟失的?險(xiǎn)使用大型語言模型(LLMs)增加信息密度的風(fēng)險(xiǎn)在于可能丟失關(guān)鍵信息。減輕這一風(fēng)險(xiǎn)的一種策略是確保事實(shí)提取LLM輸出的最大大小要么a)沒有限制,要么b)小于輸入內(nèi)容的大小,以防輸入內(nèi)容已經(jīng)非常豐富且100%有用。
通過利用LLM生成的摘要,可以通過多層檢索系統(tǒng)使搜索變得更有效。分層索引檢索的實(shí)踐利用文檔摘要來簡(jiǎn)化識(shí)別用于響應(yīng)生成的相關(guān)信息。
前一節(jié)著重于提高信息密度而不丟失相關(guān)信息,類似于無損壓縮。然而,在生成文檔摘要時(shí),LLMs執(zhí)行的更類似于有損壓縮。
這些摘要文檔支持對(duì)大型數(shù)據(jù)庫的高效搜索。與僅創(chuàng)建由文檔塊組成的單個(gè)數(shù)據(jù)索引不同,由文檔摘要組成的額外數(shù)據(jù)索引創(chuàng)建了一個(gè)第一層過濾機(jī)制,該機(jī)制排除了具有與搜索查詢無關(guān)的摘要的文檔塊。
LLMs還可以將文檔轉(zhuǎn)換為對(duì)于嵌入模型和RAG系統(tǒng)中使用的查詢都最優(yōu)的格式。一種方法是使用GPT-4為每個(gè)文檔生成一組假設(shè)/可能的問題和答案對(duì),然后使用生成的問題作為要嵌入以進(jìn)行檢索的塊。在檢索時(shí),系統(tǒng)將檢索問題及其相應(yīng)的答案,并將它們提供給LLM。因此,查詢的嵌入很可能與生成的問題的嵌入具有更高的余弦相似度。這種相似性降低了在分塊過程中丟失相關(guān)上下文的風(fēng)險(xiǎn)。每個(gè)問答對(duì)因此是獨(dú)立的,并在理論上將包含所有所需的上下文。查詢和用于檢索的文檔之間的不對(duì)稱在RAG系統(tǒng)中是一個(gè)常見問題。查詢通常是簡(jiǎn)短的問題,比如:“XYZ金融機(jī)構(gòu)提供的最佳旅行信用卡是什么?”然而,針對(duì)該查詢的相關(guān)文檔塊要長(zhǎng)得多(例如,包含所有由XYZ金融機(jī)構(gòu)提供的信用卡的詳細(xì)內(nèi)容的段落)。這個(gè)金融服務(wù)示例為語義搜索提出了問題:如果查詢與文檔塊明顯不同(即,不對(duì)稱性過大),語義相似性可能很低,這可能導(dǎo)致搜索結(jié)果不佳,并使系統(tǒng)偏向錯(cuò)誤的信息。下?的圖表說明了我們?nèi)绾问?假設(shè)問題索引:
這是我們使?的提?:
generated_question_answer_pairs = openai.ChatCompletion.create(
model=”gpt-4”,
messages=[
{
“role”: “system”,
“content”: “Analyze the provided text or html from Example bank’s
Here’s a diagram illustrating how we used a hypothetical question index:
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)
利用LLMs生成問答對(duì)對(duì)于RAG系統(tǒng)的基準(zhǔn)測(cè)試和評(píng)估也可能是有益的。這些問答對(duì)可以作為問題和期望答案的黃金標(biāo)準(zhǔn)數(shù)據(jù)集,整個(gè)RAG系統(tǒng)應(yīng)該能夠回答這些問題。
至于減少塊大小,該方法只能走得這么遠(yuǎn),因?yàn)閴K必須保持最小尺寸以保留足夠的上下文信息以便有用。即使使用更大的塊大小,始終存在在分塊過程中丟失關(guān)鍵上下文信息的風(fēng)險(xiǎn)??梢酝ㄟ^基于諸如大小和重疊比率之類的分塊考慮進(jìn)行實(shí)驗(yàn)來減輕(但無法消除)這種風(fēng)險(xiǎn)。注意事項(xiàng):假設(shè)性問題索引的風(fēng)險(xiǎn)和替代方案信息丟失仍然是這種先進(jìn)的RAG技術(shù)的風(fēng)險(xiǎn)。對(duì)于高度信息密集的文檔,LLMs可能無法生成足夠的問答對(duì)來覆蓋用戶可能對(duì)文檔中信息的各種查詢。此外,根據(jù)您的文檔存儲(chǔ)大小,使用LLM處理和轉(zhuǎn)換每個(gè)文檔以減輕查詢-文檔不對(duì)稱可能成本過高。最后,根據(jù)您的RAG系統(tǒng)的流量,一個(gè)更有效的解決方案可能是一種名為假設(shè)性文檔嵌入(HyDE)的反向方法,用于轉(zhuǎn)換用戶查詢而不是文檔。我們將在下面的檢索技術(shù)部分進(jìn)一步討論HyDE。
使用LLMs作為信息去重器可以提高數(shù)據(jù)索引的質(zhì)量。LLM通過將塊精簡(jiǎn)為較少的塊來去重信息,提高了獲得理想響應(yīng)的幾率。這是一項(xiàng)有價(jià)值的技術(shù),因?yàn)楦鶕?jù)情況不同,數(shù)據(jù)索引中的信息重復(fù)可能有助于或阻礙RAG系統(tǒng)的輸出。一方面,如果用于回答查詢所需的正確信息在LLM生成響應(yīng)的上下文窗口中重復(fù),那么LLM產(chǎn)生理想響應(yīng)的可能性增加。相反,如果重復(fù)的程度削弱甚至完全排除了LLM上下文窗口中的所需信息,那么用戶可能會(huì)收到非答案,甚至更糟糕,是來自RAG系統(tǒng)的AI幻覺。我們可以通過在嵌入空間中對(duì)塊進(jìn)行k均值聚類,使每個(gè)塊簇中的聚合token數(shù)適合LLM的有效上下文窗口。從這里,我們可以讓LLM從原始簇中簡(jiǎn)單地輸出一組經(jīng)過精簡(jiǎn)的新塊,以去除重復(fù)信息。如果一個(gè)給定的簇包含N個(gè)塊,我們應(yīng)該期望這個(gè)去重提示輸出小于或等于N個(gè)新塊,其中新塊中刪除了任何多余信息。以下圖顯示了信息去重之前和之后在嵌入空間中的塊。
注意:這個(gè)過程使得在您的RAG系統(tǒng)中包含任何引用系統(tǒng)變得更加困難,因?yàn)樾碌膲K可能包含來自多個(gè)文檔的信息。此外,信息丟失的風(fēng)險(xiǎn)仍然存在,以及降低信息重復(fù)在檢索系統(tǒng)中可能受益的風(fēng)險(xiǎn)。
上述技術(shù)強(qiáng)調(diào)了分塊策略的重要性。但是,最佳的分塊策略是特定于用例的,許多因素影響著它。找到最佳的分塊策略的唯一方法是廣泛地對(duì)您的RAG系統(tǒng)進(jìn)行A/B測(cè)試。在測(cè)試時(shí)需要考慮以下一些最重要的因素。
1、嵌入模型:
不同的嵌入模型在不同的輸入大小下具有不同的性能特征。例如,來自句子轉(zhuǎn)換器的嵌入模型在嵌入單個(gè)句子時(shí)表現(xiàn)出色,而text-embedding-ada-002可以處理更大的輸入。塊的大小應(yīng)該理想地根據(jù)所使用的具體嵌入模型進(jìn)行定制,反之亦然。
2、要嵌入的內(nèi)容的性質(zhì):根據(jù)文檔的信息密度、格式和復(fù)雜性,塊可能需要具有一定的最小尺寸才能包含足夠的上下文信息以便LLM使用。然而,這是一個(gè)平衡的過程。如果塊太大,它們可能會(huì)在嵌入中稀釋相關(guān)信息,降低在語義搜索期間該塊的檢索概率。如果您的文檔沒有自然的斷點(diǎn)(例如,用子標(biāo)題分割的教科書章節(jié)),并且文檔是基于任意字符限制(例如,500個(gè)字符)進(jìn)行分塊的,那么存在關(guān)鍵上下文信息被分割的風(fēng)險(xiǎn)。在這種情況下,應(yīng)該考慮重疊。例如,具有50%重疊比率的分塊策略意味著文檔中兩個(gè)相鄰的500字符塊將相互重疊250個(gè)字符。在決定重疊比率時(shí),應(yīng)考慮信息重復(fù)和嵌入更多數(shù)據(jù)的成本。
3、查詢的復(fù)雜性或嵌入類型如果您的RAG系統(tǒng)處理以大段落提出的查詢,那么將數(shù)據(jù)分塊成大段落是有意義的。然而,如果查詢只有幾個(gè)詞長(zhǎng),大塊大小可能不利于最佳信息檢索。4、LLM的能力、上下文窗口和成本雖然GPT-4似乎能夠處理許多大塊,但更小的生成模型可能表現(xiàn)不佳。此外,在許多大塊上運(yùn)行推斷可能成本高昂。5、要嵌入的數(shù)據(jù)量嵌入必須存儲(chǔ)在某個(gè)地方,而較小的塊大小會(huì)導(dǎo)致相同數(shù)據(jù)量的更多嵌入,這意味著增加的存儲(chǔ)需求和成本。更多的嵌入還可能增加用于語義搜索的計(jì)算資源,這取決于您的語義搜索是如何實(shí)現(xiàn)的(精確最近鄰 vs. 近似最近鄰)。我們的經(jīng)驗(yàn)通過借助我們基于LLM的RAG評(píng)估系統(tǒng)進(jìn)行廣泛的A/B測(cè)試,我們可以為我們的每個(gè)用例評(píng)估最佳的分塊策略。
我們主要在由GPT-4處理的改進(jìn)信息密集文檔上測(cè)試了以下分塊策略:
在構(gòu)建我們的金融服務(wù)AI助手時(shí),我們發(fā)現(xiàn)分塊策略的選擇并沒有太大影響(請(qǐng)參見下表中的結(jié)果)。具有重疊200個(gè)字符的1,000字符塊策略表現(xiàn)略優(yōu)于其他策略。
我們對(duì)分塊策略為何顯著影響我們的用例提出的假設(shè)包括:
然而,只要我們對(duì)應(yīng)用程序進(jìn)行了一次改變,比如為更復(fù)雜的領(lǐng)域構(gòu)建,我們很可能會(huì)看到不同的結(jié)果。
我們渴望測(cè)試更先進(jìn)的RAG技術(shù),用于預(yù)檢索和數(shù)據(jù)索引。這些技術(shù)包括遞歸檢索,通過迭代一個(gè)檢索步驟的輸出并將其用作另一個(gè)步驟的輸入來支持復(fù)雜的多步查詢。通過句子窗口和父子塊檢索進(jìn)行上下文豐富化也讓我們感興趣,這是一種改進(jìn)搜索和豐富LLM響應(yīng)的方式。
以上分享的5種高級(jí)RAG技巧,主要是面向預(yù)檢索和數(shù)據(jù)索引方向,后面會(huì)陸續(xù)針對(duì)RAG檢索中、檢索后、生成中等方向分享另外的10種RAG技巧。
文章轉(zhuǎn)自微信公眾號(hào)@耳東觀察
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)