昨天介紹了 RAG 系統常用的四個評估指標,這些指標如果要每次都靠人工計算,效率太低。今天要介紹如何用現成工具把評估流程自動化,讓我們可以在每次調整系統參數後,快速得知效果是變好還是變差。
RAGAS(Retrieval-Augmented Generation Assessment)是目前業界常用的開源評估框架,內建了 Day 23 提到的四個核心指標,並透過 LLM 自動計算分數,不需要每題都人工評分。
pip install ragas datasets
from ragas import evaluate
from ragas.metrics import (
faithfulness,
answer_relevancy,
context_precision,
context_recall,
)
from datasets import Dataset
# 準備評估資料集
eval_data = {
"question": ["pgvector 支援哪些索引類型?"],
"answer": ["pgvector 支援 IVFFlat 與 HNSW 兩種索引類型。"], # 系統實際生成的答案
"contexts": [["pgvector 提供 IVFFlat 與 HNSW 索引...(檢索到的原文)"]], # 檢索到的內容
"ground_truth": ["pgvector 支援 IVFFlat 與 HNSW 兩種索引類型"], # 標準答案
}
dataset = Dataset.from_dict(eval_data)
result = evaluate(
dataset,
metrics=[faithfulness, answer_relevancy, context_precision, context_recall],
)
print(result)
輸出結果會是每個指標的平均分數(0 到 1 之間),分數越高代表表現越好。
def run_evaluation(test_questions, rag_system):
"""
test_questions: [{"question": ..., "ground_truth": ...}, ...]
"""
questions, answers, contexts, ground_truths = [], [], [], []
for item in test_questions:
retrieved = rag_system.retrieve(item["question"])
answer = rag_system.generate(item["question"], retrieved)
questions.append(item["question"])
answers.append(answer)
contexts.append([r["content"] for r in retrieved])
ground_truths.append(item["ground_truth"])
dataset = Dataset.from_dict({
"question": questions,
"answer": answers,
"contexts": contexts,
"ground_truth": ground_truths,
})
return evaluate(dataset, metrics=[faithfulness, answer_relevancy, context_precision, context_recall])
有了這個 Pipeline,之後每次調整參數(例如換一個 Chunk Size、加入 Rerank),都可以重新跑一次評估,用分數客觀比較效果差異,而不是憑感覺猜測「應該有變好吧」。
雖然自動化評估很方便,但也要注意:
ground_truth 本身寫得不夠精確,評估結果的參考價值也會打折扣建議把評估 Pipeline 整合進開發流程,例如:
透過 RAGAS 這類工具,可以把主觀的「回答得好不好」轉換成客觀可比較的量化指標,讓每一次系統優化都有明確的依據,而不是憑感覺調整參數。明天我們要做一次完整的 A/B 測試,實際比較不同 Chunking、Embedding、Rerank 組合帶來的效果差異。