Токсичность чатов Telegram: измеряем машинным обучением
Во времена ковида я работал в компании, где мы с коллегой написали приложение на анализе больших данных для оценки уровня наших программистов. Я подумал: что если применить похожую логику к нашим рабочим чатам в Telegram — насколько они токсичны?
С 2015 года я экспериментирую с Data Science, с 2018-го пишу на Go. В 2020-м для первых прототипов я готовил датасеты из result.json через Node.js и Swift, графики строил на R — классический рисерч в DS. Заметил что коллегам интересно гораздо больше, чем просто подсчёт сообщений: кто какой вайб к кому испытывает, какой у кого словарный запас, кто больше матюкается, у кого какие самые частые слова.
Перед тем как я начал билдить бота на Go, я собрал вьюер result.json на Rust.
Готового инструмента не было. Я решил сделать его сам, с одним принципиальным условием: никакие данные не уходят дальше бота и удаляются после рендера графиков.
Бот я уже реализовал на чистом Go. Общий объём кода — около 4 тысяч строк на четыре микросервиса.
Токсичность — это не мат, и простым фильтром по словам её не посчитать. Я изучал разные системы оценки, в том числе rubert-toxic-pikabu-2ch — специализированную модель детекции токсичных комментариев на русском языке на базе RuBERT. Тащить её в бота не стал: изучил логику, квантовал LLM до более быстрого DS. Токсичность и вайбы оцениваются через паттерны поведения, которые можно достать из экспорта чата Telegram.
Пользователь получает альбом из 8-9 картинок: force-граф связей между участниками, тепловая карта активности по часам, топы слов, vibe-матрица из эмодзи-реакций. Топ слов — неожиданно самая любимая фича: частые слова собеседника, если читать их столбиком, часто складываются во что-то смешное. Именно это люди первым делом скидывают друг другу.
Я прогнал через бота две сотни реальных чатов и весь март по вечерам и выходным тюнил модель руками.
Сложные алгоритмы и оптимизацию я делал руками: моя DS-токсик-модель на больших файлах выходила за пределы RAM.
Насчет билдинга на LLM: Claude Opus 4.6 на проекте в четыре тысячи строк не помнит всего контекста кода, поэтому часто забывает и функции и файлы. Ощущение, что работаешь с Junior разрабом: рутину доверить можно, за качество и архитектуру отвечаешь сам. Мои 70% времени — написание кода и отладка, 30% — промпт-инжиниринг.
При этом LLM реально даёт возможность больше заниматься творческими и сложными задачами, а рутину типа основы проекта и тулинга скидывать нейронки. Для написания сложных и эффективных алгоритмов LLM ещё будут долго расти, потому как нейронка знает только о решённых и опубликованных задачах.
Сабж: t.me/ToxicTalksBot