Skip to main content

RAG 평가 (Evaluation)

RAG 시스템의 품질을 측정하고 개선하기 위해 체계적인 평가가 필요합니다. RAGAS 프레임워크는 검색과 생성 품질을 별도로 평가하여, 어떤 단계에서 문제가 발생하는지 진단할 수 있게 합니다.

RAG 평가의 두 축

RAGAS 프레임워크

RAGAS(Retrieval-Augmented Generation Assessment)는 RAG 시스템을 평가하는 표준 프레임워크입니다.

설치

pip install ragas

핵심 메트릭

생성된 답변이 검색된 컨텍스트에 근거하는지를 평가합니다. 환각(hallucination)을 탐지하는 핵심 지표입니다.
  • 1.0: 답변의 모든 주장이 컨텍스트에 근거
  • 0.0: 답변의 모든 주장이 컨텍스트에 근거 없음
질문: "RAG란 무엇인가?"
컨텍스트: "RAG는 검색 기반 생성 기법이다."
답변: "RAG는 검색 기반 생성 기법으로, 2020년에 Meta에서 제안했다."
→ Faithfulness ≈ 0.5 ("2020년 Meta 제안"은 컨텍스트에 없음)

RAGAS 코드 예제

from ragas import evaluate
from ragas.metrics import (
    faithfulness,
    answer_relevancy,
    context_precision,
    context_recall,
)
from datasets import Dataset

# 평가 데이터 준비
eval_data = {
    "question": [
        "RAG에서 인덱싱 단계는 무엇인가요?",
        "Self-RAG의 핵심 메커니즘은?",
    ],
    "answer": [
        "인덱싱은 문서를 청크로 분할하고 벡터로 변환하여 저장하는 과정입니다.",
        "Self-RAG는 Reflection Token을 사용하여 검색 필요성과 생성 품질을 자체 평가합니다.",
    ],
    "contexts": [
        ["인덱싱은 문서를 청크로 분할하고, 임베딩 모델로 벡터화하여 벡터 DB에 저장하는 단계입니다."],
        ["Self-RAG는 ISREL, ISSUP, ISUSE 세 가지 Reflection Token으로 검색과 생성을 평가합니다."],
    ],
    "ground_truth": [
        "인덱싱은 문서 로딩, 청킹, 임베딩, 벡터 DB 저장으로 구성됩니다.",
        "Self-RAG의 핵심은 Reflection Token(ISREL, ISSUP, ISUSE)을 통한 자기 평가입니다.",
    ],
}

dataset = Dataset.from_dict(eval_data)

# 평가 실행
results = evaluate(
    dataset=dataset,
    metrics=[
        faithfulness,
        answer_relevancy,
        context_precision,
        context_recall,
    ],
)

print(results)
# {'faithfulness': 0.95, 'answer_relevancy': 0.88,
#  'context_precision': 0.92, 'context_recall': 0.85}

메트릭별 진단과 개선

메트릭낮은 점수의 원인개선 방법
FaithfulnessLLM이 컨텍스트 무시, 환각temperature 낮추기, 프롬프트 강화
Answer Relevance질문 이해 부족, 답변 포맷프롬프트 개선, Few-shot 추가
Context Relevance검색 품질 낮음쿼리 변환, 하이브리드 검색, 재순위화
Context Recall관련 문서 누락top-k 증가, 청킹 전략 변경, 임베딩 모델 교체

LangSmith 연동

LangSmith를 사용하면 RAG 파이프라인의 각 단계를 추적하고 디버깅할 수 있습니다.
import os

# LangSmith 설정
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-api-key"
os.environ["LANGCHAIN_PROJECT"] = "rag-evaluation"

# 이후 모든 LangChain 실행이 자동으로 추적됨
from langchain.chat_models import init_chat_model

llm = init_chat_model("gpt-4o-mini")
# → LangSmith 대시보드에서 실행 추적 확인 가능

LangSmith에서 확인할 수 있는 것

  • 각 노드(검색, 생성)의 입출력
  • 검색된 문서 내용과 유사도 점수
  • LLM 호출의 프롬프트와 응답
  • 실행 시간과 토큰 사용량
  • 피드백 수집 및 데이터셋 구축

평가 데이터셋 구축

자동 생성

LLM을 활용하여 평가용 질문-답변 쌍을 자동 생성합니다.
from ragas.testset.generator import TestsetGenerator
from langchain.chat_models import init_chat_model
from langchain_openai import OpenAIEmbeddings

generator_llm = init_chat_model("gpt-4o-mini")
critic_llm = init_chat_model("gpt-4o")
embeddings = OpenAIEmbeddings()

generator = TestsetGenerator.from_langchain(
    generator_llm=generator_llm,
    critic_llm=critic_llm,
    embeddings=embeddings,
)

# 문서에서 평가 데이터 자동 생성
testset = generator.generate_with_langchain_docs(
    documents=docs,
    test_size=20,
)

test_df = testset.to_pandas()
print(test_df[["question", "ground_truth"]].head())

평가 체크리스트

최소 50~100개의 질문-답변 쌍을 확보하세요. 도메인의 다양한 유형(사실 질문, 비교, 추론 등)을 포함해야 합니다.
문서 추가/변경, 모델 업데이트 시마다 평가를 재실행하세요. CI/CD에 평가를 통합하는 것을 권장합니다.
전체 점수만 보지 말고, 검색/생성 단계를 분리하여 병목을 정확히 파악하세요.

참고 자료

자료링크
RAGAS 공식 문서docs.ragas.io
LangSmith 문서docs.smith.langchain.com
RAGAS 논문 (Es et al., 2023)arXiv 2309.15217