Если вам хочется разбавить общение в telegram чате нелепыми, но зачастую меткими и смешными комментариями, или вы ищете информацию по интеграции языковой модели в бота, или хотите сами обучить языковые модели на данных с 2ch, то в этой статье описаны шаги, как это сделать.
Бот
Запустил бота, которого можно добавлять в чаты, и он будет отвечать на сообщения, как на посты на 2ch.hk/b/.
Для этого:
Был собран датасет постов с 2ch
Была обучена диалоговая модель на базе GPT-2
Был поднят простой сервер с Python Telegram API
Подробнее по порядку:
Обучение
Hugging Face
Самый простой способ обучить языковую модель - воспользоваться библиотекой transformers. Она предоставляет инструменты для автоматизированного обучения и применения нейронных сетей (в том числе языковых моделей).
Также в их архивах можно найти множество предобученных моделей и датасетов, что заметно упрощает обучение, потому что обучать модель с нуля - затратно, а дообучать - намного проще.
Базовая модель
Возьмем диалоговую модель из списка готовых моделей. Модели делятся по языкам и задачам, и так уж вышло, что русскоязычных моделей есть ровно одна. Языковые модели, конечно, универсальные штуки, и сделать диалоговую модель можно и не из диалоговой, но чем ближе область предобученной модели к целевой, тем лучше.
Выбрана была модель Grossmend/rudialogpt3_medium_based_on_gpt2 из-за ее размера. 1.3B параметров - размер, при котором модель может генерировать осмысленные тексты, но не слишком большая.
Данные
Для обучения модели были собраны данные с 2ch.hk/b/. Я долго искал готовый датасет, но не нашел ничего подходящего, и решил собрать данные сам. Для сбора данных использовалось api2ch. Треды загружались, парсились, чистились и преобразовались к формату диалога.
Итоговый датасет насчитывал порядка 60к диалогов средней длины 3 - достаточно для дообучения модели среднего размера.
Пример диалога (сообщения от последнего к первому):
{
"dialogue": ["Рад слышать!", "Хорошо!", "Как дела?"]
}
Код для сбора и чистки данных можно найти на GitHub. Датасет можно найти на HuggingFace.
Фильтрация данных
Для повышения токсичности данных данные были отфильтрованы с помощью модели классификатора sismetanin/rubert-toxic-pikabu-2ch. Модель была создана для модерации токсичного контента, но никто не мешает использовать ее во зло.
Токсичность данных:
count |
63187.000000 |
mean |
0.675554 |
25% |
0.487243 |
50% |
0.721271 |
75% |
0.928254 |
Был взят 75% percentile токсичности, что соответствует 0.93/1.00 по шкале токсичности.
Процесс обучения и результат
Jupiter Notebook с кодом обучения можно найти на GitHub.
Готовую модель можно найти на HuggingFace
Пример ответа модели до дообучения:
Привет!
Привет!
И после:
Привет!
>всё что ты можешь сделать - это не быть долбо...
Обучение прошло успешно.
Поднятие модели и подключение к боту
API
Был написан простейший сервер на Flask для работы с моделью.
POST request: {"text": "Привет!"}
Response: {"toxified": "Пока!"}
У HuggingFace отличная документация, и подробности про запуск моделей стоит искать там.
Сама модель запускается на CPU с многопоточностью PyTorch. Так что я посчитал, что не будет целесообразным строить API с очередями и исполнителями. Модель запускается на CPU и можно было бы получить серьезное ускорение за счет скриптинга модели, но я не смог совместить скриптинг с инструментами генерации HuggingFace, так что от скриптинга пришлось отказаться.
Метрики
Для красоты настроен сбор метрик и grafana.
Python Telegram API
Про него уже написаны хорошие подробные посты (например).
Скажу лишь, что оно может работать асинхронно, и во время ожидания ответа от модели программа может обрабатывать другие запросы.
Код
Весь код сбора данных, обучения модели и бота выложен в открытый доступ на GitHub. Для простоты использования настроено поднятие бота с помощью docker-compose.
Комментарии (28)
alex1478
12.06.2022 01:36+2Довольно часто выдает в тексте текст ответа на пост >>******
И у меня не получилось получить от него хоть как-то связанный с моим сообщением ответ. Больше как генератор потока сознания двачера, которого ты своим сообщением побеспокоил.
UPD: на токсичные сообщения ответы более релевантны.
Кстати у меня есть архив постов овощного треда из /soc/ с 2019-11-08 по 2022-04-19, чуть больше 104 тысяч постов. Готов поделиться, если кому нужно.
black_samorez Автор
12.06.2022 02:12+2Я чистил по регуляркам >>******, но они как-то просочились. А про релевантность - сильно зависит от promt - текста, приписываемого ко входу. Я опытным путем нашел, что приписывая ", а? " в конце текста можно сильно поднять релевантность. Как-нибудь другие prompt'ы попробую - может еще чего найду.
inkoziev
12.06.2022 11:41+2>Кстати у меня есть архив постов овощного треда из /soc/ с 2019-11-08 по 2022-04-19, чуть больше 104 тысяч постов. Готов поделиться, если кому нужно.
Привет! Если выложите в паблик или пришлете архив с постами (можно в личку в моих контактах) - буду безмерно благодарен. Добавлю эти диалоги в сырье для эксперимента с "беседующими ботами". Там очень не хватает "свежей крови", чтобы появилось немного ярости, грубости и неуважения, как у живых человеков в интернете. А то сейчас слишком часто диалог вырождается во взаимное сюсюкание такого типа:
-Добрый день! Как дела?
- У меня всё хорошо. А у тебя?
- Неплохо
- Это хорошо. Значит, ты всё делаешь правильно
- Да, все делаю правильно
- Значит, у тебя всё хорошо)
- Ага, а как твои дела?
- Хорошо)
- Значит, ты просто хочешь меня спросить, когда у меня всё хорошо будет
- Да, примерно так ????
- Вот и отлично. Давай, спрашивайalex1478
12.06.2022 14:23Овощной — это в основном только анкеты
Вот в SQL https://anonfiles.com/r5Z2o7p9y0/soc_ovoshchnoy.sql_gzinkoziev
13.06.2022 20:29Спасибо, скачал,
действительно кажется это просто что-то типа анкет, а не диалоги.
dimuska139
12.06.2022 11:05+22Выглядит так, будто бот отдаёт в ответ просто рандомные фразы из большого списка. По крайней мере, ответы бота совсем никак не связаны с тем, что ему писал я.
Newbilius
12.06.2022 17:26+23Что довольно реалистично отображает процесс общения в интернете на отдельных площадках...)
Areso
12.06.2022 11:06+1Как называется технология парсинга пользовательского ввода в rogue-like/dnd-like играх? И есть ли библиотеки для русского языка?
Alexey2005
12.06.2022 15:26+1Fuzzy matching. Порядка 250 тыс. вручную прописанных правил на чём-то вроде ChatScript — и у вас получится чат-бот, который умеет держать контекст лучше криво затюненных GPT2.
Вот неплохая обзорная статья по этой древней технологии.
sergey-ryzhikov
12.06.2022 12:30+5Просто эта модель настолько продвинулась, что научилась скрывать от людей свою разумность =) Это делает её неотличимой от среднестатистического двачера.
mikleh
12.06.2022 14:11+10Битарды выросли и занялись созидательным трудом… Это ли не свидетельство мимолетности всего сущего?
cjv
12.06.2022 16:15Бот в группе не работает, не имеет доступ к сообщениям. Это надо в BotFather настроить
black_samorez Автор
12.06.2022 16:15Спасибо. Не знал, что можно это по умолчанию выставить, а не руками в каждой группе права давать
cjv
12.06.2022 16:38Теперь он сообщения видит, но реакции нет. Percentage стоит максимальная 1.0 (это 1% или 100% ?), отправил 300 сообщений. Не отвечает
black_samorez Автор
12.06.2022 16:431.0 этот 100%. Только что создал новый чат, добавил бота, и он работает из коробки
budda
13.06.2022 21:49Прошу прощения за офтоп у автора статьи.
Но может кто-то из комментаторов подскажет где можно посмотреть код бота на Python с ООП, разделением на модули и желательно на aiogram?
Все, что нахожу в статьях и на GitHub - "бот для телеграм за 30 мин" это каша из функций в одном файле. Хотелось бы разделить команды пользователя и администратора, работу с БД, веб интерфейс.
cleverate
Это всё, конечно, хорошо, но не покидает стойкое ощущение, что модель дообучали не на /b/, а на /po/
q4Smith
причем в ОБР треде.
— я не вижу как рубль крепнет и в принципе его укрепление можно считать чем-то плохим для россии. да мне на самом деле по**й я про то что все с этим курсом идут по наклонной к оху***му курсу доллара
Flux
Не покидает стойкое ощущение что в /po/ 75% постеров и являются этой моделью, а сейчас её просто заопенсорсили.