用 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)