Клієнт приніс датасет із 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." }) Покроковий процес аугментації
- Аналіз датасету: оцінюємо розмір, різноманітність, типи інструкцій.
- Вибір методів: комбінуємо backtranslation і LLM-генерацію залежно від задачі.
- Генерація: створюємо парафрази за допомогою вибраних методів.
- Фільтрація: перевіряємо семантичну близькість та відкидаємо дублікати.
- Інтеграція: додаємо аугментовані приклади до навчальної вибірки.
Як контролювати якість аугментованих даних?
Кожну аугментовану пару перевіряємо на семантичну близькість до оригіналу. Використовуємо 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. Замовте аугментацію даних під ключ — отримайте готовий пайплайн і покращений датасет.







