Аугментація даних для fine-tuning 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"""Створіть {n} різноманітних перефразувань цієї інструкції.
Збережіть той самий смисл, але змініть формулювання, рівень формальності та структуру речень.
Інструкція: {instruction}
Повернутися як JSON масив рядків."""
}]
)
return json.loads(response.content[0].text)
Instruction diversity expansion — розширення типів інструкцій:
def expand_instruction_types(task_description: str,
example_output: str) -> list[dict]:
"""Створення різних форматів інструкції для однієї задачі"""
variations = [
f"Будь ласка {task_description.lower()}",
f"Чи можете ви {task_description.lower()}?",
f"Мені потрібно, щоб ви {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"Я не можу допомогти з цим запитом, оскільки {reason}. "
f"Я з задоволенням допоможу з {alternative_suggestion}."
})
Аугментація 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%) може зменшити розмаїття та привести до перенавчання на певних паттернах.







