除了 Transformer 模型之外,我們還使用了一系列技術(shù),例如:

所有這些技術(shù)都已經(jīng)存在多年。向量搜索庫(kù) FAISS 于 2019 年發(fā)布。此外,文本向量化也不是什么新鮮事。[Ilin, 2024]

RAG 只是連接這些組件,以解決特定的問題。

例如,必應(yīng)搜索將其傳統(tǒng)的“BING”網(wǎng)絡(luò)搜索與大型語(yǔ)言模型的功能相結(jié)合。這使得他們的聊天機(jī)器人能夠回答“真實(shí)”生活數(shù)據(jù)的問題,例如:

下圖顯示了標(biāo)準(zhǔn)的 RAG 流程。當(dāng)用戶提出問題時(shí),樸素 RAG 會(huì)將用戶的問題直接與我們向量數(shù)據(jù)庫(kù)中的任何內(nèi)容進(jìn)行比較。

我們感興趣的是找到相似的內(nèi)容。?相似內(nèi)容是指在我們的向量空間中彼此接近的內(nèi)容。距離是通過計(jì)算?余弦相似度?來衡量的,例如。

示例:

問題:“湯姆·布雷迪打過什么位置?”

假設(shè)我們的向量數(shù)據(jù)庫(kù)中有兩個(gè)主要數(shù)據(jù)源:

  1. 湯姆·布雷迪的維基百科文章。
  2. 來自食譜的文章。

在下面的示例中,來自維基百科的內(nèi)容應(yīng)該更相關(guān),因此更接近用戶的問題。

但是“接近”到什么程度才算“足夠接近”?

我們無法為相似度分?jǐn)?shù)設(shè)置一個(gè)閾值,以便區(qū)分相關(guān)內(nèi)容和不相關(guān)內(nèi)容。您可以自己嘗試一下,但您可能會(huì)意識(shí)到這樣做是不切實(shí)際的。

找到內(nèi)容了嗎?讓我們構(gòu)建提示

現(xiàn)在我們找到了一些與用戶問題相似的內(nèi)容,我們需要將所有這些內(nèi)容打包成一個(gè)有意義的提示。我們得到了一個(gè)至少包含 3 個(gè)構(gòu)建塊的提示。

  1. 系統(tǒng)提示,用于告訴大型語(yǔ)言模型如何表現(xiàn)
  2. 用戶問題
  3. 上下文,執(zhí)行相似性搜索后找到的相關(guān)文檔

一個(gè)合適的提示模板可能如下所示:

系統(tǒng)提示中的 “… 僅使用提供的信息” 部分將大型語(yǔ)言模型變成了一個(gè)處理和解釋信息的系統(tǒng)。在這種情況下,我們不會(huì)直接利用模型的知識(shí)來回答問題。

就是這樣。—— 就是這么簡(jiǎn)單。一個(gè)向量存儲(chǔ)、一個(gè)嵌入模型、一個(gè)大型語(yǔ)言模型、幾行 Python 代碼 —— 當(dāng)然還有一些文檔。

當(dāng)我們擴(kuò)展這些系統(tǒng)并將它們從原型轉(zhuǎn)變?yōu)樯a(chǎn)解決方案時(shí),我們就會(huì)回到現(xiàn)實(shí)。

在這個(gè)過程中,我們很可能會(huì)遇到各種陷阱,例如:

如何應(yīng)對(duì) RAG 的潛在陷阱?

如上所述,我們有不同的組件相互交互。這為我們提供了一系列可能的方法來提高整個(gè)系統(tǒng)的性能。

基本上,我們可以嘗試改進(jìn)以下 5 個(gè)流程步驟:

  1. 檢索前:將嵌入內(nèi)容攝取到向量存儲(chǔ)中
  2. 檢索:找到相關(guān)內(nèi)容
  3. 檢索后:在將結(jié)果發(fā)送到大型語(yǔ)言模型之前對(duì)其進(jìn)行預(yù)處理?
  4. 生成:使用提供的上下文來解決用戶的問題
  5. 路由:請(qǐng)求的總體路由,例如代理方法將問題分解,并在模型之間來回發(fā)送

