English translation is not available yet. Showing Russian content.

Как вы генерируете синтетический датасет для instruction tuning? Self-instruct, Evol-Instruct?

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

Синтетические датасеты для instruction tuning создаются с помощью LLM, которая генерирует пары «инструкция → ответ» по заданному шаблону. Self-instruct — базовый метод: LLM сама придумывает инструкции, классифицирует их и генерирует ответы. Evol-Instruct (WizardLM) улучшает качество за счёт мутации инструкций — усложнения, конкретизации и ветвления. Оба метода требуют тщательной фильтрации (LLM-as-judge, правила, дедупликация) для удаления шума и небезопасного контента.


1. Термин: Instruction tuning (дообучение по инструкциям)

Instruction tuning — это этап дообучения LLM на парах «инструкция → ответ», чтобы модель научилась следовать разнообразным командам. В отличие от pre-training (обучение на сыром тексте), instruction tuning формирует способность понимать намерение пользователя и давать полезный ответ.

Зачем нужен dataset|синтетический датасет

  • evaluation|Ручная разметка дорога и медленна (нужны тысячи примеров).
  • LLM (например, GPT-4) уже умеют генерировать качественные инструкции и ответы.
  • Синтетические данные позволяют быстро создавать датасеты для новых доменов или задач.

Проблема LLM может генерировать однотипные или неверные примеры, поэтому нужны методы, повышающие разнообразие и качество.


2. Self-instruct: базовый метод

Self-instruct (Wang et al., 2022) — первый популярный подход к автоматической генерации instruction-tuning данных. Процесс состоит из нескольких шагов:

  1. Seed-примеры — небольшой набор (например, 175) вручную написанных инструкций с ответами, покрывающих разные типы задач (классификация, генерация, извлечение и т.д.).
  2. Генерация инструкций — LLM получает seed-примеры и промпт «Придумай новую инструкцию, похожую на эти». Генерируется N новых инструкций.
  3. Классификация по типу — каждая инструкция относится к одному из типов (например, «да/нет», «список», «текст»). Это нужно для выбора правильного формата ответа.
  4. Генерация ответов — для каждой инструкции LLM генерирует ответ, используя промпт, специфичный для типа (например, «Ответь одним словом»).
  5. Фильтрация — удаляются дубликаты, слишком короткие/длинные инструкции, инструкции с нецензурной лексикой, а также те, где ответ не соответствует типу.
  6. Итерация — новые качественные пары добавляются в пул seed, и процесс повторяется (обычно 3–5 итераций).

Результат датасет из тысяч пар. Self-instruct лёгок в реализации, но страдает от низкого разнообразия и «зацикливания» на популярных темах.


3. Evol-Instruct: мутация инструкций

Evol-Instruct (WizardLM, Xu et al., 2023) — улучшение Self-instruct, где инструкции не генерируются с нуля, а мутируют из существующих. Основные типы мутаций:

  • Усложнение (deepening) — добавление ограничений, условий, требований к формату.
    Пример: «Напиши эссе» → «Напиши эссе объёмом 500 слов, используя не менее 3 научных источников, в формате APA».
  • Конкретизация (concretizing) — замена абстрактных терминов на конкретные.
    Пример: «Объясни концепцию» → «Объясни концепцию квантовой запутанности на примере двух фотонов».
  • Ветвление (branching) — создание под-инструкций, которые расширяют исходную.
    Пример: «Переведи текст» → «Переведи текст на французский, затем напиши краткое содержание на русском».

Процесс

  1. Берётся исходная инструкция (из seed или предыдущей итерации).
  2. LLM получает промпт с описанием мутации и генерирует новую инструкцию.
  3. Новая инструкция проверяется на качество (LLM-as-judge) — не стала ли она бессмысленной или слишком сложной.
  4. Для каждой новой инструкции генерируется ответ (обычно той же LLM или более сильной моделью).
  5. Итерации повторяются 5–10 раз, на каждом шаге отбираются лучшие мутации.

