Home / RAG 평가 / RAG 품질 평가
Module

RAG 품질 평가

RAGAS · Faithfulness · Context Precision · Bedrock Evaluation

⏱ 60분 67 / 189

RAG 평가

평가 데이터셋 · 지표 · 방법 · 도구 · RAGAS

측정하지 않으면 개선할 수 없다

검색 품질 + 생성 품질 + 전체 품질 — 체계적 RAG 평가 프레임워크

평가 필요성

진단 · 개선 · 회귀 방지

PART 1 · 평가 필요성

RAG 평가

RAG 파이프라인이 어디서 실패하는지 수치로 진단하여 체계적으로 개선하는 프로세스

RAG 평가

"동작하는 것 같지만"에는 할루시네이션(환각)이 섞여 있을 수 있습니다 — 측정 없이는 모릅니다

  • 진단 — 검색 실패인가, 생성 실패인가
  • 개선 — 조정 전후를 수치로 비교
  • 회귀 방지 — 바꿨더니 나빠진 것을 감지
  • 기준 — 최소 30개 Q&A 평가 데이터셋
takeaway

측정하지 않으면 개선할 수 없습니다 — 평가 없는 RAG는 추측 위의 서비스입니다.

PART 1 · 평가 필요성

감에서 수치

평가가 있으면 달라지는 같은 질문 — 감이 수치가 되는 순간

진단 "답이 이상한데 왜지?" "Faithfulness 0.6 — 검색 결과와 다른 답"
개선 "Reranking을 넣으면 나아질까?" "Context Precision 0.4 → 0.8 — Reranking 채택"
회귀 "새 청킹 전략이 더 나은가?" "동일 데이터셋 비교: 0.75 vs 0.82 — 신규 채택"
takeaway

환각 미탐지 · 검색 실패 미인지 · 개선 방향 오판 — 평가 없이 배포하면 생기는 세 가지 문제를 수치화가 막습니다.

PART 1 · 평가 필요성

평가 루프

측정과 조정의 반복 — "체감상 좋아졌다"가 아니라 동일 데이터셋의 수치 비교로

PART 1 · 평가 필요성

평가에 필요한 것들

데이터셋 · 지표 · 방법 · 도구 — 넷이 갖춰져야 시작되는 측정

평가 데이터셋

질문 + 정답(근거 문서) 쌍
• 카테고리별 5개씩, 최소 30개부터
• 매 측정마다 동일 데이터셋 사용

평가 지표

검색 · 생성 · 전체 3축 메트릭
• Context Relevance · Faithfulness · Answer Relevance
• 전부 0~1 범위

평가 방법

LLM-as-a-Judge 자동 채점
• 사람 채점의 규모 한계를 대체
• 주장 단위로 문서와 대조

평가 도구

고르는 것 — 셋 중 하나
• 직접 구현 · Bedrock Evaluations · RAGAS
• 규모·통제 수준으로 선택

takeaway

지표·방법·도구는 고르는 것이고, 데이터셋만 직접 만들어야 합니다 — 데이터셋의 질이 평가 전체의 상한입니다.

평가 데이터셋

질문 · 정답 · 근거 — 직접 만드는 유일한 재료

PART 2 · 평가 데이터셋

데이터셋 구성

한 건 = 질문 · 정답 · 근거의 3요소 — 러닝 예제 한 건을 그대로

요소역할예시
질문실제 사용자가 물을 법한 형태 — 카테고리별 5개씩 설계"예약금 환불 규정이 어떻게 되나요?"
정답기대 답변 — 모든 채점의 기준점"이용일 3일 전까지 취소하면 전액 환불…"
근거정답의 출처 문서·청크 — Faithfulness 대조에 사용restaurant-policy.pdf · 청크 #12
takeaway

셋 중 근거가 가장 자주 빠집니다 — 근거 없는 데이터셋으로는 Faithfulness와 Context Recall을 채점할 수 없습니다.

PART 2 · 평가 데이터셋

파일 실물 — JSONL

