Telegram бот с языковой моделью, обученной на 2ch

Если вам хочется разбавить общение в telegram чате нелепыми, но зачастую меткими и смешными комментариями, или вы ищете информацию по интеграции языковой модели в бота, или хотите сами обучить языковые модели на данных с 2ch, то в этой статье описаны шаги, как это сделать.

Бот

Запустил бота, которого можно добавлять в чаты, и он будет отвечать на сообщения, как на посты на 2ch.hk/b/.

Для этого:

Подробнее по порядку:

Обучение

Hugging Face

e1d816f80db204c7bde424def862cd1a.png

Самый простой способ обучить языковую модель — воспользоваться библиотекой 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.

© Habrahabr.ru