Преимущества Evol-Instruct

  • Высокое разнообразие инструкций.
  • Естественное усложнение задач, что улучшает способность модели справляться с трудными запросами.
  • Лучшее покрытие редких типов инструкций.

Недостатки риск генерации невыполнимых инструкций (например, «напиши роман из 1000 страниц за 1 минуту»), требуется тщательная фильтрация.


4. Фильтрация качества: LLM-as-judge и правила

Даже лучшие методы генерации дают шум. Фильтрация — ключевой этап.

Методы фильтрации

МетодОписаниеПример
LLM-as-judgeLLM оценивает качество пары по шкале (1–10) или даёт бинарную оценку (ok/not ok). Отбрасываются пары с оценкой <7.Промпт: «Оцени, насколько инструкция чёткая, а ответ полный. Поставь оценку 1–10».
Правила (rule-based)Удаление по длине (инструкция <3 слов или >200 слов), по наличию запрещённых слов, по дубликатам (cosine similarity >0.9).if len(instruction.split()) < 3: skip
ДедупликацияУдаление семантически похожих инструкций (например, с помощью эмбеддингов и кластеризации).Использовать sentence-transformers для вычисления косинусного сходства.
Проверка выполнимостиLLM отвечает на вопрос «Можно ли выполнить эту инструкцию?» (для Evol-Instruct).Промпт: «Является ли эта инструкция реалистичной и выполнимой? Ответь да/нет».

Рекомендация комбинировать LLM-as-judge (для тонкой оценки) с правилами (для быстрого отсева). Использовать более сильную модель (GPT-4, Claude) в качестве judge, если бюджет позволяет.


5. Сравнение Self-instruct и Evol-Instruct

ХарактеристикаSelf-instructEvol-Instruct
Источник инструкцийГенерация с нуля на основе seedМутация существующих инструкций
РазнообразиеСреднее (зацикливание на популярных темах)Высокое (мутации создают редкие комбинации)
Сложность инструкцийОднородная, часто простыеПрогрессивно усложняются
Количество итераций3–55–10
Риск шумаУмеренный (несоответствие ответа типу)Высокий (невыполнимые инструкции)
Вычислительные затратыНизкие (одна генерация на пару)Высокие (много мутаций и проверок)
Известные датасетыAlpaca (52k), Dolly (15k)WizardLM (70k), Evol-Instruct-70k

Когда что использовать

  • Self-instruct — для быстрого прототипирования, когда нужно получить датасет за несколько часов.
  • Evol-Instruct — для production-систем, где требуется высокое качество и разнообразие (например, для обучения агентов).

6. Дополнительные методы генерации

Помимо двух основных, существуют другие подходы:

  • Backtranslation — для задач генерации (например, суммаризация): берём готовый ответ, просим LLM придумать к нему инструкцию. Полезно, когда есть корпус ответов, но нет инструкций.
  • Unnatural Instructions (Google, 2022) — генерация инструкций с помощью шаблонов и подстановки сущностей (entities). Даёт высокое разнообразие, но требует ручного проектирования шаблонов.
  • Orca-style (progressive learning) — Microsoft Orca (2023) использует «прогрессивное обучение»: сначала генерируются простые инструкции, затем модель дообучается на них, и на следующем шаге более сложные инструкции генерируются уже улучшенной моделью. Это повышает качество итеративно.
  • Self-QA — для RAG: на основе документа генерируются вопрос-ответные пары, которые затем используются для instruction tuning retrieval-агента.

