Этот репозиторий содержит решение NLP кейса для смены по машинному обучению от Тинькофф в Университете "Сириус".
За основу была взята рекомендованная модель ruDialoGPT-medium. При тестовом запуске модели было замечено, что модель не способна отвечать на сообщения, учитывая контекст предыдущей переписки. Поэтому основной целью, которую я преследовал при обучении модели, стало сделать ruDialoGPT-medium способной учитывать предыдущие сообщения при ответе пользователю.
Для дообучения были выбраны открытые чаты, с большим количеством сообщений. Преимущественно это чаты с IT тематикой, но мне также показалось интересным добавить некоторое разнообразие, чтобы диалоговая модель не была зациклена на одной теме:
- DevOps - русско-говорящее сообщество
- Go-Go!
- CyberJobsRussia
- SEO chat true Original 100%
- Startup Community
Выкачанные исходники в формате json можно найти тут.
С помощью скрипта prepare_messages.py
данные были преобразованы в csv формат (можно найти тут), чтобы в дальнейшем предобработать их и дообучить модель.
Итоговый датасет состоит из ~ 600 тысяч строк, содержащих 3 сообщения контекста и ответ. Дообучение модели происходило на вычислительном кластере
с A100, после чего модель была загружена на huggging-face: ruDialoGPT_v2_medium.
Папка finetuning содержит все скрипты для повторения результатов:
config.py
- файл, содержащий параметры загрузки данных, обучения модели и креды hf;finetuning.py
- основной скрипт, в котором происходит предобратка данных и обучение модели;train.sh
- скрипт для запуска процесса файнтюнинга на кластере с использованием менеджера очередей slurm.
Для запуска необходимо: скачать сообщения, преобразованные в csv формат, и поместить их в папку data_output.
Затем заполнить config.py
нужными параметрами и запустить установку зависимостей и скрипт вручную:
python3 -m pip install -r requierements.txt && python3 finetuning.py
или с использованием менеджера очередей slurm:
sbatch train.sh
Бот, сервис для инференса и база данных реализованы как 3 docker контейнера, разворачивающиеся в одной
сети с помощью docker-compose.yaml
Инференс модели реализован на FastApi. Код сервиса можно найти в папке model_server. Предобученная модель
с помощью git-lfs устанавливается в контейнер и затем разворачивается через библиотеку transformers. После
загрузки обращение к модели доступно внутри сети по адресу: http://dialogpt_server:80/answer
Телеграмм-бот на aiogram, способный отвечать на сообщения пользователя, находится в папке bot.
Помимо обычных текстовых сообщений бот также поддерживает отправку голосовых сообщений, которые в дальнейшем расшифровываются с помощью библиотеки SpeachRecognition и уже в текстовом виде отправляются модели.
Также бот хранит последние 3 сообщения в базе данных и по команде /clear_context
способен очистить контекст,
чтобы начать диалог с чистого листа. Интеграция с базой данных реализованая через SQLAlchemy драйвер.
Поддерживаемые команды:
/start
- начать диалог с ботом;/help
- получить help-message от бота;/clear_context
- очистить контекст переписки;{any text_message}
- получить ответ модели на сообщение;{any voice_message}
- получить ответ модели на голосовое сообщение;
Для хранения контекста переписки была выбрана база данных postgres. В ней хранится id пользователя и контекст в формате JSONB.
Для того чтобы развернуть инфраструктуру, состоящую из бота, сервиса для инференса и базы данных необходимо иметь поднятый docker deamon. Код для запуска:
BOT_TOKEN=... DB_USER=... DB_PASSWORD=... docker-compose up --build
Здесь:
- BOT_TOKEN - уникальный api токен бота, который можно получить у BotFather;
- DB_USER - имя пользователя, который будет создан в базе данных;
- DB_PASSWORD - пароль пользователя в базе данных.