Генерация синтетических данных для дообучения LLM под ключ

Вы запускаете fine-tuning LLM, но у вас всего несколько десятков тысяч примеров. Ручная разметка стоит сотни тысяч долларов и занимает месяцы. Мы решаем эту задачу с помощью генерации синтетических данных: учительская модель (GPT-4, Claude) создаёт тысячи разнообразных инструкций и ответов, а вы зат

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1440
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    997
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1264
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    712
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1002

Вы запускаете fine-tuning LLM, но у вас всего несколько десятков тысяч примеров. Ручная разметка стоит сотни тысяч долларов и занимает месяцы. Мы решаем эту задачу с помощью генерации синтетических данных: учительская модель (GPT-4, Claude) создаёт тысячи разнообразных инструкций и ответов, а вы затем дообучаете свою модель. Такой подход сокращает затраты на разметку до 90% и позволяет получить датасет с нужным распределением за 2–4 недели. Синтетическая аугментация (LLM augmentation) — это не только экономия бюджета, но и контроль качества: вы управляете стилем ответов, сложностью и доменом. В отличие от краудсорсинга, где качество аннотаций нестабильно, здесь каждый пример проходит через LLM-judge и выборочную human-оценку. Результат — датасет, который улучшает метрики модели на 15–20% без дополнительных затрат.

Как Self-Instruct масштабирует датасет?

Метод Self-Instruct, предложенный исследователями из Университета Вашингтона, требует всего 20–200 seed-примеров. Из них LLM генерирует новые инструкции, затем ответы, и повторяет процесс итеративно. За 3–5 итераций из 100 seed-примеров получается 2 000–5 000 пар. Мы адаптировали процесс под русскоязычные данные и добавили фильтр качества (LLM-судья), который отсеивает повторы и нерелевантные примеры.

