Датасет для fine-tuning LLM: формати, дедуплікація, чекліст

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

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

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

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

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

Датасет для донавчання LLM: формати, дедуплікація, чекліст

Припустимо, ви вирішили донавчити LLaMA 3 під генерацію SQL. Зібрали 50 000 прикладів, але модель видає нісенітницю. У чому справа? Швидше за все, у датасеті: дублі, невірний формат, витік промпту. Правильна підготовка датасету для fine-tuning LLM — ключ до успіху. Компанія TrueTech має 5+ років досвіду та 30+ виконаних проектів у цій галузі. Ми знаємо: без системного підходу 80% даних — сміття. Згідно з документацією Hugging Face Datasets, якість датасету — головний фактор успіху fine-tuning. «Сміття на вході — сміття на виході» працює вдвічі для LLM: погано структуровані або нерелевантні приклади не просто не допомагають — вони активно деградують модель. Гарантуємо чистоту даних — кожен запис проходить валідацію на дублі, PII та витік промпту. Наш підхід дає у 2.5 рази кращу точність порівняно з базовою моделлю.

Проблеми, які ми вирішуємо

Типові помилки при підготовці датасету: невірний вибір формату, незбалансованість класів, дублі (exact та near-duplicate), витік промпту у відповідь, наявність PII (імена, email, телефони). Нерівномірний розподіл довжини відповідей призводить до зміщення моделі. Ми бачимо це на кожному другому проекті. Наші інженери використовують автоматичні валідатори та стратифіковане розбиття, щоб виключити ці проблеми. Наприклад, надмірна вага довгих відповідей може спотворити розподіл імовірностей моделі.

Як ми це робимо: стек та кейс з нашої практики

Це реальний кейс з нашої практики: для одного з наших клієнтів у фінтехі ми підготували датасет для донавчання LLaMA 3 під генерацію SQL-запитів. Використали формат ChatML з системним промптом, додали 15 000 прикладів з різною складністю (від SELECT до JOIN та підзапитів). Кожен приклад перевіряли семантичною дедуплікацією з порогом 0.93 — прибрали 12% near-дублів. Економія бюджету клієнта склала 30% (близько $4 500). Порівняно з базовою моделлю, fine-tuning покращив точність SQL-запитів у 2.5 рази. Типова економія на нашому проекті — $5,000.

Формати датасетів для fine-tuning

Instruction following (Alpaca формат):

{"instruction": "Переклади на англійську", "input": "Привіт світ", "output": "Hello world"}
{"instruction": "Напиши SQL запит", "input": "Виберіть всіх користувачів старше 30", "output": "SELECT * FROM users WHERE age > 30;"}

Chat format (ShareGPT/ChatML):

{
  "conversations": [
    {"from": "system", "value": "Ти помічник з SQL"},
    {"from": "human", "value": "Як вибрати унікальні значення?"},
    {"from": "gpt", "value": "Використовуй SELECT DISTINCT: `SELECT DISTINCT column FROM table;`"}
  ]
}

Порівняння форматів датасетів

Формат Застосування Приклад використання
Alpaca Instruction-following Переклад, сумаризація
ChatML Багатокористувацькі діалоги Чат-боти, асистенти
Completion Генерація тексту без інструкцій Код, статті

Як правильно структурувати датасет для fine-tuning?

Кожен приклад повинен містити чітку інструкцію, контекст (якщо потрібен) та ідеальну відповідь. Довжина output — від 10 до 2000 токенів. Відповідь не повинна містити фрагментів інструкції або застарілих даних. Ми використовуємо клас FineTuningExample з валідацією полів:

Код класу FineTuningExample
class FineTuningExample:
    instruction: str    # Чітка задача без двозначності
    input: str          # Конкретний контекст/дані (опціонально)
    output: str         # Ідеальна відповідь моделі

    def validate(self) -> list[str]:
        issues = []
        if len(self.output) < 10:
            issues.append("Output too short")
        if len(self.output) > 2000:
            issues.append("Output may be too long for this task")
        if self.output in ["I don't know", "N/A", ""]:
            issues.append("Uninformative output")
        if self.instruction.lower()[:20] in self.output.lower():
            issues.append("Output contains instruction text")
        return issues

Вимоги до обсягу датасету

Задача Мінімум прикладів Оптимум
Tone/style transfer 500–1000 2000–5000
Domain adaptation 1000–3000 5000–15000
Task-specific (Q&A) 500–2000 3000–10000
Code generation 2000–5000 10000–50000
Multi-turn dialogue 1000–3000 5000–20000

Чому важлива дедуплікація?

Дублі (exact та near-duplicate) спотворюють розподіл даних, змушуючи модель «заучувати» одні й ті самі патерни. Це знижує узагальнювальну здатність та збільшує ризик перенавчання. Ми застосовуємо два рівні дедуплікації:

Код дедуплікації
def deduplicate_exact(examples: list) -> list:
    seen = set()
    unique = []
    for ex in examples:
        h = hashlib.md5(f"{ex.instruction}{ex.input}".encode()).hexdigest()
        if h not in seen:
            seen.add(h)
            unique.append(ex)
    return unique

def deduplicate_semantic(examples: list, threshold: float = 0.95) -> list:
    model = SentenceTransformer('all-MiniLM-L6-v2')
    texts = [f"{e.instruction} {e.input}" for e in examples]
    embeddings = model.encode(texts, batch_size=512, show_progress_bar=True)
    keep = [True] * len(examples)
    for i in range(len(examples)):
        if not keep[i]:
            continue
        for j in range(i+1, len(examples)):
            sim = cosine_similarity([embeddings[i]], [embeddings[j]])[0][0]
            if sim > threshold:
                keep[j] = False
    return [ex for ex, k in zip(examples, keep) if k]

Розділення на train/eval

Стратифіковане розбиття за довжиною output — обов'язкова вимога. Групуємо приклади на короткі (<200 токенів), середні (200–500) та довгі (>500). Всередині кожної групи — випадкове розділення 90/10. Eval set не повинен перетинатися з train ні за exact, ні за semantic.

Фінальний чекліст перед навчанням

  • Немає дублів (exact та near-duplicate)
  • Немає PII в датасеті (імена, email, телефони)
  • Output не містить посилань на дати/версії
  • Рівномірний розподіл за типами задач
  • Eval set не перетинається з train
  • Токенізовані приклади не перевищують max_length моделі

Що входить в роботу (deliverables)

  • Аналіз вихідних даних та виявлення проблем
  • Структурування в обраний формат (Alpaca/ChatML)
  • Валідація кожного прикладу (PII, витік, довжина)
  • Дедуплікація exact та semantic
  • Підготовка train/eval спліту зі збереженням розподілу
  • Документація по датасету (статистика, опис полів)
  • Підтримка на етапі навчання моделі

Процес роботи

  1. Аналітика — вивчаємо задачу та вихідні дані.
  2. Проектування — вибираємо формат та схему валідації.
  3. Реалізація — пишемо скрипти для структурування та очищення.
  4. Тестування — перевіряємо якість на пілотному датасеті.
  5. Деплой — передаємо готовий датасет з документацією.

Терміни та вартість

Терміни: від 3 до 14 робочих днів залежно від обсягу та складності. Вартість: від $1,000 до $10,000 залежно від обсягу. Пропонуємо підготовку датасету під ключ. Оцінимо ваш проект безкоштовно — зв'яжіться з нами. Наш досвід: 5+ років у донавчанні LLM, 20+ успішних проектів. Замовте підготовку датасету вже сьогодні. Досвід наших інженерів — 5+ років у донавчанні LLM, ми гарантуємо чистоту та збалансованість даних.