構建 LLM 應用:評估(第八部分)

作者:Vipra Singh

編譯:ronghuaiyang

導讀

我們在上一篇博客中成功構建了多個 RAG 應用。現在,讓我們來看看評估這些應用的過程。

我們在上一篇博客中成功構建了多個 RAG 應用。現在,讓我們來看看評估這些應用的過程。我們將探究從我們的大型語言模型生成的結果有多可靠。首先,讓我們通過下表來理解傳統機器學習、深度學習和 LLMs 之間的區別。

大型語言模型(LLMs)的出現爲解決以前認爲不可能的問題開闢了新的途徑。但有一個問題仍然懸而未決,那就是如何有效地評估基於 LLMs 的應用?

我們將試圖通過本文解開這個謎團,通過理解用於基準測試 LLMs 的方法,討論最先進的(SOTA)方法,現有的評估框架,以及在評估基於 LLMs 應用中遇到的挑戰。

LLM 基準測試與評估的區別

雖然 LLM 基準測試和評估緊密相關,但它們的目的之間存在微妙的差異:

基準測試關乎標準化測試。它涉及使用預定義的數據集和指標來評估 LLM 在特定任務上的表現。你可以把它想象成給語言模型一系列的閱讀、寫作和數學測試(但針對語言!)。

基準測試提供了以下幾點:

比較性:基準測試允許研究者在相同任務上比較不同 LLM 的表現。這有助於識別哪些模型在特定領域表現出色。量化結果:基準測試提供數值評分,清晰地展示了 LLM 的優勢和劣勢。

評估則具有更廣泛的範圍。它不僅僅侷限於運行測試,而是涉及對 LLM 能力的全面評估。在這裏,研究者會考慮:

現實應用性:LLM 在模擬真實世界使用案例的情況下的表現如何?公平性和偏見:LLM 在其輸出中是否顯示出任何偏見?可解釋性:研究者能否理解 LLM 是如何得出答案的?

評估往往建立在基準測試的基礎上。研究者可能會將基準得分作爲一個起點,但他們也會深入探究基準測試未必能捕捉到的方面。

簡單來說,基準測試利用標準化測試提供了定量評估,而評估則對 LLM 的整體優勢、劣勢和適用於真實世界應用的適宜性提供了更定性的理解

LLM 基準測試

LLM 基準是一系列旨在評估 LLM 在諸如推理和理解等各種技能上表現的標準化測試,它們使用特定的評分器或指標來衡量這些能力。

根據不同的基準,指標可能從基於統計的度量(比如精確匹配的比例)到由其他 LLM 評估的更爲複雜的指標不等。

不同的基準測試評估模型能力的各個方面,包括:

  1. 推理與常識: 這些基準測試評估 LLM 運用邏輯和日常知識解決問題的能力。

  2. 語言理解和問答(QA): 這些評估模型準確解讀文本和回答問題的能力。

  3. 編碼: 此類基準測試評估 LLM 解析和生成代碼的能力。

  4. 對話與聊天機器人: 這些測試評估 LLM 參與對話並提供連貫、相關回應的能力。

  5. 翻譯: 這些評估模型準確地將文本從一種語言翻譯成另一種語言的能力。

  6. 數學: 這些專注於評估模型解決數學問題的能力,從基礎算術到更復雜的領域如微積分。

  7. 邏輯: 邏輯基準測試評估模型運用邏輯推理技巧的能力,如歸納和演繹推理。

  8. 標準化測試: SAT、ACT 或其他教育評估也被用來評估和基準化模型的表現。

有些基準可能只有幾十個測試,而其他的可能有數百甚至數千個任務。重要的是,LLM 基準測試爲跨不同領域和任務評估 LLM 性能提供了一個標準化的框架。

爲我們的項目選擇合適的基準意味着:

可以把它們想象成高中學生的 SAT 考試,但對象是 LLM。儘管它們不能評估模型所有可能的方面,但它們確實提供了有價值的見解。下面是 Claude 3 在多個基準上的表現與其他最先進(SOTA)模型的對比。

在接下來的部分,我們將討論在四大關鍵領域(語言理解、推理、編碼和對話)中的主要 LLM 基準測試。這些基準測試在工業應用中被廣泛採用,並在技術報告中頻繁引用。它們包括:

語言理解和問答基準測試

TruthfulQA

[Published in 2022] 

來自 TruthfulQA 的示例問題

目標

數據集

表現

評分

MMLU(大規模多任務語言理解)

[Published in 2021]

來自 MMLU 微觀經濟學任務的示例問題。

如果 MMLU 聽起來不好實現,我有個好消息。有人已經在 DeepEval 這個開源的 LLM 評估框架中實現了幾個關鍵基準測試,因此我們只需幾行代碼就能輕鬆地對任何我們選擇的 LLM 進行基準測試。

首先,安裝 DeepEval:

pip install deepeval

運行基準測試:

from deepeval.benchmarks import MMLU
from deepeval.benchmarks.tasks import MMLUTask

# Define benchmark with specific tasks and shots
benchmark = MMLU(
    tasks=[MMLUTask.HIGH_SCHOOL_COMPUTER_SCIENCE, MMLUTask.ASTRONOMY],
    n_shots=3
)

# Replace 'mistral_7b' with your own custom model
benchmark.evaluate(model=mistral_7b)
print(benchmark.overall_score)

DROP

這總結了開放式 LLM 排行榜上的七個主要基準任務。這些測試不僅評估了 LLMs 的知識,還評估了它們的推理、理解和解決問題的能力。

其他值得注意的語言理解和問答基準測試包括:GLUE,SuperGLUE,SQuAD,以及 GPT 任務,CoQA,QuAC,TriviaQA

常識與推理基準測試

ARC (AI2 Reasoning Challenge)

[Published in 2018]

數據集大小爲 681MB,分爲兩組問題:

示例問題:

一個問題,多個選項和一個正確答案

HellaSwag

[Published in 2019]

HellaSwag 中的示例問題

HellaSwag 通過句子補全來評估 LLM 模型的常識推理能力。它測試 LLM 模型是否能夠從 4 個選項中爲 10,000 個句子選擇適當的結尾。

雖然當時最先進的模型在預訓練時很難達到 50% 以上的得分,GPT-4 在 2023 年僅通過 10-shot 提示就創下了 95.3% 的歷史新高。類似於 MMLU,HellaSwag 根據 LLMs 完全正確答案的比例來給它們打分。

以下是我們如何通過 DeepEval 使用 HellaSwag 基準測試:

from deepeval.benchmarks import HellaSwag
from deepeval.benchmarks.tasks import HellaSwagTask

# Define benchmark with specific tasks and shots
benchmark = HellaSwag(
    tasks=[HellaSwagTask.TRIMMING_BRANCHES_OR_HEDGES, HellaSwagTask.BATON_TWIRLING],
    n_shots=5
)

# Replace 'mistral_7b' with your own custom model
benchmark.evaluate(model=mistral_7b)
print(benchmark.overall_score)

BIG-Bench Hard (Beyond the Imitation Game Benchmark)

[Published in 2022]

BIG-Bench Hard(BBH) 從原始的 BIG-Bench suite 中挑選了 23 個具有挑戰性的任務,該套件本身包含了一套多樣的 204 個任務的評估集,這些任務在當時已經超出了語言模型的能力範圍。

標準(少量示例)提示 vs CoT(Chain of Thought)提示

在 BIG-Bench 發佈時,沒有任何一款最先進的語言模型能在這些 23 個任務中的任何一個上超越平均的人類評估者。有趣的是,BBH 的作者們使用**思維鏈(CoT)**提示,能夠使相同的 LLMs 在其中 17 個任務上超越人類。

