RAG Metrics

Метрики качества RAG — «дашборд» из ~12 измеримых показателей с целевыми порогами для продакшена, разбитых на 3 группы: Retrieval (нашли ли), Generation (хорошо ли ответили), End-to-End. Без них нельзя отличить рабочую систему от демо. Это продакшен-уровень поверх простых эвристик из Agent Evals.

Суть

Простых эвристик (has_citations, answer_grounded) хватает для первого агента, но в проде нужны статистические пороги. Главное правило: начни с Hit Rate — если документы не находятся, остальные метрики бессмысленны.

Зачем это нужно

Каждая фаза дорожной карты RAG (см. RAG) сопровождается замером: не переходи к следующей технике, пока текущие метрики не достигли порога. Галлюцинации — главная проблема RAG в проде, их ловит Faithfulness.

Как работает (RAG Quality Dashboard)

Retrieval (поиск):

  • Hit Rate @ K ≥ 0.85 — доля запросов, где релевантный документ в топ-K (recall).
  • MRR ≥ 0.75 — средний обратный ранг первого релевантного.
  • NDCG @ K ≥ 0.70 — качество ранжирования с учётом позиции.

Generation (генерация):

  • Faithfulness ≥ 0.85 — доля утверждений ответа, подтверждённых контекстом (метрика галлюцинаций).
  • Answer Relevancy ≥ 0.80 — соответствие ответа вопросу.
  • Answer Correctness ≥ 0.75; Toxicity ≤ 0.05.

End-to-End:

  • Context Precision ≥ 0.70, Context Recall ≥ 0.80, Context F1 ≥ 0.75.
  • Noise Robustness ≥ 0.90 — устойчивость к нерелевантным данным в контексте.

Операционные: P95 Latency < 3 c, Retrieval < 200 мс, TTFT < 500 мс.

Инструменты: RAGAS (стандарт де-факто, оценка LLM-судьёй без ground truth, автогенерация eval-датасета), DeepEval, RAGChecker (Amazon, NeurIPS'24 — диагностика на уровне отдельных утверждений), TruLens; observability — Arize Phoenix, LangSmith, Langfuse (сами практики online-трейсинга retrieval — в RAG Observability). Практика: eval-датасет 50-200 вопросов с GT, offline-eval в CI/CD (~$0.05-0.20 за запрос на GPT-4o-судье, можно локальной моделью).

Пример

Две базовые retrieval-метрики на эталонном (golden) наборе {question, relevant_doc, retrieved_docs}: Hit Rate@K (попал ли релевантный документ в топ-K) и MRR (обратная позиция первого релевантного).

def compute_metrics(results, k=3):
    mrr, hits = [], []
    for r in results:
        topk = r["retrieved_docs"][:k]
        if r["relevant_doc"] in topk:
            mrr.append(1.0 / (topk.index(r["relevant_doc"]) + 1))  # 1 / позиция первого релевантного
            hits.append(1)
        else:
            mrr.append(0.0); hits.append(0)
    return {"MRR": sum(mrr) / len(mrr), "HitRate@K": sum(hits) / len(hits)}

Связано с

  • RAG — метрики измеряют каждую фазу RAG-конвейера
  • Agent Evals — простые мини-метрики агента vs полный RAG-дашборд
  • Reranking — реранкинг оптимизируют именно по этим метрикам
  • RAG Observability — online-трейсинг retrieval (дополняет offline-метрики этой заметки)

Открытые вопросы

  • какие пороги реалистичны для русскоязычного домена (значения выше — ориентир из материалов)
  • RAGAS vs DeepEval vs RAGChecker — что выбрать на старте