Создание Goal-Oriented бота на основании своих данных

Доброго времени суток, уважаемые коллеги!
Большое спасибо за проделанную вами работу отличного качества!

Я буквально несколько дней разбираюсь с библиотекой и у меня возник целый ряд вопросов, касаемо работы с библиотекой, а порядок в голове еще не сформировался.

Предположим, что мне нужно реализовать в боте две команды:
register_user: принимается phone и name
change_phone: принимается phone
Все данные нужно отправить через API на сервер

Как я понял, нужно создать слоты phone и name для приема данных после чего на основании этих данных решать что делать.

И тут у меня возникает несколько вопросов:

  1. Как научить бота отличать просьбы пользователя зарегистрироваться от просьб изменить номер? Поиск по ключевым словам?
  2. Как научить бота добавлять номер телефона/имя в слоты? Добавить все варианты в json или как-то иначе?
  3. Как реализовать отправку данных на сервер? Или хотя бы как прочитать то, что было записано в слоты?
  4. Возможно ли конфиг-файл заменить кодом?
  5. С чего стоит начать? В каком порядке мне следует создавать бота?

Я понимаю, что многим разбирающимся людям мои вопросы могут показаться глупыми, прошу отнестись с пониманием, на этапе обучения у всех такое бывает.
Заранее спасибо большое за ответ!

1 Like

Добрый день!

  1. Это называется классификация интентов (intent - намерение) пользователя. Это простая задача классификации. Вам нужно собрать и разметить небольшой датасет различных вариантов реплик, разметить их “запрос регистрации” и “запрос изменения номера”, например. И обучить какой-нибудь классификатор (можете посмотреть список представленных моделей в документации http://docs.deeppavlov.ai/en/master/features/models/classifiers.html ).
  2. Вам нужно извлекать из текста пользователья имя и телефон (это задача распознавания именованных сущностей), создать соответствующие слоты. Заполнять слоты можно самим, например, извлекать именованные сущности и, зная их класс (телефон, имя), присваивать извлеченное значение в соответствующий слот.
  3. вы можете сохранять предикты в файл и отправлять его на сервер, но для этого вам придется писать свой код.
  4. Да, возможно, особенно в случае, когда вы используете только часть пайплайна. Ка кэто сделать смотрите на примере классфикатора в ноутбуке https://github.com/deepmipt/DeepPavlov/blob/master/examples/classification_tutorial.ipynb )
  5. Попробуйте для начала составить небольшой датасет (по 20-30 примеров) для распознавания интентов. Обучите классификатор (так как примеров мало, возьмите BERT-based ruBert, на русском языке). Попробуйте взять готовый русский NER из DeepPavlov и посмотреть качество распознавания сущностей в ваших запросах. Если качество классификации интентов и распознавания сущностей устраивает, можете сделать базовый пайплайн, в котором распознается интент входящего сообщения, извлекаются сущности, заполняются соответствующие слоты и сохраняются в файл. Если все будет устраивать - можете попробовтаь оформить заполнение слотов и отправку на сервер как отдельную компоненту DeepPavlov и вставить ее в пайплайн. Тогда, если вы оформите это все в конфиг, вы сможете одной командой поднимать это как rest server.

Успехов!