Клиент принёс датасет из 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-генерацией.
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 раза по доле успешных парафразов, но требует больше ресурсов и токенов.
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% полезных | Низкая | Быстрый |
| LLM-генерация | 95% полезных | Высокая | Медленный |
| Instruction diversity | 90% полезных | Средняя | Средний |
Какой объём аугментации оптимален?
Рекомендуем расширять датасет в 2–3 раза, сохраняя соотношение оригинал/аугментация 1:2. Доля аугментированных примеров не должна превышать 70% — иначе модель переобучается на искусственные паттерны. В наших проектах accuracy на production-запросах растёт на 8–15% после добавления 1000–3000 аугментированных пар.
Что входит в работу
Мы занимаемся аугментацией данных более 5 лет и выполнили более 20 проектов для NLP-задач. В рамках услуги вы получите:
- Код пайплайнов аугментации на Python (готов к интеграции).
- Документирование методов и конфигураций.
- Размеченный датасет в нужном формате (JSON, Parquet).
- Отчёт о метриках качества: распределение similarity, доля отбракованных примеров.
- Консультация по выбору стратегии аугментации для вашей задачи.
Сроки — от 3 до 10 рабочих дней. Стоимость рассчитывается индивидуально. Для старта достаточно прислать образец датасета и описание задачи — мы оценим проект и предложим решение.
Свяжитесь с нами, чтобы обсудить аугментацию для вашего fine-tuning. Закажите аугментацию данных под ключ — получите готовый пайплайн и улучшенный датасет.







