English translation is not available yet. Showing Russian content.

Как вы генерируете synthetic данные для instruction tuning?

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

Synthetic data (синтетические данные) для instruction tuning (дообучения по инструкциям) — это искусственно созданные пары «инструкция — ответ», которые имитируют реальные пользовательские запросы. Основные методы: Self-Instruct (генерация инструкций с помощью самой LLM), Evol-Instruct (эволюционное усложнение инструкций) и прямой промпт сильной модели (GPT-4, Claude). Ключевая задача — фильтрация низкокачественных примеров, чтобы не ухудшить способности модели.

1. Термины: Synthetic data и Instruction tuning

  • Synthetic data — данные, созданные алгоритмически, а не собранные из реальных взаимодействий. Позволяют быстро получить размеченные датасеты для задач, где трудно собрать реальные примеры.
  • Instruction tuning — этап fine-tuning LLM, при котором модель обучается следовать инструкциям на парах «промпт → ответ». Цель — улучшить способность обобщать на новые задачи (zero-shot generalization).

Synthetic data решают проблему дефицита качественных инструкций: evaluation|ручная разметка тысяч примеров дорога и медленна. Генерация через LLM (особенно сильной) даёт масштабируемый способ получить корпус.

2. Self-Instruct: генерация инструкций через саму модель

Self-Instruct (Wang et al., 2022) — метод, при котором модель генерирует инструкции, используя свой же генеративный потенциал. Этапы:

  1. Задать seed-пул — небольшой набор ручных инструкций (например, «Напиши эссе о кошках», «Переведи на французский»).
  2. Из seed-пула случайно выбирают несколько инструкций и просят LLM сгенерировать новые (промпт вида: «Придумай новую задачу, похожую на эти примеры»).
  3. Сгенерированные инструкции фильтруют (убирают дубликаты, неинформативные, слишком простые).
  4. Для каждой инструкции LLM генерирует ответ (иногда вывод рассуждения).
  5. Повторяют итерации, получая тысячи пар.

Пример промпта (упрощённо):

Ты — помощник. Вот несколько примеров инструкций:
1. Объясни разницу между машинным обучением и глубоким обучением.
2. Напиши код на Python для сортировки списка.
Придумай 5 новых инструкций, которые могут быть полезны пользователю.

Self-Instruct лёгок в реализации, но качество инструкций ограничено возможностями самой модели. Если модель слабая, генерируются однотипные или нелогичные задания.

3. Evol-Instruct: эволюционное усложнение инструкций (WizardLM)

Evol-Instruct (Xu et al., 2023) — метод, который последовательно усложняет начальные инструкции через пять типов мутаций:

  • Add constraints («добавь условие» — «...используя только 100 слов»)
  • Deepening («углуби» — «...и приведи пример из реальной жизни»)
  • Concretizing («конкретизируй» — «...расскажи про метод градиентного спуска, а не про обучение в целом»)
  • Increase reasoning («увеличь рассуждения» — «...объясни пошагово»)
  • Complicate input («усложни вход» — «...с добавлением таблицы данных»)

Процесс многопроходный: каждую инструкцию эволюционируют несколько раз, получая сложные вариации. Ответы генерируются для исходной и для эволюционировавшей инструкции, затем сравниваются (требование: ответ должен покрывать обе). В итоге получают высококачественные, разнообразные пары.

Таблица сравнения Self-Instruct vs Evol-Instruct

ХарактеристикаSelf-InstructEvol-Instruct
Источник инструкцийSeed-пул + генерацияSeed + мутации
РазнообразиеСреднееВысокое (за счёт эволюции)
Сложность инструкцийФиксированнаяРастёт от шага к шагу
Качество ответовМожет страдатьОтветы подстраиваются под усложнение
Вычислительные затратыНизкиеВыше (несколько итераций)

4. Другие методы генерации synthetic data

  • Backtranslation — берут ответы и просят LLM придумать к ним инструкцию (обратный процесс). Полезен, когда есть корпус хороших ответов, но нет инструкций.
  • Data augmentation — модифицируют существующие инструкции (замена синонимов, перефразирование, объединение нескольких задач).
  • Chain-of-Thought generation — генерируют не только ответ, но и цепочку рассуждений для задачи, требующей логики.
  • Использование сильной LLM-оракула — прямое задание GPT-4 или Claude: «Сгенерируй 20 вопросов по теме {domain} с подробными ответами». Это даёт высокое качество, но дорого.

5. Фильтрация и контроль качества

Сырые synthetic данные содержат ошибки, нелогичные инструкции, повторы. Фильтрация обязательна. Методы:

  • Rule-based фильтрация: удаление инструкций короче N символов, содержащих нецензурную лексику, неправильную пунктуацию, шаблонные фразы.
  • Deduplication (дедупликация): Jaccard similarity, MinHash для удаления семантически одинаковых пар.
  • LLM-as-a-judge: просим отдельную модель (или ту же) оценить качество каждой пары по шкале (1-5) и отбрасываем низкие баллы. Критерии: полезность, понятность, сложность, отсутствие галлюцинаций.
  • Reward model (модель вознаграждения) — обученный на человеческих предпочтениях классификатор, который предсказывает, насколько хорош ответ. Отсеиваем пары с низкими скорами.

