Аугментация данных для дообучения LLM

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Аугментация данных для дообучения LLM
Средняя
~3-5 рабочих дней
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1240
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1167
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    867
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1084
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    563
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    829

Аугментация данных для дообучения 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 на определённых паттернах.