Синтетические данные с помощью LLM: датасеты для обучения и тестов
Продвинутое3 минРедакция Innovialabs
Коротко
LLM быстро создают примеры для обучения и тестов, но полезные синтетические данные требуют плана разнообразия, автоматической и ручной фильтрации и строгого отделения от eval-наборов; опорой остаются реальные данные.
Когда синтетические данные имеют смысл
Синтетические данные — это примеры, сгенерированные моделью, а не собранные у реальных пользователей. Они полезны, когда реальных данных мало, их дорого размечать или они слишком чувствительны:
- классификаторы: интенты, категории обращений, спам, особенно редкие классы;
- дообучение (fine-tuning): пары «инструкция — ответ» в вашей области, тоне и формате;
- eval-наборы: тестовые вопросы для RAG-системы или чат-бота до запуска;
- пограничные случаи: опечатки, смесь русского и узбекского, грубые сообщения, попытки prompt injection.
Реальные данные они не заменяют. Синтетика отражает то, что модель-генератор думает о ваших пользователях, а это не всегда то, что пользователи пишут на самом деле. Используйте реальные данные, чтобы задать основу, проверить и протестировать, а синтетику — чтобы закрыть пробелы.
Пайплайн генерации
- Определите цель: задачу, набор меток, формат вывода и как выглядит хороший пример.
- Соберите seed-примеры: небольшой набор реальных обезличенных примеров на каждый класс.
- Задайте оси вариативности: по каким измерениям примеры должны различаться.
- Генерируйте партиями с промптами, которые сочетают seed-примеры и оси.
- Фильтруйте автоматически, затем вручную проверяйте выборку.
- Удаляйте дубликаты и балансируйте классы.
- Проверяйте эффект: обучите или оцените модель и сравните с базовой линией на реальных данных.
Как обеспечить разнообразие
Главная беда наивной генерации — однообразие: запрос «напиши 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-примеры и проверяйте, что вывод не воспроизводит реальные имена, телефоны или документы.
- Проверьте условия лицензии модели-генератора: некоторые провайдеры ограничивают использование выходов для обучения конкурирующих моделей.