Пример простой фильтрации на Python

def filter_low_quality(pairs, min_length=10, min_score=3):
    filtered = []
    for instruction, response in pairs:
        if len(instruction) < min_length or len(response) < min_length:
            continue
        # предположим, есть функция judge_model.predict -> 1-5
        score = judge_model.predict(instruction, response)
        if score >= min_score:
            filtered.append((instruction, response))
    return filtered

6. Пайплайн генерации: полный цикл

Типовой пайплайн для synthetic data:

  1. Domain selection — выбрать область (медицина, юриспруденция, код).
  2. Seed creation — 50–100 вручную написанных инструкций высокого качества.
  3. ExpansionSelf-Instruct / Evol-Instruct / промпт GPT-4 порождает 10–100k новых инструкций.
  4. Response generation — для каждой инструкции LLM генерирует ответ (иногда несколько вариантов).
  5. Filtering — дедупликация, проверка длины, LLM-as-judge, удаление опасных инструкций.
  6. Balancing — контроль количества задач каждого типа (classification, generation, reasoning).
  7. Fine-tuning — дообучение модели на отфильтрованном наборе.

7. Практические соображения

  • Качество vs количество: лучше 10k отфильтрованных примеров, чем 100k мусора.
  • Дороговизна: вызовы GPT-4 для генерации и оценки стоят денег. Можно использовать opensource модели (Mistral, Llama) для дешёвой генерации и только оценку через сильную модель.
  • Домен: synthetic данные для общего чата и для специализированной области (например, юридические консультации) требуют разного seed и фильтрации.
  • Перекосы: если модель-генератор имеет bias, он перейдёт в synthetic data. Нужно проверять на чувствительные темы.
  • Итеративное улучшение: после fine-tuning на synthetic данных можно оценить модель на реальных задачах и дополнить dataset проблемными случаями (hard negative mining).

8. Инструменты и библиотеки

  • Argilla — платформа для аннотации и фильтрации synthetic data, встроенные pipeline.
  • Distilabel (от Argilla) — библиотека для синтеза данных с поддержкой Self-Instruct, Evol-Instruct, фильтрации.
  • Alpaca-LoRA — знаменитый датасет из 52k synthetic инструкций, сгенерированных через Self-Instruct из seed 175 (использовали text-davinci-003).
  • LIMA — подход с минимальным количеством (1000) тщательно отобранных синтетических пар, показал, что качество важнее количества.
  • InstructLab — фреймворк IBM для генерации synthetic data с участием сообщества.

Пример кода с использованием OpenAI API (упрощённо):

import openai

def generate_synthetic(domain, num_examples=10):
    prompt = f"""
    Ты — эксперт в {domain}. Сгенерируй {num_examples} разнообразных инструкций 
    для пользователей, которые хотят узнать что-то по этой теме. 
    Для каждой инструкции напиши подробный ответ.
    Формат: 
    Инструкция: ... 
    Ответ: ...
    """
    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.8
    )
    text = response["choices"][0]["message"]["content"]
    # парсинг инструкций и ответов
    return parse_to_pairs(text)

9. Оценка качества synthetic data

Конечная метрика — улучшение downstream performance (перплексия, accuracy, human evaluation) после fine-tuning на synthetic данных. Полезно проводить ablation study: дообучать модель на разных подмножествах (Self-Instruct vs Evol-Instruct, с фильтрацией и без) и сравнивать на бенчмарках (MMLU, HumanEval, MT-Bench).

Таблица: влияние фильтрации

DatasetРазмерMMLU (acc)MT-Bench (score)
Без фильтрации50k0.625.8
С фильтрацией (LLM-as-judge)30k0.676.4
С фильтрацией + dedup25k0.686.5

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

Задача: Сгенерировать synthetic датасет для instruction tuning модели на тему «Python для анализа данных».

Инструменты: Python, openai (или API любой LLM), библиотека distilabel (опционально).

Шаги:

  1. Создать seed-пул из 20 инструкций (например, «Напиши код для чтения CSV», «Объясни, как сделать pivot table»).
  2. Использовать Self-Instruct: GPT-4 генерирует 200 инструкций на основе seed.
  3. Для каждой инструкции GPT-4 генерирует ответ.
  4. Фильтр: удалить дубликаты (MinHash), отбросить пары с длиной инструкции < 10 символов.
  5. Фильтр LLM-as-judge (та же модель оценивает по шкале от 1 до 5, порог 4).
  6. Сохранить полученный датасет в формате JSONL.
  7. (Опционально) Fine-tune небольшую модель (например, Llama-3-8B) на этих данных и сравнить производительность на нескольких задачах до и после.

Ожидаемый результат: 100–150 качественных пар, которые можно использовать для улучшения способности модели отвечать на вопросы по Python.

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

ВопросТема
100Data Augmentation и генерация синтетических данных
150Fine-tuning LLM: методы и советы
200Instruction Tuning vs Prompt Engineering
250Оценка качества датасетов для обучения
300Метрики достоверности и безопасности ответов

Навигация