from anthropic import Anthropic import json client = Anthropic() SEED_EXAMPLES = [ {"instruction": "Объясни термин из ML", "output": "..."}, {"instruction": "Напиши SQL запрос для...", "output": "..."}, # 20-200 seed примеров ] def generate_new_instructions(seed_examples: list, n: int = 20) -> list[str]: """Генерация новых инструкций на основе seed примеров""" examples_str = "\n".join([f"- {ex['instruction']}" for ex in seed_examples[:10]]) response = client.messages.create( model="claude-3-5-sonnet-20241022", max_tokens=2000, messages=[{ "role": "user", "content": f"""Here are some example instructions for an AI assistant: {examples_str} Generate {n} NEW diverse instructions in the same domain. Requirements: - Each instruction should be unique and not repeat the examples - Vary complexity: some simple, some multi-step - Include different formats: questions, commands, completions - Return as JSON array of strings""" }] ) return json.loads(response.content[0].text) def generate_response(instruction: str, context: str = None) -> str: """Генерация идеального ответа для инструкции""" prompt = f"Instruction: {instruction}" if context: prompt = f"Context: {context}\n\n{prompt}" response = client.messages.create( model="claude-3-5-sonnet-20241022", max_tokens=1000, system="You are an expert assistant. Provide accurate, helpful, and complete responses.", messages=[{"role": "user", "content": prompt}] ) return response.content[0].text 

Как Evol-Instruct усложняет инструкции?

Evol-Instruct, реализованный в WizardLM, берёт существующие примеры и применяет методы усложнения: добавление ограничений, углубление, конкретизация, увеличение числа шагов рассуждения. Например, простой вопрос «Расскажи про React» превращается в «Сравни React и Vue для крупного enterprise-приложения с учётом SSR и code-splitting». Это повышает качество fine-tuning, особенно для задач рассуждения.

EVOLUTION_METHODS = [ "Add constraints: add a specific constraint or requirement to the instruction", "Deepening: ask for more depth or detail in the response", "Concretizing: replace general concepts with specific examples", "Increased reasoning steps: require multi-step reasoning", "Complicate input: add more complex or ambiguous input", ] def evolve_instruction(original: str) -> str: """Усложнение инструкции одним из методов""" method = random.choice(EVOLUTION_METHODS) response = client.messages.create( model="claude-3-5-sonnet-20241022", max_tokens=200, messages=[{ "role": "user", "content": f"""Rewrite this instruction using this method: {method} Original instruction: {original} Return only the rewritten instruction, nothing else.""" }] ) return response.content[0].text.strip() 

Как мы оцениваем качество синтетических данных?

Мы внедрили двухуровневую валидацию: автоматический LLM-судья (на базе GPT-4) оценивает каждый пример по шкале 0–1, затем случайные 10% выборки проверяет человеческий эксперт. Если approval rate по human-оценке ниже 85% — корректируем генерацию. Дополнительно замеряем разнообразие (distinct n-grams) и длину в токенах, чтобы избежать однотипности.

Подробнее о фильтрации с помощью LLM-судьи LLM-судья принимает на вход пару (инструкция, ответ) и возвращает оценку от 0 до 1. Порог отсечения — 0.7. Если оценка ниже, пример исключается. Это снижает риск галлюцинаций и дубликатов. Мы также используем дедупликацию на основе эмбеддингов с cosine similarity > 0.9.

Как мы генерируем данные под ваш домен?

Для domain-specific задач мы добавляем контекст: базу знаний, API-спецификации, корпоративные гайды. Например, для дообучения чат-бота техподдержки: загружаем FAQ и логи звонков, LLM генерирует пары «вопрос клиента — ответ эксперта». Пайплайн включает три шага:

  1. Генерация инструкций — моделирование возможных запросов пользователей.
  2. Генерация ответов — с использованием релевантного контекста из вашей базы.
  3. Фильтрация — удаление дубликатов, проверка длины (токены), оценка качества LLM-судьёй.
def generate_domain_dataset(domain: str, n_examples: int, output_path: str): """Генерация датасета для конкретного домена""" examples = [] for i in range(n_examples): # Шаг 1: Генерация разнообразной инструкции instruction = generate_instruction_for_domain(domain) # Шаг 2: Генерация ответа response = generate_response(instruction) # Шаг 3: Качественный фильтр (LLM-judge) quality_score = judge_quality(instruction, response) if quality_score >= 0.7: examples.append({ "instruction": instruction, "output": response, "quality_score": quality_score, "generated_by": "claude-3-5-sonnet-20241022" }) if (i + 1) % 100 == 0: print(f"Generated {i+1}/{n_examples}, kept {len(examples)}") with open(output_path, 'w') as f: for ex in examples: f.write(json.dumps(ex, ensure_ascii=False) + '\n') 

Сравнение методов генерации

Метод Преимущества Когда использовать
Self-Instruct Быстрое масштабирование из малого числа seed Начальный датасет, общие домены
Evol-Instruct Усложнение инструкций, улучшение рассуждений Задачи с high-level reasoning, сложные домены

Процесс работы

  1. Анализ задачи — определение домена, требований к датасету, метрик качества.
  2. Подготовка seed-примеров — сбор 50–200 репрезентативных пар (можно ваши данные).
  3. Генерация синтетического датасета — Self-Instruct + Evol-Instruct, 5 000–50 000 пар.
  4. Фильтрация и валидация — LLM-судья + human-оценка 10% выборки.
  5. Документация — model card, замеры разнообразия, approval rate.
  6. Сопровождение — корректировка промптов при необходимости, поддержка в течение месяца.

Сроки и стоимость

Сроки зависят от объёма датасета:

  • 1 000–10 000 примеров: от 1 до 3 недель
  • 10 000–100 000 примеров: от 3 до 6 недель

Стоимость рассчитывается индивидуально — она включает API-затраты, работу инженера и валидацию. В среднем синтетика обходится в 10–20% от стоимости ручной разметки аналогичного объёма. Гарантируем качество: approval rate не ниже 85% по результатам human-оценки.

Типичные ошибки при генерации синтетики

  • Overfitting на стиль учителя — модель копирует тон GPT-4 вместо целевого. Решение: mix with real data, добавляйте примеры из вашего домена.
  • Недостаточное разнообразие — все инструкции похожи. Решение: контролируйте тематическое распределение, используйте Evol-Instruct.
  • Галлюцинации фактов — особенно в domain-specific данных. Решение: вводите контекстные фильтры и ручную проверку.

Мы имеем 5+ лет опыта в NLP и MLOps, выполнили более 50 проектов по генерации синтетических данных для LLM. Свяжитесь с нами — оценим ваш проект и предложим оптимальную стратегию. Получите консультацию прямо сейчас.