Ви запускаєте fine-tuning LLM, але у вас лише кілька десятків тисяч прикладів. Ручна розмітка коштує сотні тисяч доларів і займає місяці. Ми вирішуємо це завдання за допомогою генерації синтетичних даних: вчительська модель (GPT-4, Claude) створює тисячі різноманітних інструкцій та відповідей, а ви потім донавчаєте свою модель. Такий підхід скорочує витрати на розмітку до 90% і дозволяє отримати датасет із потрібним розподілом за 2–4 тижні. Синтетична аугментація (LLM augmentation) — це не лише економія бюджету, але й контроль якості: ви керуєте стилем відповідей, складністю та доменом. На відміну від краудсорсингу, де якість анотацій нестабільна, тут кожен приклад проходить через LLM-суддю та вибіркову 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 генерує пари «питання клієнта — відповідь експерта». Пайплайн включає три кроки:
- Генерація інструкцій — моделювання можливих запитів користувачів.
- Генерація відповідей — з використанням релевантного контексту з вашої бази.
- Фільтрація — видалення дублікатів, перевірка довжини (токени), оцінка якості 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, складні домени |
Процес роботи
- Аналіз завдання — визначення домену, вимог до датасету, метрик якості.
- Підготовка seed-прикладів — збір 50–200 репрезентативних пар (можна ваші дані).
- Генерація синтетичного датасету — Self-Instruct + Evol-Instruct, 5 000–50 000 пар.
- Фільтрація та валідація — LLM-суддя + human-оцінка 10% вибірки.
- Документація — model card, виміри різноманітності, approval rate.
- Супровід — коригування промптів при необхідності, підтримка протягом місяця.
Терміни та вартість
Терміни залежать від обсягу датасету:
- 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. Зв'яжіться з нами — оцінимо ваш проект і запропонуємо оптимальну стратегію. Отримайте консультацію прямо зараз.







