AI
LLM 평가 방법론 - DeepEval
2025. 12. 12. 17:05

LLM(Large Language Model) 기술이 발전하면서, 검색 증강 생성(Retrieval-Augmented Generation, RAG) 기반의 챗봇은 외부 지식 소스를 활용하여 답변의 정확성과 신뢰도를 높이는 강력한 방법으로 자리 잡았습니다. 하지만 RAG 시스템의 성능을 객관적으로 평가하고, 문제의 원인이 검색(Retrieval) 단계에 있는지 생성(Generation) 단계에 있는지 파악하여 개선하는 것은 어려운 과제입니다.

이때 DeepEval이 유용하게 활용될 수 있습니다. DeepEval은 LLM 애플리케이션, 특히 RAG 시스템의 성능을 체계적으로 평가하고 개선하기 위한 강력한 오픈소스 Python 프레임워크입니다. 이 글에서는 DeepEval이 무엇인지, 어떤 평가 지표를 제공하는지, 그리고 이 지표들을 활용하여 RAG 시스템의 각 컴포넌트(Retriever, Generator)를 어떻게 최적화할 수 있는지 알아보겠습니다.

1. DeepEval이란?

DeepEval은 LLM 기반 시스템의 평가를 자동화하고 표준화하기 위해 설계된 프레임워크입니다. 주요 특징은 다음과 같습니다.

  • 다양한 평가 지표 제공: RAG 시스템 평가에 필수적인 Faithfulness, Answer Relevance, Context Relevance 등 다양한 지표를 내장하고 있습니다.
  • LLM-as-Judge 활용: GPT-4와 같은 강력한 LLM을 평가자(Judge)로 활용하여 정성적인 평가를 자동화하고 점수화합니다.
  • 모듈성 및 확장성: 사용자가 커스텀 평가 지표를 쉽게 추가하고 통합할 수 있습니다.
  • 간편한 사용: 몇 줄의 코드로 복잡한 평가 파이프라인을 구성하고 실행할 수 있습니다.
  • 실험 관리 및 비교: 평가 결과를 저장하고, 다양한 버전의 RAG 시스템 성능을 비교 분석하기 용이합니다.

DeepEval을 사용하면 개발자는 RAG 시스템의 각 구성 요소(Retriever, Generator)가 얼마나 잘 작동하는지 정량적으로 파악하고, 데이터 기반의 개선 방향을 설정하는 데 도움을 받을 수 있습니다.

2. RAG 챗봇 기준 평가 지표

DeepEval은 RAG 챗봇 평가에 특화된 여러 지표를 제공하며, 이는 크게 Retriever 성능과 Generator 성능을 평가하는 지표로 나눌 수 있습니다.

Retriever 성능 평가 지표: (검색된 문맥의 품질 평가)

  1. Contextual Precision / Relevance (문맥 정확성/관련성): 검색된 Context(문맥) 노드들이 사용자의 질문(Query)과 얼마나 관련이 있는가? 관련 없는 정보가 검색 결과에 포함되지 않았는지 평가합니다. Retriever가 얼마나 정확하게 관련 문서를 찾는지를 측정합니다.
    • 측정 대상: 검색된 문맥 (Retrieval Context) vs. 사용자 질문 (Input)
  2. Contextual Recall (문맥 재현율): 검색된 Context가 답변 생성에 필요한 모든 관련 정보를 포함하고 있는가? Retriever가 질문에 답하기 위해 필요한 정보를 놓치지 않고 찾아냈는지 평가합니다. (Ground Truth Context 필요)
    • 측정 대상: 정답 생성에 필요한 문맥 (Ground Truth Context) vs. 검색된 문맥 (Retrieval Context)

Generator 성능 평가 지표: (생성된 답변의 품질 평가)

  1. Faithfulness (충실성): 생성된 답변이 제공된 Context(문맥)에 얼마나 충실한가? 즉, Context에 없는 내용을 지어내거나(환각, Hallucination) 왜곡하지 않았는지를 평가합니다. LLM이 주어진 정보를 얼마나 잘 활용하는지 측정합니다.
    • 측정 대상: 생성된 답변 (Actual Output) vs. 검색된 문맥 (Retrieval Context)
  2. Answer Relevance (답변 관련성): 생성된 답변이 사용자의 원래 질문(Query)과 얼마나 관련이 있는가? 질문의 의도를 파악하고 그에 맞는 답변을 생성했는지 평가합니다. 최종 답변의 품질을 사용자 관점에서 측정합니다.
    • 측정 대상: 생성된 답변 (Actual Output) vs. 사용자 질문 (Input)
  3. Bias (편향성): 생성된 답변이 성별, 인종, 종교 등 특정 그룹에 대한 편향된 시각을 드러내는지 평가합니다.
  4. Toxicity (유해성): 생성된 답변에 욕설, 비방, 혐오 발언 등 유해한 내용이 포함되어 있는지 평가합니다.