如果我們更仔細(xì)地觀察它們,就會(huì)得到下圖。

讓我們來看看它們中的每一個(gè)。

我們從最明顯和最簡(jiǎn)單的方法開始 — 數(shù)據(jù)質(zhì)量。對(duì)于大多數(shù) RAG 用例,它是文本數(shù)據(jù),例如一些維基文章。

1. 原始數(shù)據(jù)創(chuàng)建/準(zhǔn)備

我們并非總是需要使用現(xiàn)有的數(shù)據(jù)。我們通??梢杂绊懳臋n的創(chuàng)建過程。

通過大型語(yǔ)言模型和 RAG 應(yīng)用程序,我們突然被迫構(gòu)建我們的知識(shí)庫(kù)。在樸素 RAG 中,我們搜索信息片段,這些片段在某種程度上與用戶的問題相似。

這樣,模型永遠(yuǎn)不會(huì)看到維基的整個(gè)上下文,而只會(huì)看到單個(gè)文本片段。當(dāng)文檔包含以下內(nèi)容時(shí),就會(huì)出現(xiàn)問題,例如:

如果一個(gè)沒有背景知識(shí)的人很難理解文本片段背后的全部含義,那么大型語(yǔ)言模型也會(huì)遇到困難。

在本文的后面部分,您將找到一些技術(shù),這些技術(shù)試圖在檢索步驟之后或期間解決這些問題。

在理想的世界中,我們不需要它們。

我們維基百科中的每個(gè)部分都應(yīng)該盡可能易于理解,這對(duì)我們?nèi)祟悂碚f也更容易理解。這樣,我們就可以同時(shí)提高維基百科的可讀性和 RAG 應(yīng)用程序的性能。雙贏。

以下示例展示了我們?nèi)绾瓮ㄟ^以正確的方式設(shè)置內(nèi)容來簡(jiǎn)化 RAG 應(yīng)用程序的工作。

(1) 以文本塊自解釋的方式準(zhǔn)備數(shù)據(jù)

在下圖中,你可以看到一個(gè)類似于你在教程和技術(shù)文檔中經(jīng)常看到的例子。如果我們沒有純LLM,而是一個(gè)多模態(tài)模型,LLM將很難完全理解左側(cè)版本 1 中的內(nèi)容。版本 2 至少給了它更好的機(jī)會(huì)去理解。

RAG流程的下一步是以有意義的方式對(duì)數(shù)據(jù)進(jìn)行分塊,將其轉(zhuǎn)換為嵌入,并對(duì)其進(jìn)行索引。

2. 索引/分塊 — 分塊優(yōu)化

Transformer 模型具有固定的輸入序列長(zhǎng)度。因此,我們發(fā)送到LLM和嵌入模型的提示的標(biāo)記大小是有限的。

但我認(rèn)為,這不是一個(gè)限制。

考慮文本片段和提示的最佳長(zhǎng)度是有意義的,因?yàn)檫@對(duì)性能有重大影響,例如:

有各種可用的文本分割器來對(duì)文本進(jìn)行分塊。

(2) 分塊優(yōu)化 — 滑動(dòng)窗口、遞歸結(jié)構(gòu)感知分割、結(jié)構(gòu)感知分割、內(nèi)容感知分割

分塊的大小是一個(gè)需要考慮的參數(shù),它取決于你使用的嵌入模型及其在標(biāo)記方面的能力,像基于 BERT 的句子轉(zhuǎn)換器這樣的標(biāo)準(zhǔn)轉(zhuǎn)換器編碼器模型最多接受 512 個(gè)標(biāo)記,一些嵌入模型能夠處理更長(zhǎng)的序列,8191 個(gè)標(biāo)記甚至更多。

但更大并不總是更好。我寧愿在一本書中找到包含兩條最重要信息的兩個(gè)句子,也不愿找到 5 頁(yè)包含答案的頁(yè)面。

這里的折衷方案是:

足夠的上下文供LLM進(jìn)行推理 vs. 足夠具體的文本嵌入以便有效地執(zhí)行搜索