한 줄 = 평가 1건 — JSON Lines가 평가 데이터셋의 사실상 표준

json
// eval-dataset.jsonl — 한 줄이 평가 1건
{"question": "예약금 환불 규정이 어떻게 되나요?",
 "ground_truth": "이용일 3일 전까지 취소하면 전액 환불, 1~2일 전은 50% 공제…",
 "reference_contexts": ["restaurant-policy.pdf#chunk-12"],
 "category": "환불"}
{"question": "노쇼하면 예약금은 어떻게 되나요?",
 "ground_truth": "당일 취소와 노쇼는 환불되지 않습니다…",
 "reference_contexts": ["restaurant-policy.pdf#chunk-12"],
 "category": "환불"}
{"question": "단체 예약은 몇 명부터인가요?",
 "ground_truth": "8인 이상은 단체 예약으로 전화 접수…",
 "reference_contexts": ["restaurant-policy.pdf#chunk-31"],
 "category": "예약"}
  • 한 줄 = 질문·정답·근거·카테고리 한 건 — 붙이고 자르기 쉬운 구조
  • 필드명은 도구가 정합니다 — RAGAS는 user_input·reference, Bedrock Evaluations는 잡 스키마 요구
  • category — 축별 집계용: 어느 주제에서 무너지는지 드러남
  • 정답이 없어도 되는 메트릭도 있음 — Faithfulness·Response Relevancy는 reference 불필요
PART 2 · 평가 데이터셋

설계 원칙

규모 · 분포 · 고정 · 근거 — 데이터셋의 질이 평가 전체의 상한

규모

카테고리별 5개씩, 최소 30개
• 10개 미만은 통계적으로 무의미
• 실패 사례가 나올 때마다 증분

분포

실사용 질문의 분포를 반영
• 엣지 케이스 포함 — 문서에 없는 질문도
• 쉬운 질문만 모으면 점수가 후해짐

고정

한 번 만들면 버전으로 관리
• 데이터셋이 바뀌면 점수 비교 무효
• 추가는 버전업으로, 변경은 리뷰로

근거 명시

정답마다 출처 청크를 기록
• Faithfulness·Context Recall의 전제
• 문서 개정 시 데이터셋도 점검

takeaway

골든 데이터셋은 코드처럼 버전 관리합니다 — 리포지토리에 커밋하고, 바뀌면 Baseline도 다시 잡습니다.

평가 지표

검색 · 생성 · 전체 3축 메트릭

PART 3 · 평가 지표

평가 3축

검색 품질 · 생성 품질 · 전체 품질을 분리하여 실패 지점을 정확히 진단하는 프레임워크

평가 3축

축을 분리해야 병목이 보입니다 — 어느 축이 낮은지가 곧 개선의 출발점

  • 검색 축 — 검색된 문서가 질문과 관련 있는가
  • 생성 축 — 답변이 검색 문서에 근거하는가
  • 전체 축 — 답변이 질문에 적절한가
  • 모든 메트릭 범위: 0~1
takeaway

검색이 잘못되면 아무리 좋은 모델이어도 환각, 생성이 잘못되면 좋은 문서를 가져와도 무시 — 축이 다르면 처방이 다릅니다.

PART 3 · 평가 지표

채점의 실제 — 같은 질문, 두 답변

"예약금 환불 규정이 어떻게 되나요?" — 같은 질문에 대한 두 답변을 3축으로 나란히 채점한 결과




"예약금 환불 규정이 어떻게 되나요?"
검색된 근거restaurant-policy.pdf · 청크 #12 "예약금은 이용일 3일 전까지 취소하면 전액 환불됩니다. 이용일 1~2일 전 취소는 예약금의 50%가 공제되며, 당일 취소와 노쇼는 환불되지 않습니다…"




답변 A
통과 — 배포 가능

"예약금은 이용일 3일 전까지 취소하시면 전액 환불이 가능합니다 [문서 1]"



Context Relevance
0.91

Faithfulness
1.00

Answer Relevance
0.94





답변 B
차단 — Faithfulness < 0.8

