RAG 평가 퀵스타트

RAG 평가 퀵스타트 (RAG Evaluation Quickstart)

rag_eval 템플릿은 커스텀 메트릭, 데이터셋 관리, 실험 추적을 포함한 완전한 RAG 평가 설정을 제공해요. 프로젝트 생성부터 평가 실행, 결과 분석까지 이어지는 전체 흐름을 볼 수 있어요.

출처: 문서

본문

rag_eval 템플릿은 커스텀 메트릭, 데이터셋 관리, 실험 추적을 포함한 완전한 RAG 평가 설정을 제공해요.

프로젝트 만들기

# uvx 사용 (설치 불필요)
uvx ragas quickstart rag_eval
cd rag_eval

# 또는 ragas 설치 후
ragas quickstart rag_eval
cd rag_eval

의존성 설치

uv sync

또는 pip으로:

pip install -e .

API 키 설정

OpenAI (기본값)

export OPENAI_API_KEY="your-openai-key"

Anthropic Claude

export ANTHROPIC_API_KEY="your-anthropic-key"

evals.py 업데이트:

from anthropic import Anthropic
from ragas.llms import llm_factory

client = Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY"))
llm = llm_factory("claude-3-5-sonnet-20241022", provider="anthropic", client=client)

Google Gemini

export GOOGLE_API_KEY="your-google-api-key"

evals.py 업데이트:

import google.generativeai as genai
from ragas.llms import llm_factory

genai.configure(api_key=os.environ.get("GOOGLE_API_KEY"))
client = genai.GenerativeModel("gemini-2.0-flash")
llm = llm_factory("gemini-2.0-flash", provider="google", client=client)

로컬 모델 (Ollama)

from openai import OpenAI
from ragas.llms import llm_factory

client = OpenAI(
    api_key="ollama",
    base_url="http://localhost:11434/v1"
)
llm = llm_factory("mistral", provider="openai", client=client)

평가 실행

uv run python evals.py

평가는:

  1. load_dataset() 함수에서 테스트 데이터 로드
  2. 테스트 질문으로 RAG 애플리케이션에 질의
  3. 커스텀 메트릭으로 응답 평가
  4. 콘솔에 결과 표시
  5. evals/experiments/에 결과를 CSV로 저장

프로젝트 구조

rag_eval/
├── README.md              # Project documentation
├── pyproject.toml         # Project configuration
├── rag.py                 # RAG application implementation
├── evals.py               # Evaluation workflow
├── __init__.py            # Python package marker
└── evals/
    ├── datasets/          # Test data files
    ├── experiments/       # Evaluation results (CSV)
    └── logs/              # Execution logs and traces

코드 이해하기

RAG 애플리케이션 (rag.py)

다음을 포함하는 간단한 RAG 구현:

  • 문서 저장: 인메모리 문서 컬렉션
  • 키워드 검색: 문서 검색용 간단한 키워드 매칭
  • 응답 생성: 답변 생성을 위한 OpenAI API
  • 추적: 디버깅용 각 쿼리 로깅
from rag import default_rag_client

# OpenAI 클라이언트로 초기화
rag_client = default_rag_client(llm_client=openai_client, logdir="evals/logs")

# RAG 시스템에 질의
response = rag_client.query("What is Ragas?")
print(response["answer"])

평가 스크립트 (evals.py)

평가 워크플로우:

  1. 데이터셋 로드: 질문과 채점 노트로 테스트 케이스 생성
  2. 메트릭 정의: pass/fail 평가용 커스텀 DiscreteMetric
  3. 실험 실행: 쿼리 실행 및 응답 평가
  4. 결과 저장: 분석용 CSV 저장
from ragas import Dataset, experiment
from ragas.metrics import DiscreteMetric

# 메트릭 정의
my_metric = DiscreteMetric(
    name="correctness",
    prompt="Check if the response contains points from grading notes...",
    allowed_values=["pass", "fail"],
)

# 실험 실행
@experiment()
async def run_experiment(row):
    response = rag_client.query(row["question"])
    score = my_metric.score(llm=llm, response=response["answer"], ...)
    return {**row, "response": response["answer"], "score": score.value}

커스터마이즈

테스트 케이스 추가

evals.pyload_dataset() 함수를 편집해요.

def load_dataset():
    dataset = Dataset(
        name="test_dataset",
        backend="local/csv",
        root_dir="evals",
    )

    data_samples = [
        {
            "question": "What is Ragas?",
            "grading_notes": "- evaluation framework - LLM applications",
        },
        {
            "question": "How do experiments work?",
            "grading_notes": "- track results - compare runs - store metrics",
        },
        # 테스트 케이스 더 추가...
    ]

    for sample in data_samples:
        dataset.append(sample)
    dataset.save()
    return dataset

메트릭 수정

메트릭 프롬프트를 업데이트해서 평가 기준을 바꿔요.

my_metric = DiscreteMetric(
    name="quality",
    prompt="""Evaluate the response quality:

Response: {response}
Expected Points: {grading_notes}

Rate as:
- 'excellent': All points covered with clear explanation
- 'good': Most points covered
- 'poor': Missing key points

Rating:""",
    allowed_values=["excellent", "good", "poor"],
)

여러 메트릭 추가

다른 평가 측면을 위한 추가 메트릭을 만들어요.

from ragas.metrics import DiscreteMetric, NumericalMetric

correctness = DiscreteMetric(
    name="correctness",
    prompt="Is the response factually correct? {response}",
    allowed_values=["correct", "incorrect"],
)

relevance = NumericalMetric(
    name="relevance",
    prompt="Rate relevance 1-5: {response} for question: {question}",
    allowed_values=(1, 5),
)

자신만의 RAG 시스템 사용

예제 RAG를 프로덕션 시스템으로 교체해요.

# In evals.py
from your_rag_module import YourRAGClient

rag_client = YourRAGClient(...)

@experiment()
async def run_experiment(row):
    # RAG 시스템 호출
    response = await rag_client.query(row["question"])

    score = my_metric.score(
        llm=llm,
        response=response,
        grading_notes=row["grading_notes"],
    )

    return {
        **row,
        "response": response,
        "score": score.value,
    }

결과 보기

결과는 evals/experiments/에 CSV 파일로 저장돼요. 각 실험 실행은 다음을 포함하는 새 파일을 만들어요.

  • 입력 데이터 (질문, 채점 노트)
  • 모델 응답
  • 평가 점수
  • 타임스탬프
import pandas as pd

# 결과 로드
results = pd.read_csv("evals/experiments/your_experiment.csv")

# 통과율 계산
pass_rate = (results["score"] == "pass").mean()
print(f"Pass rate: {pass_rate:.1%}")

더 알아보기 (Learn more)