有多種方法可以解決這些塊大小選擇問題。在 LlamaIndex 中,這由 NodeParser 類涵蓋,該類具有一些高級(jí)選項(xiàng),例如定義自己的文本分割器、元數(shù)據(jù)、節(jié)點(diǎn)/塊關(guān)系等。

確保正確捕獲所有信息并且沒有任何部分被遺漏的最簡(jiǎn)單方法是使用滑動(dòng)窗口將整個(gè)文本嚴(yán)格分成幾部分。

這很簡(jiǎn)單,文本部分重疊 — 就是這樣。

除此之外,你還可以嘗試許多其他分塊技術(shù)來改進(jìn)分塊過程,例如:

(3) 提高數(shù)據(jù)質(zhì)量 — 縮寫、技術(shù)術(shù)語(yǔ)、鏈接

數(shù)據(jù)清理技術(shù)可以去除不相關(guān)的信息,或者將文本片段放入上下文中,使其更容易理解。

有時(shí),如果你知道這本書的上下文,那么較長(zhǎng)文本中特定段落的含義就非常清楚了。如果缺少上下文,就很難理解。

縮寫、特定的技術(shù)術(shù)語(yǔ)或公司內(nèi)部術(shù)語(yǔ)會(huì)使模型難以理解其全部含義。

下圖顯示了一些示例。

為了緩解這個(gè)問題,我們可以嘗試在處理數(shù)據(jù)時(shí)獲取必要的額外上下文,例如,使用縮寫翻譯表將縮寫替換為全文。

當(dāng)你圍繞文本到 SQL 的用例工作時(shí),你肯定需要這樣做。許多數(shù)據(jù)庫(kù)中的字段名稱通常都很奇怪。通常只有開發(fā)者和上帝才知道某個(gè)特定字段名稱背后的含義。

SAP(企業(yè)資源規(guī)劃解決方案)經(jīng)常使用德語(yǔ)單詞的縮寫形式來標(biāo)記其字段。字段“WERKS”是德語(yǔ)單詞“Werkstoff”的縮寫,它描述了零件的原材料。

當(dāng)然,這對(duì)定義數(shù)據(jù)庫(kù)結(jié)構(gòu)的團(tuán)隊(duì)來說可能是有意義的。其他人將很難理解,包括我們的模型。

(4) 添加元數(shù)據(jù)

你可以在所有向量數(shù)據(jù)庫(kù)中向向量數(shù)據(jù)添加元數(shù)據(jù)。元數(shù)據(jù)可以在我們執(zhí)行向量搜索之前幫助(預(yù)先)過濾整個(gè)向量數(shù)據(jù)庫(kù)。

假設(shè)我們向量存儲(chǔ)中的一半數(shù)據(jù)是針對(duì)歐洲用戶的,另一半是針對(duì)美國(guó)用戶的。如果我們知道用戶的地理位置,我們就不想搜索整個(gè)數(shù)據(jù)庫(kù),我們希望能夠直接搜索相關(guān)位。如果我們將此信息作為元數(shù)據(jù)字段,大多數(shù)向量存儲(chǔ)允許我們?cè)趫?zhí)行相似性搜索之前預(yù)先過濾數(shù)據(jù)庫(kù)。

(5) 優(yōu)化索引結(jié)構(gòu) — 全搜索 vs. 近似最近鄰,HNSW vs. IVFPQ

我不認(rèn)為相似性搜索是大多數(shù) RAG 系統(tǒng)的弱點(diǎn) — 至少當(dāng)我們查看響應(yīng)時(shí)間時(shí)不是 — 但我還是想提一下。

大多數(shù)向量分?jǐn)?shù)中的相似性搜索速度非???,即使我們有數(shù)百萬(wàn)個(gè)條目,因?yàn)樗褂昧私谱罱徏夹g(shù) — 例如 FAISS、NMSLIB、ANNOY ……

FAISS、NMSLIB 或 ANNOY 使用一些近似最近鄰使之成為可能。

