Датасет для донавчання 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 спліту зі збереженням розподілу
- Документація по датасету (статистика, опис полів)
- Підтримка на етапі навчання моделі
Процес роботи
- Аналітика — вивчаємо задачу та вихідні дані.
- Проектування — вибираємо формат та схему валідації.
- Реалізація — пишемо скрипти для структурування та очищення.
- Тестування — перевіряємо якість на пілотному датасеті.
- Деплой — передаємо готовий датасет з документацією.
Терміни та вартість
Терміни: від 3 до 14 робочих днів залежно від обсягу та складності. Вартість: від $1,000 до $10,000 залежно від обсягу. Пропонуємо підготовку датасету під ключ. Оцінимо ваш проект безкоштовно — зв'яжіться з нами. Наш досвід: 5+ років у донавчанні LLM, 20+ успішних проектів. Замовте підготовку датасету вже сьогодні. Досвід наших інженерів — 5+ років у донавчанні LLM, ми гарантуємо чистоту та збалансованість даних.







