? ? ?當完成了一個RAG系統的開發工作以后,還需要對該系統的性能進行評估。如何對RAG系統的性能進行評估呢?仔細分析RAG系統的產出成果,主要涉及以下幾點:
(1)檢索器組件 檢索的相關文檔 context,
(2)生成器組件 產出的最終答案 answer,
(3)最初的用戶問題 question。
因此RAG系統的評估應該將對question、context、answer 三者結合一起評估。
一、RAG 三元組
標準的 RAG 流程就是用戶提出 Query 問題,RAG 應用去召回 Context,然后 LLM 將 Context 組裝,生成滿足 Query 的 Response 回答。那么在這里出現的三元組:—— Query、Context 和 Response 就是 RAG 整個過程中最重要的三元組,它們之間兩兩相互牽制。我們可以通過檢測三元組之間兩兩元素的相關度,來評估這個 RAG 應用的效果:
- Context Relevance: 衡量召回的 Context 能夠支持 Query 的程度。如果該得分低,反應出了召回了太多與Query 問題無關的內容,這些錯誤的召回知識會對 LLM 的最終回答造成一定影響。
- Groundedness: 衡量 LLM 的 Response 遵從召回的 Context 的程度。如果該得分低,反應出了 LLM 的回答不遵從召回的知識,那么回答出現幻覺的可能就越大。
- Answer Relevance:衡量最終的 Response 回答對 Query 提問的相關度。如果該得分低,反應出了可能答不對題。
?二、RagAs評估
RAGAs(RAG Assessment)是一個專為評估 RAG(檢索增強生成)系統 的開源框架。它可以幫助我們來快速評估RAG系統的性能,
1、評估數據
為了評估RAG系統,Ragas需要以下信息:
- question:用戶輸入的問題。
- answer:從 RAG 系統生成的答案(由LLM給出)。
- contexts:根據用戶的問題從外部知識源檢索的上下文即與問題相關的文檔。
- ?ground_truths: 人類提供的基于問題的真實(正確)答案。 這是唯一的需要人類提供的信息。
官網:https://www.ragas.io/
2、評估指標
Ragas提供了五種評估指標包括:
- 忠實度(faithfulness)
- 答案相關性(Answer relevancy)
- 上下文精度(Context precision)
- 上下文召回率(Context recall)
- 上下文相關性(Context relevancy)
(1) 忠實度(faithfulness)
忠實度(faithfulness)衡量了生成的答案(answer)與給定上下文(context)的事實一致性。它是根據answer和檢索到的context計算得出的。并將計算結果縮放到 (0,1) 范圍且越高越好。
如果答案(answer)中提出的所有基本事實(claims)都可以從給定的上下文(context)中推斷出來,則生成的答案被認為是忠實的。為了計算這一點,首先從生成的答案中識別一組claims。然后,將這些claims中的每一項與給定的context進行交叉檢查,以確定是否可以從給定的context中推斷出它。忠實度分數由以下公式得出:
示例:
問題 (question):愛因斯坦出生于何時何地?
上下文 (context):阿爾伯特?愛因斯坦(Albert Einstein,1879 年 3 月 14 日出生)是一位出生于德國的理論物理學家,被廣泛認為是有史以來最偉大和最有影響力的科學家之一
高忠實度答案:愛因斯坦 1879 年 3 月 14 日出生于德國。
低忠實度答案:愛因斯坦于 1879 年 3 月 20 日出生于德國。
(2)答案相關性(Answer relevancy)?
評估指標“答案相關性”重點評估生成的答案(answer)與用戶問題(question)之間相關程度。不完整或包含冗余信息的答案將獲得較低分數。該指標是通過計算question和answer獲得的,它的取值范圍在 0 到 1 之間,其中分數越高表示相關性越好。
當答案直接且適當地解決原始問題時,該答案被視為相關。重要的是,我們對答案相關性的評估不考慮真實情況,而是對答案缺乏完整性或包含冗余細節的情況進行懲罰。為了計算這個分數,LLM會被提示多次為生成的答案生成適當的問題,并測量這些生成的問題與原始問題之間的平均余弦相似度。基本思想是,如果生成的答案準確地解決了最初的問題,LLM應該能夠從答案中生成與原始問題相符的問題。
示例:
問題 (question):法國在哪里,首都是哪里?
低相關性答案:法國位于西歐。
高相關性答案:法國位于西歐,巴黎是其首都。
(3)上下文精度(Context precision)?
上下文精度是一種衡量標準,它評估所有在上下文(contexts)中呈現的與基本事實(ground-truth)相關的條目是否排名較高。理想情況下,所有相關文檔塊(chunks)必須出現在頂層。該指標使用question和計算contexts,值范圍在 0 到 1 之間,其中分數越高表示精度越高。
?(4)上下文召回率(Context recall)?
上下文召回率(Context recall)衡量檢索到的上下文(Context)與人類提供的真實答案(ground truth)的一致程度。它是根據ground truth和檢索到的Context計算出來的,取值范圍在 0 到 1 之間,值越高表示性能越好。
為了根據真實答案(ground truth)估算上下文召回率(Context recall),分析真實答案中的每個句子以確定它是否可以歸因于檢索到的Context。 在理想情況下,真實答案中的所有句子都應歸因于檢索到的Context。
示例:
問題 (question):法國在哪里,首都是哪里?
基本事實 (Ground truth):法國位于西歐,其首都是巴黎。
高的上下文召回率 (High context recall):法國位于西歐,擁有中世紀城市、高山村莊和地中海海灘。其首都巴黎以其時裝屋、盧浮宮等古典藝術博物館和埃菲爾鐵塔等古跡而聞名。
低的上下文召回率 (Low context recall):法國位于西歐,擁有中世紀城市、高山村莊和地中海海灘。該國還以其葡萄酒和精致的美食而聞名。拉斯科的古代洞穴壁畫、里昂的羅馬劇院和宏偉的凡爾賽宮都證明了其豐富的歷史。
?(5)上下文相關性(Context relevancy)?
該指標衡量檢索到的上下文(Context)的相關性,根據用戶問題(question)和上下文(Context)計算得到,并且取值范圍在 (0, 1)之間,值越高表示相關性越好。理想情況下,檢索到的Context應只包含解答question的信息。 我們首先通過識別檢索到的Context中與回答question相關的句子數量來估計 |S| 的值。 最終分數由以下公式確定:
說明:這里的|S|是指Context中存在的與解答question相關的句子數量。
示例:
問題 (question):法國的首都是哪里?
高的上下文相關性 (Context relevancy):法國位于西歐,擁有中世紀城市、高山村莊和地中海海灘。其首都巴黎以其時裝屋、盧浮宮等古典藝術博物館和埃菲爾鐵塔等古跡而聞名。
低的上下文相關性 (Context relevancy):西歐的法國包括中世紀城市、高山村莊和地中海海灘。其首都巴黎以其時裝屋、盧浮宮等古典藝術博物館和埃菲爾鐵塔等古跡而聞名。該國還以其葡萄酒和精致的美食而聞名。拉斯科的古代洞穴壁畫、里昂的羅馬劇院和宏偉的凡爾賽宮都證明了其豐富的歷史。
3、編碼
(1)準備評估數據
RAGAs 作為一個無需參照的評估框架,其評估數據集的準備相對簡單。你需要準備一些?question
?和?ground_truths
?的配對,從中可以推導出其他所需信息,操作如下:
pip install ragas
from datasets import Datasetquestions = ["客戶經理被投訴了,投訴一次扣多少分?","客戶經理每年評聘申報時間是怎樣的?","客戶經理在工作中有不廉潔自律情況的,發現一次扣多少分?","客戶經理不服從支行工作安排,每次扣多少分?","客戶經理需要什么學歷和工作經驗才能入職?","個金客戶經理職位設置有哪些?"
]ground_truths = ["每投訴一次扣2分","每年一月份為客戶經理評聘的申報時間","在工作中有不廉潔自律情況的每發現一次扣50分","不服從支行工作安排,每次扣2分","須具備大專以上學歷,至少二年以上銀行工作經驗","個金客戶經理職位設置為:客戶經理助理、客戶經理、高級客戶經理、資深客戶經理"
]answers = []
contexts = []# Inference
for query in questions:answers.append(chain.invoke({"question": query}))contexts.append([docs.page_content for docs in retriever.get_relevant_documents(query)])# To dict
data = {"user_input": questions,"response": answers,"retrieved_contexts": contexts,"reference": ground_truths
}# Convert dict to dataset
dataset = Dataset.from_dict(data)
將字典轉換為數據集
dataset = Dataset.from_dict(data)
如果你不關注 context_recall 指標,就不必提供 ground_truths 數據。在這種情況下,你只需準備 question 即可。
(2)評估 RAG 應用
首先,從?ragas.metrics
?導入你計劃使用的所有度量標準。然后,使用?evaluate()
?函數,簡單地傳入所需的度量標準和已準備好的數據集即可。
# 評測結果
from ragas import evaluate
from ragas.metrics import (faithfulness,answer_relevancy,context_recall,context_precision,
)result = evaluate(dataset = dataset, metrics=[context_precision,context_recall,faithfulness,answer_relevancy,],embeddings=embeddings
)df = result.to_pandas()
下方展示了示例中的 RAGAs 分數:
參考網址
https://zhuanlan.zhihu.com/p/673077106?utm_source=chatgpt.com
RAG Pipeline Evaluation Using RAGAS | Haystack
Ragas: Evaluation Framework for RAG Systems - Build Fast with AI