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







