Pytest로 CI 파이프라인에 추가하기

Pytest로 CI 파이프라인에 추가하기 (Adding to your CI pipeline with Pytest)

Ragas 평가를 CI(Continuous Integration) 파이프라인의 일부로 추가해서 RAG 파이프라인의 정성적 성능을 추적할 수 있어요. 이를 주요 변경과 릴리스 전에 실행하는 엔드투엔드 테스트 스위트의 일부로 생각하면 돼요.

출처: 문서

본문

Ragas 평가를 CI(Continuous Integration) 파이프라인의 일부로 추가해서 RAG 파이프라인의 정성적 성능을 추적할 수 있어요. 이를 주요 변경과 릴리스 전에 실행하는 엔드투엔드 테스트 스위트의 일부로 생각해요.

사용법은 간단하지만 핵심은 evaluate() 함수의 in_ci 인자를 True로 설정하는 것이에요. 이렇게 하면 Ragas 메트릭이 특수 모드로 실행되어 더 재현 가능한 메트릭을 생성하지만 더 많은 비용이 들어요.

Pytest 테스트를 다음과 같이 쉽게 작성할 수 있어요.

참고: 이 데이터셋은 이미 레퍼런스 RAG의 출력으로 채워져 있어요. 자신의 시스템을 테스트할 때는 테스트하려는 RAG 파이프라인의 출력을 사용해야 해요. 데이터셋을 구축하는 방법에 대한 자세한 내용은 HF Dataset를 자신의 데이터로 구축하기 문서를 참고해요.

import pytest
from datasets import load_dataset

from ragas import evaluate
from ragas.metrics import (
    answer_relevancy,
    faithfulness,
    context_recall,
    context_precision,
)

def assert_in_range(score: float, value: float, plus_or_minus: float):
    """
    계산된 점수가 value +/- max_range 범위 내에 있는지 확인
    """
    assert value - plus_or_minus <= score <= value + plus_or_minus

def test_amnesty_e2e():
    # V2 데이터셋 로드
    amnesty_qa = load_dataset("vibrantlabsai/amnesty_qa", "english_v2")["eval"]

    result = evaluate(
        amnesty_qa,
        metrics=[answer_relevancy, faithfulness, context_recall, context_precision],
        in_ci=True,
    )
    assert result["answer_relevancy"] >= 0.9
    assert result["context_recall"] >= 0.95
    assert result["context_precision"] >= 0.95
    assert_in_range(result["faithfulness"], value=0.4, plus_or_minus=0.1)

Ragas E2E 테스트에 Pytest 마커 사용하기

이들은 긴 엔드투엔드 테스트이기 때문에 Pytest Markers를 활용할 수 있어요. 이는 테스트에 특수 태그를 표시하는 데 도움을 줘요. Ragas 테스트에 특수 태그를 표시해서 필요할 때만 실행하는 것을 권장해요.

ragas_ci 태그를 Pytest에 추가하려면 conftest.py에 다음을 추가해요.

def pytest_configure(config):
    """
    pytest 구성
    """
    # `ragas_ci` 추가
    config.addinivalue_line(
        "markers", "ragas_ci: Set of tests that will be run as part of Ragas CI"
    )

이제 ragas_ci를 사용해서 Ragas CI의 일부인 모든 테스트를 표시할 수 있어요.

import pytest
from datasets import load_dataset

from ragas import evaluate
from ragas.metrics import (
    answer_relevancy,
    faithfulness,
    context_recall,
    context_precision,
)

def assert_in_range(score: float, value: float, plus_or_minus: float):
    """
    계산된 점수가 value +/- max_range 범위 내에 있는지 확인
    """
    assert value - plus_or_minus <= score <= value + plus_or_minus

@pytest.mark.ragas_ci
def test_amnesty_e2e():
    # V2 데이터셋 로드
    amnesty_qa = load_dataset("vibrantlabsai/amnesty_qa", "english_v2")["eval"]

    result = evaluate(
        amnesty_qa,
        metrics=[answer_relevancy, faithfulness, context_recall, context_precision],
        in_ci=True,
    )
    assert result["answer_relevancy"] >= 0.9
    assert result["context_recall"] >= 0.95
    assert result["context_precision"] >= 0.95
    assert_in_range(result["faithfulness"], value=0.4, plus_or_minus=0.1)

더 알아보기 (Learn more)