Что такое Text Augmentation с помощью LLM (генерация парафраз, изменение тональности)?
Краткий тезис
LLM-аугментация текста — это метод расширения обучающих или тестовых наборов данных за счёт генерации контролируемых модификаций исходных текстов с сохранением смыслового ядра. В отличие от классических подходов (синонимическая замена, back-translation), LLM позволяют тонко управлять лингвистическими параметрами: тональностью, стилем, полнотой пересказа. Основные применения — аугментация данных для классических NLP-моделей или дообучения самих LLM, особенно при несбалансированных классах или малом объёме размеченных данных.
2. Контроль качества: сохранение смысла
Автоматический контроль — критическая проблема. LLM могут «галлюцинировать» факты, добавлять или опускать важные детали. Методы валидации делятся на три уровня:
- Семантическая близость — вычисление косинусного сходства эмбеддингов (Sentence Transformers), или BERTScore. Порог >0.85 обычно считается приемлемым для парафраза. Для тональности допускается меньшее сходство, так как эмоциональный сдвиг меняет лексику сильнее.
- Соответствие фактам — использование модели NLI (Natural Language Inference) для проверки entailment: исходный текст должен entail (логически следовать) из сгенерированного и наоборот. Например, модель LaBSE или rubert-tiny2 для русского языка.
- Сохранение именованных сущностей — извлечение NER из обоих текстов (Natasha, spaCy) и проверка, что набор сущностей (PER, LOC, ORG, DATE) не изменился (допустимо синонимичное переименование, но не замена одного лица на другое).
Практический пайплайн отбраковки:
from sentence_transformers import SentenceTransformer, util
from transformers import pipeline
model_sim = SentenceTransformer('intfloat/multilingual-e5-small')
nli = pipeline('text-classification', model='cointegrated/rubert-tiny2-nli')
def is_valid_augmentation(original, augmented, sim_threshold=0.8):
emb1 = model_sim.encode(original, normalize_embeddings=True)
emb2 = model_sim.encode(augmented, normalize_embeddings=True)
sim = util.cos_sim(emb1, emb2).item()
if sim < sim_threshold:
return False
# проверка NLI
pair = f"{original} [SEP] {augmented}"
result = nli(pair)[0]
# label может быть 'ENTAILMENT' или 'CONTRADICTION'
if result['label'] != 'ENTAILMENT':
return False
return True
3. Риски: неконтролируемое изменение
Основные угрозы при использовании LLM для аугментации:
- Искажение распределения данных — LLM могут внести систематическое смещение: например, при парафразировании негативных отзывов часто удаляется часть инвективной лексики, и модель начинает генерировать более «вежливые» варианты, не характерные для реального датасета.
- Потеря редких признаков — модель может «сгладить» аномальные, но важные для детекции случаев языковые конструкции (например, специфические жаргонизмы или сложные грамматические ошибки из пользовательских текстов).
- Петля обратной связи при дообучении — если аугментированный датасет используется для дообучения той же LLM, то на последующих итерациях модель будет усиливать собственные же шаблоны, что ведёт к model collapse.
- Нарушение конфиденциальности — при генерации аугментированных копий на основе персональных данных (например, медицинских записей) LLM может случайно воспроизвести точные PII, если не настроена фильтрация.
Меры защиты:
- Использование низкой температуры (0.1–0.3) для уменьшения вариативности.
- Чёткий запрет в системном промпте на «галлюцинации» и добавление фактов.
- Пост-обработка: сравнение NER, поиск точных совпадений с исходником (NGram overlap <0.9).
- Ограничение числа аугментированных экземпляров на один исходный текст (например, не больше 5) и баланс с оригинальными данными.
4. Применение: балансировка классов
Одна из наиболее востребованных задач — балансировка классов в датасетах для классификации (например, тональности, интентов, токсичности). Когда положительных примеров много, а негативных — мало, LLM генерирует дополнительные негативные тексты на основе существующих позитивных (с инверсией тональности) или наоборот.
Пример практической задачи: классификатор отзывов на русском языке, где класс «негативный» составляет всего 1000 примеров, а «позитивный» — 10000. С помощью LLM можно:
- Взять 2000 случайных позитивных отзывов.
- Для каждого промптом «Перепиши так, чтобы отзыв стал негативным, сохранив предмет и основные аспекты».
- Проверить качество (семантическое сходство с оригиналом ≤0.7, но entailment высокий).
- Добавить 2000 валидных негативных текстов к исходным, доведя баланс до 3000/10000.
Эффективность: модели, обученные на аугментированных датасетах, часто показывают прирост F1 на 5–15% (в зависимости от задачи и архитектуры). Однако важно следить, чтобы синтетические данные не «зашумляли» границу классов — рекомендуется смешивать аугментированные и реальные примеры в пропорции не более 1:2.
5. Пет-проект для закрепления
Задача: Разработать модуль аугментации для датасета отзывов (например, SentiRuEval или любой открытый). Реализовать генерацию парафраз и смены тональности с контролем качества и балансировкой классов.
Инструменты:
- Python, LangChain (или transformers напрямую)
- LLM через API: YandexGPT, GigaChat, OpenAI (для демонстрации)
- Библиотеки: sentence-transformers, rubert-tiny2 для NLI, scikit-learn для тренировки классификатора.
- Датасет: любой csv с колонками
text, label(2–3 класса).
Шаги:
- Загрузить датасет, разделить на классы.
- Определить дисбаланс: для каждого класса с недостатком примеров выбрать pool исходных текстов (из других классов или того же).
- Для каждого выбранного текста с помощью LLM сгенерировать N (например, 3) вариантов:
- Если класс-донор совпадает с целевым — только парафраз.
- Если класс-донор противоположный — смена тональности.
- Пропустить через пайплайн валидации: отсеять с семантическим сходством < 0.75 или NLI-противоречием.
- Обучить классификатор (например, логистическая регрессия на эмбеддингах BERT) на исходном датасете и на расширенном.
- Сравнить F1-score на тестовом наборе.
Ожидаемый результат:
- Скрипт, который принимает датасет и параметры (target_label, augmentation_count_per_sample) и возвращает расширенный датасет.
- Отчёт с улучшением метрик для минорного класса (например, +0.12 F1 для негативного класса).
- Демонстрация трёх примеров успешной и трёх примеров неудачной аугментации (с анализом причин отбраковки).
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 938 | Data Augmentation — классические методы (синонимы, back-translation) |
| 940 | Balancing Datasets — oversampling/undersampling без генерации |
| 942 | LLM-based synthetic data generation — общий принцип |
Навигация
- Предыдущий: 940
- Следующий: 942
- Индекс: 00. Индекс разборов