Своя модель

Очистка датасета: почему грязные данные хуже малых

Сотня чистых примеров даёт лучший результат, чем тысяча с противоречиями и дублями. Процедура очистки из шести шагов и список признаков, по которым пример стоит выбросить.

Датасет, собранный на автомате, выглядит внушительно: тысяча строк, все настоящие, все ваши. Обучение на нём даёт модель, которая отвечает хуже базовой. Причина почти всегда одна: в тысяче строк лежат три сотни дублей, полсотни противоречий и десяток примеров, где ответ обрывается на середине.

#Зачем это нужно и когда не нужно

Нужно перед любым обучением, где датасет собран автоматически — из истории, из оценок, из экспорта. Не нужно, если у вас полсотни рукописных эталонов: вы их и так вычитали, когда писали.

Порядок работ важен: чистить надо до аренды видеокарты и до подбора гиперпараметров. Чистка бесплатна и влияет на результат сильнее любого параметра обучения.

#Что понадобится

  • Выгрузка датасета в JSONL — по одному примеру на строку.
  • Любой инструмент, умеющий читать JSONL: скрипт на десять строк, таблица, редактор.
  • Час времени и готовность выбросить часть данных. Это главное требование: чистка — это удаление, и жалость к строкам делает её бессмысленной.

#Почему сотня чистых обгоняет тысячу грязных

Механизм простой. Дообучение смещает предпочтения модели в сторону того, что видит чаще. Дубль — это удвоенный голос за один вариант. Противоречие — это два взаимоисключающих голоса, и модель усредняет их в поведение, которого нет ни в одном примере.

Разберём на конкретном случае. В наборе есть две пары:

  • «Опиши задачу коротко» → ответ в три строки без вводных.
  • «Опиши задачу коротко» → ответ на два абзаца с преамбулой «Конечно, давайте разберём».

Оба ответа в своё время получили плюс: первый — за точность, второй — за вежливость в переписке с заказчиком. После обучения модель начинает выдавать полтора абзаца с половиной преамбулы. Это хуже, чем оба исходных варианта, — и никакая настройка скорости обучения этого не исправит.

Теперь то же в масштабе: если противоречий в наборе десятки, вы получаете модель, у которой нет манеры вообще. Она выучила ваше среднее — а среднего у живого человека не бывает.

#Шаг 1. Точные дубли

Самое дешёвое действие с самым заметным эффектом. Дубли возникают сами: переспросили ту же вещь, получили тот же ответ, оба раза отметили плюсом.

Удаляйте по хешу пары «вопрос + ответ». В типичном наборе, собранном из истории переписки, точные повторы — заметная доля; сколько именно, посмотрите на своём наборе, это одна строка кода.

#Шаг 2. Почти-дубли

Сложнее и важнее. Два примера, отличающихся одним словом в вопросе, — это по-прежнему один сигнал, поданный дважды.

Практические способы поймать: нормализовать текст (регистр, пробелы, пунктуация) и сравнить; отсортировать по первым пятидесяти символам вопроса и просмотреть глазами; в наборе побольше — посчитать попарную близость и просмотреть верх списка.

Не удаляйте почти-дубли автоматически по порогу: у соседних примеров бывает содержательная разница. Автоматика находит кандидатов, решение принимает человек.

#Шаг 3. Противоречия

Это шаг, который нельзя автоматизировать полностью, и он же самый ценный.

Сгруппируйте похожие вопросы и прочитайте эталонные ответы подряд. Ищите не фактические расхождения, а расхождения манеры: где-то коротко, где-то развёрнуто; где-то сразу вывод, где-то вывод в конце; где-то на «вы», где-то на «ты».

Правило разрешения: оставляйте тот вариант, который отражает ваше текущее предпочтение, и выбрасывайте остальные. Не пытайтесь «объединить лучшее» — вы получите третий вариант, которого нет в вашей практике.

Откуда берутся противоречия и как их меньше плодить на этапе разметки — в статье про разметку хороших ответов.

#Шаг 4. Отбраковка по признакам

Список примеров, которые стоит удалять, не глядя на их содержание:

  • Оборванные ответы. Генерация упёрлась в лимит и остановилась на полуслове. Учит модель обрываться.
  • Ответы с извинениями и отказами не по делу. «Извините, как языковая модель…» — если вы не хотите этого поведения, не кладите его в эталоны.
  • Ответы, содержащие служебную разметку. Маркеры ролей, куски шаблона чата, обрывки системного промпта внутри текста ответа.
  • Односложные ответы там, где нужен разбор. «Да» в качестве эталона учит лениться.
  • Ответы, скопированные из документа целиком. Это не ваша манера, это цитата.
  • Примеры с чужой манерой. Ответ крупной облачной модели, отмеченный плюсом за пользу. Он перенесёт её стиль, а не ваш.
  • Персональные данные, которых не должно быть в весах. Чужие имена, телефоны, реквизиты. Из обученной модели их потом не вынуть.

