Как я случайно написал оффлайн-редактор датасетов для нейросетей, пока пытался выспаться

Все началось с того, что я застрял на дообучении локальной модели. Прогон должен был занять около двенадцати часов, я со спокойной душой ушел спать, а утром меня встретила ошибка и падение скрипта прямо на восьмидесятом проценте. Причина оказалась банальной до боли - где-то в середине файла на четыреста тысяч строк закралась неэкранированная кавычка и сбойный символ. Обычный текстовый редактор просто пропустил этот мусор, а Питон на обучении честно упал.

Когда работаешь с датасетами объемом в пару гигабайт, быстро понимаешь, насколько привычные инструменты вроде VS Code не приспособлены для этой задачи. Они пытаются загрузить многомиллионный файл целиком в оперативную память, начинают тормозить, а одно неловкое нажатие клавиши может незаметно сломать структуру JSONL. В итоге вместо работы с данными ты либо тратишь часы на поиск кавычек, либо каждый раз пишешь одноразовые скрипты на Питоне, чтобы просто проверить файл на дубликаты или поделить его на обучающую и валидационную выборки.

Поняв, что нормальных легких утилит под эту задачу просто нет, я решил написать Prose - бесплатный оффлайн-редактор, который превращает нечитаемые JSON-строки в удобные визуальные карточки. Чтобы программа не пожирала гигабайты оперативной памяти, я реализовал чтение файла за фиксированное время O(1). Бэкенд на Питоне при открытии сканирует датасет в бинарном режиме и собирает массив байтовых смещений. В итоге переход хоть на первую, хоть на стотысячную запись происходит мгновенно за доли миллисекунды без загрузки всего файла в память.

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

В последнем обновлении v1.0.3 я добавил возможность конвертировать дампы переписок из Telegram Desktop напрямую в готовые обучающие пары. Программа сама находит участников чата, позволяет распределить роли, задать минимальную длину сообщений и склеивает подряд идущие реплики одного автора. Там же появился автоматический аудит, который сканирует файл на пустые ответы и дубликаты с возможностью очистки за один клик, а также встроенный сплиттер на обучающую и тестовую выборку с удобным ползунком процента.

Для тех, кто следит за лимитами контекста, в шапке редактора работает честный счетчик токенов в реальном времени. Он умеет переключать пресеты под словари 15 популярных моделей - от Llama 3 и DeepSeek R1 до Qwen 2.5 и GPT-4o. Всю навигацию и горячие клавиши можно полностью перенастраивать под себя в настройках с кастомной визуализацией клавиш, добавлять записи в избранное или мгновенно отменять случайный перескок по строкам.

Демонстрация интерфейса :)

Проект полностью бесплатен, открыт и собирается на стеке из Python, PyWebView, Bottle и Vue 3. Забрать готовую сборку для Windows или посмотреть исходный код можно в репозитории на GitHub:

2