Валидация качества датасета для дообучения 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. Гарантируем конфиденциальность данных и точность оценки. Свяжитесь с нами — разберём ваш датасет бесплатно и предложим оптимальный план валидации.







