Агенты и продакшн
~30 мин

Оценка RAG-систем (RAGAS)

Метрики качества RAG: faithfulness, context precision/recall, answer relevancy. Фреймворк RAGAS для автоматической оценки.

Оценка RAG — как понять, что система работает?

Загрузка интерактивного виджета...

RAG выглядит простым в демо, но ломается в продакшене тихо и незаметно. Проблема в том, что RAG ломается в двух местах: retrieval (нашли не те документы или не все нужные) и generation (модель проигнорировала контекст и нагаллюцинировала). Обычные метрики типа BLEU или ROUGE оценивают только финальный ответ, но не показывают, где именно система сломалась — в поиске документов или в генерации. Нужны специальные метрики для каждого слоя отдельно.

Две поверхности отказа RAG

  • Retrieval: вернул нерелевантные чанки по теме, нашёл правильный документ но не тот фрагмент, нашёл 3 хороших чанка + 2 мусорных которые захламили контекст
  • Generation: модель проигнорировала контекст и ответила из своих весов, смешала информацию из разных чанков в кашу, додумала факты которых не было в документах

RAGAS — фреймворк для оценки

RAGAS (Retrieval-Augmented Generation Assessment) — это open-source фреймворк, который стал индустриальным стандартом для оценки RAG-систем. Главная идея: использует LLM-as-a-judge — другая более сильная модель выступает судьёй и оценивает качество ответов твоей RAG-системы. Это дороже ручной разметки на небольшой выборке, но дешевле human evaluation на большой.

🎯 6 метрик RAGAS

1. Faithfulness (фактологическая точность) — ответ не противоречит найденному контексту? RAGAS извлекает все утверждения из ответа и проверяет каждое по документам. Score 0.8 = 80% утверждений подтверждены документами. Ловит галлюцинации. 2. Context Precision — релевантные документы оказались наверху списка? Если единственный нужный чанк на 5-м месте из 5, а первые 4 — мусор, то генерация пострадает. 3. Context Recall — нашли ли все документы, нужные для полного ответа? Для ответа про зарплаты ML-инженеров может понадобиться 3 чанка, а retriever нашёл только 1. 4. Answer Relevancy — ответ по теме вопроса? Спросили "как вернуть товар", получили историю компании — низкий relevancy. 5. Context Relevancy — все найденные чанки релевантны запросу? 5 чанков нашли, 3 про погоду для вопроса про зарплаты = низкий score. 6. Noise Sensitivity — устойчивость к мусорным чанкам в контексте. В реальности retriever ВСЕГДА возвращает мусор вместе с релевантным контентом.

Пороги для продакшена

  • Faithfulness >= 0.80 (ниже = пользователи получают галлюцинации)
  • Context Precision >= 0.70 (ниже = ранжирование сломано, retriever работает плохо)
  • Context Recall >= 0.70 (ниже = теряем важные документы, ответы неполные)
  • Answer Relevancy >= 0.70 (ниже = ответы вообще не по теме, система бесполезна)

Как запустить RAGAS

pip install ragas

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

# Ваши данные: вопросы, ответы, найденные чанки
from datasets import Dataset
dataset = Dataset.from_dict({
    "question": ["Какая зарплата ML-инженера?"],
    "answer": ["ML-инженер получает 250-400K ₽/мес по данным 2024"],
    "contexts": [["Зарплата ML: 250-400K", "Data Scientist: 200-350K"]],
    "ground_truth": ["250-400 тысяч рублей в месяц"]
})

# Оценка по 4 основным метрикам
result = evaluate(
    dataset, 
    metrics=[faithfulness, context_precision, context_recall, answer_relevancy]
)
print(result)

IR-метрики для быстрой проверки retrieval

RAGAS использует LLM-судью — это дорого на больших датасетах и долго. Для быстрых проверок качества retrieval отдельно от generation можно использовать классические IR-метрики без LLM: Precision@K (доля релевантных среди top-K найденных), Recall@K (доля найденных от всех релевантных), MRR (Mean Reciprocal Rank) — позиция первого релевантного документа.

Precision@K vs Recall@K

Precision@K и Recall@K конфликтуют друг с другом. Увеличиваешь K → recall растёт (находим больше релевантных), precision падает (больше мусора). Для юридических документов важнее recall (не пропустить прецедент), для FAQ-бота — precision (не захламлять контекст ненужной инфой).

Генерация синтетических тестов

Размеченных данных нет, а вручную размечать лень? RAGAS умеет генерировать тестовые вопросы из твоих документов автоматически. Три типа эволюций: Simple — простые фактоидные вопросы ("Сколько стоит услуга?"), Reasoning — требуют рассуждений ("Почему услуга А лучше Б?"), Multi-context — ответ собирается из нескольких чанков.

from ragas.testset.generator import TestsetGenerator
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

generator = TestsetGenerator.from_langchain(
    ChatOpenAI(model="gpt-4"), 
    ChatOpenAI(model="gpt-3.5-turbo"), 
    OpenAIEmbeddings()
)
testset = generator.generate_with_langchain_docs(documents, test_size=50)

RAGAS в CI/CD

Обновил FAQ, добавил новые документы, переиндексировал базу знаний — запусти pipeline проверки, что retrieval quality не просела. GitHub Actions с триггером на paths: ['knowledge_base/**'] автоматически прогонит тесты и заблокирует merge если метрики упали ниже порогов.

⚠️ Суть для собеса

RAG оценивается по двум осям: retrieval quality (нашли ли правильные документы) и generation quality (правильно ли модель использовала найденный контекст). RAGAS — стандартный фреймворк для этого. Faithfulness ловит галлюцинации, Context Recall ловит потерю важных документов. В проде нужно мониторить эти метрики постоянно — RAG деградирует незаметно.