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

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

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

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

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

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

RAG evaluation: метрики retrieval (Recall@K, MRR) и generation (Faithfulness, Relevance)
Оценка RAG по двум слоям: нашли ли правильные документы + основан ли ответ на контексте

Две поверхности отказа 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 если метрики упали ниже порогов.

🎯 На собеседовании

Junior

Что такое Precision@K и Recall@K? Precision@K — доля релевантных среди top-K найденных документов. Recall@K — доля найденных от всех релевантных. Увеличиваешь K → recall растёт, precision падает. Баланс зависит от задачи. • Что такое NDCG? Normalized Discounted Cumulative Gain — учитывает не только релевантность, но и позицию: документ на 1-м месте ценнее, чем на 10-м. Gain «дисконтируется» логарифмически с позицией. • Как оценить end-to-end RAG? По двум осям отдельно: retrieval (нашли ли правильные документы) и generation (правильно ли модель использовала контекст). RAGAS — стандартный фреймворк для этого.

Middle

Faithfulness vs Relevance — в чём разница? Faithfulness: ответ не противоречит найденному контексту (ловит галлюцинации). Relevance: ответ по теме вопроса. Можно быть faithful но irrelevant (точно цитируешь не тот документ) или relevant но unfaithful (по теме, но выдумываешь факты). • Как работает RAGAS? LLM-as-a-judge: сильная модель оценивает ответы RAG-системы по 6 метрикам (faithfulness, context precision/recall, answer relevancy, context relevancy, noise sensitivity). Дороже ручной разметки на маленькой выборке, но масштабируется. • Как размер чанка влияет на метрики? Маленькие чанки → высокая precision (точнее попадание), низкий recall (теряется контекст). Большие чанки → высокий recall (больше контекста), низкая precision (больше шума). Типичный sweet spot: 256-512 токенов с overlap. • Как оценить retrieval отдельно от generation? Классические IR-метрики без LLM: Precision@K, Recall@K, MRR (позиция первого релевантного). Быстро и дёшево для итераций над retriever-ом.

Senior

LLM-as-judge — limitations и bias? Модель-судья имеет свои bias: предпочитает длинные ответы, свой стиль, может не замечать фактологические ошибки в незнакомых доменах. Решение: калибровка на human annotations, ensemble из нескольких judges, domain-specific rubrics. • Как строить human-in-the-loop evaluation? Stratified sampling (по сложности, домену), inter-annotator agreement (Cohen kappa > 0.7), calibration sessions. Human eval дорого — используй для валидации LLM-judge, не для рутинной оценки. • Multi-hop retrieval evaluation — в чём сложность? Ответ требует информации из нескольких документов. Стандартные метрики (Precision@K) не учитывают, что нужны ВСЕ K документов вместе. Нужна holistic оценка: собирает ли система полный контекст. • Production RAG monitoring — что мониторить? Drift detection: распределение запросов меняется → retrieval деградирует. Latency vs quality tradeoff: больше чанков = лучше recall, но медленнее. Alerting на падение faithfulness ниже 0.8. CI/CD: автотесты при обновлении knowledge base.

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

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