Разверните AI-помощника с помощью Rasa - от концепции до Facebook - в течение часа.

Rasa - это диалоговая платформа ИИ с открытым исходным кодом, которая использует машинное обучение для создания чат-ботов и помощников ИИ. Сегодня я собираюсь показать вам, как создать собственного простого чат-бота с помощью Rasa и развернуть его в качестве бота в мессенджере Facebook - и все это в течение часа. Все, что вам нужно, это простое программирование на Python и работающее подключение к Интернету.

Полный код можно найти здесь: GitHub Repo

Код был разработан и протестирован на Python 3.7. В настоящее время Rasa поддерживает Python только до 3.8 (обновления см. Здесь).

Бот, который мы создаем сегодня, будет очень простым и не будет углубляться в какие-либо продвинутые приложения НЛП. Тем не менее, этот фреймворк обеспечивает достаточную поддержку для более сложных приложений.

Я рекомендую этот курс Coursera, предлагаемый DeepLearning.AI, чтобы узнать больше об обработке естественного языка.



Давайте начнем!

Клонировать мое репо для полного кода.

Зависимости

Убедитесь, что все зависимости установлены. Нашему простому боту требуются всего две библиотеки:

rasa==2.2.0
spacy==2.2.4

Если вы клонировали мой репозиторий, вы можете запустить pip install -r requirements.txt, чтобы установить обе библиотеки из корневого каталога.

Простые языковые модели необходимо установить на отдельном этапе.

python3 -m spacy download en_core_web_md
python3 -m spacy link en_core_web_md en

Пошаговое руководство по репозиторию

Прежде чем я покажу вам, как обучать и развертывать нашего помощника, давайте рассмотрим каждый из компонентов, чтобы понять, как они работают вместе.

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

Начнем с файлов конфигурации.

Файлы конфигурации

endpoints.yml

Здесь находятся все конечные точки для помощника. Для поддержки настраиваемых действий (которые в основном представляют собой настраиваемый код, который вы можете написать для вызова других API, запросов к базам данных или доступа к другим созданным вами службам), нам необходимо создать сервер действий. Для этого включите action_endpoint в этот файл.

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

Вот как выглядит наш файл конечных точек.

action_endpoint:
  url: "http://localhost:5055/webhook"

config.yml

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

language: "en"

Следующий компонент настраивает конвейер NLU. Мы используем один из «разумных» стартовых конвейеров, который рекомендует Раса.

pipeline:  
  - name: SpacyNLP
  - name: SpacyTokenizer
  - name: SpacyFeaturizer
...

Далее идет policies. Это политики, которым будет следовать Rasa, чтобы отвечать на сообщения пользователей.

policies:  
  - name: MemoizationPolicy
  - name: RulePolicy
  core_fallback_threshold: 0.3
  core_fallback_action_name: action_default_fallback       
...

MemoizationPolicy запоминает последние X событий из обучающих историй. X можно указать, добавив max_history в конфигурации политики.

RulePolicy использует жесткие правила, которые мы пишем для бота (мы рассмотрим это позже), чтобы сформировать ответ. Несмотря на то, что RulePolicy указана второй, она будет иметь приоритет над другими политиками. Это связано с тем, что RulePolicy имеет наивысший приоритет по умолчанию - эти приоритеты также можно настроить. С нашей конфигурацией политики бот сначала проверит применимые правила, а затем обратится к обучающим материалам, если таковых нет.

В наших политиках также настроен резервный механизм по умолчанию. Когда показатель достоверности действия ниже нашего core_fallback_threshold, равного 0,3, он отправит заранее определенный ответ с именем utter_default и вернется в состояние до срабатывания отката. Это невероятно полезно, когда пользователь говорит что-то совершенно бессмысленное.

credentials.yml

Если ваш код размещен где-то вроде GitHub, вам следует дважды подумать, прежде чем размещать этот файл. Этот файл необходим для аутентификации. Мы будем использовать его для подключения к нашему боту Facebook Messenger. На данный момент я скрыл секреты, но мы также расскажем, как их можно генерировать из Facebook.

Примечание. этого файла нет в моем репозитории GitHub. Вам необходимо создать этот файл и заполнить его токенами, сгенерированными позже.

facebook:
  verify: "[this is your custom verification token]"
  secret: "[this is generated from facebook]"
  page-access-token: "[this is generated from facebook]"