이 외에도 Hallucination (문맥과 무관한 환각), Summarization Quality 등 다양한 지표를 활용하여 RAG 시스템의 여러 측면을 평가할 수 있습니다.

3. 평가 지표 기반 RAG 성능 개선: Retriever와 Generator 최적화 (링크)

DeepEval의 평가 지표는 RAG 시스템의 성능을 단순히 측정하는 것을 넘어, 어떤 컴포넌트(Retriever 또는 Generator)에 문제가 있는지 정확히 진단하고 개선 방향을 설정하는 데 핵심적인 역할을 합니다. 개선 프로세스를 Retriever와 Generator 관점에서 나누어 살펴보겠습니다.

프로세스 개요:

  1. 평가 데이터셋 정의: 다양한 질문과 이상적인 답변, 관련 문맥 정보 준비.
  2. DeepEval 평가 실행: Retriever 및 Generator 관련 핵심 지표 동시 측정.
  3. 결과 분석 (컴포넌트별):
    • Retriever 성능 지표 분석 (Contextual Precision, Contextual Recall 등)
    • Generator 성능 지표 분석 (Faithfulness, Answer Relevance, Bias 등)
  4. 개선 작업 수행 (컴포넌트 타겟): 분석 결과에 따라 문제 컴포넌트 집중 개선.
  5. 재평가 및 반복: 개선 후 다시 평가하여 성능 향상 확인 및 목표 달성까지 반복.

상세 프로세스:

Step 1: 평가 데이터셋 정의 (Define Evaluation Dataset)

  • 실제 사용 환경을 반영하는 다양한 유형의 질문(Query) 목록을 준비합니다.
  • 각 질문에 대해 이상적인 답변(Expected Output)과 정답 생성에 필요한 핵심 문맥 정보(Ground Truth Context - 주로 Contextual Recall 측정에 사용)를 정의합니다.

Step 2: DeepEval 평가 실행 (Run Evaluation with DeepEval)

  • 준비된 데이터셋의 각 질문에 대해 RAG 시스템을 실행하여, 검색된 문맥(Retrieval Context)과 생성된 최종 답변(Actual Output)을 얻습니다.
  • DeepEval을 사용하여 아래와 같이 RetrieverGenerator 관련 핵심 지표들을 동시에 측정합니다.
    • Retriever 평가 지표:
      • Contextual Precision / Contextual Relevance: 검색된 문맥이 질문과 얼마나 관련 있는가?
      • Contextual Recall: 검색된 문맥이 답변 생성에 필요한 정보를 충분히 포함하는가?
    • Generator 평가 지표:
      • Faithfulness: 생성된 답변이 검색된 문맥에 얼마나 충실한가? (문맥 기반 환각 측정)
      • Answer Relevance: 생성된 답변이 원래 질문의 의도에 얼마나 부합하는가?
      • Bias, Toxicity: 생성된 답변의 편향성 및 유해성 정도.
      • (필요시 Coherence, Conciseness 등 추가 지표 활용)

Step 3: 결과 분석 및 병목 식별 (Analyze Results & Identify Bottlenecks)

측정된 지표 점수를 바탕으로 어떤 컴포넌트가 성능 저하의 원인인지 분석합니다.

  • 3.1 Retriever 성능 분석:
    • 낮은 Contextual Precision: 관련 없는 정보가 너무 많이 검색되고 있음을 의미합니다. 이는 Generator에게 혼란을 주어 답변 품질 저하로 이어질 수 있습니다.
    • 낮은 Contextual Recall: 답변 생성에 필요한 중요한 정보가 누락되고 있음을 의미합니다. 이 경우 Generator는 주어진 정보만으로는 완전한 답변을 생성하기 어렵습니다.
  • 3.2 Generator 성능 분석:
    • 낮은 Faithfulness: Generator가 제공된 문맥(Retrieval Context)에 없는 내용을 지어내거나(Hallucination) 사실을 왜곡하고 있음을 시사합니다. 검색된 문맥 자체는 좋았더라도 문제가 발생할 수 있습니다.
    • 낮은 Answer Relevance: 생성된 답변이 사용자의 질문 의도에서 벗어났음을 의미합니다. 이는 ①Retriever가 관련 없는 문맥을 전달했거나(낮은 Contextual Precision 동반), ②Generator가 문맥을 잘못 해석했거나 질문 의도를 제대로 파악하지 못했기 때문일 수 있습니다. Faithfulness 점수와 함께 분석해야 원인 파악이 용이합니다.
    • 높은 Bias / Toxicity 점수: 생성된 답변 내용에 윤리적 문제가 있음을 나타냅니다.

