[RAG] 성능 측정 방식 테스트
RAG 성능 평가를 위한 프레임워크 Deepeval을 통해 검색과 생성 성능을 정밀 측정하고, 서비스 품질과 사용자 만족도를 향상시킬 수 있습니다.
개요
대규모 언어 모델(LLM)의 성능 테스트는 단순히 모델이 얼마나 '똑똑한지'를 넘어, 우리가 LLM을 신뢰하고 효과적으로 활용하기 위한 필수적인 과정입니다. 또한 생성형 AI 애플리케이션의 지속적인 개선 여지를 만드는데 중요한 역할을 하고 있으므로 LLM 구현에 있어 반드시 진행되어야하는 단계입니다.
현재 문서에서는 RAG 성능 평가 기준과 Deepeval을 사용하여 어떻게 성능 평가를 하였는지 작성하였습니다.
Process
자료를 확인해봤을 때 일반적으로 측정되고 수집되어야 하는 자료들은 다음과 같습니다.
RAG 시스템에 대한 정보:
- RAG 시스템의 구체적인 작업은 무엇입니까? (예: 사실적 질문에 대한 답변, 제공된 문서를 기반으로 한 창의적인 텍스트 생성, 정보 요약 등)
- RAG 시스템은 어떤 종류의 문서 또는 지식 기반을 사용합니까? (예: 내부 회사 문서, 특정 분야의 과학 논문, 일반 웹 크롤링 등. 이 데이터의 크기와 형식은 어떻게 됩니까?)
- 검색 및 생성 구성 요소에 사용 중인 특정 모델은 무엇입니까? (알고 계시다면 알려주십시오. 이는 잠재적인 편향이나 한계를 이해하는 데 도움이 될 수 있습니다.)
- 성능에 대한 주요 목표는 무엇입니까? (예: 정확성이 가장 중요한가요, 아니면 속도가 중요한 요소인가요? 검색된 정보의 관련성이나 생성된 텍스트의 유창성에 대해 우려하고 계신가요? 비용 고려 사항이 있습니까?)
- 현재 알고 있거나 우려하고 있는 특정 과제나 한계가 있습니까? (예: 매우 긴 문서 처리, 상충되는 정보 처리, 환각 방지 등)
1. 검색(Retrieval) 성능 측정 항목:
- 정확도 (Precision): 검색된 문서 중 관련성 있는 문서의 비율입니다. 상위 K개의 결과에 대한 정확도 (Precision@K)를 측정하는 것이 일반적입니다.
- 재현율 (Recall): 전체 관련 문서 중 검색된 문서의 비율입니다. 상위 K개의 결과에 대한 재현율 (Recall@K)을 측정할 수 있습니다.
- F1 점수 (F1 Score): 정확도와 재현율의 조화 평균으로, 두 지표의 균형을 나타냅니다.
- 평균 상호 순위 (Mean Reciprocal Rank, MRR): 첫 번째 관련 문서의 순위의 역수의 평균입니다. 검색 결과의 순위 품질을 평가하는 데 유용합니다.
- 정규화된 할인 누적 이득 (Normalized Discounted Cumulative Gain, NDCG): 검색 결과의 순위와 관련성을 모두 고려한 지표로, 상위 결과에 가중치를 부여합니다.
2. 생성(Generation) 성능 측정 항목:
- 정확성 (Accuracy) / 사실성 (Factuality): 생성된 텍스트가 검색된 정보 및 실제 사실과 일치하는 정도입니다. 환각(Hallucination)의 발생 빈도를 측정하는 것이 중요합니다.
- 관련성 (Relevance): 생성된 텍스트가 사용자의 질문이나 입력과 관련이 있는 정도입니다.
- 유창성 (Fluency): 생성된 텍스트가 문법적으로 정확하고 자연스럽게 읽히는 정도입니다.
- 일관성 (Coherence): 생성된 텍스트의 내용이 논리적으로 일관성이 있는지 여부입니다.
- 다양성 (Diversity): 생성된 텍스트가 다양한 표현과 어휘를 사용하는지 여부입니다.
- 독성 및 편향 (Toxicity and Bias): 생성된 텍스트에 유해하거나 편향된 내용이 포함되어 있는지 여부입니다.
3. RAG 시스템 전체 성능 측정 항목:
- 응답 시간 (Response Time): 사용자가 질문을 입력한 후 답변을 받기까지 걸리는 시간입니다.
- 처리량 (Throughput): 단위 시간당 처리할 수 있는 요청의 수입니다.
- 비용 (Cost): RAG 시스템을 운영하는 데 드는 비용입니다. (예: API 호출 비용, 인프라 비용 등)
- 사용자 만족도 (User Satisfaction): 사용자가 RAG 시스템의 답변에 얼마나 만족하는지를 설문 조사 등을 통해 측정합니다.
4. RAG 특화 측정 항목:
- 충실도 (Faithfulness): 생성된 텍스트가 검색된 컨텍스트에 얼마나 충실한지를 측정합니다. 이는 환각을 평가하는 데 중요한 지표입니다.
- 컨텍스트 관련성 (Context Relevance): 검색된 컨텍스트가 사용자의 질문과 얼마나 관련이 있는지를 측정합니다.
측정 방법:
- 자동 평가 (Automatic Evaluation): BLEU, ROUGE, METEOR와 같은 지표를 사용하여 생성된 텍스트를 참조 텍스트와 비교합니다.
- 수동 평가 (Human Evaluation): 사람이 직접 생성된 텍스트의 품질을 평가합니다. 이는 정확성, 유창성, 관련성 등과 같은 주관적인 측면을 평가하는 데 필수적입니다.
- 벤치마크 데이터셋 활용: QASPER, Natural Questions 등과 같은 표준 벤치마크 데이터셋을 사용하여 RAG 시스템의 성능을 평가하고 다른 시스템과 비교할 수 있습니다.
주의 사항:
- 다양한 지표 활용: 단일 지표만으로는 RAG 시스템의 성능을 완전히 평가하기 어렵습니다. 여러 지표를 종합적으로 고려해야 합니다.
- 목표에 맞는 지표 선택: RAG 시스템의 구체적인 목표와 작업에 따라 중요한 지표가 달라질 수 있습니다.
- 지속적인 모니터링: RAG 시스템의 성능은 시간이 지남에 따라 변할 수 있으므로 지속적인 모니터링과 평가가 필요합니다.
Deepeval로 RAG 성능 평가하기
DeepEval에서 지원하는 기본적인 Retrieval 성능 평가 지표는 3가지입니다.
- ContextualPrecisionMetric (문맥 정밀도 지표)
- 문맥 정밀도 지표는 검색 컨텍스트(retrieval_context) 내에서 주어진 입력(input)과 관련된 노드들이 관련 없는 노드들보다 더 높은 순위로 매겨졌는지를 평가합니다.
- ContextualRecallMetric (문맥 재현율 지표)
- 검색 컨텍스트(retrievalcontext)가 기대 출력(expectedoutput)과 얼마나 일치하는지를 평가합니다.
- ContextualRelevancyMetric (문맥 관련성 지표)
- 문맥 관련성 지표는 주어진 입력(input)에 대해 검색 컨텍스트(retrieval_context)에 제시된 정보의 전반적인 관련성을 평가합니다.
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
)