Аугментация данных для дообучения LLM
Аугментация данных для LLM отличается от аугментации для CV или классического NLP: нельзя просто повернуть текст или изменить яркость. Нужны методы, которые создают семантически эквивалентные, но лексически разнообразные примеры — не ломая смысл и не деградируя качество.
Методы аугментации
Backtranslation — перевод на промежуточный язык и обратно. Создаёт перефразировки с сохранением смысла:
from deep_translator import GoogleTranslator
def backtranslate(text: str, pivot_language: str = 'de') -> str:
"""English → German → English для создания парафраза"""
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?"
LLM-generated paraphrases — наиболее качественный метод:
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)
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() # Imperative
]
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."
})
Аугментация output'ов
def augment_long_outputs(output: str, model_client) -> list[str]:
"""Создание вариаций ответа разной длины и структуры"""
augmented = []
# Краткая версия
brief = model_client.summarize(output, max_words=50)
augmented.append(brief)
# Структурированная (с bullet points)
structured = model_client.restructure_with_bullets(output)
augmented.append(structured)
return augmented
Контроль качества аугментации
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()))
}
Цель аугментации — увеличить разнообразие формулировок при сохранении смысла. Оптимальный диапазон semantic similarity: 0.75-0.95. При similarity > 0.98 — почти дубликат, при < 0.7 — вероятно, изменился смысл.
Аугментация в 2-3x увеличивает датасет при разумном соотношении оригиналов и аугментированных примеров 1:2. Слишком большая доля аугментированных примеров (>70%) может снизить diversity и привести к overfitting на определённых паттернах.







