Оценка качества RAG-системы (RAGAS, precision, recall, faithfulness)
Без систематической оценки качества RAG-система — «чёрный ящик». RAGAS (RAG Assessment) — наиболее распространённый фреймворк для автоматической оценки, который не требует ручной разметки ответов, используя LLM как судью.
Метрики RAGAS
| Метрика | Что измеряет | Диапазон |
|---|---|---|
| Context Precision | Доля retrieved контекста, который реально нужен для ответа | 0–1 |
| Context Recall | Доля необходимого контекста, которая была retrieved | 0–1 |
| Faithfulness | Соответствие ответа retrieved контексту (нет галлюцинаций) | 0–1 |
| Answer Relevancy | Насколько ответ релевантен вопросу | 0–1 |
| Answer Correctness | Фактическая правильность ответа (требует ground truth) | 0–1 |
Установка и базовое использование RAGAS
from ragas import evaluate
from ragas.metrics import (
context_precision,
context_recall,
faithfulness,
answer_relevancy,
answer_correctness,
)
from datasets import Dataset
# Подготовка датасета для оценки
eval_data = {
"question": [
"Каков срок действия договора?",
"Кто несёт ответственность за задержку поставки?",
],
"answer": [
"Договор действует до 31 декабря 2025 года.",
"Поставщик несёт ответственность за задержку сверх 5 рабочих дней.",
],
"contexts": [
["2.1. Настоящий Договор вступает в силу с момента подписания и действует до 31.12.2025..."],
["4.3. В случае задержки поставки более чем на 5 рабочих дней Поставщик..."],
],
"ground_truths": [
"Договор действует до 31 декабря 2025 года.",
"Ответственность несёт Поставщик при задержке более 5 рабочих дней.",
],
}
dataset = Dataset.from_dict(eval_data)
# Оценка
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from ragas.llms import LangchainLLMWrapper
from ragas.embeddings import LangchainEmbeddingsWrapper
evaluator_llm = LangchainLLMWrapper(ChatOpenAI(model="gpt-4o"))
evaluator_embeddings = LangchainEmbeddingsWrapper(OpenAIEmbeddings())
results = evaluate(
dataset,
metrics=[context_precision, context_recall, faithfulness, answer_relevancy],
llm=evaluator_llm,
embeddings=evaluator_embeddings,
)
print(results)
# {'context_precision': 0.88, 'context_recall': 0.82, 'faithfulness': 0.94, 'answer_relevancy': 0.91}
Автоматизированный тестовый набор: Testset Generation
RAGAS умеет генерировать тестовый набор из ваших документов:
from ragas.testset.generator import TestsetGenerator
from ragas.testset.evolutions import simple, reasoning, multi_context
generator = TestsetGenerator.with_openai()
# Генерация тестов разной сложности
testset = generator.generate_with_langchain_docs(
documents=your_documents,
test_size=100,
distributions={
simple: 0.5, # Простые вопросы по одному документу
reasoning: 0.3, # Требующие рассуждений
multi_context: 0.2, # Требующие нескольких документов
}
)
testset.to_pandas().to_csv("evaluation_testset.csv", index=False)
Интерпретация метрик
Context Precision < 0.7: система извлекает много нерелевантного контекста. Решения: улучшить reranking, добавить фильтрацию по метаданным, уменьшить top_k.
Context Recall < 0.7: система не находит нужные документы. Решения: улучшить chunking, попробовать hybrid search, fine-tune embedding модель.
Faithfulness < 0.8: модель галлюцинирует — выдумывает информацию, не подкреплённую контекстом. Решения: улучшить system prompt, добавить инструкцию «отвечай только на основе контекста», использовать меньшую temperature.
Answer Relevancy < 0.8: ответы не по делу. Решения: улучшить prompt, добавить примеры желаемого формата.
Практический кейс: итерации по RAGAS метрикам
Исходное состояние (базовый RAG, GPT-4o-mini, ChromaDB):
| Метрика | v1 |
|---|---|
| Context Precision | 0.61 |
| Context Recall | 0.68 |
| Faithfulness | 0.74 |
| Answer Relevancy | 0.79 |
Итерация 1: добавили hybrid search (sparse + dense).
- Context Recall: 0.68 → 0.81 (+19%)
Итерация 2: добавили Contextual Compression + reranker.
- Context Precision: 0.61 → 0.84 (+38%)
- Faithfulness: 0.74 → 0.91 (+23%)
Итерация 3: доработали system prompt с явным запретом галлюцинаций.
- Faithfulness: 0.91 → 0.95
- Answer Relevancy: 0.79 → 0.88
Финальное состояние (v4):
| Метрика | v4 |
|---|---|
| Context Precision | 0.84 |
| Context Recall | 0.81 |
| Faithfulness | 0.95 |
| Answer Relevancy | 0.88 |
Continuous Evaluation в CI/CD
import pytest
@pytest.fixture(scope="session")
def rag_evaluation_results():
"""Запускает RAGAS оценку на тестовом наборе"""
return evaluate(evaluation_dataset, metrics=[faithfulness, context_recall])
def test_faithfulness_above_threshold(rag_evaluation_results):
assert rag_evaluation_results["faithfulness"] >= 0.85, \
f"Faithfulness {rag_evaluation_results['faithfulness']:.2f} below threshold 0.85"
def test_context_recall_above_threshold(rag_evaluation_results):
assert rag_evaluation_results["context_recall"] >= 0.75
Сроки
- Настройка RAGAS pipeline: 2–3 дня
- Генерация тестового набора: 1–2 дня
- Baseline оценка: 1 день
- Итерации по улучшению: 2–4 недели
- Итого: 3–6 недель







