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