"예약금은 이용일 3일 전까지 취소하면 전액 환불이 가능하며, 환불액은 영업일 기준 3일 안에 입금됩니다. 당일 취소도 절반은 환불받을 수 있습니다."


강조 문장 — 문서에 없는 주장(환각)인데, 문장은 그럴듯함

Context Relevance
0.91

Faithfulness
0.33

Answer Relevance
0.90





검색은 동일(Context Relevance 0.91)·그럴듯함도 비슷(Answer Relevance 0.94 vs 0.90) — 두 답변을 갈라놓는 것은 Faithfulness 하나 (예시 수치)


takeaway

그럴듯함은 환각을 못 잡습니다 — 답변의 주장을 문서와 대조하는 Faithfulness가 잡습니다 — 그럴듯한 문장일수록 대조 없이는 구분되지 않습니다.

PART 3 · 평가 지표

핵심 메트릭 정의

각 메트릭이 측정하는 것과 낮을 때의 의미 — 실무의 중심은 Context Precision과 Faithfulness

메트릭측정 대상낮으면
검색Context Relevance검색 결과가 질문과 관련 있는가검색 결과가 무관 — 청킹·임베딩 점검
검색Context Precision관련 문서가 상위 순위에 있는가관련 문서가 하위에 묻힘 — Reranking
검색Context Recall정답에 필요한 정보가 전부 검색됐는가필요한 정보 누락 — K값 증가
생성Faithfulness답변의 각 주장이 문서에 근거하는가모델이 지어냄 (환각)
생성Answer Correctness답변이 정답과 일치하는가검색 + 생성 둘 다 점검
전체Answer Relevance답변이 질문 의도에 적절한가질문과 무관한 답변 — 프롬프트 재설계
전체Helpfulness답변이 사용자에게 유용한가형식·길이 부적절
PART 3 · 평가 지표

실패 패턴 진단과 개선

메트릭 조합이 가리키는 실패 유형 — 비용 낮은 조정부터 시도

검색만 실패

Context Relevance 하락 + Faithfulness 정상

  • 원인: 청킹 크기·임베딩 모델 문제
  • 개선: 청킹 축소, 하이브리드 검색, 순위 문제면 Reranking

생성만 실패

Context Relevance 정상 + Faithfulness 하락

  • 원인: 모델이 가져온 문서를 무시하고 지어냄
  • 개선: temperature=0 + "문서 근거만" 프롬프트 강화

파이프라인 전체

검색·생성 메트릭이 함께 하락

  • 원인: 임베딩과 프롬프트가 동시에 어긋남
  • 개선: 인덱싱부터 재점검 — 단계별로 나눠 조정

프롬프트 구조

Answer Relevance만 하락, 나머지 정상

  • 원인: 답변 형식·길이가 질문 의도와 불일치
  • 개선: 프롬프트 재설계, K값 축소로 잡음 제거
Faithfulness < 0.8이면 배포 차단 — 널리 쓰이는 예시 기준

0.8 미만이면 답변 속 주장의 20%가 문서에 근거하지 않는다는 뜻입니다. temperature=0 고정 + "반드시 문서에 근거하여 답변하세요" 지시로 대부분 해결됩니다.

평가 방법

자동 평가 스펙트럼 · LLM-as-a-Judge

PART 4 · 평가 방법

자동 평가 방법의 스펙트럼

규칙 → 통계 → 임베딩 → LLM 판정 — 유연해질수록 비싸진다

규칙 기반

exact match · 정규식 · 형식 검증

  • 결정적 — 같은 입력이면 늘 같은 판정
  • 무료·즉시, CI에 바로 연결

언제 — 형식·필수 포함어·JSON 스키마 검사

통계 기반

BLEU · ROUGE — n-gram 겹침

  • 요약·번역의 전통 지표
  • 의미가 같아도 단어가 다르면 점수 하락

언제 — 요약 품질의 대략적 비교

임베딩 유사도

