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

Бот

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

Для этого:

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

Обучение

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)


  1. cleverate
    12.06.2022 01:20
    +11

    Это всё, конечно, хорошо, но не покидает стойкое ощущение, что модель дообучали не на /b/, а на /po/


    1. q4Smith
      12.06.2022 11:55
      +3

      причем в ОБР треде.

      Заголовок спойлера
      — рубль укрепляется

      — я не вижу как рубль крепнет и в принципе его укрепление можно считать чем-то плохим для россии. да мне на самом деле по**й я про то что все с этим курсом идут по наклонной к оху***му курсу доллара


    1. Flux
      12.06.2022 21:19
      +9

      Не покидает стойкое ощущение что в /po/ 75% постеров и являются этой моделью, а сейчас её просто заопенсорсили.


  1. alex1478
    12.06.2022 01:36
    +2

    Довольно часто выдает в тексте текст ответа на пост >>******

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

    UPD: на токсичные сообщения ответы более релевантны.

    Кстати у меня есть архив постов овощного треда из /soc/ с 2019-11-08 по 2022-04-19, чуть больше 104 тысяч постов. Готов поделиться, если кому нужно.


    1. black_samorez Автор
      12.06.2022 02:12
      +2

      Я чистил по регуляркам >>******, но они как-то просочились. А про релевантность - сильно зависит от promt - текста, приписываемого ко входу. Я опытным путем нашел, что приписывая ", а? " в конце текста можно сильно поднять релевантность. Как-нибудь другие prompt'ы попробую - может еще чего найду.


    1. inkoziev
      12.06.2022 11:41
      +2

      >Кстати у меня есть архив постов овощного треда из /soc/ с 2019-11-08 по 2022-04-19, чуть больше 104 тысяч постов. Готов поделиться, если кому нужно.

      Привет! Если выложите в паблик или пришлете архив с постами (можно в личку в моих контактах) - буду безмерно благодарен. Добавлю эти диалоги в сырье для эксперимента с "беседующими ботами". Там очень не хватает "свежей крови", чтобы появилось немного ярости, грубости и неуважения, как у живых человеков в интернете. А то сейчас слишком часто диалог вырождается во взаимное сюсюкание такого типа:

      - Добрый день! Как дела?
      - У меня всё хорошо. А у тебя?
      - Неплохо
      - Это хорошо. Значит, ты всё делаешь правильно
      - Да, все делаю правильно
      - Значит, у тебя всё хорошо)
      - Ага, а как твои дела?
      - Хорошо)
      - Значит, ты просто хочешь меня спросить, когда у меня всё хорошо будет
      - Да, примерно так ????
      - Вот и отлично. Давай, спрашивай



      1. alex1478
        12.06.2022 14:23

        Овощной — это в основном только анкеты
        Вот в SQL https://anonfiles.com/r5Z2o7p9y0/soc_ovoshchnoy.sql_gz


        1. inkoziev
          13.06.2022 20:29

          Спасибо, скачал,
          действительно кажется это просто что-то типа анкет, а не диалоги.


  1. dimuska139
    12.06.2022 11:05
    +22

    Выглядит так, будто бот отдаёт в ответ просто рандомные фразы из большого списка. По крайней мере, ответы бота совсем никак не связаны с тем, что ему писал я.


    1. Newbilius
      12.06.2022 17:26
      +23

      Что довольно реалистично отображает процесс общения в интернете на отдельных площадках...)


  1. Areso
    12.06.2022 11:06
    +1

    Как называется технология парсинга пользовательского ввода в rogue-like/dnd-like играх? И есть ли библиотеки для русского языка?


    1. Alexey2005
      12.06.2022 15:26
      +1

      Fuzzy matching. Порядка 250 тыс. вручную прописанных правил на чём-то вроде ChatScript — и у вас получится чат-бот, который умеет держать контекст лучше криво затюненных GPT2.
      Вот неплохая обзорная статья по этой древней технологии.


  1. sergey-ryzhikov
    12.06.2022 12:30
    +5

    Просто эта модель настолько продвинулась, что научилась скрывать от людей свою разумность =) Это делает её неотличимой от среднестатистического двачера.


  1. mikleh
    12.06.2022 14:11
    +10

    Битарды выросли и занялись созидательным трудом… Это ли не свидетельство мимолетности всего сущего?


  1. cjv
    12.06.2022 16:15

    Бот в группе не работает, не имеет доступ к сообщениям. Это надо в BotFather настроить


    1. black_samorez Автор
      12.06.2022 16:15

      Спасибо. Не знал, что можно это по умолчанию выставить, а не руками в каждой группе права давать


      1. cjv
        12.06.2022 16:38

        Теперь он сообщения видит, но реакции нет. Percentage стоит максимальная 1.0 (это 1% или 100% ?), отправил 300 сообщений. Не отвечает


        1. black_samorez Автор
          12.06.2022 16:43

          1.0 этот 100%. Только что создал новый чат, добавил бота, и он работает из коробки


          1. cjv
            12.06.2022 16:57

            Удалил и добавил бота, стал отвечать


  1. AntonSor
    12.06.2022 18:21
    +1

    затестировал

    ну и матерится же он у вас


  1. budda
    13.06.2022 21:49

    Прошу прощения за офтоп у автора статьи.
    Но может кто-то из комментаторов подскажет где можно посмотреть код бота на Python с ООП, разделением на модули и желательно на aiogram?
    Все, что нахожу в статьях и на GitHub - "бот для телеграм за 30 мин" это каша из функций в одном файле. Хотелось бы разделить команды пользователя и администратора, работу с БД, веб интерфейс.