7. Практические рекомендации

  1. Выбор базовой LLM для генерации используйте самую сильную доступную модель (GPT-4, Claude 3 Opus, Llama 3 70B). Качество генерации напрямую влияет на качество датасета.
  2. Seed-примеры тщательно подбирайте 100–200 примеров, покрывающих все типы задач, которые нужны в вашем сценарии. Плохой seed → плохой датасет.
  3. Количество итераций для Self-instruct 3–5 итераций достаточно; для Evol-Instruct 5–10. Больше итераций увеличивает разнообразие, но растёт риск шума.
  4. Баланс разнообразия после генерации проверьте распределение инструкций по темам (например, с помощью кластеризации эмбеддингов). Если есть перекос — добавьте seed-примеров из недостающих категорий.
  5. Фильтрация не жалейте времени на фильтрацию. Лучше иметь 10k качественных пар, чем 50k с шумом.
  6. Оценка датасета после генерации проведите human evaluation на 100–200 случайных парах. Если >10% пар признаны некачественными — улучшайте фильтрацию или меняйте промпты.

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

  • datasets (Hugging Face) — для хранения и загрузки датасетов.
  • trl (Transformer Reinforcement Learning) — содержит утилиты для instruction tuning (SFTTrainer).
  • Axolotl — фреймворк для fine-tuning, поддерживает синтетические датасеты.
  • LLaMA-Factory — удобный интерфейс для генерации и обучения.
  • OpenAI API / vLLM — для генерации данных с использованием GPT-4 или open-source моделей.
  • Sentence-Transformers — для дедупликации по эмбеддингам.

Пример кода для генерации одной инструкции через Self-instruct (упрощённо):

import openai

def generate_instruction(seed_examples: list[str]) -> str:
    prompt = f"""Придумай новую инструкцию, похожую на эти примеры.
Примеры:
{chr(10).join(seed_examples[:5])}

Новая инструкция:"""
    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.8,
        max_tokens=100
    )
    return response.choices[0].message.content.strip()

9. Проблемы и ограничения

  • Переобучение на шум если фильтрация слабая, модель выучит неверные паттерны (например, отвечать «Я не знаю» на сложные вопросы).
  • Bias (смещение): LLM-генератор может воспроизводить свои собственные предубеждения (гендерные, культурные). Нужно проверять датасет на fairness.
  • Safety (безопасность): синтетические инструкции могут содержать вредные запросы (например, «как взломать систему»). Используйте фильтрацию по ключевым словам и LLM-as-judge для безопасности.
  • Вычислительные затраты генерация 50k пар через GPT-4 может стоить сотни долларов. Для экономии используйте open-source модели (Mistral, Llama) с vLLM.

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

Задача Создать синтетический датасет для instruction tuning агента, который отвечает на вопросы по документации Python.

Инструменты Python, OpenAI API (или vLLM с Mistral-7B), Hugging Face datasets, sentence-transformers.

Шаги:

  1. Соберите 50 seed-примеров: вопросы по Python (например, «Как открыть файл?», «Что такое декоратор?») с ответами из официальной документации.
  2. Реализуйте Self-instruct: сгенерируйте 500 новых инструкций с помощью GPT-4 (или Mistral-7B). Используйте промпт с seed-примерами.
  3. Примените Evol-Instruct: возьмите 100 лучших инструкций из шага 2, для каждой сгенерируйте 3 мутации (усложнение, конкретизация, ветвление). Получите ~300 новых инструкций.
  4. Фильтрация:
    • Удалите дубликаты (cosine similarity >0.85).
    • Используйте LLM-as-judge (та же модель) для оценки качества (отбросьте <7).
    • Проверьте на безопасность (удалите инструкции с нецензурной лексикой).
  5. Соберите финальный датасет (цель: 500–1000 пар).
  6. Обучите небольшую модель (например, Llama-3-8B) с помощью SFTTrainer из библиотеки trl.
  7. Оцените: сравните ответы обученной модели с базовой на 50 тестовых вопросах (human evaluation).

Ожидаемый результат Рабочий пайплайн генерации синтетических данных, датасет в формате Hugging Face, обученная модель, которая даёт более точные ответы по Python, чем базовая.


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

ВопросТема
672Проектирование RAG-системы (синтетические данные для retrieval)
675Оценка качества retrieval (метрики для датасета)
680Fine-tuning для RAG (instruction tuning как часть пайплайна)
682Архитектура AI-агентов (instruction tuning для агентов)
684Оценка агентных систем (качество датасета влияет на оценку)

Навигация