Валидация качества датасета для дообучения LLM: аудит и очистка

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1Все 1566 услуг
Валидация качества датасета для дообучения 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: аудит и очистка

Запустили 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
Несоответствие тону Научный стиль вместо разговорного Модель не следует стилю, пользователь разочарован

Все эти проблемы мы фиксируем в отчёте и даём конкретные правки.

Как заказать валидацию датасета?

  1. Отправьте датасет в формате JSONL или CSV.
  2. Мы проводим технический аудит за 1 день.
  3. Семантический анализ и выборка для ручной проверки — ещё 1 день.
  4. Вы получаете отчёт и очищенный датасет.
Подробнее о метриках качества Мы рассчитываем distribution length, overlap score, lexical diversity. Все метрики визуализируются, чтобы вы видели полную картину.

Наш опыт и гарантии

За 5 лет мы провели более 50 аудитов для стартапов и крупных компаний. Наши инженеры имеют сертификаты по PyTorch и Hugging Face. Гарантируем конфиденциальность данных и точность оценки. Свяжитесь с нами — разберём ваш датасет бесплатно и предложим оптимальный план валидации.