타사 통합

타사 통합 (Third-Party Integrations)

Pydantic Evals는 특정 메트릭 프레임워크에 강한 의존성을 가지지 않아요. 팀이 이미 Ragas, DeepEval, 또는 다른 채점 라이브러리를 사용 중이라면, Evaluator 기본 클래스를 통해 그 상위 메트릭을 감싸서 어떤 Pydantic Evals 데이터셋에서든 실행하기 쉬워요. 이 페이지는 흔한 것들에 대한 실제 예시를 보여줘요.

출처: 문서

본문

가능하면 내장 평가자를 쓰는 게 좋아요

루브릭 기반 LLMJudge(바로 쓸 수 있는 루브릭은 표준 품질 메트릭 페이지 참고)나 커스텀 평가자가 여러분의 사용 사례를 커버한다면, 보통 그게 더 단순해요 -- 추가 의존성이 전혀 없고 점수가 보고서에 깔끔하게 들어가니까요. 아래 통합들은 게시된 벤치마크와의 재현성, 기존 평가 스위트와의 동등성, 또는 네이티브로 노출하지 않는 기능 등 정확한 상위 구현이 특별히 필요할 때 사용해요. 외부 평가자와 내장 평가자를 한 데이터셋에서 섞어 쓸 수 있어요.

패턴

각 프레임워크 통합은 같은 패턴을 따라요:

  1. Evaluator를 서브클래싱해요.
  2. ctx.inputs, ctx.output, ctx.expected_output와 메타데이터를 상위 메트릭이 기대하는 형태로 변환해요.
  3. float 점수, bool 판정, EvaluationReason, 또는 이들의 dict를 반환해요.

이 페이지의 나머지는 구체적인 어댑터를 보여줘요. 의도적으로 간결하게 만들었으니, 팀이 필요로 하는 설정(모델 선택, 임계값, 케이스별 토글)을 추가해 확장해요.

Ragas

pip install ragas로 설치해요 (pydantic-evals에 포함되지 않아요).

이 어댑터는 단일 턴 샘플을 위해 ragas.metrics.Faithfulness를 감싸요. 각 케이스는 입력이나 메타데이터의 일부로 검색된 컨텍스트를 제공할 것으로 기대돼요.

from dataclasses import dataclass

from ragas.dataset_schema import SingleTurnSample
from ragas.metrics import Faithfulness

from pydantic_evals.evaluators import EvaluationReason, Evaluator, EvaluatorContext


@dataclass
class RagasFaithfulness(Evaluator):
    """Wrap `ragas.metrics.Faithfulness` as a Pydantic Evals evaluator."""

    context_field: str = 'context'

    async def evaluate(self, ctx: EvaluatorContext) -> EvaluationReason:
        metadata = ctx.metadata or {}
        retrieved_contexts = metadata.get(self.context_field, [])
        if isinstance(retrieved_contexts, str):
            retrieved_contexts = [retrieved_contexts]

        sample = SingleTurnSample(
            user_input=str(ctx.inputs),
            response=str(ctx.output),
            retrieved_contexts=retrieved_contexts,
        )
        metric = Faithfulness()
        score = await metric.single_turn_ascore(sample)
        return EvaluationReason(value=float(score), reason=f'ragas.Faithfulness = {score:.3f}')

사용법은 내장 평가자와 똑같아요:

from pydantic_evals import Case, Dataset

dataset = Dataset(
    name='rag_eval',
    cases=[
        Case(
            inputs='What is the capital of France?',
            metadata={'context': ['Paris is the capital of France.']},
        ),
    ],
    evaluators=[RagasFaithfulness()],
)

같은 패턴이 ragas.metrics.answer_relevancy, context_precision 및 다른 채점 메트릭에도 동작해요. 메트릭 클래스와 (필요하다면) 샘플 필드를 바꾸기만 하면 돼요.

DeepEval

pip install deepeval로 설치해요 (pydantic-evals에 포함되지 않아요).

이 어댑터는 DeepEval의 GEval 메트릭을 감싸서 LLMTestCase에 대해 기준(criterion)을 채점해요. DeepEval의 measure는 동기식이라 평가자도 동기식이에요.

from dataclasses import dataclass

from deepeval.metrics import GEval
from deepeval.test_case import LLMTestCase, LLMTestCaseParams

from pydantic_evals.evaluators import EvaluationReason, Evaluator, EvaluatorContext


@dataclass
class DeepEvalGEval(Evaluator):
    """Wrap `deepeval.metrics.GEval` as a Pydantic Evals evaluator."""

    metric_name: str
    criteria: str
    threshold: float = 0.5

    def evaluate(self, ctx: EvaluatorContext) -> dict[str, float | bool | EvaluationReason]:
        test_case = LLMTestCase(
            input=str(ctx.inputs),
            actual_output=str(ctx.output),
            expected_output=None if ctx.expected_output is None else str(ctx.expected_output),
        )
        metric = GEval(
            name=self.metric_name,
            criteria=self.criteria,
            evaluation_params=[LLMTestCaseParams.INPUT, LLMTestCaseParams.ACTUAL_OUTPUT],
            threshold=self.threshold,
        )
        metric.measure(test_case)
        return {
            f'{self.metric_name}_score': EvaluationReason(value=float(metric.score), reason=metric.reason or ''),
            f'{self.metric_name}_pass': bool(metric.success),
        }

같은 래퍼가 DeepEval의 FaithfulnessMetric, AnswerRelevancyMetric, HallucinationMetric 등에서도 동작해요. 메트릭 클래스를 바꾸고 관련 LLMTestCase 필드(예: faithfulness의 retrieval_context)를 채우면 돼요.

의존성에 대한 참고

  • ragasdeepeval은 선택적 의존성이에요 -- pydantic-evals와 함께 설치되지 않고 어떤 의존성 그룹에도 속하지 않아요. 이 통합들을 사용하는 프로젝트에서만 설치해요.
  • 두 라이브러리 모두 자체 LLM 호출을 하므로, 이 평가자들이 포함된 데이터셋을 실행할 때는 추가 API 사용량이 있을 수 있다는 점에 대비해요.

더 알아보기 (Learn more)