Перейти к содержанию
Innovialabs

Синтетические данные с помощью LLM: датасеты для обучения и тестов

Продвинутое3 мин

Коротко

LLM быстро создают примеры для обучения и тестов, но полезные синтетические данные требуют плана разнообразия, автоматической и ручной фильтрации и строгого отделения от eval-наборов; опорой остаются реальные данные.

Когда синтетические данные имеют смысл

Синтетические данные — это примеры, сгенерированные моделью, а не собранные у реальных пользователей. Они полезны, когда реальных данных мало, их дорого размечать или они слишком чувствительны:

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

Реальные данные они не заменяют. Синтетика отражает то, что модель-генератор думает о ваших пользователях, а это не всегда то, что пользователи пишут на самом деле. Используйте реальные данные, чтобы задать основу, проверить и протестировать, а синтетику — чтобы закрыть пробелы.

Пайплайн генерации

  1. Определите цель: задачу, набор меток, формат вывода и как выглядит хороший пример.
  2. Соберите seed-примеры: небольшой набор реальных обезличенных примеров на каждый класс.
  3. Задайте оси вариативности: по каким измерениям примеры должны различаться.
  4. Генерируйте партиями с промптами, которые сочетают seed-примеры и оси.
  5. Фильтруйте автоматически, затем вручную проверяйте выборку.
  6. Удаляйте дубликаты и балансируйте классы.
  7. Проверяйте эффект: обучите или оцените модель и сравните с базовой линией на реальных данных.

Как обеспечить разнообразие

Главная беда наивной генерации — однообразие: запрос «напиши 100 жалоб клиентов» дает 100 вариаций одной и той же жалобы. Делайте разнообразие явным.

  • Варьируйте атрибуты систематически: персона, язык, длина, тон, канал, тема, сложность. Сэмплируйте комбинации и подставляйте их в каждый промпт.
  • Меняйте seed-примеры между партиями, чтобы модель не цеплялась за одни и те же.
  • Просите конкретные сценарии, а не общий текст: «постоянный клиент, заказ пришел поврежденным, пишет коротко с телефона».
  • Используйте несколько моделей-генераторов, если возможно: у каждой свой стиль.
  • Измеряйте разнообразие: смотрите кластеры эмбеддингов и пересечение n-грамм, проверяйте, что каждый класс покрывает несколько подтем.
import random

axes = {
    "persona": ["student", "small shop owner", "retiree", "IT specialist"],
    "language": ["Russian", "Uzbek (Latin)", "mixed Russian and Uzbek"],
    "tone": ["polite", "irritated", "very brief"],
    "length": ["one sentence", "three to four sentences"],
}

def make_spec():
    return {k: random.choice(v) for k, v in axes.items()}

Отсев некачественных примеров

Заметная часть сгенерированного окажется ошибочной, дублирующей или не по теме. Фильтруйте слоями:

  • Проверка формата: валидный JSON, обязательные поля, ограничения длины.
  • Дедупликация: удаление точных и почти точных дублей по эмбеддингам.
  • Проверка меток: отдельная модель или промпт классифицирует пример; если метка не совпала — пример убирается.
  • LLM-as-judge: оценка реалистичности и корректности по рубрике; оставляйте только то, что выше порога.
  • Ручная проверка: читайте случайную выборку из каждого класса. Если отбраковка большая — исправляйте промпт, а не ужесточайте фильтр.

Как избежать коллапса модели

Model collapse возникает, когда модели многократно обучаются на собственных выходах: редкие случаи исчезают, ответы становятся пресными и однообразными. Чтобы этого избежать:

  • всегда держите реальные данные в обучающей смеси;
  • не генерируйте данные моделью, дообученной на прошлой синтетике, поколение за поколением;
  • следите за сужением разнообразия: ответы короче, меньше разных формулировок, пропадают редкие классы;
  • отмечайте происхождение каждого примера полем provenance.

Как избежать утечки данных

Утечка делает результаты лучше, чем они есть.

  • Разделяйте генерацию train и eval: разные seed-примеры, промпты и, в идеале, разные модели-генераторы. Удаляйте дубли между сплитами.
  • Держите тестовый набор из реальных данных, из которого не выведен ни один синтетический пример. Финальные решения принимайте по нему.
  • Не допускайте утечки персональных данных: обезличивайте seed-примеры и проверяйте, что вывод не воспроизводит реальные имена, телефоны или документы.
  • Проверьте условия лицензии модели-генератора: некоторые провайдеры ограничивают использование выходов для обучения конкурирующих моделей.

Частые вопросы

На ранних этапах — да, это намного лучше, чем ничего. Перед запуском добавьте реальные вопросы пользователей: синтетические тесты обычно чище и проще реального трафика.

Поможем с этим

Если хотите не разбираться самим, а получить результат — этим мы занимаемся каждый день.

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.