Оцінка якості RAG-системи (RAGAS, precision, recall, faithfulness)
Без систематичної оцінки якості RAG-система — "чорна скринька". RAGAS (RAG Assessment) — найпопулярніший фреймворк для автоматичної оцінки, який не потребує ручної розмітки відповідей, використовуючи LLM як судді.
Метрики RAGAS
| Метрика | Що вимірює | Діапазон |
|---|---|---|
| Context Precision | Частка отриманого контексту, яка насправді необхідна для відповіді | 0–1 |
| Context Recall | Частка необхідного контексту, який був отриманий | 0–1 |
| Faithfulness | Відповідність відповіді отриманому контексту (немає галюцинацій) | 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}
Автоматизований набір тестів: генерація тестів
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 |
Безперервна оцінка в 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 дні
- Базова оцінка: 1 день
- Ітерації поліпшення: 2–4 тижні
- Всього: 3–6 тижнів







