[RAG] 성능 측정 방식 테스트

RAG 성능 평가를 위한 프레임워크 Deepeval을 통해 검색과 생성 성능을 정밀 측정하고, 서비스 품질과 사용자 만족도를 향상시킬 수 있습니다.

개요

대규모 언어 모델(LLM)의 성능 테스트는 단순히 모델이 얼마나 ’똑똑한지’를 넘어, 우리가 LLM을 신뢰하고 효과적으로 활용하기 위한 필수적인 과정입니다. 또한 생성형 AI 애플리케이션의 지속적인 개선 여지를 만드는데 중요한 역할을 하고 있으므로 LLM 구현에 있어 반드시 진행되어야하는 단계입니다.

현재 문서에서는 RAG 성능 평가 기준과 Deepeval을 사용하여 어떻게 성능 평가를 하였는지 작성하였습니다.

Process

자료를 확인해봤을 때 일반적으로 측정되고 수집되어야 하는 자료들은 다음과 같습니다.

RAG 시스템에 대한 정보:

  1. RAG 시스템의 구체적인 작업은 무엇입니까? (예: 사실적 질문에 대한 답변, 제공된 문서를 기반으로 한 창의적인 텍스트 생성, 정보 요약 등)
  2. RAG 시스템은 어떤 종류의 문서 또는 지식 기반을 사용합니까? (예: 내부 회사 문서, 특정 분야의 과학 논문, 일반 웹 크롤링 등. 이 데이터의 크기와 형식은 어떻게 됩니까?)
  3. 검색 및 생성 구성 요소에 사용 중인 특정 모델은 무엇입니까? (알고 계시다면 알려주십시오. 이는 잠재적인 편향이나 한계를 이해하는 데 도움이 될 수 있습니다.)
  4. 성능에 대한 주요 목표는 무엇입니까? (예: 정확성이 가장 중요한가요, 아니면 속도가 중요한 요소인가요? 검색된 정보의 관련성이나 생성된 텍스트의 유창성에 대해 우려하고 계신가요? 비용 고려 사항이 있습니까?)
  5. 현재 알고 있거나 우려하고 있는 특정 과제나 한계가 있습니까? (예: 매우 긴 문서 처리, 상충되는 정보 처리, 환각 방지 등)

1. 검색(Retrieval) 성능 측정 항목:

2. 생성(Generation) 성능 측정 항목:

3. RAG 시스템 전체 성능 측정 항목:

4. RAG 특화 측정 항목:

측정 방법:

주의 사항:


Deepeval로 RAG 성능 평가하기

DeepEval에서 지원하는 기본적인 Retrieval 성능 평가 지표는 3가지입니다.

RAG 파이프라인의 검색기(retriever)를 측정하기 위해 ’판단자로서의 LLM(LLM-as-a-judge)’을 사용합니다. 또한 DeepEval의 문맥 정밀도 지표는 자체 설명적인 LLM 평가(self-explaining LLM-Eval) 방식으로, 측정된 점수에 대한 이유를 함께 출력합니다.

Code

DeepEval에서는 모델 호출을 위해 Langchain을 사용하고 있습니다.

따라서 langchain_aws 패키지를 통해 선언하였습니다.

from langchain_aws import ChatBedrockConverse

inferenceProfileArn = "us.anthropic.claude-sonnet-4-20250514-v1:0"

llm = ChatBedrockConverse(
    model=inferenceProfileArn,
    temperature=0,
    max_tokens=None,
    credentials_profile_name="smileshark",
    region_name="us-east-1"
)
from deepeval.models.base_model import DeepEvalBaseLLM

class AWSBedrock(DeepEvalBaseLLM):
    def __init__(
        self,
        model
    ):
        self.model = model

    def load_model(self):
        return self.model

    def generate(self, prompt: str) -> str:
        chat_model = self.load_model()
        return chat_model.invoke(prompt).content

    async def a_generate(self, prompt: str) -> str:
        chat_model = self.load_model()
        res = await chat_model.ainvoke(prompt)
        return res.content

    def get_model_name(self):
        return "Bedrock Claude Sonnet 4"

aws_bedrock = AWSBedrock(model=llm)
print(aws_bedrock.generate("Write me a joke"))

다음과 같이 RAG 평가에 필요한 지표들을 초기화합니다. 기본적으로 평가 방식에 따라 threshold를 조정하여 테스트합니다.

예를 들어 검색 신뢰성이 중요한 경우 ContextualRelevancyMetric 을 높게 설정하는 것이 더 신뢰성 있는 결과를 만들기에 적합하며

from deepeval import evaluate
from deepeval.test_case import LLMTestCase
from deepeval.metrics import (
    ContextualPrecisionMetric,
    ContextualRecallMetric,
    ContextualRelevancyMetric
)

contextual_precision = ContextualPrecisionMetric(
    threshold=0.7,
    model=aws_bedrock,
    include_reason=True
)
contextual_recall = ContextualRecallMetric(
    threshold=0.7,
    model=aws_bedrock,
    include_reason=True
)
contextual_relevancy = ContextualRelevancyMetric(
    threshold=0.7,
    model=aws_bedrock,
    include_reason=True
)