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

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Аугментація даних для дообчання LLM
Середній
~3-5 днів
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Аугментація даних для 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%) може зменшити розмаїття та привести до перенавчання на певних паттернах.