Ragas RAG 평가 프레임워크
📅 작성일: 2026-02-13 | 수정일: 2026-02-14 | ⏱️ 읽는 시간: 약 3분
Ragas(RAG Assessment)는 RAG(Retrieval-Augmented Generation) 파이프라인의 품질을 객관적으로 평가하기 위한 오픈 소스 프레임워크입니다. Agentic AI 플랫폼에서 RAG 시스템의 성능을 측정하고 지속적으로 개선하는 데 필수적입니다.
개요
RAG 평가가 필요한 이유
RAG 시스템은 여러 컴포넌트(검색, 생성, 컨텍스트 처리)로 구성되어 있어 전체 품질을 측정하기 어렵습니다:
Ragas vs AWS Bedrock RAG Evaluation
AWS Bedrock RAG Evaluation GA
AWS Bedrock RAG Evaluation은 2025년 3월 GA되었습니다. Bedrock 네이티브 통합으로 별도 설정 없이 RAG 평가를 수행할 수 있습니다.
Ragas vs AWS Bedrock RAG Evaluation
AWS Bedrock RAG Evaluation 메트릭:
- Context Relevance: 검색된 컨텍스트가 질문과 관련있는지
- Coverage: 답변이 질문의 모든 측면을 다루는지
- Correctness: 답변이 정확한지 (ground truth 대비)
- Faithfulness: 답변이 컨텍스트에 충실한지
Ragas 핵심 메트릭
Ragas Core Metrics
Faithfulness
Generation Quality
Whether answer is faithful to context
Answer Relevancy
Generation Quality
Whether answer is relevant to question
Context Precision
Retrieval Quality
Precision of retrieved context
Context Recall
Retrieval Quality
Whether required information is retrieved
Answer Correctness
Overall Quality
Answer accuracy
Ragas 0.2+ API 변경사항
Ragas 0.2 이상에서 context_relevancy 메트릭은 제거되었습니다. 컨텍스트 품질 평가는 context_precision과 context_recall을 조합하여 수행하세요.
설치 및 기본 설정
Python 환경 설정
# Ragas 설치 (0.2+ 권장)
pip install "ragas>=0.2" langchain-openai datasets
# 추가 의존성
pip install pandas numpy
기본 평가 코드
from ragas import evaluate
from ragas.metrics import (
faithfulness,
answer_relevancy,
context_precision,
context_recall,
)
from datasets import Dataset
# 평가 데이터셋 준비
eval_data = {
"question": [
"Kubernetes에서 GPU 스케줄링은 어떻게 하나요?",
"Karpenter의 주요 기능은 무엇인가요?",
],
"answer": [
"Kubernetes에서 GPU 스케줄링은 NVIDIA Device Plugin을 통해 수행됩니다...",
"Karpenter는 자동 노드 프로비저닝, 통합(consolidation), 드리프트 감지 기능을 제공합니다...",
],
"contexts": [
["GPU 스케줄링은 Device Plugin을 통해...", "NVIDIA GPU Operator는..."],
["Karpenter는 Kubernetes 노드 자동 스케일러로...", "NodePool CRD를 통해..."],
],
"ground_truth": [
"NVIDIA Device Plugin과 GPU Operator를 사용하여 GPU 리소스를 스케줄링합니다.",
"Karpenter는 자동 노드 프로비저닝, 통합, 드리프트 감지, 중단 처리 기능을 제공합니다.",
],
}
dataset = Dataset.from_dict(eval_data)
# 평가 실행 (에러 핸들링 포함)
try:
results = evaluate(
dataset,
metrics=[
faithfulness,
answer_relevancy,
context_precision,
context_recall,
],
)
print(results)
except Exception as e:
print(f"평가 중 오류 발생: {e}")
# 로깅 또는 재시도 로직
핵심 메트릭 상세 설명
1. Faithfulness (충실도)
답변이 제공된 컨텍스트에 얼마나 충실한지 측정합니다. 환각(hallucination)을 감지하는 데 핵심적인 메트릭입니다.
from ragas.metrics import faithfulness
# Faithfulness 계산 과정:
# 1. 답변을 개별 주장(claims)으로 분해
# 2. 각 주장이 컨텍스트에서 추론 가능한지 검증
# 3. 검증된 주장 수 / 전체 주장 수 = Faithfulness 점수
# 점수 해석:
# 1.0: 모든 주장이 컨텍스트에서 지원됨
# 0.5: 절반의 주장만 컨텍스트에서 지원됨
# 0.0: 어떤 주장도 컨텍스트에서 지원되지 않음 (심각한 환각)
2. Answer Relevancy (답변 관련성)
답변이 질문에 얼마나 관련있는지 측정합니다.
from ragas.metrics import answer_relevancy
# Answer Relevancy 계산 과정:
# 1. 답변에서 역으로 질문을 생성
# 2. 생성된 질문과 원본 질문의 유사도 계산
# 3. 여러 번 반복하여 평균 계산
# 점수 해석:
# 높은 점수: 답변이 질문에 직접적으로 관련됨
# 낮은 점수: 답변이 질문과 동떨어진 내용을 포함
3. Context Precision (컨텍스트 정밀도)
검색된 컨텍스트 중 실제로 유용한 정보의 비율을 측정합니다.
from ragas.metrics import context_precision
# Context Precision 계산:
# - Ground truth 답변을 생성하는 데 필요한 컨텍스트 식별
# - 상위 랭킹 컨텍스트에 유용한 정보가 있는지 확인
# - 높은 순위에 관련 컨텍스트가 있을수록 높은 점수
4. Context Recall (컨텍스트 재현율)
정답을 생성하는 데 필요한 정보가 검색된 컨텍스트에 포함되어 있는지 측정합니다.
from ragas.metrics import context_recall
# Context Recall 계산:
# 1. Ground truth를 개별 문장으로 분해
# 2. 각 문장이 검색된 컨텍스트에서 추론 가능한지 확인
# 3. 추론 가능한 문장 수 / 전체 문장 수 = Recall 점수
종합 평가 파이프라인
전체 RAG 시스템 평가
import os
from ragas import evaluate
from ragas.metrics import (
faithfulness,
answer_relevancy,
context_precision,
context_recall,
answer_correctness,
)
from datasets import Dataset
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
# LLM 설정 (평가용)
os.environ["OPENAI_API_KEY"] = "your-api-key"
def evaluate_rag_pipeline(questions, rag_chain, ground_truths):
"""RAG 파이프라인 종합 평가"""
answers = []
contexts = []
for question in questions:
# RAG 체인 실행
result = rag_chain.invoke({"query": question})
answers.append(result["result"])
contexts.append([doc.page_content for doc in result["source_documents"]])
# 평가 데이터셋 구성
eval_dataset = Dataset.from_dict({
"question": questions,
"answer": answers,
"contexts": contexts,
"ground_truth": ground_truths,
})
# 전체 메트릭으로 평가
results = evaluate(
eval_dataset,
metrics=[
faithfulness,
answer_relevancy,
context_precision,
context_recall,
answer_correctness,
],
)
return results
# 사용 예시
questions = [
"EKS에서 Karpenter를 설정하는 방법은?",
"GPU 노드 자동 스케일링 구성 방법은?",
"Inference Gateway의 동적 라우팅 설정은?",
]
ground_truths = [
"Karpenter는 Helm 차트로 설치하고 NodePool CRD를 정의하여 설정합니다.",
"DCGM Exporter 메트릭과 KEDA를 연동하여 GPU 사용률 기반 스케일링을 구성합니다.",
"Gateway API의 HTTPRoute를 사용하여 가중치 기반 트래픽 분배를 설정합니다.",
]
# 평가 실행
results = evaluate_rag_pipeline(questions, rag_chain, ground_truths)
print(results.to_pandas())
평가 결과 분석
import pandas as pd
import matplotlib.pyplot as plt
def analyze_evaluation_results(results):
"""평가 결과 분석 및 시각화"""
df = results.to_pandas()
# 메트릭별 평균 점수
metrics_summary = df.mean(numeric_only=True)
print("=== 메트릭별 평균 점수 ===")
print(metrics_summary)
# 문제 영역 식별
print("\n=== 개선 필요 영역 ===")
for metric, score in metrics_summary.items():
if score < 0.7:
print(f"⚠️ {metric}: {score:.2f} - 개선 필요")
elif score < 0.85:
print(f"📊 {metric}: {score:.2f} - 양호")
else:
print(f"✅ {metric}: {score:.2f} - 우수")
# 시각화
fig, ax = plt.subplots(figsize=(10, 6))
metrics_summary.plot(kind='bar', ax=ax, color=['#4285f4', '#34a853', '#fbbc04', '#ea4335', '#9c27b0', '#00bcd4'])
ax.set_ylabel('Score')
ax.set_title('RAG Pipeline Evaluation Results')
ax.set_ylim(0, 1)
ax.axhline(y=0.7, color='r', linestyle='--', label='Minimum Threshold')
ax.legend()
plt.tight_layout()
plt.savefig('rag_evaluation_results.png')
return metrics_summary
# 분석 실행
summary = analyze_evaluation_results(results)