정답 ↔ 답변 벡터 코사인

  • 표현이 달라도 의미 일치를 포착
  • 왜 틀렸는지 설명 불가 — 근거 대조 불가

언제 — 의미 일치 스크리닝

takeaway

싸고 결정적인 방법부터 걸고 판단이 필요한 것만 Judge에게 — 형식은 규칙으로, 의미는 임베딩으로, 근거는 Judge로.

PART 4 · 평가 방법

규칙 · 통계 · 임베딩 — 가벼운 세 방법

Judge 앞단의 저비용 게이트 — 각자 몇 줄이면 충분

규칙 기반
통계 기반
임베딩 유사도
takeaway

세 방법은 게이트로 씁니다 — 여기서 걸러지지 않은 답변만 Judge 채점으로 보내 평가 비용을 줄입니다.

PART 4 · 평가 방법

LLM-as-Judge

LLM에게 "이 답변의 품질을 채점하라"고 요청하여 자동 평가하는 패턴

LLM-as-Judge

Bedrock Evaluations와 RAGAS 모두 내부적으로 이 패턴을 사용합니다

  • 모든 평가 도구의 공통 기반
  • 커스텀 메트릭(도메인 특화) 구현 가능
  • 점수 + 근거(reasoning)를 함께 출력
  • 평가 LLM은 생성 LLM과 분리 권장
takeaway

평가 도구의 밑바닥에는 전부 이 패턴이 있습니다 — 직접 구현해 보면 도구가 하는 일이 보입니다.

PART 4 · 평가 방법

자동 채점의 동작 원리

평가 전용 프롬프트가 결정하는 채점 기준과 출력 형식

  1. 1
    평가 입력

    질문 + 검색 결과 + RAG가 생성한 답변을 평가자 LLM에 전달.

  2. 2
    채점 프롬프트

    판정 기준(supported/unsupported)과 JSON 출력 형식을 명시 — 기준이 곧 메트릭 정의.

  3. 3
    점수 + 근거

    점수와 함께 근거(reasoning)를 출력하게 하여 채점의 신뢰성을 확보.

  4. 4
    집계

    데이터셋 전체 샘플의 점수를 평균해 메트릭 산출 — 낮은 샘플부터 원인 분석.

takeaway

평가 LLM은 생성 LLM과 다른 모델을 사용합니다 — 자기 평가 편향을 막는 기본 수칙입니다.

PART 4 · 평가 방법

판정의 실제 — 주장 단위 채점

차단된 답변 B의 Faithfulness 0.33 — 평가자 LLM이 답변을 주장으로 쪼개 문서와 대조한 결과




채점 대상
답변 B — "예약금 환불 규정이 어떻게 되나요?"에 대한 환각 섞인 답 · 근거 — restaurant-policy.pdf 청크 #12 "예약금은 이용일 3일 전까지 취소하면 전액 환불됩니다. 이용일 1~2일 전 취소는 예약금의 50%가 공제되며, 당일 취소와 노쇼는 환불되지 않습니다…"


평가자 LLM의 판정 — 답변을 주장 3개로 분해해 문서와 대조 (temperature=0)

1
"예약금은 이용일 3일 전까지 취소하면 전액 환불이 가능하다"
문서의 "3일 전까지 … 전액 환불"과 일치
supported


2
"환불액은 영업일 기준 3일 안에 입금된다"
문서에 입금 기한 언급 없음 — 근거 부재
unsupported


3
"당일 취소도 절반은 환불된다"
문서는 "당일 취소는 환불되지 않는다" — 상충
unsupported



Faithfulness = supported 1 / 주장 3 = 0.33
{"claims": ["supported", "unsupported", "unsupported"], "score": 0.33}
(예시 수치)


takeaway

판정 기준을 프롬프트에 쓰면 그 프롬프트가 곧 메트릭 정의입니다 — 이 채점을 메트릭 7종만큼 손으로 관리하는 대신, 도구(RAGAS)가 대신 실행합니다.

평가 도구

직접 구현 · Bedrock Evaluations · RAGAS

PART 5 · 평가 도구

평가 도구

