- PVSM.RU - https://www.pvsm.ru -
Если вам хочется разбавить общение в telegram чате нелепыми, но зачастую меткими и смешными комментариями, или вы ищете информацию по интеграции языковой модели в бота, или хотите сами обучить языковые модели на данных с 2ch, то в этой статье описаны шаги, как это сделать.
Запустил бота [1], которого можно добавлять в чаты, и он будет отвечать на сообщения, как на посты на 2ch.hk/b/.
Для этого:
Был собран датасет [2] постов с 2ch
Была обучена диалоговая модель [3] на базе GPT-2
Был поднят простой сервер [4] с Python Telegram API
Подробнее по порядку:

Самый простой способ обучить языковую модель - воспользоваться библиотекой 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]
Пример ответа модели до дообучения:
Привет!
Привет!
И после:
Привет!
>всё что ты можешь сделать - это не быть долбо...
Обучение прошло успешно.
Был написан [12] простейший сервер на Flask для работы с моделью.
POST request: {"text": "Привет!"}
Response: {"toxified": "Пока!"}
У HuggingFace отличная документация [13], и подробности про запуск моделей стоит искать там.
Сама модель запускается на CPU с многопоточность PyTorch. Так что я посчитал, что не будет целесообразным строить API с очередями и исполнителями. Модель запускается на CPU и можно было бы получить серьезное ускорение за счет скриптирнга [14] модели, но я не смог совместить скриптинг с инструментами генерации [15] HuggingFace, так что от скриптинга пришлось отказаться.
Для красоты настроен сбор метрик и grafana [16].
Про него уже написаны хорошие подробные посты (например [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
Нажмите здесь для печати.