Как вы оцениваете качество синтетических данных? (Self-consistency, LLM-as-Judge)

Краткий тезис

Оценка качества синтетических данных — критический этап, позволяющий отсеять шумные, нерелевантные или неверные примеры перед использованием в обучении или RAG. Основные методы: Self-consistency (проверка согласованности генераций на один и тот же запрос), LLM-as-Judge (автоматическая оценка сильным LLM), Human validation (выборочная Review|ручная проверка) и Downstream quality (оценка влияния на целевую задачу). Комбинация этих подходов даёт надёжный фильтр качества.


1. Термин: Синтетические данные

Синтетические данные — это искусственно сгенерированные примеры (вопрос-ответ, документ-резюме и т.д.), созданные с помощью LLM или других алгоритмов, а не собранные из реальных источников. Они используются для:

  • расширения обучающих наборов, когда реальных данных мало;
  • создания пар для RAG (вопросы к документам);
  • fine-tuning моделей под специфические домены.

Риски синтетика может содержать галлюцинации, повторяться, быть нерепрезентативной. Поэтому оценка качества обязательна.


2. Self-consistency (согласованность)

Self-consistency — метод, при котором один и тот же запрос (например, вопрос) подаётся в LLM несколько раз (обычно 3–5) с разными seed или температурой, и измеряется согласованность полученных ответов.

Как работает

  1. Берём синтетический пример (вопрос, контекст, ответ).
  2. Генерируем ответ на тот же вопрос 3 раза (с temperature > 0, например 0.7).
  3. Сравниваем ответы между собой (или с оригинальным синтетическим ответом) с помощью метрик ROUGE-L, F1 по токенам, BERTScore.
  4. Если среднее согласие (agreement) ниже порога (например, 0.8), пример считается шумным и отбрасывается.

Пример кода (Python)

from rouge_score import rouge_scorer
import numpy as np

def self_consistency_score(question, original_answer, llm, n=3):
    generated = [llm.generate(question, temperature=0.7) for _ in range(n)]
    scorer = rouge_scorer.RougeScorer(['rougeL'], use_stemmer=True)
    scores = []
    for gen in generated:
        score = scorer.score(original_answer, gen)['rougeL'].fmeasure
        scores.append(score)
    return np.mean(scores)

# Порог: если средний ROUGE-L < 0.8 → отбрасываем
if self_consistency_score(q, a, my_llm) < 0.8:
    discard()

Интерпретация порогов

Средний ROUGE-LКачествоДействие
> 0.9ОтличноеОставить
0.8 – 0.9ХорошееОставить
0.6 – 0.8СреднееПроверить вручную
< 0.6НизкоеОтбросить

Ограничения Self-consistency не гарантирует фактической правильности — ответы могут быть согласованными, но неверными. Поэтому метод лучше сочетать с другими.


3. LLM-as-Judge

LLM-as-Judge — использование сильной LLM (GPT-4, Claude 3.5) для оценки качества синтетических данных по заданным критериям.

Процесс

  1. Создаём промпт-судью, который просит LLM оценить ответ по шкале (например, 1–10) по критериям: корректность, релевантность, полнота, отсутствие галлюцинаций.
  2. Подаём на вход вопрос, контекст (если есть) и синтетический ответ.
  3. Получаем оценку. Примеры с оценкой ниже порога (например, < 7) отбрасываются.

Пример промпта

Ты — эксперт по оценке качества данных. Оцени ответ на вопрос по шкале 1-10, где 10 — идеально.

Вопрос: {question}
Контекст: {context}
Ответ: {answer}

Критерии:
- Корректность (факты соответствуют контексту)
- Полнота (ответ покрывает все аспекты вопроса)
- Релевантность (ответ прямо относится к вопросу)

Верни только число от 1 до 10.

Калибровка LLM-as-Judge

  • Использовать chain-of-thought (попросить LLM сначала объяснить оценку, потом выставить число).
  • Проверять inter-judge agreement (сравнивать оценки от разных LLM или от одной с разными промптами).
  • Периодически валидировать на небольшом наборе, размеченном человеком.

Преимущества и недостатки

ПлюсыМинусы
Быстро, масштабируемоLLM может быть предвзята (например, предпочитать длинные ответы)
Можно настраивать критерииСтоимость (если много данных)
Не требует разметки человекомНе всегда точна на сложных доменах

4. Human validation (ручная валидация)

Human validation — выборочная проверка синтетических данных экспертами-людьми.

Как внедрить

  • Отбираем случайную стратифицированную выборку (обычно 5–10% от всего набора).
  • Каждый пример проверяется 1–2 аннотаторами по тем же критериям, что и LLM-as-Judge.
  • Вычисляем inter-annotator agreement (Cohen's kappa, Fleiss' kappa). Если согласие низкое (< 0.6), уточняем инструкции.
  • По результатам корректируем пороги для Self-consistency и LLM-as-Judge.

Пример

  • Всего 10 000 синтетических пар.
  • Отбираем 500 пар (5%).
  • Два аннотатора ставят оценки 1–5.
  • Если средняя оценка < 3, пересматриваем метод генерации.

Зачем Human validation — золотой стандарт, но дорогой. Используется для калибровки автоматических метрик и выявления систематических ошибок.


5. Downstream quality (оценка на целевой задаче)

Самый прагматичный метод: обучить модель на синтетических данных и оценить её качество на реальных задачах.

Пайплайн

  1. Обучаем модель (например, fine-tuning LLM или RAG-ретривер) на синтетическом датасете.
  2. Оцениваем на отдельном тестовом наборе реальных данных (человеческая разметка).
  3. Сравниваем метрики (accuracy, F1, ROUGE-L, faithfulness) с baseline (модель без синтетики или с другим источником).
  4. Если прирост метрик значимый — синтетика качественная.

Пример

  • Baseline: RAG с эмбеддингами OpenAI → точность ответов 72%.
  • После добавления 5000 синтетических QA пар (отфильтрованных) → точность 78%.
  • Если бы синтетика была шумной, точность могла бы упасть.

Важно Downstream quality — конечная проверка, но требует времени и вычислительных ресурсов. Используется после фильтрации другими методами.


6. Комбинированный подход (рекомендуемый па


Навигация