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

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

Напрямки AI-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1414
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1284
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    980
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1240
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    696
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    982

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