Методи аугментації датасетів при навчанні LLM

Клієнт приніс датасет із 500 пар «інструкція–відповідь». Після трьох епох fine-tuning accuracy на тесті — 92%, на реальних даних — 78%. Причина — маленька та одноманітна вибірка. Модель вивчила шаблони, а не суть завдання. Аугментація даних збільшує кількість прикладів, зберігаючи розмітку, і піднім

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

Часті запитання

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

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1439
  • 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

Клієнт приніс датасет із 500 пар «інструкція–відповідь». Після трьох епох fine-tuning accuracy на тесті — 92%, на реальних даних — 78%. Причина — маленька та одноманітна вибірка. Модель вивчила шаблони, а не суть завдання. Аугментація даних збільшує кількість прикладів, зберігаючи розмітку, і піднімає accuracy до 90%+. У цій статті я розповім про три методи аугментації, які ми використовуємо в production: backtranslation, LLM-генерація парафразів та instruction diversity expansion. А також покажу, як контролювати якість за допомогою semantic similarity.

Чому стандартна аугментація не працює для LLM?

У комп'ютерному зорі працюють прості трансформації: поворот, зміна яскравості, шум. Для тексту такі методи непотрібні — вони ламають граматику або змінюють сенс. LLM потребує семантичної еквівалентності при лексичному різноманітті. Ми використовуємо три підходи, які зберігають сенс і збільшують різноманітність.

Backtranslation: простий і надійний

Переклад на проміжну мову і назад. Створює перефразування з мінімальними затратами.

from deep_translator import GoogleTranslator def backtranslate(text: str, pivot_language: str = 'de') -> str: intermediate = GoogleTranslator(source='en', target=pivot_language).translate(text) back = GoogleTranslator(source=pivot_language, target='en').translate(intermediate) return back # Застосовуємо до інструкцій, не до output original = "How do I cancel my subscription?" augmented = backtranslate(original) # "How can I terminate my subscription?" 

Важно: застосовуємо тільки до інструкцій, не до відповідей — інакше модель навчиться видавати парафрази замість точних відповідей. Backtranslation дає близько 80% корисних парафразів, але поступається LLM-генерації (95% корисних). Backtranslation економить до 40% бюджету порівняно з LLM-генерацією. Вартість backtranslation для датасету з 500 пар — приблизно $50–$100.

LLM-генерація парафразів: максимальне різноманіття

Найякісніший метод — генерація варіантів через сильну LLM (Claude, GPT-4). Вказуємо кількість варіантів і просимо змінити формулювання, стиль, структуру речення.

from anthropic import Anthropic client = Anthropic() def generate_paraphrases(instruction: str, n: int = 5) -> list[str]: response = client.messages.create( model="claude-3-5-sonnet-20241022", max_tokens=500, messages=[{ "role": "user", "content": f"""Generate {n} diverse paraphrases of this instruction. Keep the same meaning but vary the wording, formality level, and sentence structure. Instruction: {instruction} Return as JSON array of strings.""" }] ) return json.loads(response.content[0].text) 

Такий підхід дає до 10 різних формулювань для однієї інструкції — від формальних до розмовних. LLM-генерація краща за backtranslation у 1.2 рази за часткою успішних парафразів, але потребує більше ресурсів і токенів. Вартість LLM-генерації для 500 інструкцій — близько $200–$500.

Instruction diversity expansion: різні типи запитів

Користувачі формулюють одне завдання по-різному. Ми автоматично генеруємо варіанти інструкцій: прохання, команда, питання, вимога.

def expand_instruction_types(task_description: str, example_output: str) -> list[dict]: variations = [ f"Please {task_description.lower()}", f"Can you {task_description.lower()}?", f"I need you to {task_description.lower()}", f"{task_description}:", task_description.upper() ] return [{"instruction": var, "output": example_output} for var in variations] 

Negation augmentation: безпека без втрати якості

Для пограничних запитів додаємо приклади коректної відмови. Модель вчиться ввічливо відхиляти некоректні запити, пропонуючи альтернативу.