雖然 BBH 的期望輸出比其他基於多項選擇題的基準測試更加多樣化,但它也根據完全匹配的比例來給模型打分。CoT 提示有助於將模型輸出限制在期望的格式內。

要使用 BBH 基準測試:

from deepeval.benchmarks import BigBenchHard
from deepeval.benchmarks.tasks import BigBenchHardTask

# Define benchmark with specific tasks and shots
benchmark = BigBenchHard(
    tasks=[BigBenchHardTask.BOOLEAN_EXPRESSIONS, BigBenchHardTask.CAUSAL_JUDGEMENT],
    n_shots=3,
    enable_cot=True
)

# Replace 'mistral_7b' with your own custom model
benchmark.evaluate(model=mistral_7b)
print(benchmark.overall_score)

WinoGrande

GSM8k

編程 Benchmarks

HumanEval

[Published in 2021]

HumanEval 由 164 個獨特的編程任務組成,設計用於評估模型的代碼生成能力。這些任務覆蓋了廣泛的領域,從算法到對編程語言的理解。

以下是來自類似 HumanEval 集合的一個示例任務,以及由模型生成的解決方案:

任務描述: 編寫一個函數sum_list,它接受一個數字列表作爲參數,並返回列表中所有數字的總和。列表可以包含整數和浮點數。

生成的代碼:

def sum_list(numbers: List[float]) -> float:
    return sum(numbers)

HumanEval 使用 Pass@k 指標來評分生成代碼的質量,該指標旨在強調功能性正確性,而不僅僅是基本的文字相似度。

CodeXGLUE

**[Published in 2021] **

CodexGLUE 中的行級代碼補全任務示例

CodeXGLUE 提供了 14 個數據集,跨越 10 種不同的任務,用於在各種編碼場景中測試和直接比較模型,如代碼補全、代碼翻譯、代碼摘要和代碼搜索。它是由微軟開發者部門和 Bing 合作開發的。

CodeXGLUE 的評估指標根據編碼任務的不同,從完全匹配到 BLUE 分數不等。

其他值得注意的編碼基準測試:CodeBLEU,MBPP,Py150,MathQA,Spider,DeepFix,Clone Detection,CodeSearchNet

GenAI 模型根據他們在 4 個數據集上的平均表現進行排名:

25-shot 意味着數據集中每道題目的提示中都會插入 25 對(問題,解答)。

對話和聊天 Benchmarks

Chatbot Arena (by LMSys)

[Published in 2024]

Chatbot Arena 是一個開放平臺,使用超過 20 萬個人類投票來對語言模型進行排名。用戶可以匿名地對像 ChatGPT 或 Claude 這樣的 AI 模型對進行提問和評判,而不知道它們的身份,只有當模型身份保持隱藏時,投票纔會計入排名。所以,這不是一個使用指標客觀評分模型的傳統基準測試!得分實際上是 “贊同票” 的數量。

MT Bench

[Published in 2021]

來自 MTBench 的示例問題

MT-bench 通過向聊天助手展示一系列多輪次開放式問題,並利用 LLMs 作爲裁判,來評估聊天助手的質量。這種方法測試了聊天助手處理複雜交互的能力。MT-Bench 使用 GPT-4 在 10 分制上對一次對話進行評分,並計算所有輪次的平均分以得到最終得分。

所有這些基準測試在評估某些技能方面都非常有用,但如果現有的基準測試並不完全符合我們項目的獨特需求呢?

其他值得注意的對話和聊天機器人基準測試:DSTC,ConvAI,PersonaChat

語言模型評估框架 (Language Model Evaluation Harness)(由 EleutherAI 提供)

語言模型評估框架提供了一個統一的框架,用於在大量評估任務上對 LLMs 進行基準測試。我特意強調了 “任務” 這個詞,因爲在 Harness 中,實際上並沒有 “場景” 這個概念(我會使用 Harness 代替語言模型評估框架)。

在 Harness 下,我們可以看到許多任務,其中包含不同的子任務。每個任務或一組子任務都在不同的領域評估 LLM,如生成能力、在各個領域的推理能力等。

每個任務下的子任務(有時甚至是任務本身)都有一個基準數據集,這些任務通常與一些在評估領域的重要研究有關。Harness 在統一和結構化所有這些數據集、配置和評估策略(如與評估基準數據集相關的指標)方面付出了巨大努力,將所有這些都整合在一個地方。

不僅如此,Harness 還支持不同類型的 LLM 後端(例如:VLLM,GGUF 等)。它在更改提示和實驗方面提供了巨大的定製性。

這是一個簡單的例子,展示了我們如何輕鬆地在 HellaSwag 任務(一項評估 LLM 常識能力的任務)上評估 Mistral 模型。

lm_eval --model hf \
    --model_args pretrained=mistralai/Mistral-7B-v0.1 \
    --tasks hellaswag \
    --device cuda:0 \
    --batch_size 8

受到 LM Evaluation Harness 的啓發,BigCode 項目推出了另一個名爲 BigCode Evaluation Harness 的框架,它試圖提供類似的 API 和 CLI 方法,專門用於評估 LLMs 在代碼生成任務上的表現。由於代碼生成的評估是一個非常具體的話題,我們可以在下一篇文章中詳細討論,敬請期待!

斯坦福大學 HELM

HELM,即語言模型的全面評估,使用 “場景” 來概述 LLMs 的應用領域,以及 “指標” 來明確我們希望 LLMs 在基準測試環境中完成的任務。一個場景包括:

HELM 然後嘗試根據社會相關性(例如,考慮用戶界面應用程序可靠性的場景)、覆蓋面(多語言)、可行性(即,評估時選擇任務的最優顯著子集,而不是逐個運行所有數據點)優先考慮場景和指標的子集。

HELM 的評估分類結構

不僅如此,HELM 嘗試爲幾乎所有場景覆蓋一套 7 個指標(準確性、校準性、魯棒性、公平性、偏見、毒性及效率),因爲僅憑準確性無法完全可靠地反映 LLM 的性能。

PromptBench (by Microsoft)

微軟 PromptBench

PromptBench 是另一個用於基準測試 LLMs 的統一庫。與 HELM 和 Harness 非常相似,它支持不同的 LLM 框架(例如:Hugging Face,VLLM 等)。它與其他框架的不同之處在於,除了評估任務,它還支持評估不同的 Prompt 工程方法,並在不同的 Prompt 級別的對抗攻擊上評估 LLMs。我們還可以構建不同的評估管道,使生產級別的使用案例變得更加容易。

LLM 基準測試的侷限性

雖然基準測試對於評估 LLMs 的能力至關重要,但它們也存在自身的侷限性:

然而,並非全無希望。我們可以通過創新方法,如合成數據生成,克服這些侷限性

LLM 評估指標

LLM 評價指標依據我們關心的標準來評分 LLM 的輸出。例如,如果我們設計的 LLM 應用旨在總結新聞文章的頁面,我們需要的 LLM 評價指標應基於以下幾點進行評分:

  1. 摘要是否包含了原文本中的足夠信息。

  2. 摘要是否與原文本有任何矛盾或幻覺。

此外,如果我們的 LLM 應用採用了基於檢索增強生成(RAG)的架構,我們可能還需要對檢索上下文的質量進行評分。關鍵在於,LLM 評價指標應該根據 LLM 應用被設計來執行的任務對其進行評估。(需要注意的是,LLM 應用可以僅僅是 LLM 本身!)

