Решения

Оценка RAG: groundedness и качество ответов

Задача страницы. Дать практический метод оценки RAG‑систем: как измерять groundedness/faithfulness (опора на источники, отсутствие галлюцинаций), метрики retrieval (Recall@K, Precision@K, MRR), качество конечных ответов (correctness, цитируемость), а также как организовать оффлайн‑бенчмарки и онлайн A/B.

TL;DR

  • Делите оценку на три слоя: Retrieval → Augmentation → Answer.
  • Главные метрики: Recall@K и Context Precision (retrieval), Groundedness и Citation Accuracy (answer).
  • Используйте LLM‑as‑Judge по строгому рубрикатору + авто‑проверки (пересечение с контекстом, цитаты, факты).
  • Стройте оффлайн наборы из ваших документов, а на проде запускайте canary A/B с бизнес‑метриками и p95‑латентностью.

Связанные разделы:
/solutions/rag//solutions/rag/vector-db//solutions/embeddings//solutions/llm-training/eval//solutions/llm-inference/guardrails//solutions/llm-inference/observability//solutions/llm-inference/costs/

Картина метрик: от поисковой части к ответу

Retrieval

  • Recall@K — доля запросов, для которых целевой фрагмент попал в top‑K.
  • Precision@K — доля релевантных среди top‑K.
  • MRR / Hit@K — чувствительность к позиции релевантов.
  • Latency p95 — задержка поиска (см. /solutions/rag/vector-db/).

Augmentation (сбор контекста)

  • Context Precision — доля вставленных в подсказку фрагментов, реально нужных для ответа.
  • Coverage — сколько ключевых фактов из эталона покрыто контекстом.
  • Redundancy — дубликаты/пересечения в контексте.

Answer (итоговая генерация)

  • Groundedness/Faithfulness — все утверждения подтверждаются контекстом.
  • Citation Accuracy — корректные отсылки к источникам (id/секции).
  • Correctness — соответствие эталонному ответу (если он есть).
  • Style/Clarity — краткость, структура, соблюдение инструкции.
  • Latency p95 / Cost per 1M — эксплуатационные показатели (см. /solutions/llm-inference/costs/).

Общий оффлайн‑пайплайн оценки

				
					Документы → очистка → чанкование → (опц.) ручная разметка Q/A
                   ↘ генерация кандидатов вопросов (по секциям)
Q → top‑K retrieve → сбор контекста → ответ LLM → оценка (правила + Judge)
                                          ↘ метрики (retrieval/answer)

				
			
  1. Сэмплинг вопросов: берите заголовки/абзацы, генерируйте 1–3 вопроса на фрагмент + добавляйте «adversarial» (перефраз, многосоставные, кросс‑разделы).
  2. Эталон (gold): короткая справка (1–3 предложения) + обязательные ссылки на фрагменты (id).
  3. Запуск пайплайна: ваш прод‑стек retrieval + сбор контекста + ответ.
  4. Скоринг: автоматические проверки + LLM‑Judge по жёсткой рубрике.
  5. Агрегация: отчёты по сегментам (темы, длины, языки, источники).

Подробнее про подготовку и чанкование: /solutions/rag/, про индексы: /solutions/rag/vector-db/.

Рубрика для Groundedness (строгий JSON‑контракт)

Идея. Judge должен отвечать строго JSON‑ом по схеме: для каждого проверяемого утверждения — supported / contradicted / insufficient.

JSON Schema (фрагмент):

				
					{
  "type": "object",
  "properties": {
    "score_0_1": {"type":"number", "minimum":0, "maximum":1},
    "claims": {
      "type": "array",
      "items": {
        "type":"object",
        "properties": {
          "text": {"type":"string"},
          "label": {"type":"string", "enum":["supported","contradicted","insufficient"]},
          "evidence_ids": {"type":"array","items":{"type":"string"}}
        },
        "required":["text","label"]
      }
    },
    "notes": {"type":"string"}
  },
  "required": ["score_0_1","claims"]
}

				
			

Инструкция Judge (кратко):

  • Рассматривай только предоставленный контекст.
  • Не делай внешних допущений.
  • Любое утверждение, не подтверждённое контекстом, — insufficient.
  • Противоречия — contradicted.
  • Выдай итоговый score_0_1 как долю утверждений в метках supported.

Автопроверки до Judge: дешёвые и надёжные

  1. Citation Accuracy: все указанные источники должны присутствовать в top‑K; id/якоря валидны.
  2. Overlap Heuristic: доля уникальных сущностей/терминов ответа, встречающихся в контексте (proxy groundedness).
  3. Length/Policy: соблюдение лимитов max_tokens, отсутствие запрещённых паттернов (см. /solutions/llm-inference/guardrails/).
  4. Redundancy: доля пересечений между чанками в подсказке (>30% — признак неэффективного сборщика контекста).

Метрики и формулы

