Как вы комбинируете реальные и синтетические данные для максимального качества?

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

Комбинирование реальных и синтетических данных — ключевой приём для повышения качества моделей при ограниченном объёме размеченных примеров. Оптимальная стратегия: 10–30% реальных данных и 70–90% синтетических. Сначала модель обучается на большом объёме синтетики (pre-training или первый этап fine-tuning), затем дообучается на реальных данных (fine-tuning). В каждом батче поддерживается смесь real + synthetic в соотношении 1:3, а валидация проводится исключительно на real holdout, чтобы избежать переобучения на артефакты синтетики.


1. Зачем комбинировать реальные и синтетические данные?

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

Комбинирование решает дилемму «качество vs количество»:

  • Синтетика даёт объём и разнообразие, помогает модели изучить общие паттерны.
  • Реальные данные корректируют смещение (bias) синтетики и «приземляют» модель к истинному распределению.

Без реальных данных модель может отлично работать на синтетических тестах, но проваливаться в production. Без синтетики — не хватит примеров для обобщения.


2. Типы синтетических данных

ТипОписаниеПример
Self-instructМодель генерирует инструкции и ответы на основе промптовLLM пишет вопросы по документации и отвечает на них
Back-translationПеревод текста на другой язык и обратно для получения парафразАнглийский → Французский → Английский
Template-basedЗаполнение шаблонов с переменными«Как {действие} в {инструмент}?» → «Как настроить CI/CD в Jenkins
AdversarialГенерация сложных/граничных примеров для улучшения робастностиВопросы с опечатками, противоречиями
Data augmentationМодификация существующих реальных примеров (синонимы, перестановка)Замена слов на синонимы в запросах

Для Agentic RAG синтетические данные часто генерируют с помощью симуляции агента: задаётся сценарий, агент выполняет действия (retrieval, вызов инструментов), и записывается траектория (запрос → контекст → ответ). Это даёт пары (вход, выход) для обучения.


3. Стратегии смешивания: двухэтапное обучение

3.1 Первый этап: обучение на синтетике (pre-training / large-scale fine-tuning)

  • Используется 100% синтетических данных (или 90% синтетики + 10% real для стабильности).
  • Цель: модель учится общей структуре задачи, формату ответов, базовым паттернам.
  • Объём: десятки/сотни тысяч примеров.
  • Риск: модель может выучить артефакты синтетики (повторяющиеся фразы, логические ошибки).

3.2 Второй этап: дообучение на реальных данных (fine-tuning)

  • Используются только реальные данные (или смесь с сильным перевесом real).
  • Цель: скорректировать смещение, улучшить точность на реальных запросах.
  • Объём: несколько тысяч примеров (10–30% от общего датасета).
  • Важно: learning rate на втором этапе обычно ниже (1e-5 vs 1e-4), чтобы не разрушить выученные паттерны.

4. Стратегии смешивания: совместное обучение (joint training)

В каждом батче смешиваются real и synthetic примеры. Соотношение — гиперпараметр.

Рекомендуемое соотношение: 1 часть real : 3 части synthetic (25% real, 75% synthetic). Почему?

  • Слишком много real → модель переобучается на малом объёме, теряет обобщение.
  • Слишком много synthetic → модель игнорирует реальное распределение.

Пример батча (batch_size=32):

  • 8 real примеров
  • 24 synthetic примера

Можно использовать динамическое соотношение: на ранних эпохах больше synthetic, на поздних — больше real (curriculum learning).


5. Валидация: только на real holdout

Критическое правило: никогда не валидируйтесь на синтетических данных. Синтетика может быть сгенерирована той же моделью, что обучается, или содержать скрытые паттерны, которые модель выучит, но которые не переносятся на реальность.

Holdout — это отложенная выборка реальных данных (обычно 10–20% от всех real), которая не участвовала в обучении. Метрики считаются только на ней.

Если метрики на real holdout падают при добавлении синтетики — значит синтетика вредит (например, слишком шумная или нерепрезентативная). В таком случае нужно улучшать качество генерации синтетики или уменьшать её долю.


6. Метрики качества при комбинировании

МетрикаНа чём считаетсяЦель
Accuracy / F1Real holdoutОсновная метрика задачи
PerplexityReal holdoutПроверка, не переобучилась ли модель на синтаксис синтетики
Diversity (distinct n-grams)Synthetic trainСинтетика должна быть разнообразной, иначе модель заучит шаблоны
Faithfulness (для RAG)Real holdoutОтветы должны соответствовать контексту, а не выдумкам синтетики
Human evaluationReal sampleФинальная проверка качества

