Генерація синтетичних даних для дообчання LLM

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Генерація синтетичних даних для дообчання LLM
Середній
~3-5 днів
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Генерація синтетичних даних для fine-tuning LLM

Синтетична генерація — це створення навчальних прикладів за допомогою сильнішої LLM (teacher model). Підхід "Self-Instruct" та його розвиток WizardLM/Evol-Instruct дозволяють сгенерувати тисячі якісних навчальних прикладів з невеликого seed датасету (100-200 прикладів).

Self-Instruct методологія

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"""Ось деякі приклади інструкцій для AI помічника:
{examples_str}

Сгенеруйте {n} НОВИХ різноманітних інструкцій в тій же області.
Вимоги:
- Кожна інструкція повинна бути унікальною та не повторювати приклади
- Змініть складність: деякі прості, деякі багатоступінчасті
- Включіть різні формати: питання, команди, завершення
- Повернутися як JSON масив рядків"""
        }]
    )
    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: Ускладнення інструкцій

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"""Перепишіть цю інструкцію, використовуючи цей метод: {method}

Оригінальна інструкція: {original}

Повернутися лише переписану інструкцію, нічого більше."""
        }]
    )
    return response.content[0].text.strip()

Генерація domain-specific даних

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')

Оцінювання синтетичних даних перед навчанням

Синтетичні дані потребують додаткової валідації:

  • Hallucination check: відповіді teacher моделі можуть містити фактичні помилки. Потрібна review domain-експертом вибірки.
  • Style bias: GPT-4 має характерний стиль — модель може вивчити "GPT-style" замість цільового стилю.
  • Diversity check: чи немає тематичних кластерів, які перепредставлені.

Для 5000+ синтетичних прикладів рекомендується людська review 5-10% вибірки з розрахунком approval rate. Якщо approval rate < 80%, потрібно поліпшити промпти генерації.