Retrieval

				
					Recall@K   = (#запросов с хотя бы 1 целевым фрагм. в top-K) / (#запросов)
Precision@K= (#релевантных в top-K) / (K × #запросов)
MRR        = avg(1 / rank_первого_релеванта)

				
			

Groundedness (по Judge)

				
					G = avg(score_0_1)
HallucinationRate = (#claims с label ∈ {contradicted, insufficient}) / (#claims)

				
			

Citation Accuracy

				
					CA = (#ответов, где все указанные цитаты ∈ top-K и корректны) / (#ответов с цитатами)

				
			

Итоговый интегральный балл (пример)

				
					Score = 0.35*Recall@K + 0.25*G + 0.20*CA + 0.10*MRR + 0.10*ContextPrecision
				
			

Весы подбираются под ваш продукт (подробнее — /solutions/llm-training/eval/).

Мини‑фреймворк оценки (псевдокод)

				
					def eval_batch(queries, corpus, retriever, collector, llm, judge):
    R = []  # результаты по запросам
    for q in queries:
        topk = retriever.search(q, k=50)                  # (doc_id, score)
        ctx  = collector.build(topk, budget_tokens=1200)  # сбор контекста
        ans  = llm.generate(q, ctx, max_new_tokens=200)   # ответ

        auto = {
          "citation_ok": all(c in [d for d,_ in topk] for c in extract_citations(ans)),
          "overlap":     entity_overlap(ans, ctx),
        }
        j = judge(q, ctx, ans)  # JSON по схеме из §3

        R.append({"q":q, "topk":topk, "ctx":ctx, "ans":ans, "auto":auto, "judge":j})

    return aggregate_metrics(R)  # формулы из §5

				
			

Как собирать датасеты под RAG

  • Стратифицированный сэмплинг. Балансируйте темы/разделы/форматы (текст/таблицы/код).
  • Adversarial‑варианты. Перефразы, запросы «с подвохом» (дубликаты терминов, редкие сущности, кросс‑док).
  • Шум/пропуски. Вставляйте ошибки и пропуски, чтобы проверить устойчивость поиска.
  • Мультиязычность. Вопросы/ответы на целевых языках; проверяйте, что эмбеддинги и индексы соответствуют.
  • Обновляемость. Храните версию корпуса/индекса, чтобы результаты были воспроизводимы.

Подготовка корпуса и индексов: /solutions/rag/ и /solutions/rag/vector-db/. Эмбеддинги: /solutions/embeddings/.

Онлайн A/B и продуктовые метрики

Что мерить в проде:

  • Deflection/Resolution Rate — доля диалогов, где пользователь не обратился к оператору/повтору.
  • Follow‑up редактирование — сколько раз переформулируют запрос.
  • CSAT/Thumbs — простая оценка пользователем.
  • Latency p95 и ошибки (см. /solutions/llm-inference/observability/).

Практика A/B:

  • Canary 5–10% трафика; фиксируйте версии: retriever@index@params, collector@v, model@quant.
  • Останавливайте эксперимент при деградации groundedness/CSAT или росте p95.

Поддерживайте стриминг (см. /solutions/llm-inference/streaming/) — UX важнее.

Пороговые значения (рабочие ориентиры)

  • Recall@K: ≥ 0.75 для K=10 при качественном корпусе; для «сложных» доменов стремитесь ≥ 0.6.
  • Groundedness (G): ≥ 0.85 для справочных ответов, ≥ 0.7 для «поясняющих» текстов.
  • Citation Accuracy: ≥ 0.9, иначе усиливайте сбор контекста и шаблоны ссылок.
  • Latency p95 (end‑to‑end): чат ≤ 1–1.5 с, аналитика ≤ 2–3 с (со стримингом).
  • HallucinationRate: ≤ 5–10% по claims — выше требует немедленного внимания.

Диагностика и улучшения

  • Низкий Recall@K → см. /solutions/rag/vector-db/: увеличьте nprobe, улучшите чанкование/метаданные, добавьте гибрид (метаданные → вектор).
  • Groundedness падает → сократите шум в контексте, ужесточите сбор (де‑дуп, сортировка по разделам), улучшите цитаты и стиль подсказки.
  • Citation Accuracy низкий → валидируйте id/якоря, не вставляйте «мертвые» ссылки, ограничьте преобразования текста.
  • Высокая p95 → уменьшите K и размер контекста, батчируйте поиск, используйте short/long пулы.
  • Галлюцинации → включите guardrails и пост‑фильтры (см. /solutions/llm-inference/guardrails/).

Отчёт и дашборды

Минимум графиков:

  • Распределение Recall@K / MRR по темам/языкам.
  • Groundedness и HallucinationRate по источникам.
  • Citation Accuracy и доля «пустых» ответов.
  • Latency p95: поиск/LLM/общая.
  • Стоимость (цена за 1M) vs качество (см. /solutions/llm-inference/costs/).

Интеграция в наблюдаемость: /solutions/llm-inference/observability/.

Чек‑лист перед продом

  • Есть оффлайн‑набор (вопросы/эталоны/цитаты) и пайплайн оценок.
  • Включены автопроверки (цитаты/пересечения/политики) и строгий Judge JSON.
  • Определены SLO по Recall@K, Groundedness, Citation Accuracy, p95.
  • Настроены A/B‑механики и дашборды качества/латентности/стоимости.
  • План деградации: снижение K, ужесточение сборщика контекста, фоллбек‑модель.
  • Nightly‑прогон бенчмарка и алерты при регрессиях.

Как запускать это в cloudcompute.ru

  • В /solutions/templates/ используйте “RAG‑Eval Harness”:
    – генерация валид‑набора из вашего корпуса;
    – запуск retrieval/collector/LLM;
    – автопроверки + Judge JSON;
    – отчёт с метриками и артефактами (семплы ответов).
  • Для экономики и SLA: /solutions/llm-inference/costs/, наблюдаемость — /solutions/llm-inference/observability/, безопасность — /solutions/llm-inference/guardrails/.