Датасет, собранный на автомате, выглядит внушительно: тысяча строк, все настоящие, все ваши. Обучение на нём даёт модель, которая отвечает хуже базовой. Причина почти всегда одна: в тысяче строк лежат три сотни дублей, полсотни противоречий и десяток примеров, где ответ обрывается на середине.
#Зачем это нужно и когда не нужно
Нужно перед любым обучением, где датасет собран автоматически — из истории, из оценок, из экспорта. Не нужно, если у вас полсотни рукописных эталонов: вы их и так вычитали, когда писали.
Порядок работ важен: чистить надо до аренды видеокарты и до подбора гиперпараметров. Чистка бесплатна и влияет на результат сильнее любого параметра обучения.
#Что понадобится
- Выгрузка датасета в JSONL — по одному примеру на строку.
- Любой инструмент, умеющий читать JSONL: скрипт на десять строк, таблица, редактор.
- Час времени и готовность выбросить часть данных. Это главное требование: чистка — это удаление, и жалость к строкам делает её бессмысленной.
#Почему сотня чистых обгоняет тысячу грязных
Механизм простой. Дообучение смещает предпочтения модели в сторону того, что видит чаще. Дубль — это удвоенный голос за один вариант. Противоречие — это два взаимоисключающих голоса, и модель усредняет их в поведение, которого нет ни в одном примере.
Разберём на конкретном случае. В наборе есть две пары:
- «Опиши задачу коротко» → ответ в три строки без вводных.
- «Опиши задачу коротко» → ответ на два абзаца с преамбулой «Конечно, давайте разберём».
Оба ответа в своё время получили плюс: первый — за точность, второй — за вежливость в переписке с заказчиком. После обучения модель начинает выдавать полтора абзаца с половиной преамбулы. Это хуже, чем оба исходных варианта, — и никакая настройка скорости обучения этого не исправит.
Теперь то же в масштабе: если противоречий в наборе десятки, вы получаете модель, у которой нет манеры вообще. Она выучила ваше среднее — а среднего у живого человека не бывает.
#Шаг 1. Точные дубли
Самое дешёвое действие с самым заметным эффектом. Дубли возникают сами: переспросили ту же вещь, получили тот же ответ, оба раза отметили плюсом.
Удаляйте по хешу пары «вопрос + ответ». В типичном наборе, собранном из истории переписки, точные повторы — заметная доля; сколько именно, посмотрите на своём наборе, это одна строка кода.
#Шаг 2. Почти-дубли
Сложнее и важнее. Два примера, отличающихся одним словом в вопросе, — это по-прежнему один сигнал, поданный дважды.
Практические способы поймать: нормализовать текст (регистр, пробелы, пунктуация) и сравнить; отсортировать по первым пятидесяти символам вопроса и просмотреть глазами; в наборе побольше — посчитать попарную близость и просмотреть верх списка.
Не удаляйте почти-дубли автоматически по порогу: у соседних примеров бывает содержательная разница. Автоматика находит кандидатов, решение принимает человек.
#Шаг 3. Противоречия
Это шаг, который нельзя автоматизировать полностью, и он же самый ценный.
Сгруппируйте похожие вопросы и прочитайте эталонные ответы подряд. Ищите не фактические расхождения, а расхождения манеры: где-то коротко, где-то развёрнуто; где-то сразу вывод, где-то вывод в конце; где-то на «вы», где-то на «ты».
Правило разрешения: оставляйте тот вариант, который отражает ваше текущее предпочтение, и выбрасывайте остальные. Не пытайтесь «объединить лучшее» — вы получите третий вариант, которого нет в вашей практике.
Откуда берутся противоречия и как их меньше плодить на этапе разметки — в статье про разметку хороших ответов.
#Шаг 4. Отбраковка по признакам
Список примеров, которые стоит удалять, не глядя на их содержание:
- Оборванные ответы. Генерация упёрлась в лимит и остановилась на полуслове. Учит модель обрываться.
- Ответы с извинениями и отказами не по делу. «Извините, как языковая модель…» — если вы не хотите этого поведения, не кладите его в эталоны.
- Ответы, содержащие служебную разметку. Маркеры ролей, куски шаблона чата, обрывки системного промпта внутри текста ответа.
- Односложные ответы там, где нужен разбор. «Да» в качестве эталона учит лениться.
- Ответы, скопированные из документа целиком. Это не ваша манера, это цитата.
- Примеры с чужой манерой. Ответ крупной облачной модели, отмеченный плюсом за пользу. Он перенесёт её стиль, а не ваш.
- Персональные данные, которых не должно быть в весах. Чужие имена, телефоны, реквизиты. Из обученной модели их потом не вынуть.
Последний пункт — не про гигиену, а про необратимость. Удалить факт из индекса поиска — одна операция; удалить его из весов — только переобучение с нуля.
#Шаг 5. Баланс
Разложите примеры по темам и посмотрите на распределение. Типичная картина автоматически собранного набора: 70% про одну рабочую задачу, потому что именно ею вы занимались весь месяц.
Что с этим делать: либо проредить доминирующую тему до разумной доли, либо дописать примеры по недостающим. Первое быстрее, второе полезнее.
Отдельно проверьте распределение длин. Если в наборе преобладают длинные ответы, модель начнёт отвечать длинно на всё, включая вопросы, требующие одной строки.
#Шаг 6. Формат и отложенная выборка
Финальные две проверки перед обучением:
- Формат. Все записи одной схемы, все рендерятся шаблоном базовой модели без ошибок. Распечатайте первую запись после рендеринга и прочитайте глазами — детали в статье про форматы обучающих данных.
- Отложенная выборка. Отделите случайные 10–15% после чистки и не трогайте их до проверки результата. Если отложить до чистки, в валидацию попадёт мусор, и оценка будет ложной.
#Проверка результата
Чистка выполнена, если:
- В наборе нет двух записей с одинаковой парой «вопрос — ответ».
- Случайная сотня примеров читается как один голос: тон, длина и структура не скачут.
- Ни одна тема не занимает больше половины набора.
- Распределение длин ответов похоже на то, что вы хотите получать от модели.
- Отложенная выборка отделена и в обучение не попадает.
Сколько примеров должно остаться после чистки, чтобы обучение имело смысл, — в статье сколько примеров нужно для дообучения. Если после отбраковки осталось меньше сотни, честнее не обучать, а вставить лучшее в системный промпт.
#Что может пойти не так
- Вычистили до стерильности. Удалили всё нетипичное — и модель выучила один шаблон, который применяет ко всему. Разнообразие тем нужно сохранять.
- Автоматическая дедупликация съела содержательные пары. Порог близости подобран агрессивно. Смотрите кандидатов глазами.
- Чистили после обучения. Бессмысленно: обученную модель чистый датасет не исправит, нужен новый прогон с базы.
- Отложенную выборку отделили до чистки. Проверка на грязных данных покажет качество, которого нет.
- Оставили противоречия «на всякий случай». Самая частая ошибка. Признаки того, что модель их выучила, — в статье про переобучение и его лечение.
Как этот набор вообще собирается фоном, без отдельной сессии разметки, — в гайде как собрать датасет из своих оценок. Общая рамка маршрута — в пилларе про свою модель и дообучение.
#Частые вопросы
#Сколько строк обычно уходит при чистке?
Зависит от источника: у набора, собранного из истории переписки, отбраковка бывает существенной, у рукописных эталонов — почти нулевой. Конкретной доли ждать не стоит, её надо измерить на своём наборе. Тревожный признак — если не удалилось ничего: значит, вы не смотрели.
#Можно ли поручить чистку модели?
Частично: модель хорошо находит кандидатов в дубли и размечает темы. Решение об удалении оставьте себе — модель не знает, какая из двух версий отражает ваше текущее предпочтение, а именно это и есть содержание работы.
#Что делать с примерами, где ответ верный, но не в моём стиле?
Для датасета стиля это брак. Лучший ход — переписать ответ своими словами и оставить пару в наборе: рукописный эталон стоит нескольких автоматически собранных.
#Надо ли чистить датасет повторно перед вторым прогоном?
Да, если вы добавляли примеры. Новая партия приносит новые дубли и новые противоречия со старой. Полная процедура занимает меньше времени во второй раз, потому что вы уже знаете свои типовые проблемы.
#Помогает ли увеличение датасета вместо чистки?
Нет, и это главное заблуждение темы. Добавление примеров к грязному набору увеличивает и число противоречий тоже. Сначала чистка, потом объём — обратный порядок стоит вам обучения впустую.
#Вывод
Чистка датасета — самая недооценённая часть маршрута: бесплатная, скучная и влияющая на результат сильнее гиперпараметров. Шесть шагов — дубли, почти-дубли, противоречия, отбраковка, баланс, формат — занимают час и экономят прогон.
Если после честной чистки от тысячи строк осталось двести — это хорошая новость, а не потеря. Двести согласованных примеров научат модель вашей манере. Тысяча противоречивых научит её среднему, которого у вас нет.