Step 4: 컴포넌트별 개선 작업 수행 (Perform Component-Specific Improvements)

분석 결과를 바탕으로 문제가 식별된 컴포넌트를 타겟하여 개선 작업을 수행합니다.

  • 4.1 Retriever 개선 (Contextual Precision/Recall 저하 시):
    • 임베딩 모델 변경/튜닝: 질문과 문맥 간의 의미론적 유사성을 더 잘 포착하는 모델 사용.
    • 청킹(Chunking) 전략 수정: 문서를 나누는 방식(크기, 중첩 등)을 변경하여 정보의 손실이나 분절을 최소화.
    • 검색 알고리즘 변경/튜닝: BM25, Vector Search, Hybrid Search 등 다양한 알고리즘 테스트 및 파라미터 조정.
    • 메타데이터 필터링/부스팅: 검색 범위를 좁히거나 특정 문서의 중요도를 높임.
    • Reranker 도입: 초기 검색 결과(Candidates)를 받아 관련성 높은 순서로 재정렬하는 모델 추가.
  • 4.2 Generator 개선 (Faithfulness/Answer Relevance/Bias/Toxicity 등 문제 시):
    • LLM 모델 변경/튜닝: 더 성능이 좋거나 특정 작업(예: 요약, 지시 따르기)에 강한 모델로 교체 또는 파인튜닝.
    • 프롬프트 엔지니어링:
      • Faithfulness 향상: LLM에게 "제공된 문맥만을 기반으로 답변하라", "모르는 내용은 모른다고 답하라" 등 명확한 지시 추가.
      • Answer Relevance 향상: 질문의 핵심 의도를 파악하고 그에 집중하여 답변하도록 유도.
      • Bias/Toxicity 완화: 안전하고 편향되지 않은 답변을 생성하도록 가이드라인 제시 (Safety Prompting).
    • 후처리(Post-processing): 생성된 답변에서 유해하거나 편향된 내용을 필터링하는 로직 추가.
    • Context 활용 방식 조정: LLM에게 전달하는 Context의 양이나 형식을 조절.

Step 5: 재평가 및 반복 (Re-evaluate and Iterate)

  • 개선 작업(Step 4)을 수행한 후, 동일한 평가 데이터셋(Step 1)과 지표(Step 2)를 사용하여 RAG 시스템을 다시 평가합니다.
  • 지표 점수가 개선되었는지, 특히 목표했던 컴포넌트의 성능 지표가 향상되었는지 확인합니다.
  • Retriever와 Generator 관련 지표 모두 목표 수준에 도달할 때까지 분석(Step 3) -> 개선(Step 4) -> 재평가(Step 2) 과정을 반복합니다.

4. Python 예시 코드 및 예상 출력 결과

다음은 DeepEval을 사용하여 FaithfulnessAnswer Relevance를 평가하는 간단한 예시입니다.

# deepeval 설치 (필요시)
# pip install deepeval

import os
from deepeval import evaluate
from deepeval.metrics import FaithfulnessMetric, AnswerRelevanceMetric, ContextualPrecisionMetric
from deepeval.test_case import LLMTestCase

# DeepEval 사용을 위한 API 키 설정 (환경 변수 사용 권장)
# 예: OpenAI GPT-4를 평가자로 사용하는 경우
# os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"
# 또는 DeepEval 로그인 후 생성되는 API 키 사용 가능
# os.environ["CONFIDENT_AI_API_KEY"] = "YOUR_DEEPEVAL_API_KEY"