Последний пункт — не про гигиену, а про необратимость. Удалить факт из индекса поиска — одна операция; удалить его из весов — только переобучение с нуля.

#Шаг 5. Баланс

Разложите примеры по темам и посмотрите на распределение. Типичная картина автоматически собранного набора: 70% про одну рабочую задачу, потому что именно ею вы занимались весь месяц.

Что с этим делать: либо проредить доминирующую тему до разумной доли, либо дописать примеры по недостающим. Первое быстрее, второе полезнее.

Отдельно проверьте распределение длин. Если в наборе преобладают длинные ответы, модель начнёт отвечать длинно на всё, включая вопросы, требующие одной строки.

#Шаг 6. Формат и отложенная выборка

Финальные две проверки перед обучением:

  1. Формат. Все записи одной схемы, все рендерятся шаблоном базовой модели без ошибок. Распечатайте первую запись после рендеринга и прочитайте глазами — детали в статье про форматы обучающих данных.
  2. Отложенная выборка. Отделите случайные 10–15% после чистки и не трогайте их до проверки результата. Если отложить до чистки, в валидацию попадёт мусор, и оценка будет ложной.

#Проверка результата

Чистка выполнена, если:

  • В наборе нет двух записей с одинаковой парой «вопрос — ответ».
  • Случайная сотня примеров читается как один голос: тон, длина и структура не скачут.
  • Ни одна тема не занимает больше половины набора.
  • Распределение длин ответов похоже на то, что вы хотите получать от модели.
  • Отложенная выборка отделена и в обучение не попадает.

Сколько примеров должно остаться после чистки, чтобы обучение имело смысл, — в статье сколько примеров нужно для дообучения. Если после отбраковки осталось меньше сотни, честнее не обучать, а вставить лучшее в системный промпт.

#Что может пойти не так

  • Вычистили до стерильности. Удалили всё нетипичное — и модель выучила один шаблон, который применяет ко всему. Разнообразие тем нужно сохранять.
  • Автоматическая дедупликация съела содержательные пары. Порог близости подобран агрессивно. Смотрите кандидатов глазами.
  • Чистили после обучения. Бессмысленно: обученную модель чистый датасет не исправит, нужен новый прогон с базы.
  • Отложенную выборку отделили до чистки. Проверка на грязных данных покажет качество, которого нет.
  • Оставили противоречия «на всякий случай». Самая частая ошибка. Признаки того, что модель их выучила, — в статье про переобучение и его лечение.

Как этот набор вообще собирается фоном, без отдельной сессии разметки, — в гайде как собрать датасет из своих оценок. Общая рамка маршрута — в пилларе про свою модель и дообучение.

#Частые вопросы

#Сколько строк обычно уходит при чистке?

Зависит от источника: у набора, собранного из истории переписки, отбраковка бывает существенной, у рукописных эталонов — почти нулевой. Конкретной доли ждать не стоит, её надо измерить на своём наборе. Тревожный признак — если не удалилось ничего: значит, вы не смотрели.

#Можно ли поручить чистку модели?

Частично: модель хорошо находит кандидатов в дубли и размечает темы. Решение об удалении оставьте себе — модель не знает, какая из двух версий отражает ваше текущее предпочтение, а именно это и есть содержание работы.

#Что делать с примерами, где ответ верный, но не в моём стиле?

Для датасета стиля это брак. Лучший ход — переписать ответ своими словами и оставить пару в наборе: рукописный эталон стоит нескольких автоматически собранных.

#Надо ли чистить датасет повторно перед вторым прогоном?

Да, если вы добавляли примеры. Новая партия приносит новые дубли и новые противоречия со старой. Полная процедура занимает меньше времени во второй раз, потому что вы уже знаете свои типовые проблемы.

#Помогает ли увеличение датасета вместо чистки?

Нет, и это главное заблуждение темы. Добавление примеров к грязному набору увеличивает и число противоречий тоже. Сначала чистка, потом объём — обратный порядок стоит вам обучения впустую.

#Вывод

Чистка датасета — самая недооценённая часть маршрута: бесплатная, скучная и влияющая на результат сильнее гиперпараметров. Шесть шагов — дубли, почти-дубли, противоречия, отбраковка, баланс, формат — занимают час и экономят прогон.

Если после честной чистки от тысячи строк осталось двести — это хорошая новость, а не потеря. Двести согласованных примеров научат модель вашей манере. Тысяча противоречивых научит её среднему, которого у вас нет.

Хотите ИИ, который помнит вас?

Persona держит контекст между чатами и работает на вашем железе — если развернуть её у себя и подключить локальную модель.

Создать аккаунт