Суть
Простых эвристик (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 — что выбрать на старте