규모 · 커스터마이징 · 환경에 따른 3택 1

평가 도구 3종

셋 다 LLM-as-Judge 기반 — 비용은 동일하게 평가 LLM 토큰에 비례합니다

  • 직접 구현 — 코드 20줄로 baseline
  • Bedrock Evaluations — 관리형 서버리스
  • RAGAS — 오픈소스 · 커스텀 자유
  • 패턴은 하나, 포장이 셋
takeaway

기능이 아니라 환경과 규모가 선택을 결정합니다 — 어느 것을 골라도 측정하는 것이 안 하는 것보다 낫습니다.

PART 5 · 평가 도구

도구 선택 기준

소규모 PoC는 직접 구현 · 프로덕션 자동화는 Bedrock Evaluations · 커스텀 메트릭은 RAGAS

직접 구현

  • boto3 + 평가 프롬프트 — 완전 자유
  • 코드 20줄로 Faithfulness 측정 가능
  • 메트릭 정의부터 집계까지 직접 관리

언제 — 소규모 PoC, 빠른 baseline 측정

Bedrock Evaluations

  • 관리형 서버리스 — 콘솔/API로 설정
  • S3 결과 + CloudWatch로 CI/CD 통합
  • 데이터가 AWS 리전 밖으로 나가지 않음

언제 — 프로덕션 자동화, AWS 규정 준수 환경

RAGAS

  • 핵심 메트릭 6종 + 무제한 커스텀
  • DataFrame 출력 — 질문별 세밀 분석
  • pytest · GitHub Actions로 로컬/CI 실행

언제 — 커스텀 메트릭, 질문별 세밀 분석

takeaway

어떤 도구를 쓰든 운영 원칙은 같습니다 — 핵심 메트릭 하락 시 배포 차단(예시 기준: 5%+), 모델 업데이트 후에는 반드시 재평가합니다.

PART 5 · 평가 도구

Bedrock Evaluations — 유형과 내장 메트릭

관리형을 골랐다면 — 평가 유형 2종과 Builtin 메트릭의 정확한 이름

평가 유형내장 메트릭 (Builtin.*)비고
Retrieve onlyContext relevance · Context coveragecoverage는 ground truth 필수
Retrieve + generateCorrectness · Completeness · Faithfulness · Helpfulness · Logical coherence · Citation precision · Citation coverage책임 AI 3종(Harmfulness · Stereotyping · Refusal) 추가 선택
takeaway

judge 모델은 직접 선택하고 점수는 0~1로 정규화됩니다 — 데이터셋은 S3 JSONL, CreateEvaluationJob API로 CI/CD 회귀 게이트 자동화(BYOI로 외부 RAG 응답도 평가). RAGAS의 context precision/recall과 이름 체계가 다르니 혼용하지 않습니다.

RAGAS

SingleTurnSample · 클래스 메트릭 · Bedrock 연동

PART 6 · RAGAS

RAGAS

RAGAS(Retrieval Augmented Generation Assessment) — RAG 파이프라인을 자동 평가하는 오픈소스 프레임워크

RAGAS

LLM-as-Judge 패턴을 프레임워크로 포장 — 메트릭 6종을 코드 몇 줄로 실행합니다

  • 설치: pip install "ragas>=0.4,<0.5"
  • 단위: SingleTurnSample → EvaluationDataset
  • 메트릭: 클래스 인스턴스 — Faithfulness()
  • 평가자: Bedrock LLM 연동 가능
0.4.x API 필수

0.1.x 함수형 import(from ragas.metrics import faithfulness)는 0.4.x에서 아직 동작하지만 DeprecationWarning과 함께 v1.0 제거 예고 상태입니다 — 새 코드는 클래스 기반으로 쓰고, 신규 정본은 ragas.metrics.collections입니다.

PART 6 · RAGAS

RAGAS 메트릭 6종

정답(reference) 준비 여부가 결정하는 사용 가능 메트릭

takeaway

정답 준비가 어려우면 Faithfulness + Response Relevancy로 시작하고, 정답을 확보한 뒤 Context Recall까지 확장합니다.

