Ragas Ragas
stable · 中文译文
中文译文 · 原文:https://docs.ragas.io/en/stable/howtos/applications/add_to_ci/ · 许可证 Apache-2.0

用 Pytest 接入 CI 流水线

你可以把 Ragas 评测加入持续集成流水线,持续跟踪 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):
    """
    Check if computed score is within the range of value +/- max_range
    """
    assert value - plus_or_minus <= score <= value + plus_or_minus


def test_amnesty_e2e():
    # loading the V2 dataset
    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)

用 Pytest Markers 标记 Ragas E2E 测试

因为这些是耗时较长的端到端测试,你可以利用 Pytest Markers 给测试打上特殊标签。建议用特殊标签标记 Ragas 测试,这样就可以只在需要时运行它们。

要给 Pytest 添加新的 ragas_ci 标签,在 conftest.py 中加入以下内容

def pytest_configure(config):
    """
    configure pytest
    """
    # add `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):
    """
    Check if computed score is within the range of value +/- max_range
    """
    assert value - plus_or_minus <= score <= value + plus_or_minus


@pytest.mark.ragas_ci
def test_amnesty_e2e():
    # loading the V2 dataset
    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)