- PVSM.RU - https://www.pvsm.ru -

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

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

Бот

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

Для этого:

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

Обучение

Hugging Face

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

Самый простой способ обучить языковую модель - воспользоваться библиотекой transformers [5]. Она предоставляет инструменты для автоматизированного обучения и применения нейронных сетей (в том числе языковых моделей).

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

Базовая модель

Возьмем диалоговую модель из списка готовых моделей [6]. Модели делятся по языкам и задачам, и так уж вышло, что русскоязычных моделей есть ровно одна. Языковые модели, конечно, универсальные штуки, и сделать диалоговую модель можно и не из диалоговой, но чем ближе область предобученной модели к целевой, тем лучше.

Выбрана была модель Grossmend/rudialogpt3_medium_based_on_gpt2 [7] из-за ее размера. 1.3B параметров - размер, при котором модель может генерировать осмысленные тексты, но не слишком большая.

Данные

Для обучения модели были собраны данные с 2ch.hk/b/. Я долго искал готовый датасет, но не нашел ничего подходящего, и решил собрать данные сам. Для сбора данных использовалось api2ch [8]. Треды загружались, парсились, чистились и преобразовались к формату диалога.

Итоговый датасет насчитывал порядка 60к диалогов средней длины 3 - достаточно для дообучения модели среднего размера.

Пример диалога (сообщения от последнего к первому):

{
  "dialogue": ["Рад слышать!", "Хорошо!", "Как дела?"]
}

Код для сбора и чистки данных можно найти на GitHub [9]. Датасет можно найти на HuggingFace [2].

Фильтрация данных

Для повышения токсичности данных данные были отфильтрованы с помощью модели классификатора sismetanin/rubert-toxic-pikabu-2ch [10]. Модель была создана для модерации токсичного контента, но никто не мешает использовать ее во зло.

Токсичность данных:

count

63187.000000

mean

0.675554

25%

0.487243

50%

0.721271

75%

0.928254

Был взять 75% percentile токсичности, что соответствует 0.93/1.00 по шкале токсичности.

Процесс обучения и результат

Jupiter Notebook с кодом обучения можно найти на GitHub [11].

Готовую модель можно найти на HuggingFace [3]

Пример ответа модели до дообучения:

Привет!

Привет!

И после:

Привет!

>всё что ты можешь сделать - это не быть долбо...

Обучение прошло успешно.

Поднятие модели и подключение к боту

API

Был написан [12] простейший сервер на Flask для работы с моделью.

POST request: {"text": "Привет!"}
Response: {"toxified": "Пока!"}

У HuggingFace отличная документация [13], и подробности про запуск моделей стоит искать там.

Сама модель запускается на CPU с многопоточность PyTorch. Так что я посчитал, что не будет целесообразным строить API с очередями и исполнителями. Модель запускается на CPU и можно было бы получить серьезное ускорение за счет скриптирнга [14] модели, но я не смог совместить скриптинг с инструментами генерации [15] HuggingFace, так что от скриптинга пришлось отказаться.

Метрики

Для красоты настроен сбор метрик и grafana [16].

Python Telegram API

Про него уже написаны хорошие подробные посты (например [17]).

Скажу лишь, что оно может работать в асинхронно [18], и во время ожидания ответа от модели программа может обрабатывать другие запросы.

Код

Весь код сбора данных, обучения модели и бота выложен в открытый доступ на GitHub [19]. Для простоты использования настроено поднятие бота с помощью docker-compose.

Автор:
black_samorez

Источник [20]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/375963

Ссылки в тексте:

[1] бота: https://t.me/toxic_ebanko_bot

[2] датасет: https://huggingface.co/datasets/BlackSamorez/2ch_b_dialogues

[3] диалоговая модель: https://huggingface.co/BlackSamorez/rudialogpt3_medium_based_on_gpt2_2ch

[4] простой сервер: https://github.com/BlackSamorez/ebanko/tree/main/app

[5] transformers: https://huggingface.co

[6] списка готовых моделей: https://huggingface.co/models

[7] Grossmend/rudialogpt3_medium_based_on_gpt2: https://huggingface.co/Grossmend/rudialogpt3_medium_based_on_gpt2

[8] api2ch: https://pypi.org/project/api2ch/

[9] GitHub: https://github.com/BlackSamorez/ebanko/blob/main/datamine/collect.py

[10] sismetanin/rubert-toxic-pikabu-2ch: https://huggingface.co/sismetanin/rubert-toxic-pikabu-2ch

[11] GitHub: https://github.com/BlackSamorez/ebanko/blob/main/experiments/2ch_training.ipynb

[12] Был написан: https://github.com/BlackSamorez/ebanko/blob/main/app/app/server.py

[13] документация: https://huggingface.co/docs

[14] скриптирнга: https://pytorch.org/docs/stable/jit.html

[15] инструментами генерации: https://huggingface.co/docs/transformers/main/en/internal/generation_utils#generate-outputs

[16] grafana: https://grafana.com

[17] например: https://habr.com/ru/post/543676/

[18] асинхронно: https://habr.com/ru/company/kts/blog/598575/

[19] GitHub: https://github.com/BlackSamorez/ebanko

[20] Источник: https://habr.com/ru/post/670970/?utm_source=habrahabr&utm_medium=rss&utm_campaign=670970