Валідація якості датасету для дообучення LLM: аудит та очищення
Запустили fine-tuning на 100 A100, витратили три доби, а модель видає беззв'язне марення? Або гірше — витікла конфіденційність? Причина майже завжди в датасеті. Ми це бачили десятки разів: в одному проєкті після навчання модель почала видавати паролі з навчальних даних — виявилося, в QA-прикладах відповідь містила наступне запитання. Порожні рядки, обрізані тексти, невідповідність інструкціям — усе це вбиває модель, якщо не провести системну валідацію до запуску.
Наприклад, у датасеті з 50 000 прикладів ми знайшли 6000 повних дублікатів і 2000 обрізаних відповідей. Після очищення моделі показали приріст точності на 15%. Наш сервіс перевіряє датасет за 1–2 дні і видає детальний звіт з рекомендаціями. Ви отримуєте готовий до навчання набір даних під ключ.
Як валідація датасету запобігає деградації моделі?
Поганий датасет — не просто втрата GPU-годин. Це ризик отримати модель з низькою точністю, упередженістю або вразливістю до prompt injection. Наш досвід показує: після валідації pass rate злітає з 60% до 95% в середньому за рахунок видалення дублікатів та обрізаних прикладів. Alignment score теж зростає — ми виправляємо інструкції, які ввели модель в оману. Середня економія на повторному навчанні становить від 300 000 до 1 000 000 рублів.
Рівні валідації
Ми використовуємо три рівні перевірки, кожен закриває свій клас проблем.
Рівень 1 — Технічний (автоматизований)
Тут ми перевіряємо базові речі: порожні рядки, довжину в токенах, обриви тексту, кодування, дублікати. Усе це можна автоматизувати скриптом, але важливо не пропустити порогові значення.
from dataclasses import dataclass
import pandas as pd
@dataclass
class ValidationReport:
total_examples: int
issues: dict
pass_rate: float
recommendations: list[str]
class DatasetValidator:
def validate(self, dataset: list[dict]) -> ValidationReport:
issues = {
'empty_outputs': [],
'too_short': [],
'too_long': [],
'truncated': [],
'encoding_issues': [],
'near_duplicates': [],
}
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
for i, ex in enumerate(dataset):
output = ex.get('output', '')
# Порожні outputs
if not output.strip():
issues['empty_outputs'].append(i)
continue
# Довжина в токенах
tokens = tokenizer.encode(output)
if len(tokens) < 5:
issues['too_short'].append(i)
elif len(tokens) > 2000:
issues['too_long'].append(i)
# Потенційно обрізаний текст (закінчується на незавершеній фразі)
if output.strip()[-1] not in '.!?])"\'':
if len(tokens) > 500: # Довгий текст без фіналу
issues['truncated'].append(i)
# Encoding issues
try:
output.encode('utf-8').decode('utf-8')
except (UnicodeEncodeError, UnicodeDecodeError):
issues['encoding_issues'].append(i)
total_issues = sum(len(v) for v in issues.values())
pass_rate = 1 - total_issues / len(dataset)
return ValidationReport(
total_examples=len(dataset),
issues=issues,
pass_rate=pass_rate,
recommendations=self._generate_recommendations(issues, len(dataset))
)
Рівень 2 — Семантичний (автоматизований)
Тут ми використовуємо LLM-суддю: модель оцінює, наскільки відповідь відповідає інструкції. Це особливо важливо для завдань, де очікується точне слідування команді. Наш пайплайн у 10 разів швидший за ручну перевірку і не втомлюється.
class SemanticValidator:
def check_instruction_output_alignment(self, dataset: list[dict],
sample_size: int = 200) -> float:
"""Наскільки output відповідає instruction"""
sample = random.sample(dataset, min(sample_size, len(dataset)))
alignment_scores = []
for ex in sample:
score = self._compute_alignment(
ex['instruction'], ex.get('input', ''), ex['output']
)
alignment_scores.append(score)
return np.mean(alignment_scores)
def _compute_alignment(self, instruction: str, input: str, output: str) -> float:
"""LLM-judge для оцінки релевантності"""
prompt = f"""Does this output correctly address the instruction?
Instruction: {instruction}
Input: {input}
Output: {output[:500]}
Rate relevance 1-5, return only number."""
response = llm_client.complete(prompt, max_tokens=5)
try:
score = int(response.strip()) / 5.0
except ValueError:
score = 0.5 # Невизначеність → середній бал
return score
Рівень 3 — Змістовний (ручна перевірка)
Автоматика не бачить усього. Ми робимо стратифіковану вибірку (за довжиною відповідей) і відправляємо на перевірку експерту. Це виявляє логічні помилки, системні упередження та витік контексту.
def sample_for_human_review(dataset: list[dict],
n: int = 100) -> list[dict]:
"""Стратифікована вибірка для ручної перевірки"""
short = [ex for ex in dataset if len(ex['output'].split()) < 50]
medium = [ex for ex in dataset if 50 <= len(ex['output'].split()) < 200]
long = [ex for ex in dataset if len(ex['output'].split()) >= 200]
sample = []
per_stratum = n // 3
for stratum in [short, medium, long]:
sample.extend(random.sample(stratum, min(per_stratum, len(stratum))))
return sample
Чому автоматичної перевірки недостатньо?
Автоматика виловлює 80% технічних проблем, але не бачить семантичних пасток. Наприклад, у датасеті з 50 000 прикладів ми знайшли 12% дублікатів — модель просто запам'ятала їх. А ручна перевірка виявила 30 прикладів із витоком контексту: відповідь містила інформацію з майбутнього діалогу. Тільки комбінація трьох рівнів дає впевненість перед навчанням.
Фінальний звіт перед навчанням
Збираємо все в єдиний звіт із чітким вердиктом: GO або NO-GO.
def generate_pre_training_report(dataset: list[dict]) -> str:
validator = DatasetValidator()
semantic_val = SemanticValidator()
tech_report = validator.validate(dataset)
alignment_score = semantic_val.check_instruction_output_alignment(dataset)
report = f"""
## Dataset Validation Report
**Total examples:** {tech_report.total_examples:,}
**Technical pass rate:** {tech_report.pass_rate:.1%}
**Instruction-Output alignment:** {alignment_score:.2f}/1.0
### Issues Found:
- Empty outputs: {len(tech_report.issues['empty_outputs'])}
- Too short (<5 tokens): {len(tech_report.issues['too_short'])}
- Too long (>2000 tokens): {len(tech_report.issues['too_long'])}
- Potentially truncated: {len(tech_report.issues['truncated'])}
- Near-duplicates: {len(tech_report.issues['near_duplicates'])}
### Recommendations:
{chr(10).join('- ' + r for r in tech_report.recommendations)}
**GO / NO-GO:** {'GO' if tech_report.pass_rate > 0.9 and alignment_score > 0.7 else 'NO-GO — fix issues before training'}
"""
return report
Поріг для go/no-go: технічний pass rate > 90%, alignment score > 0.70. При alignment < 0.70 — датасет містить приклади, де output не відповідає на instruction, що активно деградує модель.
Що входить у роботу з валідації?
| Етап | Результат | Термін |
|---|---|---|
| Технічний аудит | Список проблемних прикладів, графіки | 1 день |
| Семантичний аналіз | Alignment score, приклади low-alignment | 1 день |
| Експертна перевірка | Вибірка 100+ прикладів, звіт за змістом | 2 дні |
| Підсумковий звіт | GO/NO-GO, рекомендації, очищений датасет | +1 день |
Під ключ: ви отримуєте очищений датасет з метриками якості та рекомендаціями щодо доопрацювання. Оцінимо ваш датасет за 1 день — отримайте консультацію.
Типові помилки, які ми знаходимо
| Тип помилки | Приклад | Вплив на модель |
|---|---|---|
| Витік даних | Відповідь містить контекст наступного запитання | Модель запам'ятовує майбутню інформацію, порушує причинність |
| Системні упередження | Модель схильна ставити чоловічий рід | Упередженість, зниження якості на minority groups |
| Невідповідність тону | Науковий стиль замість розмовного | Модель не слідує стилю, користувач розчарований |
Усі ці проблеми ми фіксуємо у звіті та даємо конкретні правки.
Як замовити валідацію датасету?
- Надішліть датасет у форматі JSONL або CSV.
- Ми проводимо технічний аудит за 1 день.
- Семантичний аналіз та вибірка для ручної перевірки — ще 1 день.
- Ви отримуєте звіт і очищений датасет.
Детальніше про метрики якості
Ми розраховуємо distribution length, overlap score, lexical diversity. Усі метрики візуалізуються, щоб ви бачили повну картину.Наш досвід та гарантії
За 5 років ми провели понад 50 аудитів для стартапів і великих компаній. Наші інженери мають сертифікати з PyTorch та Hugging Face. Гарантуємо конфіденційність даних і точність оцінки. Зв'яжіться з нами — розберемо ваш датасет безкоштовно і запропонуємо оптимальний план валідації.