domain.yml

Из официальной документации RASA:

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

Файл domain.yml разбит на намерения, сущности, слоты, ответы, действия и конфигурации сеанса.

  • бот обучен распознавать намерения, которые вы определяете, и будет вести себя по-разному в зависимости от того, какие из них обнаружены
  • если вы указали экстрактор сущностей в своем конвейере, он будет извлекать все сущности, которые вы определяете в этом файле; сущности могут использоваться для дальнейшего управления потоком разговора
  • слоты - это пары ключ-значение для бота для хранения информации в памяти; слоты могут быть установлены, сброшены и извлечены в любой момент во время разговора
  • ответы - это заранее определенные шаблоны ответов для отправки сообщений ботом; наш резервный вариант по умолчанию всегда будет отправлять сообщение, связанное с utter_default, когда он достигает этого состояния
  • действия включают любые настраиваемые действия, которые были определены

В конфигурации сеанса мы можем определить время истечения сеанса и должны ли слоты переноситься в новые сеансы.

Данные обучения

Мы разбиваем наши обучающие данные на три папки: nlu, rules и stories. В папке nlu мы определяем наши намерения и сущности. В папке правил мы определяем правила, которые применяются через нашу RulePolicy. Папка историй содержит фиктивные беседы, которые используются в качестве дополнительных обучающих данных для управления диалогом.

nlu.yml

В нашей настройке NLU мы определяем несколько очень простых намерений. Вот пример нашего намерения «приветствовать», в котором используются следующие данные обучения:

nlu:
  - intent: greet  
    examples: |    
      - hey    
      - hello    
      - hiya
...

В официальной документации более подробно рассказывается о том, как можно улучшить компонент NLU, например, путем включения сущностей, синонимов и справочных таблиц.

rules.yml

Правила определяют небольшие шаблоны разговоров, которым бот всегда должен следовать. RulePolicy использует эти правила для управления потоком диалога.

Здесь мы определяем простое правило «всегда приветствовать пользователя». Когда бот обнаруживает намерение «приветствовать» (он учится распознавать намерение приветствия на основе данных, предоставленных выше), он выполняет настраиваемое действие action_greet.

- rule: always greet the user 
  steps:    
    - intent: greet    
    - action: action_greet

stories.yml

Истории - это примеры «реальных» разговоров, которые используются для дальнейшего обучения модели управления диалогами бота. Они написаны как диалоги между пользователем и ботом.

Мы включим одну очень простую историю.

version: "2.0"
stories:
  - story: generic happy path
steps:
  - intent: greet
  - action: action_greet
  - intent: select_price
  - action: action_select_upper_price
  - intent: select_purpose
  - action: action_select_purpose
  - intent: select_brand
  - action: action_select_brand

Настраиваемые действия

Настраиваемые действия невероятно полезны для более сложных ботов - их можно использовать для вызова других внутренних служб NLP или общедоступных API-интерфейсов для улучшения взаимодействия.

Настроенные действия хранятся в actions/actions.py

Вот пример нашего настраиваемого действия action_greet, которое приветствует пользователя.

Каждое настраиваемое действие следует очень стандартному формату. Существует метод name, который возвращает имя настраиваемого действия - это имя должно совпадать с именем, указанным в domain.yml.

Метод run должен принимать диспетчер, трекер и домен.

  • диспетчер используется для генерации ответов (здесь он выдает два сообщения)
  • трекер относится к диалоговому трекеру и может использоваться для получения значений слотов, текущего и прошлого состояний

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

  • SlotSet - используется для установки значения слота
  • FollowupAction - запускает последующее действие
  • Перезапущен - завершить текущий разговор.

Обучение и запуск бота

Когда у вас будут все вышеперечисленные файлы, вы можете обучать бота. Запустите rasa train в корневом каталоге, чтобы запустить этот процесс. В зависимости от того, сколько у вас данных и насколько сложен ваш конвейер, это может занять некоторое время.

Если вы видите это сообщение, это означает, что модель была успешно обучена и сохранена.

Для запуска бота необходимо выполнить две команды - одну для сервера действий и одну для самого бота. Я здесь объединил в одну строчку.

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

rasa run -m models --enable-api --cors "*" --debug & rasa run actions

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