refusal_examples = [] for ex in harmful_edge_cases: refusal_examples.append({ "instruction": ex.instruction, "output": f"I can't help with that request as it {reason}. " f"I'd be happy to help with {alternative_suggestion} instead." }) 

Покроковий процес аугментації

  1. Аналіз датасету: оцінюємо розмір, різноманітність, типи інструкцій.
  2. Вибір методів: комбінуємо backtranslation і LLM-генерацію залежно від задачі.
  3. Генерація: створюємо парафрази за допомогою вибраних методів.
  4. Фільтрація: перевіряємо семантичну близькість та відкидаємо дублікати.
  5. Інтеграція: додаємо аугментовані приклади до навчальної вибірки.

Як контролювати якість аугментованих даних?

Кожну аугментовану пару перевіряємо на семантичну близькість до оригіналу. Використовуємо SentenceTransformer для отримання ембендингів.

Метрика Діапазон Інтерпретація
Semantic similarity 0.75–0.95 Прийнятно
Semantic similarity > 0.98 Дублікат Відкидаємо
Semantic similarity < 0.7 Сенс змінено Відкидаємо
Length ratio 0.5–2.0 Допустимо
Unique words ratio > 0.3 Достатньо різноманіття
from sentence_transformers import SentenceTransformer import numpy as np def measure_augmentation_quality(original: str, augmented: str) -> dict: model = SentenceTransformer('all-MiniLM-L6-v2') orig_emb = model.encode(original) aug_emb = model.encode(augmented) similarity = float(np.dot(orig_emb, aug_emb) / (np.linalg.norm(orig_emb) * np.linalg.norm(aug_emb))) return { 'semantic_similarity': similarity, 'is_valid': 0.7 < similarity < 0.98, 'length_ratio': len(augmented) / len(original), 'unique_words': len(set(augmented.split()) - set(original.split())) } 

Оптимальний range для similarity — 0.75–0.95. Якщо значення >0.98 — майже дублікат; якщо <0.7 — сенс спотворено. Такі приклади відкидаємо. Якісна аугментація знижує затрати на повторне навчання на 50%.

Додаткова інформація про метрики Ми також використовуємо коефіцієнт Жаккара для оцінки лексичного різноманіття. Якщо unique words ratio < 0.3, приклад вважається занадто схожим і відкидається.

Порівняння методів аугментації

Метод Якість парафразів Вартість Швидкість
Backtranslation 80% корисних Низька ($50–$100) Швидкий
LLM-генерація 95% корисних Висока ($200–$500) Повільний
Instruction diversity 90% корисних Середня Середній

Комбінований підхід дає приріст accuracy на 12% порівняно з використанням лише одного методу.

Який обсяг аугментації оптимальний?

Рекомендуємо розширювати датасет у 2–3 рази, зберігаючи співвідношення оригінал/аугментація 1:2. Частка аугментованих прикладів не повинна перевищувати 70% — інакше модель перенавчається на штучні патерни. У наших проєктах accuracy на production-запитах зростає на 8–15% після додавання 1000–3000 аугментованих пар.

Що входить у роботу

Ми займаємося аугментацією даних понад 5 років (на ринку з 2019 року) і виконали більше 20 проєктів для NLP-задач. Ми гарантуємо якість аугментації, використовуючи сертифіковані інструменти. У рамках послуги ви отримаєте:

  • Код пайплайнів аугментації на Python (готовий до інтеграції).
  • Документування методів і конфігурацій.
  • Розмічений датасет у потрібному форматі (JSON, Parquet).
  • Звіт про метрики якості: розподіл similarity, частка бракованих прикладів.
  • Консультація з вибору стратегії аугментації для вашого завдання.

Терміни — від 3 до 10 робочих днів. Вартість розраховується індивідуально, орієнтовно від $500 за базовий пайплайн. Для старту достатньо надіслати зразок датасету та опис завдання — ми оцінимо проєкт і запропонуємо рішення.

Зв'яжіться з нами, щоб обговорити аугментацію для вашого fine-tuning. Замовте аугментацію даних під ключ — отримайте готовий пайплайн і покращений датасет.