# 평가할 RAG 시스템의 결과 예시
query = "아인슈타인의 상대성 이론은 무엇인가요?"
retrieval_context = [
    "상대성 이론은 알베르트 아인슈타인이 제안한 시간과 공간에 대한 이론입니다.",
    "특수 상대성 이론은 등속 운동을 하는 관찰자에게 물리 법칙이 동일하게 적용된다는 원리입니다.",
    "일반 상대성 이론은 중력이 시공간의 곡률에 의해 발생한다는 이론입니다.",
    "양자역학은 미시 세계의 현상을 설명하는 물리학 이론입니다." # 관련성 낮은 문맥 예시
]
actual_output = "아인슈타인의 상대성 이론은 시간, 공간, 중력에 대한 그의 이론으로, 특수 상대성 이론과 일반 상대성 이론으로 나뉩니다. 특수 상대성 이론은 물리 법칙의 동일성을, 일반 상대성 이론은 중력과 시공간 곡률의 관계를 설명합니다."
expected_output = "상대성 이론은 아인슈타인이 제안한 시간과 공간에 대한 이론으로, 특수 상대성 이론과 일반 상대성 이론이 있습니다. 특수 상대성 이론은 등속 운동에서의 물리 법칙 동일성을, 일반 상대성 이론은 중력을 시공간의 곡률로 설명합니다." # AnswerRelevance, Contextual Recall 등에 사용

# 평가 지표 정의
# threshold: 이 점수 미만이면 실패로 간주 (0.0 ~ 1.0)
# model: 평가에 사용할 LLM 모델 지정 (기본값은 gpt-4-turbo)
# include_reason: 평가 점수에 대한 이유를 제공할지 여부
faithfulness_metric = FaithfulnessMetric(threshold=0.7, model="gpt-4", include_reason=True)
answer_relevance_metric = AnswerRelevanceMetric(threshold=0.7, model="gpt-4", include_reason=True)
contextual_precision_metric = ContextualPrecisionMetric(threshold=0.7, model="gpt-4", include_reason=True)

# 평가 케이스 생성
test_case = LLMTestCase(
    input=query,
    actual_output=actual_output,
    expected_output=expected_output, # 일부 지표는 expected_output 필요
    retrieval_context=retrieval_context,
    context=retrieval_context # 일부 레거시 지표는 'context' 인자 사용
)

# 평가 실행
# evaluate 함수는 여러 테스트 케이스와 여러 메트릭을 리스트로 받아 한 번에 평가 가능
results = evaluate([test_case], [faithfulness_metric, answer_relevance_metric, contextual_precision_metric])

# 결과 출력 (간략화)
print("--- Evaluation Results ---")
# 실제 결과는 리스트 안에 각 테스트 케이스 결과가 있고, 그 안에 metrics 리스트가 포함됨
# 여기서는 첫 번째 테스트 케이스의 결과만 예시로 출력
test_result = results[0]
for metric_result in test_result.metrics:
    print(f"Metric: {metric_result.__class__.__name__}") # 메트릭 클래스 이름 출력
    print(f"Score: {metric_result.score}")
    print(f"Threshold: {metric_result.threshold}")
    print(f"Reason: {metric_result.reason}")
    print(f"Success: {metric_result.success}")
    print("-" * 20)

 

예상 출력 결과:

--- Evaluation Results ---
Metric: FaithfulnessMetric
Score: 0.95
Threshold: 0.7
Reason: The actual output accurately reflects the information presented in the relevant parts of the retrieval context (special and general relativity) without incorporating extraneous details like quantum mechanics or making unsubstantiated claims.
Success: True
--------------------
Metric: AnswerRelevanceMetric
Score: 0.92
Threshold: 0.7
Reason: The answer directly addresses the user's query about Einstein's theory of relativity. It provides a concise and relevant summary covering the main aspects mentioned (time, space, gravity) and correctly identifies the two main components.
Success: True
--------------------
Metric: ContextualPrecisionMetric
Score: 0.75
Threshold: 0.7
Reason: The retrieved context predominantly contains relevant information about relativity theory (nodes 1, 2, 3). However, it also includes a node about quantum mechanics (node 4) which is irrelevant to the specific query about relativity, slightly lowering the precision score.
Success: True
--------------------

 

참고: 실제 점수와 이유는 평가 시점의 LLM(평가자) 상태와 설정에 따라 약간씩 달라질 수 있습니다. 예시에서는 관련성 낮은 문맥("양자역학")을 포함시켜 ContextualPrecisionMetric 점수가 약간 낮게 나올 수 있음을 보여줍니다.

'AI' 카테고리의 다른 글

차량 색상 분류를 위한 AI 모델 비교  (0) 2025.12.18
차량 모델 분류를 위한 AI 모델 비교  (0) 2025.12.17
LLM 평가 방법론 - BERTScore  (0) 2025.12.11
LLM 평가 방법론 - ROUGE  (0) 2025.12.10
LLM 평가 방법론 - GPTScore  (0) 2025.12.10