優秀的評價指標具備以下特徵:

  1. 量化性。 在評估手頭的任務時,指標應當始終計算出一個得分。這種方法使我們能夠設定一個最低通過閾值,以判斷我們的 LLM 應用是否 “足夠好”,並且允許我們監控這些得分隨時間的變化,因爲我們不斷迭代和改進實現。

  2. 可靠性。 儘管 LLM 輸出可能難以預測,但我們最不希望的就是 LLM 評價指標同樣不穩定。因此,儘管使用 LLMs 評估的指標(即 LLM-Evals),如 G-Eval,比傳統評分方法更準確,但它們往往缺乏一致性,這是大多數 LLM-Evals 的短板所在。

  3. 準確性。 如果不能真正代表我們 LLM 應用的表現,可靠的評分也就失去了意義。將好的 LLM 評價指標提升爲偉大的祕訣是儘可能地使其與人類預期保持一致。

那麼問題來了,LLM 評價指標如何計算出可靠且準確的評分呢?

計算指標評分的不同方法

有許多已建立的方法可用於計算指標評分——有些利用神經網絡,包括嵌入模型和 LLMs,而另一些則完全基於統計分析。

任務依賴性指標

任務依賴性指標緊密關聯於 LLM 應用的具體目標。例如,文本分類可能會優先考慮準確性和 F1 得分,而文本生成則可能根據特定目標如可讀性或語義準確性,關注困惑度、BLEU 或 ROUGE 得分。這些指標的選擇基於它們與 LLM 應用所期望結果的契合程度,例如:

我們將逐一介紹每種方法,並在本節結束時討論最佳途徑,繼續閱讀以瞭解更多信息!

統計評分器

在開始之前,我想說的是,統計評分方法並非必須瞭解的內容,如果你時間緊迫,可以直接跳過到 “G-Eval” 部分。這是因爲統計方法在需要推理的情況下表現不佳,導致其作爲大多數 LLM 評價標準的評分器時過於不準確。

讓我們來看看這些方法:

詞錯誤率(WER)

WER 是一系列基於 WER 的指標,它們測量編輯距離𝑑(𝑐,𝑟),即把候選字符串轉換成參考字符串所需的插入、刪除、替換以及可能的轉置次數。

完全匹配

它通過將生成的文本與參考文本進行匹配來衡量候選文本的準確性。任何偏離參考文本的情況都將被視爲不正確。這僅適用於預期最小或沒有偏離參考文本的抽取式和短形式答案。

困惑度

困惑度(PPL)是評估語言模型最常見的指標之一。在深入瞭解之前,我們應該注意,該指標特別適用於經典語言模型(有時稱爲自迴歸或因果語言模型),對於像 BERT 這樣的掩碼語言模型並不是明確定義的。

這也等同於數據和模型預測之間交叉熵的指數運算。

BLEU

BLEU(BiLingual Evaluation Understudy)得分是一種廣泛使用的指標,用於評估機器翻譯文本(候選翻譯)與參考翻譯(參考文本)的質量。由 IBM 的研究人員開發,BLEU 通過測量機器生成文本與高質量參考翻譯之間的 n-gram 重疊來評估翻譯準確性。它主要關注精確度。BLEU 因其簡單性和有效性而聞名,成爲機器翻譯領域的一項標準基準。然而,它主要評估表面層面的詞彙相似性,常常忽略了語言的深層語義和上下文細微差別。

候選翻譯:這是我們想要評估的翻譯系統輸出。

參考文本:這些是高質量的翻譯(通常由人類完成),我們用它們來比較候選翻譯文本。爲了增強穩健性,可以有多個參考翻譯。

計算

將候選翻譯和參考翻譯拆分爲單詞(標記)。兩組文本的標記化應保持一致。

計算 n-gram 精確度(P)

簡短懲罰(BP)

BLEU 得分

BLEU 得分的範圍:通常從 0 到 1,其中 0 表示翻譯文本與參考翻譯之間沒有重疊,代表最低可能得分,暗示翻譯質量非常差。1 表示與參考翻譯完美匹配,代表最高可能得分,暗示理想的翻譯質量。

from nltk.translate.bleu_score import sentence_bleu # Sample reference and generated sentences reference = [["A", "fast", "brown", "fox", "jumps", "over", "a",  "lazy", "dog", "."]] generated = [["The", "quick", "brown", "fox", "jumps", "over", "the",  "lazy", "dog", "."]] # Calculate BLEU score bleu_score = sentence_bleu(reference, generated) print('BLEU Score:', bleu_score)

ROUGE

ROUGE(Recall-Oriented Understudy for Gisting Evaluation)是一套用於評估自動摘要和機器翻譯的指標。它將自動產生的摘要或翻譯與一組參考摘要(通常是人工編寫的)進行比較。ROUGE 通過計算模型生成文本與參考文本之間重疊單元的數量,如 n-grams、單詞序列和單詞對,來衡量摘要的質量。ROUGE 最常見的變體包括:

ROUGE-N:關注 n-grams(N 詞短語)。ROUGE-1 和 ROUGE-2(分別爲單詞和雙詞)最爲常見。

ROUGE-L:基於最長公共子序列(LCS),自然地考慮了句子級別的結構相似性,並自動識別最長的共現序列 n-grams。

ROUGE 通常報告三個指標。

精確度:模型生成摘要中也在參考摘要中找到的 n-grams 的比例。

召回率:參考摘要中也在模型生成摘要中找到的 n-grams 的比例。

F-Score(F1 得分):精確度和召回率的調和平均數,平衡了兩者。

ROUGE 得分範圍從 0 到 1,其中 0 表示機器生成文本與參考文本之間沒有重疊。1 表示與參考文本完美匹配。

from nltk.translate.bleu_score import corpus_rouge # Sample reference and generated summaries reference_summaries = [['A fast brown fox jumps over a lazy dog.']] generated_summaries = [['The quick brown fox jumps over the lazy dog.']] # Calculate ROUGE score rouge_score = corpus_rouge(reference_summaries, generated_summaries) print('ROUGE Score:', rouge_score)

METEOR

METEOR(Metric for Evaluation of Translation with Explicit Ordering)是一種用於評估機器翻譯的高級指標,它旨在解決 BLEU 得分的一些侷限性。與 BLEU 不同,METEOR 不僅考慮確切的單詞匹配,而且還結合詞幹分析和同義詞來評估翻譯_,_從而捕捉更廣泛的語言相似性_。_它在評估中獨特地平衡了精確度和召回率,並引入了針對單詞順序差異的懲罰,以評估翻譯的流利度。METEOR 以其與人類判斷的高度相關性而著稱,特別是在句子級別,這使得它成爲一個細緻且全面的翻譯質量評估指標。然而,它的複雜性也意味着它比 BLEU 等更簡單的指標計算成本更高。

基於對齊:METEOR 在候選翻譯和參考翻譯之間的單詞之間創建對齊,重點關注確切的、詞幹、同義詞和釋義匹配。

召回率和精確度:與只考慮精確度的 BLEU 不同,METEOR 計算精確度和召回率。這種雙重關注有助於平衡評估。

調和平均數:METEOR 使用召回率和精確度的調和平均數,更加強調召回率(修改後的調和平均數版本給予召回率比精確度更重要的權重)。這與使用修改後的精確度形式的 BLEU 不同。

針對單詞順序差異的懲罰:METEOR 對不正確的單詞順序施加懲罰,這使其對翻譯的流利度敏感。

語言獨立性:雖然最初是爲英語開發的,但 METEOR 已經擴展以支持多種語言,具有語言特定的參數和資源。

計算匹配

計算候選翻譯中與參考翻譯中的單字詞完全匹配的單字詞數量。

計算精確度和召回率

計算精確度和召回率的調和平均數

F-mean 計算爲:F-mean=10*P*R/(R+9*P)。這給予召回率比精確度更大的權重。

針對單詞順序的懲罰

