# RAGAS 評估指標完整指南
## 1. 業務場景分類
### A. 問答系統評估
1. **檢索品質評估**
- Context Precision (上下文精確度):評估檢索內容與問題的相關程度
- Context Recall (上下文召回率):評估是否檢索到所有必要資訊
- Context Entities Recall (實體召回率):評估關鍵實體的檢索完整度
- Noise Sensitivity (雜訊敏感度):評估系統對干擾資訊的穩定性
2. **回答品質評估**
- Answer Relevancy (答案相關性):評估回答是否切中問題要點
- Faithfulness (忠實度):評估回答是否與上下文保持一致
- Factual Correctness (事實正確性):評估回答中的事實陳述是否正確
- Topic Adherence (主題連貫性):評估回答是否始終圍繞主題
### B. 多模態系統評估
1. **視覺語言理解**
- Multimodal Faithfulness (多模態忠實度):評估系統對圖像內容的解讀準確性
- Multimodal Relevance (多模態相關性):評估回答是否恰當結合圖像和文字資訊
### C. 代理工具使用評估
1. **任務完成度**
- Agent Goal Accuracy (代理目標準確率):評估是否達成用戶意圖
- Tool Call Accuracy (工具調用準確率):評估工具使用的準確性
## 2. 技術實現與計算方法
### A. 檢索相關指標
#### 1. Context Precision (上下文精確度)
```python
def calculate_context_precision(context, question):
"""
計算檢索內容與問題的相關程度
參數:
context: 檢索的上下文內容
question: 用戶問題
返回:
float: 0-1之間的精確度分數
"""
# 1. 生成文本嵌入
context_embedding = get_embeddings(context)
question_embedding = get_embeddings(question)
# 2. 計算相似度
similarity = cosine_similarity(context_embedding, question_embedding)
# 3. 根據閾值判斷相關性
relevance_score = (similarity > THRESHOLD).mean()
return relevance_score
# 使用範例
問題 = "台北101的高度是多少?"
上下文 = "台北101高度為509.2公尺,是台灣最高的建築物。"
精確度分數 = calculate_context_precision(上下文, 問題) # 返回: 0.92
```
#### 2. Context Recall (上下文召回率)
```python
def calculate_context_recall(retrieved_context, reference_context):
"""
計算檢索內容對參考答案的覆蓋程度
參數:
retrieved_context: 系統檢索的上下文
reference_context: 標準參考上下文
返回:
float: 0-1之間的召回率分數
"""
# 1. 提取關鍵信息單元
retrieved_info = extract_key_info(retrieved_context)
reference_info = extract_key_info(reference_context)
# 2. 計算覆蓋率
recall = len(retrieved_info.intersection(reference_info)) / len(reference_info)
return recall
# 使用範例
參考答案 = "台北101有101層,高度509.2公尺,2004年完工。"
檢索內容 = "台北101高度509.2公尺,2004年完工。"
召回率分數 = calculate_context_recall(檢索內容, 參考答案) # 返回: 0.67
```
### B. 答案品質指標
#### 1. Faithfulness (忠實度)
```python
def calculate_faithfulness(answer, context):
"""
計算回答與上下文的一致性
參數:
answer: 系統生成的回答
context: 參考上下文
返回:
float: 0-1之間的忠實度分數
"""
# 1. 提取回答中的陳述
claims = extract_claims(answer)
# 2. 驗證每個陳述
def verify_claim(claim, context):
# 使用自然語言推理模型
entailment_score = nli_model(premise=context, hypothesis=claim)
return entailment_score
claim_scores = [verify_claim(claim, context) for claim in claims]
return np.mean(claim_scores)
# 使用範例
上下文 = "台北101是台灣最高的建築物,高度為509.2公尺。"
回答 = "台北101高達509.2公尺,是全台最高建築。"
忠實度分數 = calculate_faithfulness(回答, 上下文) # 返回: 0.95
```
### C. 傳統自然語言處理指標
#### 1. ROUGE Score (ROUGE分數)
```python
def calculate_rouge(generated_text, reference_text):
"""
計算ROUGE-N分數
參數:
generated_text: 生成的文本
reference_text: 參考文本
返回:
dict: 包含不同ROUGE指標的分數
"""
def rouge_n(n):
# 1. 生成n-gram
gen_ngrams = get_ngrams(generated_text, n)
ref_ngrams = get_ngrams(reference_text, n)
# 2. 計算重疊部分
overlap = len(gen_ngrams.intersection(ref_ngrams))
# 3. 計算精確率和召回率
precision = overlap / len(gen_ngrams)
recall = overlap / len(ref_ngrams)
# 4. 計算F1分數
f1 = 2 * (precision * recall) / (precision + recall)
return f1
return {
'rouge-1': rouge_n(1),
'rouge-2': rouge_n(2),
'rouge-l': calculate_rouge_l()
}
# 使用範例
參考文本 = "台北101是台灣標誌性建築。"
生成文本 = "台北101代表台灣的標誌性建築物。"
rouge分數 = calculate_rouge(生成文本, 參考文本)
# 返回: {'rouge-1': 0.85, 'rouge-2': 0.70, 'rouge-l': 0.80}
```
### D. SQL評估指標
#### 1. Datacompy Score (數據比對分數)
```python
def calculate_datacompy_score(query1_result, query2_result):
"""
比較SQL查詢結果的相似度
參數:
query1_result: 第一個查詢結果
query2_result: 第二個查詢結果
返回:
float: 0-1之間的相似度分數
"""
# 1. 比較schema
schema_match = compare_schemas(query1_result, query2_result)
# 2. 比較數據
row_match = compare_rows(query1_result, query2_result)
value_match = compare_values(query1_result, query2_result)
# 3. 計算總分
score = (schema_match + row_match + value_match) / 3
return score
# 使用範例
查詢1 = "SELECT * FROM 員工 WHERE 年齡 > 25"
查詢2 = "SELECT * FROM 員工 WHERE 年齡 >= 26"
相似度分數 = calculate_datacompy_score(
execute_query(查詢1),
execute_query(查詢2)
) # 返回: 0.92
```
## 3. 指標選擇最佳實踐
### A. 使用場景對應
1. **一般問答系統**
- 主要指標: Context Precision, Answer Relevancy
- 次要指標: Faithfulness, Topic Adherence
2. **技術文檔檢索**
- 主要指標: Context Entities Recall, Factual Correctness
- 次要指標: Context Precision, ROUGE Score
3. **多模態應用**
- 主要指標: Multimodal Faithfulness, Multimodal Relevance
- 次要指標: Answer Relevancy, Topic Adherence
### B. 綜合評分方法
```python
def comprehensive_score(問題, 上下文, 回答, 參考答案):
"""
計算綜合評分
"""
權重 = {
'precision': 0.3,
'recall': 0.2,
'faithfulness': 0.3,
'relevancy': 0.2
}
分數 = {
'precision': calculate_context_precision(上下文, 問題),
'recall': calculate_context_recall(上下文, 參考答案),
'faithfulness': calculate_faithfulness(回答, 上下文),
'relevancy': calculate_answer_relevancy(回答, 問題)
}
最終分數 = sum(權重[k] * 分數[k] for k in 權重)
return 最終分數, 分數
```
## 4. 分數解讀指南
### A. 分數範圍說明
| 指標 | 範圍 | 優秀 | 可接受 | 需改進 |
|--------|-------|------|------------|------|
| Context Precision | 0-1 | >0.8 | 0.6-0.8 | <0.6 |
| Faithfulness | 0-1 | >0.9 | 0.7-0.9 | <0.7 |
| ROUGE-1 | 0-1 | >0.7 | 0.5-0.7 | <0.5 |
| SQL Equivalence | 0-1 | >0.95 | 0.8-0.95 | <0.8 |
### B. 常見問題
1. **過度依賴單一指標**
- 建議: 綜合使用多個指標
- 考慮具體業務場景的重要性權重
2. **閾值設定問題**
- 定期驗證閾值的合理性
- 根據領域特點調整閾值
3. **特殊情況處理**
- 多語言內容的評估方法
- 專業術語的處理方式
- 模糊查詢的評估標準
### C. 優化建議
1. **效能優化**
- 對常用上下文進行嵌入緩存
- 批量處理評估請求
- 使用高效的相似度計算方法
2. **準確度優化**
- 使用領域特定的評估標準
- 定期更新評估模型
- 收集用戶反饋進行調整