Как вы делаете synthetic data generation для редких классов в датасете?

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

Синтетическая генерация данных (synthetic data generation) для редких классов решает проблему дисбаланса, когда в обучающей выборке значительно меньше примеров одного класса по сравнению с другими. Основной подход в контексте LLM — использовать языковую модель для создания новых реалистичных образцов по запросу, задавая схему данных и вариации. Ключевую роль играет проверка качества сгенерированных данных через кросс-валидацию на реальных примерах, чтобы избежать шума и смещений.


1. Термины: синтетические данные, редкий класс и дисбаланс

Синтетические данные — искусственно созданные примеры, имитирующие распределение реальных данных. Редкий класс — это класс, представленный в датасете значительно реже других (например, 1% против 99%). Дисбаланс классов ведёт к перекосу модели в сторону частого класса, снижая recall и precision по редкому.

Зачем генерировать синтетику для редких классов?

  • Увеличить количество примеров для обучения.
  • Повысить устойчивость модели в Agentic RAG-системах, где редкие запросы должны обрабатываться корректно.
  • Избежать overfitting на малом количестве реальных семплов.

2. Проблема дисбаланса в контексте Agentic RAG

В Agentic RAG (архитектура, где агент принимает решения о поиске и генерации) редкие классы могут соответствовать:

  • Узкоспециализированным доменным запросам.
  • «Длинному хвосту» (long tail) пользовательских интентов.
  • Крайне редко встречающимся документам в базе знаний.

Без синтетической генерации модель-агент может игнорировать такие запросы или выдавать неадекватный ответ. Следовательно, генерация синтетических данных — прямой способ улучшить recall и faithfulness на редких сценариях.


3. Методы синтетической генерации данных для редких классов

3.1 Традиционные подходы (без LLM)

  • SMOTE (Synthetic Minority Over-sampling Technique): создаёт новые примеры интерполяцией между соседними реальными образцами. Подходит для табличных данных.
  • ADASYN: адаптивная версия SMOTE, фокусируется на сложных областях.
  • GAN (Generative Adversarial Network): генерирует реалистичные данные, но требует много вычислительных ресурсов и настройки.

3.2 Генерация с помощью LLM (наш фокус)

LLM позволяет создавать структурированные и неструктурированные данные (текст, JSON, код) на естественном языке. Преимущества:

  • Контролируемая генерация через промпты.
  • Возможность задавать формат (schema) и вариации.
  • Меньше ручной работы по сравнению с традиционными методами.

4. Процесс генерации с LLM: пошаговый рецепт

4.1 Определение схемы данных (schema)

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

Пример схемы для датасета отзывов (редкий класс — негативный отзыв):

{
  "текст": "отзыв на русском, 30–200 символов",
  "оценка": "1 (негативный)",
  "тема": ["опоздание", "грубость", "качество"],
  "тональность": "отрицательная"
}

4.2 Промпт для LLM

Базовый шаблон:

Сгенерируй {N} примеров для класса "{rare_class_name}" в формате {schema}. Вариации:
- Изменяй длину текста от короткого до развернутого.
- Используй разные ключевые слова/триггеры.
- Добавляй специфичный для домена сленг.
Пример реального образца (few-shot): {real_example}.
Проверь, что каждый пример уникален и соответствует распределению признаков.

Вариации (дополнения в промпт):

  • Температура (temperature): от 0.7 до 1.0 для разнообразия.
  • Использование chain-of-thought для логического обоснования, если данные должны быть причинно-связаны.
  • Добавление negative prompts (что НЕ должно быть в примере).

4.3 Постобработка и фильтрация

  • Отсев дубликатов (через эмбеддинги или хэш-функции).
  • Проверка соответствия схеме (валидация JSON, regex).
  • Удаление выбросов по длине/семантике (например, cosine similarity с реальными примерами — выбрасываем слишком похожие или слишком далёкие).

5. Проверка качества синтетических данных

5.1 Кросс-валидация на реальных данных