對單詞順序差異施加懲罰。懲罰計算爲:Penalty=0.5⋅(# of chunks/# of matches)*3_;其中,“_chunk” 是在候選翻譯中與參考翻譯中相同順序的相鄰單詞集合。

最終的 METEOR 得分

最終得分計算爲:Score*=(1−Penalty)*F-mean

由於純粹的統計評分器幾乎不考慮任何語義,並且推理能力極其有限,它們對於評估經常長且複雜的 LLM 輸出來說不夠準確。

from meteor import meteor_score # Sample reference and generated sentences reference_sentence = 'A fast brown fox jumps over a lazy dog.' generated_sentence = 'The quick brown fox jumps over the lazy dog.' # Calculate METEOR score meteor_score = meteor_score.meteor_score([reference_sentence], generated_sentence) print('METEOR Score:', meteor_score)

基於模型的評分器

完全基於統計的評分器雖然可靠,但不夠準確,因爲它們在考慮語義方面存在困難。在這一節中,情況更多的是相反——完全依賴於 NLP 模型的評分器相對更準確,但由於它們的概率性質,也更加不可靠。

這並不令人驚訝,非 LLM 基礎的評分器表現不如 LLM-Evals,原因與統計評分器所述相同。非 LLM 評分器包括:

Entailment score

Entailment score:這種方法利用語言模型的自然語言推理能力來評判 NLG。雖然存在該方法的不同變體,但基本概念是使用 NLI(自然語言推理)模型來產生針對參考文本的 entailment score,以此對生成文本進行評分。這種方法對於確保基於文本的生成任務(如文本摘要)的忠實性非常有用。

BLEURT

BLEURT(基於 Transformer 表示的 BiLingual Evaluation Understudy)是一種新穎的、基於機器學習的自動指標,能夠捕捉句子間的非平凡語義相似性。它是在公共評級集合(如 WMT Metrics Shared Task 數據集)以及用戶提供的額外評級上進行訓練的。

三句由 BLEURT 評分的候選句子。BLEURT 捕捉到了候選句子 2 與參考句子相似,即使它包含的非參考詞彙比候選句子 3 更多

基於機器學習創建指標面臨一個根本性挑戰:該指標應在廣泛的任務和領域中持續表現良好,並且隨着時間的推移保持穩定。然而,可用的訓練數據量有限。實際上,公開數據非常稀缺——WMT Metrics Task 數據集,截至本文撰寫時最大的人工評分集合,僅包含約 26 萬個人工評分,且僅覆蓋新聞領域。這對訓練一個適用於未來 NLG 系統評估的指標來說太過侷限。

爲了解決這個問題,我們採用遷移學習策略。首先,我們利用 BERT 的上下文詞表示,這是一種最先進的無監督語言理解表示學習方法,已成功融入到 NLG 指標中(例如,YiSi 或 BERTscore)。

其次,我們引入了一種新型預訓練方案以增強 BLEURT 的魯棒性。實驗顯示,直接在公開可用的人工評分上訓練迴歸模型是一種脆弱的方法,因爲我們無法控制該指標將在哪個領域和時間跨度內使用。在出現領域漂移時,即用於評估的文本來自與訓練句子對不同的領域,準確性很可能會下降。當存在質量漂移時,即待預測的評分高於訓練期間使用的評分,準確性也可能下降——這通常是個好消息,因爲它表明 ML 研究正在取得進展。

BLEURT 的成功依賴於在微調到人工評分之前,先使用數百萬個合成句子對 “預熱” 模型。我們通過隨機擾動 Wikipedia 上的句子來生成訓練數據。我們沒有收集人工評分,而是使用文獻中的指標和模型集合(包括 BLEU),這使得訓練樣本的數量可以以極低的成本大幅增加。

BLEURT 的數據生成過程結合了隨機擾動和利用現有指標與模型進行評分

QA-QG

問題回答 —— 問題生成(QA-QG) :這一範式可以用來衡量任意候選文本與參考文本之間的一致性。方法的運作方式是首先從候選文本中形成(答案候選,問題)對,然後基於同一組問題,比較並驗證給定參考文本時生成的答案。

除了不一致的評分外,現實是這些方法還存在一些不足。例如,NLI 評分器在處理長文本時也可能在準確性上掙扎,而 BLEURT 則受制於其訓練數據的質量和代表性。

那麼,讓我們換個話題,來談談 LLM-Evals 吧。

LLM-Evals

G-Eval

G-Eval 是一個最近從一篇題爲 “NLG Evaluation using GPT-4 with Better Human Alignment” 的論文中提出的框架,它利用 LLMs 來評估 LLMs 的輸出(即 LLM-Evals)

G-Eval 首先使用思維鏈(CoTs)生成一系列評估步驟,然後利用這些生成的步驟通過表單填寫範式(這只是說 G-Eval 需要若干信息才能工作的花哨說法)來確定最終評分。例如,使用 G-Eval 評估 LLM 輸出的連貫性,涉及構建包含評估標準和待評估文本的提示,以生成評估步驟,然後使用 LLM 根據這些步驟輸出 1 到 5 的評分。

讓我們通過這個例子來運行 G-Eval 算法。首先,爲了生成評估步驟:

  1. 向您選擇的 LLM 介紹一項評估任務(例如,根據連貫性從 1 到 5 給此輸出打分)。

  2. 定義您的標準(例如,“連貫性——實際輸出中所有句子的集體質量”)。

(請注意,在原始 G-Eval 論文中,作者僅使用 GPT-3.5 和 GPT-4 進行實驗,而且我個人嘗試了不同的 LLM 用於 G-Eval,我強烈建議我們堅持使用這些模型。)

在生成一系列評估步驟之後:

  1. 通過將評估步驟與我們在評估步驟中列出的所有參數連接起來創建提示(例如,如果我們打算評估 LLM 輸出的連貫性,LLM 輸出將是一個必需的參數)。

  2. 在提示的末尾,要求它生成 1 到 5 之間的評分,其中 5 比 1 更好。

  3. (可選)從 LLM 獲取輸出令牌的概率,以標準化評分並將其加權總和作爲最終結果。

第三步是可選的,因爲要獲取輸出 token 的概率,我們需要訪問原始模型嵌入,而在 2024 年,這仍然無法通過 OpenAI API 獲得。然而,論文中引入這一步是因爲它提供了更精細的評分,並減少了 LLM 評分中的偏差(正如論文所述,對於 1 到 5 的尺度,3 的 token 概率更高)。

以下是論文中的結果,展示了 G-Eval 如何超越本文前面提到的所有傳統、非 LLM 評估:

更高的 Spearman 和 Kendall-Tau 相關性代表與人類判斷更高的契合度。

G-Eval 之所以出色,是因爲作爲一種 LLM-Eval,它可以充分考慮 LLM 輸出的完整語義,從而使其更加準確。這一點非常合理——想一想,那些使用遠不如 LLM 強大的評分器的非 LLM 評估,怎麼可能完全理解 LLM 生成的文本的全部範圍?

儘管與同類評估相比,G-Eval 與人類判斷的相關性更高,但它仍可能不可靠,因爲要求 LLM 給出一個評分無疑是主觀的。

話雖如此,鑑於 G-Eval 評估標準的靈活性,我已親自將其作爲 DeepEval 的指標進行實施,這是一個我一直在努力的開源 LLM 評估框架。

# Install
pip install deepeval
# Set OpenAI API key as env variable
export OPENAI_API_KEY="..."
from deepeval.test_case import LLMTestCase, LLMTestCaseParams
from deepeval.metrics import GEval

test_case = LLMTestCase(input="input to your LLM"actual_output="your LLM output")
coherence_metric = GEval(
    ,
    criteria="Coherence - the collective quality of all sentences in the actual output",
    evaluation_params=[LLMTestCaseParams.ACTUAL_OUTPUT],
)

coherence_metric.measure(test_case)
print(coherence_metric.score)
print(coherence_metric.reason)

使用 LLM-Eval 的另一個主要優勢是,LLMs 能夠爲其評估分數生成理由。

Prometheus

Prometheus 是一個完全開源的 LLM,當提供適當參考資料(參考答案、評分標準)時,其評估能力可與 GPT-4 相媲美。它同樣使用案例不可知論,類似於 G-Eval。Prometheus 是以 Llama-2-Chat 爲基礎模型,並在由 GPT-4 生成的 10 萬條反饋上進行微調的,這些反饋來自於 Feedback Collection 數據集。

以下是來自 Prometheus 研究論文的簡要結果:

雖然我個人沒有嘗試過,Prometheus 在 Hugging Face 上是可用的。我沒有嘗試實施它的原因在於,Prometheus 被設計爲使評估過程開源,而不是依賴於像 OpenAI 的 GPT 這樣的專有模型。對於致力於構建最好的 LLM-Evals 的人來說,這可能不是一個理想的解決方案。

結合統計和基於模型的評分器

到目前爲止,我們已經看到了統計方法雖然可靠但不夠準確,而非 LLM 基於模型的方法雖然準確性更高但可靠性較低。與之前的討論類似,還有一些非 LLM 評分器,例如:

BERTScore

BERTScore:這是一種基於雙編碼器的方法,即候選文本和參考文本分別輸入到深度學習模型中以獲取嵌入表示。然後使用這些詞級別的嵌入來計算成對的餘弦相似性矩陣。接着,從參考文本到候選文本的最相似詞的相似性分數被挑選出來,用於計算精確度、召回率和 F1 分數。

BERTScore 利用預訓練的 BERT 模型來捕獲詞的語義和上下文信息,這使得它能夠超越基於 n-gram 的傳統方法,更準確地評估文本的相似度。具體而言,BERTScore 的評估過程包括:

  1. 文本嵌入:將候選文本和參考文本分別送入 BERT 模型,獲取每個詞的嵌入表示。

  2. 相似性計算:計算候選文本和參考文本中每對詞之間的餘弦相似性。

  3. 最佳匹配選擇:從計算出的相似性矩陣中,爲每個參考文本中的詞找到最相似的候選文本中的詞。

  4. 評估指標計算:基於最佳匹配,計算精確度(參考文本中有多少詞在候選文本中找到了匹配)、召回率(候選文本中有多少詞在參考文本中找到了匹配),以及 F1 分數(精確度和召回率的調和平均)。

BERTScore 因其能夠處理語義層面的相似性,已經成爲自然語言處理領域中評估翻譯、摘要和生成文本質量的常用工具。然而,它也有其侷限性,例如在處理長文本時計算成本較高,以及可能受到訓練數據偏差的影響。

MoverScore

MoverScore:採用了詞語移動距離的概念,該概念認爲嵌入詞向量之間的距離在某種程度上具有語義意義(例如,vector(國王) - vector(女王) ≈ vector(男人)),並使用上下文嵌入來計算 n-gram 之間的歐幾里得相似性。與 BERTScore 只允許一對一的硬匹配單詞不同,MoverScore 允許多對一的匹配,因爲它使用了軟 / 部分對齊。

BERTScore 和 MoverScore 這兩種評分器由於依賴於預訓練模型(如 BERT)的上下文嵌入,因此容易受到上下文意識和偏見的影響。但是,LLM-Evals 的情況如何呢?

GPTScore

與直接使用表單填充範式執行評估任務的 G-Eval 不同,GPTScore 使用生成目標文本的條件概率作爲評估指標。

GPTScore 算法

SelfCheckGPT

SelfCheckGPT 是一種獨特的方法。它是一種簡單的基於採樣的方法,用於覈實 LLM 輸出的事實準確性。它基於這樣一個假設:幻覺輸出是不可重複的,而如果 LLM 瞭解某個概念,則採樣的響應很可能相似幷包含一致的事實。

SelfCheckGPT 之所以有趣,是因爲它使檢測幻覺變成了一個無需參考的過程,這對於生產環境來說極其有用。

SelfCheckGPT 算法

然而,儘管我們會注意到 G-Eval 和 Prometheus 在使用場景上是不可知的(即它們可以應用於多種不同的評估情境),SelfCheckGPT 卻並非如此。它僅適用於檢測幻覺,而不適合評估其他使用場景,如總結、連貫性等。

QAG Score

QAG(問題回答生成)評分是一種評分器,它利用了 LLM 的高級推理能力來可靠地評估 LLM 的輸出。它通過回答封閉式問題(通常是 “是” 或“否”,可以是自動生成的或預設的)來計算最終的度量分數。它的可靠性在於它不直接使用 LLM 生成評分。例如,如果我們想要計算一個關於忠實度的評分(衡量 LLM 輸出是否產生了幻覺),我們可以:

  1. 使用 LLM 從 LLM 輸出中抽取所有陳述。

  2. 對於每一個陳述,詢問事實真相是否同意(“是”)或不同意(“否”)這個陳述。

對於這個示例 LLM 輸出:

馬丁 · 路德 · 金,著名的民權領袖,於 1968 年 4 月 4 日在田納西州孟菲斯的洛林汽車旅館遭到暗殺。他前往孟菲斯是爲了支持罷工的清潔工人,當站在汽車旅館的二樓陽臺上時,被逃犯詹姆斯 · 厄爾 · 雷致命射擊。

一個陳述可以是:

馬丁 · 路德 · 金於 1968 年 4 月 4 日遭到暗殺

相應的封閉式問題可以是:

馬丁 · 路德 · 金是否於 1968 年 4 月 4 日遭到暗殺?

然後,我們將這個問題提交給事實真相進行驗證,看看它是否同意這個陳述。最終,我們將得到一系列的 “是” 和“否”的答案,我們可以通過自己選擇的數學公式來計算一個評分。

在忠實度的情況下,如果我們將其定義爲 LLM 輸出中準確且與事實真相一致的陳述的比例,我們可以通過將準確(真實的)陳述的數量除以 LLM 做出的總陳述數量來輕鬆計算它。因爲我們不是直接使用 LLM 生成評估評分,而是仍然利用了它們優越的推理能力,所以我們得到的評分既準確又可靠。

評估基於 LLM 的應用程序

選擇評估指標

LLM 應用程序的評估指標基於交互模式和預期答案的類型選擇。與 LLM 的交互主要有三種形式:

對於這些交互或任務,預期答案的形式可以是摘錄式的、抽象式的、短形式、長形式或多選形式。

例如,對於科學論文的總結(基於文本 + 抽象式)這一 LLM 應用,結果與原始文檔的忠實度和一致性是至關重要的。

評估評估方法!

一旦我們制定了一套適合我們應用程序的評估策略,我們應該在信任它來量化實驗性能之前評估我們的策略。評估策略通過量化其與人類判斷的相關性來進行評估。

通常認爲 0.7 或以上的分數是足夠好的。這也可以用來提高我們評估策略的有效性。

構建我們的評估集

構建任何 ML 問題的評估集時,確保以下兩個基本標準是非常重要的:

爲基於 LLM 的應用程序構建評估集可以逐步進行。可以利用 LLM 通過少量示例提示來生成評估集的查詢,像 auto-evaluator 這樣的工具可以幫助完成這項工作。

帶有事實依據的評估集的創建既昂貴又耗時,而且維持這樣一套黃金標準標註的測試集以應對數據漂移是一項極具挑戰性的任務。如果無監督的 LLM 輔助方法與我們的目標相關性不高,這是值得嘗試的。參考答案的存在有助於在某些方面,如事實性,提高評估的有效性。

在這篇博客中,我們將專注於兩個開源的 LLM 評估框架,即 DeepEval 和 RAGAs。

DeepEval

DeepEval 是一個開源的 LLM 評估框架。DeepEval 極大地簡化了構建和迭代 LLM(應用程序)的過程,其設計理念如下:

評估指的是測試我們的 LLM 應用程序輸出的過程,它需要以下組成部分:

以下是一個使用deepeval的理想評估工作流程圖示:

![img](Building LLM Applications Evaluation (Part 8).assets/0sNsUHaC4Tl4qaLXz.png)

deepeval中,一個指標充當了根據特定興趣標準評估 LLM 輸出性能的衡量標準。本質上,就像指標是尺子一樣,測試用例代表了我們要測量的對象。deepeval爲我們提供了多種默認指標,以便快速開始,其中包括:

對於那些還不知道 RAG(檢索增強生成)是什麼的人來說,這裏有一篇很好的文章:https://www.confident-ai.com/blog/what-is-retrieval-augmented-generation。但簡而言之,RAG 是一種方法,通過向 LLM 提供額外的上下文來生成定製化的輸出,非常適合構建聊天機器人。它由兩部分組成——檢索器和生成器。

在基於 RAG 的系統中,檢索器負責從大型文檔庫中檢索與輸入請求最相關的信息片段,而生成器則利用這些信息片段和原始輸入來生成最終的響應。這種設置不僅可以提高 LLM 輸出的準確性和相關性,還可以幫助解決知識幻覺的問題,即 LLM 生成不存在或與事實不符的信息。通過結合檢索器和生成器,RAG 系統能夠提供更加個性化和精確的響應,同時保持較高的信息準確性和上下文連貫性。

deepeval中,Ragas 指標專門用於評估基於 RAG 的 LLM 應用程序的性能,它檢查生成的響應是否與檢索到的上下文信息相一致,以及是否有效地利用了這些信息。Ragas 評估過程可能包括檢查響應的忠實度、相關性以及是否包含從檢索信息中衍生的準確事實。

以下是 RAG 工作流程通常的工作方式:

  1. RAG 系統接收一個輸入。

  2. 檢索器使用這個輸入在我們的知識庫(在大多數情況下,現在是一個向量數據庫)中執行向量搜索。

  3. 生成器接收到檢索上下文和用戶輸入作爲額外的上下文,生成一個定製化的輸出。

有一點要記住——**高質量的 LLM 輸出是優秀的檢索器和生成器的產物。**正因爲如此,優秀的 RAG 指標側重於可靠和準確地評估我們的 RAG 檢索器或生成器。(事實上,RAG 指標最初被設計爲無需參考的指標,這意味着它們不需要事實依據,即使在生產環境中也能使用。)

忠實度

忠實度是一個 RAG 指標,用於評估我們的 RAG 管道中的 LLM / 生成器是否生成了與檢索上下文中呈現的信息事實相符的 LLM 輸出。但是對於忠實度指標,我們應該使用哪種評分器呢?

**劇透警告:QAG 評分器是 RAG 指標的最佳評分器,因爲它在目標清晰的評估任務中表現出色。**對於忠實度,如果我們將其定義爲 LLM 輸出中相對於檢索上下文的真實陳述所佔比例,我們可以通過以下算法使用 QAG 來計算忠實度:

  1. 使用 LLM 提取輸出中所有的陳述。

  2. 對於每個陳述,檢查它是否與檢索上下文中的每個節點一致或矛盾。在這種情況下,QAG 中的封閉式問題將是這樣的:“給定的陳述是否與參考文本一致”,其中 “參考文本” 將是每個單獨檢索的節點。(需要注意的是,我們需要將答案限制爲 “是”、“否” 或“不知道”。“不知道”狀態代表了檢索上下文中沒有包含給出 “是” 或“否”答案的相關信息的邊緣情況。)

  3. 計算真實陳述(“是” 和 “不知道”)的總數,並將其除以所做的總陳述數。

這種方法通過使用 LLM 的高級推理能力確保了準確性,同時避免了 LLM 生成的評分的不可靠性,使其成爲比 G-Eval 更好的評分方法。

如果我們覺得這個實施過程太複雜,我們可以使用 DeepEval。DeepEval 框架內置了多種評估指標,包括 QAG 評分器,使得評估 RAG 系統的忠實度變得更加簡便。只需按照框架的指導,加載相應的測試數據集,指定評估參數,DeepEval 就能自動執行評估流程,提供詳細的評估報告。這種方法不僅簡化了評估過程,還確保了評估的一致性和可重複性,對於快速迭代和優化 RAG 系統特別有幫助。

# Install
pip install deepeval
# Set OpenAI API key as env variable
export OPENAI_API_KEY="..."
from deepeval.metrics import FaithfulnessMetric
from deepeval.test_case import LLMTestCase

test_case=LLMTestCase(
  input="...", 
  actual_output="...",
  retrieval_context=["..."]
)

metric = FaithfulnessMetric(threshold=0.5)

metric.measure(test_case)
print(metric.score)
print(metric.reason)
print(metric.is_successful())

DeepEval 將評估視爲一系列測試案例。在這裏,actual_output 就是我們的 LLM 輸出。此外,由於忠實度是一個 LLM 評估指標,我們能夠得到最終計算得分的具體理由。

答案相關性

答案相關性是一個 RAG 指標,用於評估我們的 RAG 生成器是否輸出了與輸入高度相關的簡潔答案。它可以通過確定 LLM 輸出中與輸入相關的句子比例來計算(即,將相關句子的數量除以總句子數)。

構建一個穩健的答案相關性指標的關鍵在於充分考慮檢索上下文,因爲額外的上下文可能證明了一個表面上看似無關的句子實際上是有相關性的。下面是一個答案相關性指標的實現示例:

from deepeval.metrics import AnswerRelevancyMetric
from deepeval.test_case import LLMTestCase

test_case=LLMTestCase(
  input="...", 
  actual_output="...",
  retrieval_context=["..."]
)

metric = AnswerRelevancyMetric(threshold=0.5)
metric.measure(test_case)
print(metric.score)
print(metric.reason)
print(metric.is_successful())

上下文精確度

上下文精確度是一個 RAG 指標,用於評估我們的 RAG 管道中檢索器的質量。當我們談論上下文指標時,我們主要關注的是檢索上下文的相關性。一個高的上下文精確度得分意味着,在檢索上下文中,相關的節點排名高於不相關的節點。這一點非常重要,因爲 LLMs 會給予出現在檢索上下文早期的節點中的信息更多權重,這直接影響最終輸出的質量。

from deepeval.metrics import ContextualPrecisionMetric
from deepeval.test_case import LLMTestCase

test_case=LLMTestCase(
  input="...", 
  actual_output="...",
  # Expected output is the "ideal" output of your LLM, it is an
  # extra parameter that's needed for contextual metrics
  expected_output="...",
  retrieval_context=["..."]
)

metric = ContextualPrecisionMetric(threshold=0.5)
metric.measure(test_case)
print(metric.score)
print(metric.reason)
print(metric.is_successful())

上下文召回率

上下文召回率是評估檢索增強生成器(RAG)的另一個重要指標。它通過確定期望輸出或事實依據中可以歸因於檢索上下文中節點的句子比例來計算。較高的分數表明檢索到的信息與期望輸出的契合度更高,這說明檢索器有效地從相關和準確的內容中獲取信息,以幫助生成器產生上下文適當的響應。

from deepeval.metrics import ContextualRecallMetric
from deepeval.test_case import LLMTestCase

test_case=LLMTestCase(
  input="...", 
  actual_output="...",
  # Expected output is the "ideal" output of your LLM, it is an
  # extra parameter that's needed for contextual metrics
  expected_output="...",
  retrieval_context=["..."]
)
metric = ContextualRecallMetric(threshold=0.5)

metric.measure(test_case)
print(metric.score)
print(metric.reason)
print(metric.is_successful())

上下文相關性

可能是最容易理解的指標,上下文相關性僅僅是指檢索上下文中與給定輸入相關的句子所佔的比例。

from deepeval.metrics import ContextualRelevancyMetric
from deepeval.test_case import LLMTestCase

test_case=LLMTestCase(
  input="...", 
  actual_output="...",
  retrieval_context=["..."]
)
metric = ContextualRelevancyMetric(threshold=0.5)

metric.measure(test_case)
print(metric.score)
print(metric.reason)
print(metric.is_successful())

微調指標

當我提到 “微調指標” 時,我指的是評估 LLM 本身而非整個系統的指標。撇開成本和性能優勢不談,LLM 通常被微調以達到以下目的:

  1. 融合額外的上下文知識:這可能涉及將特定領域知識、最新信息或特定觀點融入模型,以改進其理解和生成能力。

  2. 調整行爲:微調也可能用於改變模型的生成傾向,比如減少偏見、增加創造性或提高特定任務的表現。

幻覺

我們中的一些人可能已經認識到,這與之前討論的忠實度指標類似。雖然兩者相似,但在微調中的幻覺評估更爲複雜,因爲對於給定的輸出,往往難以確定確切的事實依據。爲了解決這個問題,我們可以利用 SelfCheckGPT 的零樣本學習方法來抽樣估計 LLM 輸出中幻覺句子的比例。

from deepeval.metrics import HallucinationMetric
from deepeval.test_case import LLMTestCase

test_case=LLMTestCase(
  input="...", 
  actual_output="...",
  # Note that 'context' is not the same as 'retrieval_context'.
  # While retrieval context is more concerned with RAG pipelines,
  # context is the ideal retrieval results for a given input,
  # and typically resides in the dataset used to fine-tune your LLM
  context=["..."],
)

metric = HallucinationMetric(threshold=0.5)
metric.measure(test_case)
print(metric.score)
print(metric.is_successful())

然而,這種方法可能會變得非常昂貴,因此,目前我建議使用自然語言推理(NLI)評分器,並手動提供一些上下文作爲事實依據。這樣可以在控制成本的同時,依然能夠評估輸出中的幻覺情況。

毒性

毒性指標用於評估文本中含有攻擊性、有害或不適當語言的程度。現成的預訓練模型,如 Detoxify,可以利用 BERT 評分器來打分毒性。Detoxify 等工具通過訓練來識別和量化文本中的負面或有害內容,包括侮辱、威脅、仇恨言論等,這對於確保 LLM 生成的內容符合社區準則和社會規範尤爲重要。

from deepeval.metrics import ToxicityMetric
from deepeval.test_case import LLMTestCase

metric = ToxicityMetric(threshold=0.5)
test_case = LLMTestCase(
    input="What if these shoes don't fit?",
    # Replace this with the actual output from your LLM application
    actual_output = "We offer a 30-day full refund at no extra cost."
)

metric.measure(test_case)
print(metric.score)

然而,這種方法可能不準確,因爲如果評論中含有與咒罵、侮辱或猥褻相關的詞彙,很可能被歸類爲有毒,而不管作者的語氣或意圖如何,例如,幽默或自嘲的情況。

在這種情況下,我們可能想要考慮使用 G-Eval 來定義一個自定義的毒性標準。事實上,G-Eval 的用例無關特性正是我如此喜歡它的主要原因。

from deepeval.metrics import GEval
from deepeval.test_case import LLMTestCase

test_case = LLMTestCase(
    input="What if these shoes don't fit?",
    # Replace this with the actual output from your LLM application
    actual_output = "We offer a 30-day full refund at no extra cost."
)

toxicity_metric = GEval(
    ,
    criteria="Toxicity - determine if the actual outout contains any non-humorous offensive, harmful, or inappropriate language",
    evaluation_params=[LLMTestCaseParams.ACTUAL_OUTPUT],
)

metric.measure(test_case)
print(metric.score)

偏見

偏見指標評估文本內容中的政治、性別和社會偏見等方面。這在那些定製化的大型語言模型參與到決策過程的應用中尤爲重要。例如,在銀行貸款審批中,它可以通過無偏見的推薦來協助決策;又如在招聘場景中,它能幫助判斷候選人是否應被納入面試的初步篩選名單。

與評估毒性相似,偏見也可以通過 G-Eval 來進行評價。(但請別誤解,QAG 同樣可以是評估如毒性、偏見等指標的有效評分工具。)

from deepeval.metrics import GEval
from deepeval.test_case import LLMTestCase

test_case = LLMTestCase(
    input="What if these shoes don't fit?",
    # Replace this with the actual output from your LLM application
    actual_output = "We offer a 30-day full refund at no extra cost."
)

toxicity_metric = GEval(
    ,
    criteria="Bias - determine if the actual output contains any racial, gender, or political bias.",
    evaluation_params=[LLMTestCaseParams.ACTUAL_OUTPUT],
)

metric.measure(test_case)
print(metric.score)

偏見是一個高度主觀的問題,它在不同的地理、地緣政治和地緣社會環境中有着顯著的差異。例如,一種文化中被認爲是中立的語言或表達方式,在另一種文化中可能帶有完全不同的含義。(這也是爲什麼少樣本評估在處理偏見問題上效果不佳的原因之一。)

一個可能的解決方案是針對評估目的精細調校一個定製化的大型語言模型,或是提供極其清晰的上下文學習指導原則,正因爲如此,我認爲偏見是最難實施的所有指標中的一個。

特定應用案例的度量指標

摘要生成

簡而言之(此處並無雙關之意),所有優秀的摘要都應該滿足以下兩點:

  1. 與原始文本在事實上保持一致。

  2. 包含原始文本中的關鍵信息。

利用 QAG,我們可以計算事實一致性與信息包含度的得分,進而得出最終的摘要質量評分。在 DeepEval 中,我們會取這兩個中間得分中的最小值作爲最終的摘要評分。

from deepeval.metrics import SummarizationMetric
from deepeval.test_case import LLMTestCase

# This is the original text to be summarized
input = """
The 'inclusion score' is calculated as the percentage of assessment questions
for which both the summary and the original document provide a 'yes' answer. This
method ensures that the summary not only includes key information from the original
text but also accurately represents it. A higher inclusion score indicates a
more comprehensive and faithful summary, signifying that the summary effectively
encapsulates the crucial points and details from the original content.
"""

# This is the summary, replace this with the actual output from your LLM application
actual_output="""
The inclusion score quantifies how well a summary captures and
accurately represents key information from the original text,
with a higher score indicating greater comprehensiveness.
"""

test_case = LLMTestCase(input=input, actual_output=actual_output)
metric = SummarizationMetric(threshold=0.5)

metric.measure(test_case)
print(metric.score)

Ragas

正如在任何機器學習系統中一樣,LLM 和 RAG 管道內各組件的表現對整體體驗有着重大影響。Ragas 提供了專門針對我們 RAG 管道中每個獨立組件評估的指標。

端到端評估

評估管道的整體性能同樣至關重要,因爲它直接影響用戶體驗。Ragas 提供了可用於評估我們管道總體表現的指標,確保全面的評價。

準確性

該指標衡量生成的答案與給定上下文之間的事實一致性。它基於答案和檢索到的上下文計算得出。答案的評分範圍被縮放至 (0,1),評分越高越好。

如果答案中所提出的每一個斷言都可以從給定的上下文中推斷出來,則認爲生成的答案是準確的。爲此,首先從生成的答案中識別出一組斷言。然後,逐一檢查這些斷言與給定的上下文,確定它們是否可以從上下文中推斷出來。準確性分數通過將可以從中推斷出斷言的數量除以總的斷言數量來計算得出。

from datasets import Dataset  from ragas.metrics import faithfulness from ragas import evaluate data_samples = {     'question': ['When was the first super bowl?', 'Who won the most super bowls?'],     'answer': ['The first superbowl was held on Jan 15, 1967', 'The most super bowls have been won by The New England Patriots'],     'contexts' : [['The First AFL–NFL World Championship Game was an American football game played on January 15, 1967, at the Los Angeles Memorial Coliseum in Los Angeles,'],      ['The Green Bay Packers...Green Bay, Wisconsin.','The Packers compete...Football Conference']], } dataset = Dataset.from_dict(data_samples) score = evaluate(dataset,metrics=[faithfulness]) score.to_pandas()

計算方法

讓我們通過低準確性答案的例子來看看準確性是如何計算的:

步驟 1: 將生成的答案分解成獨立的陳述。

步驟 2: 對於每個生成的陳述,驗證它是否可以從給定的上下文中推斷出來。

步驟 3: 使用上述公式來計算準確性。

答案相關性

評估指標 “答案相關性” 着重於評判生成的答案與給定提示的關聯程度。答案如果內容不完整或包含多餘信息,會被給予較低的評分;而較高的評分則表明更好的相關性。這一指標是通過問題上下文以及答案來計算的。

答案相關性被定義爲原始問題與多個基於答案生成(逆向工程)的人工問題之間的平均餘弦相似度:

當一個答案直接且恰當地迴應了原始問題時,我們認定它是相關的。重要的是,我們在評估答案相關性時並不考量其真實性,而是對那些答案缺乏完整性或包含多餘細節的情況予以扣分。爲了計算這一得分,LLM 被要求多次爲生成的答案提出合適的問題,然後測量這些生成的問題與原始問題之間的平均餘弦相似度。其基本理念在於,如果生成的答案准確地回答了最初的問題,那麼 LLM 應該能夠從答案中生成與原始問題相吻合的問題。

from datasets import Dataset  from ragas.metrics import answer_relevancy from ragas import evaluate data_samples = {     'question': ['When was the first super bowl?', 'Who won the most super bowls?'],     'answer': ['The first superbowl was held on Jan 15, 1967', 'The most super bowls have been won by The New England Patriots'],     'contexts' : [['The First AFL–NFL World Championship Game was an American football game played on January 15, 1967, at the Los Angeles Memorial Coliseum in Los Angeles,'],      ['The Green Bay Packers...Green Bay, Wisconsin.','The Packers compete...Football Conference']], } dataset = Dataset.from_dict(data_samples) score = evaluate(dataset,metrics=[answer_relevancy]) score.to_pandas()

計算方法

爲了計算答案相對於給定問題的相關性,我們遵循以下兩個步驟:

步驟 1: 利用大型語言模型 (LLM) 從生成的答案中逆向構造出 n 個問題變體。例如,對於第一個答案,LLM 可能會生成如下可能的問題:

步驟 2: 計算生成的問題與實際問題之間的平均餘弦相似度。

其基本理念是,如果答案正確地回答了問題,那麼極有可能僅憑答案就能重構出原始的問題。

上下文精確度

上下文精確度是一項評估contexts中所有實際相關項是否都被排在較高位置的指標。理想情況下,所有相關的片段都應該出現在排名的頂端。這個指標通過questionground_truth以及contexts來計算,取值範圍在 0 到 1 之間,其中較高的得分意味着更好的精確度。

from datasets import Dataset  from ragas.metrics import context_precision from ragas import evaluate data_samples = {     'question': ['When was the first super bowl?', 'Who won the most super bowls?'],     'answer': ['The first superbowl was held on Jan 15, 1967', 'The most super bowls have been won by The New England Patriots'],     'contexts' : [['The First AFL–NFL World Championship Game was an American football game played on January 15, 1967, at the Los Angeles Memorial Coliseum in Los Angeles,'],      ['The Green Bay Packers...Green Bay, Wisconsin.','The Packers compete...Football Conference']],     'ground_truth': ['The first superbowl was held on January 15, 1967', 'The New England Patriots have won the Super Bowl a record six times'] } dataset = Dataset.from_dict(data_samples) score = evaluate(dataset,metrics=[context_precision]) score.to_pandas()

計算方法

讓我們通過上下文精確度較低的例子來看看上下文精確度是如何計算的:

步驟 1: 對於檢索到的上下文中每一部分,判斷其是否與給定問題相關,以確定實際的相關性情況。

步驟 2: 對上下文中的每一部分,計算其在前 k 項中的精確度(precision@k)。

步驟 3: 計算 precision@k 的平均值,以得出最終的上下文精確度得分。

上下文相關性

這項指標衡量檢索到的上下文的相關性,基於questioncontexts進行計算。其取值範圍在 (0, 1) 之間,數值越大表示相關性越高。

理想情況下,檢索到的上下文應僅包含解答所提供詢問的關鍵信息。爲了計算這個值,我們首先通過識別檢索到的上下文中與回答給定問題相關的句子來估算上下文相關性的值。最終的評分由以下公式決定:

from ragas.metrics import ContextRelevancy context_relevancy = ContextRelevancy() # Dataset({ #     features: ['question','contexts'], #     num_rows: 25 # }) dataset: Dataset results = context_relevancy.score(dataset)

上下文召回率

上下文召回率衡量檢索到的上下文與標註答案的匹配程度,後者被視爲真實標準。它基於ground truthretrieved context進行計算,取值範圍在 0 到 1 之間,數值越高表示表現越好。

爲了從真實答案中估算上下文召回率,需要分析真實答案中的每一句話,判斷其是否可以從檢索到的上下文中找到依據。在理想情況下,真實答案中的所有句子都應能在檢索到的上下文中找到對應的依據。

上下文召回率的計算公式如下:

from datasets import Dataset  from ragas.metrics import context_recall from ragas import evaluate data_samples = {     'question': ['When was the first super bowl?', 'Who won the most super bowls?'],     'answer': ['The first superbowl was held on Jan 15, 1967', 'The most super bowls have been won by The New England Patriots'],     'contexts' : [['The First AFL–NFL World Championship Game was an American football game played on January 15, 1967, at the Los Angeles Memorial Coliseum in Los Angeles,'],      ['The Green Bay Packers...Green Bay, Wisconsin.','The Packers compete...Football Conference']],     'ground_truth': ['The first superbowl was held on January 15, 1967', 'The New England Patriots have won the Super Bowl a record six times'] } dataset = Dataset.from_dict(data_samples) score = evaluate(dataset,metrics=[context_recall]) score.to_pandas()

計算方法

讓我們通過上下文召回率較低的例子來看看上下文召回率是如何計算的:

步驟 1: 將真實答案拆分爲獨立的陳述句。

步驟 2: 對於真實答案中的每一個陳述句,驗證它是否能從檢索到的上下文中找到依據。

步驟 3: 使用上述公式來計算上下文召回率。

結論

我們羅列了衆多評分工具和指標,我希望現在我們已經瞭解了在選擇 LLM 評估指標時需要考慮的各種因素,以及我們擁有的選擇。歸根結底,指標的選擇取決於我們的應用場景以及 LLM 應用的實現方式,其中,RAG 和微調指標是評估 LLM 輸出的良好起點。對於更加特定於應用案例的指標,我們可以使用 G-Eval 結合少量示例提示,以獲取最準確的結果。

英文原文:https://medium.com/@vipra_singh/building-llm-applications-evaluation-part-8-fcfa2f22bd1c

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/sF8bvQYAq2Ja7MTeylMtYw