對(duì)于只有幾千個(gè)條目的用例來說,這通常是多余的。如果我們執(zhí)行 ANN 或完全最近鄰搜索,只會(huì)稍微影響 RAG 系統(tǒng)的響應(yīng)時(shí)間。

但是,如果你想建立一個(gè)可擴(kuò)展的系統(tǒng),你當(dāng)然可以加快速度。

(6) 選擇合適的嵌入模型

在對(duì)文本塊進(jìn)行嵌入時(shí),有多種選擇。如果不確定使用哪些模型,可以查看現(xiàn)有的文本嵌入模型性能基準(zhǔn)測(cè)試,例如 MTEB(大規(guī)模文本嵌入基準(zhǔn)測(cè)試)。

在嵌入方面,我們通常需要決定嵌入的維度數(shù)。更高的維度可以捕捉和存儲(chǔ)句子更多的語(yǔ)義方面,但另一方面,它需要更多的存儲(chǔ)空間和計(jì)算時(shí)間。

我們將所有內(nèi)容轉(zhuǎn)換為嵌入向量,并將它們添加到向量數(shù)據(jù)庫(kù)中?,F(xiàn)在有來自不同提供商的多種模型可用。如果想了解可以使用哪些模型,可以查看langchain.embeddings模塊支持的模型。在模塊的源代碼中,你會(huì)發(fā)現(xiàn)一個(gè)相當(dāng)長(zhǎng)的支持模型列表:

    __all__ = [
"OpenAIEmbeddings",
"AzureOpenAIEmbeddings",
"CacheBackedEmbeddings",
"ClarifaiEmbeddings",
"CohereEmbeddings",
...
"QianfanEmbeddingsEndpoint",
"JohnSnowLabsEmbeddings",
"VoyageEmbeddings",
"BookendEmbeddings"
]

3. 檢索優(yōu)化 — 查詢翻譯 / 查詢重寫 / 查詢擴(kuò)展

查詢擴(kuò)展、查詢重寫或查詢翻譯,所有這些方法都必須修改發(fā)送給 LLM 的原始查詢。

基本上,我們正在利用 LLM 的力量來增強(qiáng)和優(yōu)化我們發(fā)送到向量搜索的查詢。

有多種方法,例如:

  1. 通過針對(duì)用戶問題生成 LLM 生成的文檔來擴(kuò)展用戶的查詢。
  2. 或者,我們可以使用 LLM 對(duì)用戶的查詢進(jìn)行稍微的改寫,并將不同的提示發(fā)送給模型,然后解釋來自模型的不同反饋。

讓我們從第一個(gè)開始。

(7) 使用生成答案進(jìn)行查詢擴(kuò)展 — HyDE 等

在執(zhí)行相似性搜索之前,我們使用 LLM 生成答案。如果這是一個(gè)只能使用我們的內(nèi)部知識(shí)才能回答的問題,我們會(huì)間接地要求模型進(jìn)行幻覺,并使用幻覺的答案來搜索與答案相似的內(nèi)容,而不是用戶查詢本身。

有幾種技術(shù),例如 HyDE(假設(shè)文檔嵌入)、重寫-檢索-讀取、后退提示、Query2Doc、ITER-RETGEN 等。

在 HyDE 中,我們讓 LLM 首先在沒有上下文的情況下為用戶的查詢創(chuàng)建一個(gè)答案,并使用該答案在我們的向量數(shù)據(jù)庫(kù)中搜索相關(guān)信息。

作為 HyDE 等方法的替代方法,我們可以使用多個(gè)系統(tǒng)提示來擴(kuò)展用戶的查詢。

(8) 多個(gè)系統(tǒng)提示

這個(gè)想法很簡(jiǎn)單:我們生成例如 4 個(gè)不同的提示,這些提示將提供 4 個(gè)不同的響應(yīng)。

你可以發(fā)揮創(chuàng)造力。提示之間的區(qū)別可以是任何東西。

這個(gè)想法在數(shù)據(jù)科學(xué)中隨處可見。在 Boosting 算法中,我們通常有簡(jiǎn)單的模型,每個(gè)模型略有不同,做出一個(gè)小的決策。最后,我們以某種方式整合結(jié)果。這個(gè)概念非常強(qiáng)大。

