LLM 평가 소개

LLM 평가 소개

LLM 애플리케이션을 만들고 나면 "내 출력이 정말 괜찮은 걸까?"라는 질문이 꼭 남아요. DeepEval은 이런 질문에 답하기 위해, LLM 출력을 마치 소프트웨어 단위 테스트처럼 검증할 수 있게 도와주는 오픈소스 평가 프레임워크예요. 평가를 실행하면 그 시점의 애플리케이션 성능을 벤치마킹하는 test run이 생기고, 시간이 지나면서 회귀(regression)도 잡아낼 수 있어요.

출처: Introduction to LLM Evals

테스트 실행(run)이란

평가를 돌리면 하나의 **테스트 실행(test run)**이 만들어져요. 이건 특정 시점에 LLM 애플리케이션을 벤치마킹하는 테스트 케이스들의 묶음이에요. 같은 애플리케이션을 나중에 다시 평가하면 결과를 나란히 비교해 회귀를 발견할 수 있죠.

메트릭(Metrics)

deepeval은 30개 이상의 평가 메트릭을 제공하고, 대부분은 LLM을 이용해 점수를 매겨요. 각 메트릭은 LLM 출력을 특정 기준으로 측정하는 "자" 역할을 해요.

from deepeval.metrics import AnswerRelevancyMetric

answer_relevancy_metric = AnswerRelevancyMetric()

테스트 케이스(Test Cases)

deepeval에서 테스트 케이스는 한 번의 LLM 상호작용을 나타내요. 정의해 둔 평가 메트릭으로 LLM 애플리케이션을 단위 테스트할 수 있게 만드는 단위죠.

from deepeval.test_case import LLMTestCase

예를 들어 input은 RAG 기반 LLM 애플리케이션과의 사용자 상호작용을 흉내 내고, actual_output은 애플리케이션이 낸 실제 출력, retrieval_context는 RAG 파이프라인에서 검색된 노드들을 담아요. 이렇게 테스트 케이스를 만들면 deepeval의 기본 메트릭으로 평가할 수 있어요.

메트릭에는 몇 가지 성질이 있어요.

  • threshold=None 메트릭: 점수와 이유는 계산하지만 통과/실패 판정은 하지 않아요. 때문에 테스트 케이스의 상태를 결정하지 못하죠. 모든 테스트 케이스는 결국 통과하거나 실패해야 하므로, 평가마다 threshold를 가진 비플래키(non-flaky) 메트릭이 적어도 하나는 필요해요.
  • 플래키(flaky) 테스트 케이스·메트릭 (flaky=True): 결과는 기록·보고되지만, 실패해도 아무것도 막지 못해요. 플래키 메트릭의 실패는 테스트 케이스를 실패시키지 않고, 실패한 플래키 테스트 케이스는 assert_test()이 경고를 출력하는 대신 예외를 던지지 않죠.

데이터셋(Datasets)

deepeval의 데이터셋은 golden들의 모음이에요. 하나 또는 여러 메트릭으로 테스트 케이스 묶음을 평가하기 위한 중앙 인터페이스를 제공해요. 평가 결과를 어느 한 건이 아니라 전체 분포로 보고 싶을 때 유용하죠.

CI/CD에서의 단위 테스트

테스트 케이스는 expect()로 넘겨지고, toPass()는 인자를 하나 받아요.

  • metrics: BaseMetric 타입의 메트릭 배열. 테스트 케이스에 대해 동시에 실행돼요.

이렇게 하면 CI/CD 파이프라인에 pytest 기반 평가를 자연스럽게 녹일 수 있어요.

스크립트에서 평가하기(Evaluating In Scripts)

evaluate()를 쓰면 스크립트에서도 평가를 실행할 수 있어요.

  • test_cases: LLMTestCase 또는 ConversationalTestCase의 리스트, 혹은 EvaluationDataset. 같은 테스트 실행에서 LLMTestCaseConversationalTestCase를 섞어 평가할 수는 없어요.
  • metrics: BaseMetric 타입의 메트릭 리스트.

evaluate()의 전체 문서는 end-to-end 평가와 component-level 평가 페이지에서 각각 확인할 수 있어요.

프레임워크 통합(Framework Integrations)

프레임워크 통합은 애플리케이션의 trace와 span을 캡처해요. 그래서 에이전트의 전체 실행 경로(trajectory)나 개별 컴포넌트를, 실행 구조를 손으로 재현하지 않아도 deepeval 메트릭으로 평가할 수 있게 해줘요.

알아두면 좋은 점

평가에 필요한 세 가지 구성 요소를 꼽자면, 테스트 케이스(점수를 매길 inputactual_output), 하나 이상의 메트릭, 그리고 선택적으로 여러 테스트 케이스를 한 번에 평가하기 위한 평가 데이터셋이에요. end-to-end 평가가 적합할 때와 component-level 평가가 적합할 때는 각각의 문서에서 더 자세히 다뤄요.

더 알아보기