PART 6 · RAGAS

데이터셋 구성과 평가 실행

SingleTurnSample로 케이스 구성, 클래스 메트릭으로 평가 실행

python
from ragas import evaluate, EvaluationDataset, SingleTurnSample
from ragas.metrics import Faithfulness, ResponseRelevancy, ContextPrecision

# ① 평가 케이스 — 질문·답변·검색 컨텍스트·정답 4필드를 하나로
sample = SingleTurnSample(
    user_input="예약금 환불 규정이 어떻게 되나요?",
    response="예약금은 이용일 3일 전까지 취소하면 전액 환불이 가능합니다.",
    retrieved_contexts=["예약금은 이용일 3일 전까지 취소하면 전액 환불됩니다."],
    reference="예약금은 이용일 3일 전까지 취소하시면 전액 환불이 가능합니다.",
)
# ② 샘플 모음 → 평가 데이터셋
dataset = EvaluationDataset(samples=[sample])

# ③ 평가 실행 — 메트릭은 클래스 인스턴스로 전달 (0.4.x)
results = evaluate(dataset=dataset,
                   metrics=[Faithfulness(), ResponseRelevancy(), ContextPrecision()])
print(results.to_pandas())  # ④ 샘플별 점수 DataFrame
  • SingleTurnSample — 평가 1건. user_input·response·retrieved_contexts·reference(선택)
  • EvaluationDataset — 샘플 모음. 카테고리별 5개씩 최소 30건 권장
  • Faithfulness() 등 메트릭 — 클래스 인스턴스로 전달. 0.1.x 소문자 import는 아직 동작하나 v1.0 제거 예고(경고 발생)
  • to_pandas() — 샘플별 점수 DataFrame. 점수 낮은 질문부터 원인 분석
PART 6 · RAGAS

RAGAS + Bedrock 연동

Bedrock의 Claude를 평가자로 — 외부 API 없이 AWS 환경에서 완결

핵심 포인트

ChatBedrockConverse
langchain-aws의 Bedrock 채팅 모델 — RAGAS 평가자로 사용
BedrockEmbeddings
Response Relevancy의 역질문 유사도 계산에 필요
llm= / embeddings=
LangChain 모델을 넘기면 RAGAS가 내부에서 자동 래핑
모델 분리
평가 모델은 생성 모델과 다르게 — 자기 평가 편향 방지

코드

python
from langchain_aws import ChatBedrockConverse, BedrockEmbeddings
from ragas import evaluate
from ragas.metrics import Faithfulness, ResponseRelevancy

# 평가자 LLM — Bedrock Claude를 채점자로 지정
evaluator_llm = ChatBedrockConverse(
    model_id="us.anthropic.claude-sonnet-4-6",
    region_name="us-east-1", temperature=0,
)
# 임베딩 — Response Relevancy 계산용 Titan 임베딩
evaluator_embeddings = BedrockEmbeddings(model_id="amazon.titan-embed-text-v2:0")

# evaluate에 전달 — LangChain 모델은 내부에서 자동 래핑
results = evaluate(dataset=dataset,
                   metrics=[Faithfulness(), ResponseRelevancy()],
                   llm=evaluator_llm, embeddings=evaluator_embeddings)
PART 6 · RAGAS

지표별 실행 코드

evaluate 한 벌은 그대로 — 축에 맞는 메트릭 인스턴스만 바꿔 끼운다

검색 축 — 정답 기반 3종
생성 축 — Faithfulness · Noise
전체 축 — Response Relevancy
takeaway

여섯 메트릭 전부 evaluate 한 벌에 인스턴스만 교체입니다 — 정답 없이 되는 Faithfulness · Response Relevancy로 시작해, 정답 확보 후 검색 축과 Noise Sensitivity로 확장합니다.

평가 없는 RAG는 추측 위에 서비스를 올리는 것입니다.

3축 메트릭으로 병목을 진단하고, LLM-as-Judge로 자동화하세요.