我們?cè)谶@里做的是一樣的,只是再次使用模型來整合不同的預(yù)測(cè)。缺點(diǎn)當(dāng)然是計(jì)算時(shí)間和/或響應(yīng)時(shí)間更長(zhǎng)。

(9) 查詢路由

在查詢路由中,我們使用 LLM 的決策能力來決定下一步做什么。

假設(shè)我們的向量存儲(chǔ)中有來自不同領(lǐng)域的數(shù)據(jù)。為了更有針對(duì)性地搜索相關(guān)內(nèi)容,讓模型在第一步中決定我們應(yīng)該使用哪個(gè)數(shù)據(jù)池來回答問題是有意義的。

下圖中的示例向量存儲(chǔ)包含來自世界各地的新聞。有關(guān)體育和足球的新聞、烹飪趨勢(shì)和政治新聞。當(dāng)用戶查詢我們的聊天機(jī)器人時(shí),我們不想混合這些數(shù)據(jù)。

國(guó)家之間的體育競(jìng)爭(zhēng)不應(yīng)該與政治混為一談。如果用戶正在尋找有關(guān)政治的新聞,那么有關(guān)烹飪的內(nèi)容可能沒有幫助。

通過這種方式,我們可以顯著提高性能。我們還可以讓最終用戶選擇用于回答問題的主題。

(10) 混合搜索

基本上,RAG 管道的檢索步驟就是一個(gè)搜索引擎。這可能是我們 RAG 系統(tǒng)中最重要的部分。

當(dāng)我們想要改進(jìn)相似性搜索時(shí),值得關(guān)注一下搜索領(lǐng)域?;旌纤阉鞣椒ň褪且粋€(gè)例子。我們執(zhí)行向量搜索和詞匯(關(guān)鍵字)搜索,并以某種方式將這些結(jié)果結(jié)合在一起。

在機(jī)器學(xué)習(xí)中,這是一種常見的方法。擁有不同的技術(shù)、不同的模型,預(yù)測(cè)相同的輸出,并匯總結(jié)果。其思想始終是一致的。

一群專家試圖找到解決方案并做出妥協(xié),這比一個(gè)獨(dú)立的專家做出更好的決策。

4. 檢索后:如何改進(jìn)檢索步驟?

上下文豐富 – 例如句子窗口檢索

我們通常會(huì)盡量保持文本塊較小,以便找到我們想要的內(nèi)容并保持較高的搜索質(zhì)量。

另一方面,如果不僅能看到最匹配的句子,還能看到它周圍的上下文,通常會(huì)更容易給出正確的答案。

讓我們看一下下圖中的例子:

我們有一堆文本塊,來自一篇關(guān)于德國(guó)足球俱樂部拜仁慕尼黑的維基百科文章。我還沒有測(cè)試過,但我可以想象第一個(gè)文本片段會(huì)帶來最高的相似度得分。

盡管如此,第二個(gè)塊中的信息可能更相關(guān)。我們也希望捕捉到那一個(gè)。這就是上下文豐富發(fā)揮作用的地方。

有各種方法可以豐富上下文,下面我將簡(jiǎn)要描述其中兩種:

  1. 句子窗口檢索器
  2. 自動(dòng)合并檢索器

(11) 句子窗口檢索

相似度得分最高的文本塊表示找到的最匹配的內(nèi)容。在將內(nèi)容發(fā)送到 LLM 之前,我們?cè)谡业降奈谋緣K前后添加 k 個(gè)句子。這是有意義的,因?yàn)檫@些信息很可能與中間部分相關(guān)聯(lián),而且中間文本塊中的信息可能不完整。

自動(dòng)合并檢索器也是這樣做的,只是這一次,每個(gè)塊都附加了一些“父”塊,這些父塊不一定是找到的塊之前和之后的塊。

(12) 自動(dòng)合并檢索器(又稱父文檔檢索器)

自動(dòng)合并檢索器的工作原理類似,只是這一次每個(gè)小的文本塊都被分配了某些“父”塊,這些父塊不一定是找到的文本塊之前和之后的塊。

