커스텀 메트릭 직접 만들기

커스텀 메트릭 직접 만들기

기본 메트릭으로 충분할 때도 있지만, 제품만의 평가 기준이 필요한 순간이 꼭 오게 돼요. DeepEval에서는 BaseMetric을 상속해 나만의 커스텀 메트릭을 만들 수 있어요. 한번 만들어 두면 deepeval의 생태계 안에서 자동으로 통합돼요.

출처: 'Do it yourself' Metrics

커스텀 메트릭이 필요한 때

커스텀 메트릭을 고민하는 상황은 크게 두 가지예요.

  • 평가 기준을 더 세밀하게 제어하고 싶을 때 — GEval이나 DAG만으로는 부족하다고 느낄 때.
  • 평가에 LLM을 쓰고 싶지 않을 때deepeval의 모든 메트릭은 LLM으로 동작하지만, 고전적인 규칙 기반 점수를 쓰고 싶다면 직접 만들면 돼요.

커스텀 메트릭도 deepeval의 평가 흐름에 자연스럽게 통합되기 때문에, 테스트 러너·임베딩·Confident AI 연동까지 그대로 따라와요.

커스텀 메트릭을 만들 때 지켜야 할 규칙

1. BaseMetric 클래스 상속

단일 턴 커스텀 메트릭은 BaseMetric을 상속해야 해요.

class CustomMetric(BaseMetric):
    ...

이게 중요한 이유는, BaseMetric 클래스 덕분에 deepeval이 평가 중에 커스텀 메트릭을 단일 턴 메트릭으로 인식하기 때문이에요.

다중 턴(대화형)으로 만들고 싶다면 대신 BaseConversationalMetric을 상속해요.

class CustomConversationalMetric(BaseConversationalMetric):
    ...

BaseConversationalMetric은 커스텀 메트릭을 다중 턴 메트릭으로 인식시켜 줘요. 즉, 어떤 베이스 클래스를 쓰느냐가 deepeval이 테스트 케이스를 어디로 라우팅할지를 결정해요.

2. __init__() 메서드 구현

BaseMetric / BaseConversationalMetric 클래스는 평가 후(로컬 또는 Confident AI에서) 표시할 수 있는 몇 가지 프로퍼티를 제공해요. 대표적인 예가 threshold인데, 이 값이 평가 중인 LLMTestCase가 통과했는지 실패했는지를 판정해요.

유용한 프로퍼티를 몇 가지 보면:

  • evaluation_model: 사용하는 평가 모델의 이름을 지정하는 str.
  • include_reason: 점수와 함께 이유(reason)를 포함할지 여부를 정하는 bool. LLM으로 평가하지 않을 계획이라면 필요 없어요.

3. measure()a_measure() 메서드 구현

measure()a_measure()가 실제 평가가 일어나는 곳이에요. deepeval에서 평가란, 점수 계산 알고리즘에 따라 메트릭을 LLMTestCase에 적용해 점수와 (LLM을 쓴다면) 선택적으로 이유를 생성하는 과정이에요.

더 많은 예시

비-LLM 평가(Non-LLM Evals)

LLM-Eval은 LLM으로 점수를 매기는 평가 메트릭이에요. 반대로 non-LLM eval은 LLM으로 점수를 매기지 않는 메트릭이죠. 예를 들어 전통적인 rouge score를 사용하는 경우가 그렇죠.

직접 rouge 스코러를 구현해도 되지만, 문서화되진 않았어도 deepeval이 더 전통적인 NLP 점수 계산을 위한 scorer 모듈을 제공한답니다. deepeval/scorer/scorer.py에서 찾을 수 있어요.

핵심 정리

커스텀 메트릭의 시작점을 다시 정리하면, 단일 턴이면 BaseMetric(LLMTestCase를 받음), 다중 턴이면 BaseConversationalMetric(ConversationalTestCase를 받음)을 상속하면 돼요. 베이스 클래스가 deepeval에 어떤 테스트 케이스로 라우팅할지 알려 주니까, 이것만 지켜도 커스텀 메트릭이 정상적으로 동작해요.

더 알아보기