7. Инструменты для генерации и смешивания

  • LangChain / LlamaIndex — пайплайны генерации синтетических данных для RAG (синтез вопросов по документам).
  • Hugging Face Datasets — удобное смешивание датасетов (concatenate_datasets, interleave_datasets).
  • Weights & Biases / MLflow — отслеживание экспериментов с разными соотношениями.
  • NVIDIA NeMo / Google T5X — фреймворки для масштабного fine-tuning с поддержкой смешанных данных.

Пример кода на Python для смешивания батчей:

from datasets import Dataset, interleave_datasets
import torch
from torch.utils.data import DataLoader

real_ds = Dataset.from_dict({"text": real_texts})
synth_ds = Dataset.from_dict({"text": synth_texts})

# Соотношение 1:3 -> probabilities [0.25, 0.75]
mixed_ds = interleave_datasets([real_ds, synth_ds], probabilities=[0.25, 0.75])

dataloader = DataLoader(mixed_ds, batch_size=32, shuffle=True)

8. Риски и как их избежать

РискПричинаРешение
Переобучение на синтетикуСинтетика однообразнаИспользовать несколько источников генерации, добавлять шум
Смещение (bias)Синтетика копирует bias LLM-генератораФильтровать синтетику, балансировать по демографическим группам
Ухудшение на реальных данныхСинтетика не покрывает реальные сценарииУвеличивать долю real, улучшать качество синтетики (human-in-the-loop)
Концептуальный дрейфРеальные данные меняются со временемПериодически обновлять real датасет, перегенерировать синтетику

9. Best practices

  1. Начинайте с синтетики: сначала обучите baseline на большом объёме синтетических данных.
  2. Добавляйте real постепенно: увеличивайте долю real от 0% до 30% на втором этапе.
  3. Используйте real для валидации и early stopping: останавливайте обучение, когда метрика на real holdout перестаёт расти.
  4. Генерируйте синтетику с контролем качества: применяйте фильтры (длина, логическая непротиворечивость, разнообразие).
  5. Экспериментируйте с соотношением: запустите grid search по долям real (5%, 10%, 20%, 30%) на небольшом подмножестве.
  6. Документируйте происхождение данных: real и synthetic должны быть чётко размечены в датасете.

10. Пример из практики: fine-tuning агента для RAG

Допустим, мы обучаем агента, который по запросу пользователя ищет документы, вызывает API и формирует ответ. У нас есть 500 реальных диалогов (дорогие) и возможность сгенерировать 10 000 синтетических.

План:

  1. Сгенерировать 10 000 синтетических траекторий с помощью симуляции (LLM-агент + набор документов).
  2. Обучить модель на всех 10 000 синтетических примерах (3 эпохи, lr=1e-4).
  3. Смешать 500 real + 2000 synthetic (выборка из 10 000) в соотношении 1:4 (20% real).
  4. Дообучить ещё 2 эпохи с lr=5e-5, валидируясь на 100 real holdout.
  5. Если метрика (например, успешность выполнения задания) на holdout > 85% — стоп.

Результат: модель показывает 90% успешности на real тестах против 70% без синтетики и 80% только на real.


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

Задача: Обучить небольшую модель (например, DistilBERT или TinyLLaMA) отвечать на вопросы по технической документации, используя комбинацию real и synthetic данных.

Инструменты:

  • Hugging Face Transformers, Datasets, TRL (для fine-tuning).
  • LangChain для генерации синтетических Q&A пар по документам.
  • Weights & Biases для логирования.

Шаги:

  1. Собрать 200 реальных вопросов от коллег или из логов чата.
  2. Сгенерировать 2000 синтетических вопросов по той же документации с помощью LLM (GPT-4 или Llama 3).
  3. Создать датасет с меткой source (real/synthetic).
  4. Обучить модель в два этапа: сначала на всех synthetic (5 эпох), затем на смеси 1:3 (real:synthetic) ещё 3 эпохи.
  5. Оценить на real holdout (50 примеров) после каждого этапа.
  6. Сравнить с baseline (только real, только synthetic).

Ожидаемый результат: модель, обученная на смеси, покажет лучший F1 на real holdout, чем любая из моно-стратегий.


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

ВопросТема
680Fine-tuning LLM: стратегии и гиперпараметры
690Data augmentation для NLP
695Оценка качества генерации текста
705Синтетические данные для RAG: генерация и фильтрация
710Как избежать переобучения при fine-tuning
720Human-in-the-loop для улучшения датасета

Навигация