Ключевой этап: смешиваем синтетические примеры с реальными, обучаем модель и оцениваем её на отдельном тестовом наборе только из реальных данных. Сравниваем метрики (F1, recall) с baseline (только реальные данные). Если метрики ухудшились — синтетика содержит шум.

5.2 Экспертная проверка

В Agentic RAG особенно важна достоверность (factuality). Привлекаем domain expert для выборочной валидации сгенерированных примеров.

5.3 Автоматизированные метрики

  • Classifier Confidence: обучаем классификатор на смешанных данных и смотрим, насколько уверенно он предсказывает редкий класс для синтетических примеров.
  • Distributional Similarity: сравниваем распределение признаков синтетики и реальных данных (например, KS-тест для числовых, chi-square для категориальных).
  • LLM-as-a-Judge: используем другую LLM для оценки правдоподобия каждого сгенерированного примера по шкале 1–5.

6. Пример кода (Python + OpenAI API)

import openai
import json

def generate_rare_class_samples(rare_class, schema, n_samples=50):
    prompt = f"""Сгенерируй {n_samples} примеров для класса "{rare_class}" 
в формате JSON: {schema}.
Вариации: меняй длину, формулировки, добавляй специфичные для домена детали.
Каждый пример должен быть уникальным и реалистичным."""
    
    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.8,
        max_tokens=2000
    )
    # Парсинг ответа (предполагаем, что модель возвращает список JSON)
    try:
        samples = json.loads(response.choices[0].message.content)
    except:
        # fallback: разбить по строкам
        samples = [{"text": line.strip()} for line in response.choices[0].message.content.split('\n') if line.strip()]
    return samples[:n_samples]

# Использование
rare_samples = generate_rare_class_samples("негативный отзыв о доставке", 
                                           {"текст": "str", "оценка": 1, "тема": "опоздание"})

7. Интеграция в Agentic RAG: генерация данных для агента

В архитектуре Agentic RAG синтетические данные можно использовать:

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

Пример сценария Агент должен отвечать на вопросы о редких медицинских симптомах. Генерируем синтетические вопрос-ответные пары для этих симптомов, включаем их в обучающую выборку для retrieval и генерации.


8. Риски и ограничения

  • Шум и артефакты: LLM может генерировать неправдоподобные или фактологически неверные образцы.
  • Утечка информации: модель может воспроизводить защищённые данные, если обучалась на них.
  • Перекос в сторону частых паттернов: даже при low temperature LLM может копировать распространённые шаблоны, не покрывая «длинный хвост» вариаций.
  • Расход токенов: генерация больших объёмов синтетики может быть дорогой.

Как снизить риски

  • Использовать few-shot с реальными редкими примерами.
  • Применять self-consistency (генерировать несколько вариантов и фильтровать по большинству).
  • Комбинировать с традиционными методами (SMOTE для числовых признаков в дополнение к тексту).

Пет-проект для закрепления

Задача Разработать конвейер генерации синтетических данных для редкого класса «жалоба на мобильное приложение» в датасете отзывов.

Инструменты

  • Python, OpenAI API (или локальная модель типа Llama 3).
  • Scikit-learn для кросс-валидации.
  • FAISS для фильтрации дубликатов по эмбеддингам.

Шаги:

  1. Загрузите реальный датасет (например, UCI SMS Spam Collection или собственный).
  2. Определите редкий класс (менее 5%).
  3. Напишите промпт с few-shot примерами из реального датасета.
  4. Сгенерируйте 200 синтетических примеров.
  5. Проведите валидацию: смешайте с реальными, обучите классификатор (LogisticRegression) и измерьте F1 на тестовой выборке.
  6. Сравните результат с SMOTE и baseline.

Ожидаемый результат Повышение F1 на редком классе минимум на 10% относительно baseline. В отчёте — анализ качества сгенерированных данных (примеры, метрики, замечания).


Связь с другими вопросами

ВопросТема
267Data augmentation для RAG
269Как балансировать датасет при fine-tuning LLM
271Оценка качества сгенерированных данных
255Few-shot learning в агентных системах
263Тестирование Agentic RAG на редких сценариях
252Сбор данных для обучения агента

Навигация