您可以發(fā)揮您的所有創(chuàng)造力,定義和識(shí)別文本塊之間的相關(guān)關(guān)系。

例如,當(dāng)我們查看技術(shù)文檔或法律合同時(shí),段落或章節(jié)通常會(huì)引用合同的其他部分。挑戰(zhàn)在于用其他段落中的相關(guān)信息來豐富段落。因此,我們需要能夠識(shí)別文本中引用文檔其他部分的鏈接。

我們可以在此概念的基礎(chǔ)上構(gòu)建一個(gè)完整的層次結(jié)構(gòu),就像一個(gè)決策樹,具有不同級(jí)別的父節(jié)點(diǎn)、子節(jié)點(diǎn)和葉節(jié)點(diǎn)。例如,我們可以有 3 個(gè)級(jí)別,具有不同的塊大小 [LlamaIndex, 2024]:

當(dāng)我們對(duì)數(shù)據(jù)進(jìn)行索引并執(zhí)行相似性搜索時(shí),我們使用的是最小的塊,即葉節(jié)點(diǎn)。在此步驟之后,我們找到葉的匹配父節(jié)點(diǎn)。

在檢索步驟之后,我們必須解釋找到的內(nèi)容并使用它來解決用戶查詢。為此,我們使用大型語(yǔ)言模型 (LLM)。但是哪種模型適合我們的用例呢?

5. 生成 / 代理

(13) 選擇合適的 LLM 和提供商 – 開源與閉源、服務(wù)與自托管、小型模型與大型模型

為您的應(yīng)用程序選擇合適的模型并不像您想象的那么容易。這取決于具體的應(yīng)用和您的流程是什么樣的。

有些人會(huì)說,最明顯的解決方案是:

直接使用最強(qiáng)大的那個(gè)

然而,使用更小、更便宜、更快的模型有一些不可否認(rèn)的優(yōu)勢(shì)。

RAG 流程的某些部分,準(zhǔn)確性可以低一些,但響應(yīng)時(shí)間應(yīng)該很快,例如:當(dāng)我們使用基于代理的方法時(shí),我們需要沿著管道不斷做出簡(jiǎn)單的決策。

此外,如果較小模型的響應(yīng)和決策能力足以滿足我們的用例,那么就沒有必要去追求最強(qiáng)大的模型。您將降低解決方案的運(yùn)營(yíng)成本,用戶也會(huì)感謝您改進(jìn)系統(tǒng)的響應(yīng)時(shí)間。

但是我們?nèi)绾芜x擇模型呢?

有幾個(gè)基準(zhǔn)測(cè)試,從不同的角度比較了 LLM。但最終,我們只需要為我們的 RAG 解決方案嘗試一下它們。

(14) 代理

代理結(jié)合了一些組件,并根據(jù)一定的規(guī)則迭代地執(zhí)行它們。

代理使用所謂的“思維鏈推理”概念,它描述了以下迭代過程:

  1. 發(fā)送請(qǐng)求,
  2. 使用 LLM 解釋響應(yīng),
  3. 決定下一步行動(dòng),以及
  4. 再次行動(dòng)。

下圖中的問題顯示了一個(gè)通常過于復(fù)雜而無法一次性回答的示例,因?yàn)榇鸢负芸赡軟]有寫在任何地方。

我們?nèi)祟悤?huì)把它分解成我們可以回答的更簡(jiǎn)單的子問題,然后計(jì)算出我們想要的答案。代理在這種情況下也是這樣做的。

使用基于代理的方法,我們可以顯著提高準(zhǔn)確性。當(dāng)然,總會(huì)有一個(gè)權(quán)衡。與一次性提示相比,我們?cè)黾恿怂璧挠?jì)算能力和響應(yīng)時(shí)間。但提高了準(zhǔn)確性。

盡管如此,使用這種方法,我們可以用更小、更快的模型超越更大模型的準(zhǔn)確性。最終,這對(duì)您的解決方案來說可能是更好的方法。