Во время выполнения вышеуказанного сервер действий будет занимать порт 5055, а бот - порт 5005.

Вы можете проверить, что сервер запущен, послав эхо-запрос http: // localhost: 5005.

Взаимодействие с ботом

Есть несколько способов начать взаимодействие с ботом.

REST API

Вы можете взаимодействовать с ботом через REST API. Пока сервер RASA работает, отправьте этот запрос для отправки сообщения от имени пользователя:

curl --request POST \
  --url http://localhost:5005/webhooks/rest/webhook \
  --header 'content-type: application/json' \
  --data '{"sender": "sender_id", "message": "hi"}'

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

Оболочка RASA

Вы можете запустить rasa shell, чтобы начать разговор с ботом через командную строку.

Настройка Facebook Messenger

Я предпочитаю развертывать сервер Rasa через ngrok, который откроет ваш локальный порт для общедоступного Интернета. В качестве альтернативы вы можете использовать такую ​​службу, как Heroku, но размер образа Rasa затрудняет работу приложения на большинстве бесплатных уровней.

настройка ngrok

  1. Создайте учетную запись ngrok
  2. Следуйте этим инструкциям, чтобы настроить ngrok на вашем компьютере: https://ngrok.com/download
  3. Запустите HTTP-туннель на порту 5005, запустив ./ngrok http 5005 в отдельном терминале

Убедитесь, что терминал работает - в любое время, когда он выйдет из строя, ваше туннелирование прекратится, и ваш бот не будет отвечать на Messenger.

Запишите сгенерированный URL. Безопасный URL-адрес (с https) необходимо будет предоставить Facebook.

Создайте приложение на Facebook

Ботов Facebook необходимо связать со страницей Facebook. Вам понадобится учетная запись Facebook, чтобы создать страницу.

Как только ваша страница будет создана, перейдите на https://developers.facebook.com/apps. Нажмите зеленую кнопку Создать приложение, чтобы создать новое приложение.

Выберите первый вариант и следуйте инструкциям по созданию приложения.

Добавьте «Мессенджер» в свое приложение, нажав кнопку «Настроить» внизу.

Настройте приложение на Facebook

Как только приложение будет создано, оно должно направить вас на страницу «Настройки» в Messenger. Если вы не попали туда автоматически, перейдите на панель управления приложения и выберите «Мессенджеры» ›« Настройки »:

Сначала свяжите свою страницу Facebook с приложением.

Рядом со связанной страницей добавьте подписки, чтобы разрешить сообщения.

Как только ваша страница будет связана, нажмите «сгенерировать токен» рядом с вашей страницей. Следите за этим токеном, так как он должен быть включен в ваш проект Rasa. Мы будем называть этот токен «токеном доступа к странице».

Затем перейдите к настройкам ›basic на панели управления, чтобы узнать секрет своего приложения.

Затем прокрутите вниз до «webhooks», чтобы добавить новый URL-адрес обратного вызова.

Прежде чем заполнять данные обратного вызова, создайте credentials.yml в своем проекте Rasa. Файл должен выглядеть примерно так:

Вот как заполнить поля:

  • verify: создайте токен безопасного подтверждения по вашему выбору.
  • секрет: это секрет вашего приложения, полученный в основных настройках.
  • page-access-token: используйте маркер доступа к странице, который вы создали для своей страницы ранее.

Снова запустите сервер Rasa, выполнив следующую команду. Это немного отличается от команды ранее, поскольку теперь мы используем флаг учетных данных.

rasa run -m models --enable-api --cors "*" --debug --credentials credentials.yml & rasa run actions

Возьмите токен проверки, который был создан как часть credentials.yml, и введите его вместе с URL-адресом обратного вызова в разделе Webhooks.

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

Убедитесь, что ваше приложение запущено и работает

Перейдите на свою страницу и попробуйте отправить сообщение боту.

Отлично, все готово! Бот в его текущем состоянии на самом деле не будет давать значимых рекомендаций по ноутбуку - может быть, однажды он будет :)

Спасибо за чтение!

Следуй за мной на Medium, чтобы быть в курсе последних обновлений. 😃

Я также создаю полный набор бесплатных уроков по науке о данных и практических задач на www.dscrashcourse.com в качестве хобби-проекта.

Еще раз спасибо за чтение! 📕