這始終取決于您的具體用例 — 當(dāng)我們構(gòu)建一個(gè)用于純粹信息檢索的機(jī)器人時(shí),我們一直在與搜索引擎的超短響應(yīng)時(shí)間競(jìng)爭(zhēng)。

響應(yīng)時(shí)間是關(guān)鍵。

等待幾秒甚至幾分鐘的結(jié)果很糟糕。

6. 評(píng)估 — 評(píng)估我們的 RAG 系統(tǒng)

基于 RAG 的系統(tǒng)的性能高度依賴于提供的數(shù)據(jù)和 LLM 提取有用信息的能力。為此,我們需要幾個(gè)組件協(xié)同工作。當(dāng)我們想要評(píng)估整個(gè)系統(tǒng)時(shí),我們通常不僅要跟蹤整體性能,還要了解各個(gè)組件是如何完成其應(yīng)盡職責(zé)的。

和以前一樣,我們可以將其分為檢索器組件和生成器組件的評(píng)估。

我們可以使用典型的搜索指標(biāo)(如 DCG 和 nDCG)來評(píng)估搜索部分,這些指標(biāo)用于評(píng)估排名質(zhì)量。它們檢查真正相關(guān)的內(nèi)容在相似性搜索中是否確實(shí)被歸類為此類。[EvidentlyAI, 2024][Leonie Monigatti, 2023]

“理想排名”與真實(shí)排名:NDCG 作為一種幫助評(píng)估排名質(zhì)量的指標(biāo) — 圖片由作者提供 [EvidentlyAI, 2024]

評(píng)估模型本身的響應(yīng)非常棘手。

我們?nèi)绾卧u(píng)估響應(yīng)?語(yǔ)言是模棱兩可的,所以我們?nèi)绾谓o輸出一個(gè)類似于評(píng)級(jí)的評(píng)價(jià)呢?

最簡(jiǎn)單的方法是詢問很多人他們是否認(rèn)為答案有幫助——假設(shè)我們讓 1000 個(gè)人對(duì) LLM 的答案進(jìn)行評(píng)分。這將使您很好地了解它的工作情況。但對(duì)于一個(gè)高效的解決方案來說,這是不切實(shí)際的。

每次稍微更改 RAG 過程時(shí),都會(huì)影響結(jié)果。我知道說服領(lǐng)域?qū)<覝y(cè)試您的解決方案是多么困難。我們可以做一兩次,但不是每次我們更改管道中的某些內(nèi)容時(shí)都這樣做。

所以我們需要想出一個(gè)更好的辦法。一種方法是,我們不使用人工,而是使用其他 LLM 來評(píng)估結(jié)果——所以我們使用模型“作為評(píng)判者”的方法

(15) LLM 作為評(píng)判者

可以使用 LLM 作為評(píng)判者的方法來評(píng)估生成部分。這個(gè)概念很簡(jiǎn)單。

  1. 我們生成一個(gè)評(píng)估數(shù)據(jù)集
  2. 然后使用我們想要評(píng)估的合適標(biāo)準(zhǔn)定義一個(gè)所謂的“批評(píng)代理”,
  3. 最后建立一個(gè)測(cè)試流程,根據(jù)定義的標(biāo)準(zhǔn)自動(dòng)評(píng)估 LLM 的響應(yīng)

步驟 (1) — 生成一個(gè)合成評(píng)估數(shù)據(jù)集

通常是一組(1)上下文、(2)問題和(3)答案。我們不一定有一個(gè)完整的數(shù)據(jù)集。我們可以通過向 LLM 提供上下文并讓它猜測(cè)可能提出的問題來自己創(chuàng)建它。一步一步地建立一個(gè)合成數(shù)據(jù)集。

步驟 (2) — 建立一個(gè)所謂的“批評(píng)代理”

“批評(píng)代理”是另一個(gè) LLM(通常是一個(gè)強(qiáng)大的 LLM),我們使用它根據(jù)一些標(biāo)準(zhǔn)來評(píng)估系統(tǒng)的響應(yīng),例如:

一個(gè)示例指標(biāo)定義可能如下所示 [Databricks, 2023]:

definition=(
"Professionalism refers to the use of a formal, respectful, and appropriate style of communication that is "
"tailored to the context and audience. It often involves avoiding overly casual language, slang, or "
"colloquialisms, and instead using clear, concise, and respectful language."
),
grading_prompt=(
"Professionalism: If the answer is written using a professional tone, below are the details for different scores: "
"- Score 1: Language is extremely casual, informal, and may include slang or colloquialisms. Not suitable for "
"professional contexts."
"- Score 2: Language is casual but generally respectful and avoids strong informality or slang. Acceptable in "
"some informal professional settings."
"- Score 3: Language is overall formal but still have casual words/phrases. Borderline for professional contexts."
"- Score 4: Language is balanced and avoids extreme informality or formality. Suitable for most professional contexts. "
"- Score 5: Language is noticeably formal, respectful, and avoids casual elements. Appropriate for formal "
"business or academic settings. "
),

步驟 (3) — 測(cè)試 RAG 系統(tǒng):使用剛剛創(chuàng)建的評(píng)估數(shù)據(jù)集,我們開始測(cè)試系統(tǒng)

對(duì)于我們要測(cè)試的每個(gè)指標(biāo)/標(biāo)準(zhǔn),我們定義一個(gè)詳細(xì)的描述(例如,在 1-5 的范圍內(nèi)),然后讓模型做出決定。這不是一門精確的科學(xué),模型的答案會(huì)有所不同,但它讓我們了解系統(tǒng)運(yùn)行情況。

您可以在 Prometheus 的提示模板 或 Databricks 的 MLFlow 教程 中找到此評(píng)分提示外觀的一些示例。

(16) RAGAs

RAGAs(檢索增強(qiáng)生成評(píng)估) 是一個(gè)框架,允許您評(píng)估 RAG 系統(tǒng)的每個(gè)組件。

一個(gè)核心概念仍然是“LLM 作為評(píng)判者”/“LLM 輔助評(píng)估”背后的理念。但 Ragas 提供的遠(yuǎn)不止這些。它還提供了不同的工具和技術(shù)來實(shí)現(xiàn) RAG 應(yīng)用程序的持續(xù)學(xué)習(xí)。

值得一提的是一個(gè)核心概念,“組件式評(píng)估”。Ragas 提供預(yù)定義的指標(biāo)來分別評(píng)估 RAG 流水線的每個(gè)組件,例如 [Ragas, 2024]:

生成:

檢索:

其他指標(biāo)側(cè)重于端到端評(píng)估 RAG 流水線,例如:

(17) 持續(xù)從應(yīng)用程序和用戶那里收集數(shù)據(jù)

收集數(shù)據(jù)是具體識(shí)別和填補(bǔ)流程中空白的關(guān)鍵。通常,知識(shí)庫(kù)中提供給系統(tǒng)的數(shù)據(jù)本身不夠好。為了意識(shí)到這一點(diǎn),我們需要引入一些方法,讓用戶能夠盡可能輕松地提供反饋。

其他有趣的指標(biāo)有

RAG 系統(tǒng)是一個(gè)包含不同步驟的概念。為了優(yōu)化性能和響應(yīng)時(shí)間,我們需要知道瓶頸在哪里。這就是為什么我們要監(jiān)控這些步驟,以便我們能夠在最大的杠桿上努力。

總結(jié)

沒有明確的道路可循。這是一個(gè)不斷試錯(cuò)的過程。與任何其他數(shù)據(jù)科學(xué)用例一樣,我們有一套特定的工具,可以使用這些工具來嘗試找到針對(duì)特定問題的解決方案。

這就是這些項(xiàng)目一開始就很有趣的原因。如果有一本靜態(tài)的食譜可以遵循,那不是很無聊嗎?

請(qǐng)?jiān)谠u(píng)論中告訴我你的想法。

文章轉(zhuǎn)自微信公眾號(hào)@知覺之門

上一篇:

15種高級(jí)RAG技術(shù):從預(yù)搜索到生成全面提升RAG效果

下一篇:

使用Function Calling構(gòu)建自主 AI 智能體
#你可能也喜歡這些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)