Чат-боты на Python и Rasa

Опубликовано: 19 Июля, 2021

Rasa - это инструмент для создания собственных чат-ботов с ИИ с использованием Python и понимания естественного языка (NLU). Rasa предоставляет основу для разработки чат-ботов с ИИ, которые используют понимание естественного языка (NLU). Это также позволяет пользователю обучать модель и добавлять настраиваемые действия. Чат-боты, созданные с использованием Rasa, развернуты на нескольких платформах, таких как мессенджер FB, бот Microsoft, Slack и т. Д.

Архитектура:

Архитектура гонки

Раса состоит из двух основных компонентов:

  • Rasa NLU (понимание естественного языка): Rasa NLU - это инструмент обработки естественного языка с открытым исходным кодом для классификации намерений (решает, что запрашивает пользователь), извлечения объекта из бота в виде структурированных данных и помогает чат-боту понять, что говорит пользователь.
  • Rasa Core : фреймворк чат-бота с управлением диалогом на основе машинного обучения, который принимает структурированные входные данные от NLU и предсказывает следующее наилучшее действие с использованием вероятностной модели, такой как нейронная сеть LSTM, а не оператора if / else. Под капотом он также использует обучение с подкреплением, чтобы улучшить предсказание следующего наилучшего действия.

Другими словами, задача Rasa NLU - интерпретировать ввод, предоставленный пользователем в форме структурированных данных, а задача Rasa Core - определять следующий набор действий, выполняемых чат-ботом. Rasa Core и Rasa NLU не зависят друг от друга и могут использоваться отдельно.

Как установить Rasa :

  • Перед установкой RASA настоятельно рекомендуется использовать виртуальную среду. Для создания виртуальной среды в anaconda используется следующая команда:
 conda create -n rasa
активировать расу




  • Теперь мы установим Rasa в нашу среду, мы будем устанавливать его с помощью pip install. Нам также необходимо установить TensorFlow в нашей среде (он будет установлен Rasa по умолчанию). Установка rasa займет некоторое время.
 pip install rasa
  • Теперь инициализируем бота с помощью rasa init. Это создаст исходные файлы проекта для чат-бота и обучит исходную модель.
 раса инициализация
o начать работу быстро, будет создан первоначальный проект.
Если вам нужна помощь, ознакомьтесь с документацией по адресу https://rasa.com/docs/rasa.
А теперь приступим! ????????

? Введите путь, по которому будет создан проект [по умолчанию: текущий каталог] ./sample_bot
? Путь './sample_bot' не существует ????. Создать путь? да
Создан каталог проекта в 'C:  Users  Pawan  Desktop  chatbots  sample_bot'.
Завершено создание структуры проекта.
? Вы хотите обучить начальную модель? ???????? да
Обучение исходной модели ...
Базовая модель обучения ...
Обработано сюжетных блоков: 100% | ????????????????????????????????????????? ??????????? | 5/5 [00:00 <?,? It / s, # трекеров = 1]
Обработано сюжетных блоков: 100% | ????????????????????????????????????????? ? | 5/5 [00:00 <00:00, 1252,55 бит / с, # трекеров = 5]
Обработано сюжетных блоков: 100% | ????????????????????????????????????????? ? | 5/5 [00:00 <00:00, 250,35 бит / с, # трекеров = 20]
Обработано сюжетных блоков: 100% | ????????????????????????????????????????? ? | 5/5 [00:00 <00:00, 178,79 бит / с, # трекеров = 24]
Обработано трекеров: 100% | ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?????? ???? | 5/5 [00:00 <00:00, 1252.03it / s, # actions = 16]
Обработанные действия: 16ит [00:00, 667,56ит / с, # examples = 16]
Обработано трекеров: 100% | ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?????? | 231/231 [00:00 <00:00, 284,86 бит / с, # действий = 126]
Эпох: 0% | | 0/100 [00:00 <?,? It / s] c:  users  Pawan  anaconda3  envs  rasa  lib  site-packages  rasa  utils  tensorflow  model_data.py: 386: VisibleDeprecationWarning: создание ndarray из рваных вложенных последовательностей (который представляет собой список или кортеж списков или кортежей или ndarrays с разной длиной или формой) устарел. Если вы хотели это сделать, вы должны указать 'dtype = object' при создании ndarray
  final_data [k] .append (np.concatenate (np.array (v)))
Эпохи: 100% | ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ???? 100/100 [00:31 <00:00, 3,15ит / с, t_loss = 0,202, убыток = 0,131, расчет = 1.000].....................................................................................................................................................................................................................................................................
2020-07-31 22:55:59 ИНФОРМАЦИЯ rasa.utils.tensorflow.models - Завершено обучение.
2020-07-31 22:56:02 INFO rasa.core.agent - Сохраненная модель в 'C:  Users  Pawan  AppData  Local  Temp  tmpk26900vo  core'
Обучение базовой модели завершено.
Обучающая модель NLU ...
2020-07-31 22:56:03 INFO rasa.nlu.training_data.training_data - Статистика тренировочных данных:
2020-07-31 22:56:03 INFO rasa.nlu.training_data.training_data - Количество примеров намерений: 43 (7 различных намерений)
2020-07-31 22:56:03 INFO rasa.nlu.training_data.training_data - Найдены намерения: 'bot_challenge', 'mood_unhappy', 'mood_great', 'greet', 'affirm', 'goodbye', 'deny'
2020-07-31 22:56:03 INFO rasa.nlu.training_data.training_data - Количество примеров ответов: 0 (0 отдельных ответов)
2020-07-31 22:56:03 INFO rasa.nlu.training_data.training_data - Количество примеров сущностей: 0 (0 отдельных сущностей)
2020-07-31 22:56:03 INFO rasa.nlu.model - Начало обучения компонента WhitespaceTokenizer
2020-07-31 22:56:03 INFO rasa.nlu.model - Завершенный обучающий компонент.
2020-07-31 22:56:03 INFO rasa.nlu.model - Начало обучения компонента RegexFeaturizer
2020-07-31 22:56:03 INFO rasa.nlu.model - Завершенный обучающий компонент.
2020-07-31 22:56:03 INFO rasa.nlu.model - Начало обучения компонента LexicalSyntacticFeaturizer
2020-07-31 22:56:03 INFO rasa.nlu.model - Завершенный обучающий компонент.
2020-07-31 22:56:03 INFO rasa.nlu.model - Начало обучения компонента CountVectorsFeaturizer
2020-07-31 22:56:03 INFO rasa.nlu.model - Завершенный обучающий компонент.
2020-07-31 22:56:03 INFO rasa.nlu.model - Начало обучения компонента CountVectorsFeaturizer
2020-07-31 22:56:03 INFO rasa.nlu.model - Завершенный обучающий компонент.
2020-07-31 22:56:03 INFO rasa.nlu.model - Начинаем обучать компонент DIETClassifier
Чтобы быстро приступить к работе, будет создан первоначальный проект.
Если вам нужна помощь, ознакомьтесь с документацией по адресу https://rasa.com/docs/rasa.
А теперь приступим! ????????

? Введите путь, по которому будет создан проект [по умолчанию: текущий каталог] ./sample_bot
? Путь './sample_bot' не существует ????. Создать путь? да
Создан каталог проекта в 'C:  Users  Pawan  Desktop  chatbots  sample_bot'.
Завершено создание структуры проекта.
? Вы хотите обучить начальную модель? ???????? да
Обучение исходной модели ...
Базовая модель обучения ...
Обработано сюжетных блоков: 100% | ????????????????????????????????????????? ??????????? | 5/5 [00:00 <?,? It / s, # трекеров = 1]
Обработано сюжетных блоков: 100% | ????????????????????????????????????????? ? | 5/5 [00:00 <00:00, 1252,55 бит / с, # трекеров = 5]
Обработано сюжетных блоков: 100% | ????????????????????????????????????????? ? | 5/5 [00:00 <00:00, 250,35 бит / с, # трекеров = 20]
Обработано сюжетных блоков: 100% | ????????????????????????????????????????? ? | 5/5 [00:00 <00:00, 178,79 бит / с, # трекеров = 24]
Обработано трекеров: 100% | ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ?????? ???? | 5/5 [00:00 <00:00, 1252.03it / s, # actions = 16]
Обработанные действия: 16ит [00:00, 667,56ит / с, # examples = 16]
Обработано трекеров: 100% | ?????????????????????????????????????????? | 231/231 [00:00 <00:00, 284,86 бит / с, # действий = 126]
Эпохи: 0% | | 0/100 [00:00 <?,? It / s] c:  users  Pawan  anaconda3  envs  rasa  lib  site-packages  rasa  utils  tensorflow  model_data.py: 386: VisibleDeprecationWarning: создание ndarray из рваных вложенных последовательностей (который представляет собой список или кортеж списков или кортежей или ndarrays с разной длиной или формой) устарел. Если вы хотели это сделать, вы должны указать 'dtype = object' при создании ndarray
  final_data [k] .append (np.concatenate (np.array (v)))
Эпох: 100% | ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 100/100 [00:31 <00:00, 3,15ит / с, t_loss = 0,202, потери = 0,131, acc = 1.000]
2020-07-31 22:55:59 ИНФОРМАЦИЯ rasa.utils.tensorflow.models - Завершено обучение.
2020-07-31 22:56:02 INFO rasa.core.agent - Сохраненная модель в 'C:  Users  Pawan  AppData  Local  Temp  tmpk26900vo  core'
Обучение базовой модели завершено.
Обучающая модель NLU ...
2020-07-31 22:56:03 INFO rasa.nlu.training_data.training_data - Статистика тренировочных данных:
2020-07-31 22:56:03 INFO rasa.nlu.training_data.training_data - Количество примеров намерений: 43 (7 различных намерений)
2020-07-31 22:56:03 INFO rasa.nlu.training_data.training_data - Найдены намерения: 'bot_challenge', 'mood_unhappy', 'mood_great', 'greet', 'affirm', 'goodbye', 'deny'
2020-07-31 22:56:03 INFO rasa.nlu.training_data.training_data - Количество примеров ответов: 0 (0 отдельных ответов)
2020-07-31 22:56:03 INFO rasa.nlu.training_data.training_data - Количество примеров сущностей: 0 (0 отдельных сущностей)
2020-07-31 22:56:03 INFO rasa.nlu.model - Начало обучения компонента WhitespaceTokenizer
2020-07-31 22:56:03 INFO rasa.nlu.model - Завершенный обучающий компонент.
2020-07-31 22:56:03 INFO rasa.nlu.model - Начало обучения компонента RegexFeaturizer
2020-07-31 22:56:03 INFO rasa.nlu.model - Завершенный обучающий компонент.
2020-07-31 22:56:03 INFO rasa.nlu.model - Начало обучения компонента LexicalSyntacticFeaturizer
2020-07-31 22:56:03 INFO rasa.nlu.model - Завершенный обучающий компонент.
2020-07-31 22:56:03 INFO rasa.nlu.model - Начало обучения компонента CountVectorsFeaturizer
2020-07-31 22:56:03 INFO rasa.nlu.model - Завершенный обучающий компонент.
2020-07-31 22:56:03 INFO rasa.nlu.model - Начало обучения компонента CountVectorsFeaturizer
2020-07-31 22:56:03 INFO rasa.nlu.model - Завершенный обучающий компонент.
2020-07-31 22:56:03 INFO rasa.nlu.model - Начинаем обучать компонент DIETClassifier
....




Начиная:

Приведенная выше команда создаст исходные файлы проекта в каталоге sample_bot. Посмотрим на эти файлы:

  • __init__.py: пустой файл, который помогает python находить ваши действия.
  • actions.py: этот файл используется для создания настраиваемых действий. Если вы хотите вызвать внешний сервер или получить данные внешнего API, вы можете определить свои действия здесь.
  • config.yml : этот файл определяет конфигурацию NLU и базовой модели. Если вы используете какую-либо модель вне модели NLU, вы должны определить конвейер здесь.
  • credentials.yml : этот файл используется для хранения учетных данных для подключения к внешним службам, таким как Facebook Messenger, Slack и т. д.
  • data / nlu.md : в этом файле мы определяем наши намерения (что пользователь может попросить сделать бота?). Эти намерения затем используются при обучении модели NLU.
  • data / stories.md : Истории - это образец разговора между пользователем и ботом в форме намерений, ответов и действий. Истории Раса - это форма обучающих данных, используемых для обучения моделей управления диалогами Раса.
  • domain.yml : в этом файле перечислены различные намерения (то, что вы ожидаете от пользователя) с ответами бота и действиями, которые он может выполнять.
  • endpoints.yml : определяет детали для подключения каналов, таких как Slack, FB messenger и т. д., для хранения данных чатов в онлайн-базах данных, таких как Redis и т. д.
  • models / <timestamps> .tar.gz : исходная модель, все обученные модели хранятся в папке моделей. Для переобучения модели используем команду rasa train.

Для запуска локальной среды мы используем команду rasa x. Это началось с чего-то

 Запуск Rasa X в локальном режиме ... ????
Ух ты
Ух ты

Сервер работает по адресу http: // localhost: 5002 / login? Username = me & password = s23dafd5436d

2020-08-01 00:27:24 ПРЕДУПРЕЖДЕНИЕ sanic.root - Sanic пытался использовать loop.add_signal_handler, но это не реализовано на этой платформе.
2020-08-01 00:27:24 ПРЕДУПРЕЖДЕНИЕ sanic.root - Sanic пытался использовать loop.add_signal_handler, но это не реализовано на этой платформе.




  • Теперь перейдите по адресу, предоставленному сервером rasa, мы увидим окно браузера, в котором открывается окно чата, которое мы можем использовать для общения с помощником.

Создание бота погоды в Расе:

  • В этом уроке мы создадим бота, который может сообщать нам погоду в любом городе, мы также будем использовать открытый API погоды для этого урока.
  • Сначала мы инициализируем проект, используя следующую команду:
 rasa init --no-prompt


  • Это создаст начальную структуру проекта, как мы видели выше. Для этого проекта нам нужно только внести изменения в следующие файлы:
    • data / nlu.md
    • data / stories.md
    • domain.yml
    • endpoints.yml
    • actions.py
  • Остальные все файлы оставляем без изменений.
  • Сначала мы определим истории (Примечание: истории - пример разговора, который мы использовали для обучения нашей модели). Эти истории определены в форме языка разметки. Мы удаляем некоторые предопределенные истории и заменяем их теми разговорами, которые актуальны для нашего бота.
 ## попрощайся
* до свидания
  - utter_goodbye

## вызов бота
* bot_challenge
  - utter_iamabot

## weather long
* приветствовать
  - utter_greet
* Погода
  - utter_ask_location
* city_info
  - utter_getting_weather
  - action_get_weather
* Благодарность
  - utter_welcome
  - utter_goodbye

## погода короткая
* приветствовать
  - utter_greet
* weather_for_location
  - utter_getting_weather
  - action_get_weather
* Благодарность
  - utter_welcome
  - utter_goodbye

## Новая история

* приветствовать
    - utter_greet
* weather_for_location {"location": "Лондон"}
    - utter_getting_weather
    - action_get_weather


  • Rasa nlu.md содержит список намерений и их возможный образец текста. Кроме того, в этом примере мы будем отображать наши сущности отдельно stext. Эти намерения используются для обучения нашей модели NLU.
 ## intent: приветствовать
- Привет
- Привет
- Привет
- доброе утро
- Добрый вечер
- Привет

## intent: до свидания
- до свидания
- до свидания
- Увидимся
- до скорого

## intent: bot_challenge
- Вы - бот?
- Ты человек?
- я разговариваю с ботом?
- я разговариваю с человеком?

## intent: weather
- какая погода
- какая сегодня температура
- какая температура
- я хочу знать температуру
- я хочу знать погоду сегодня
- скажи мне прогноз погоды
- Какая сегодня погода

## intent: weather_for_location
- какая погода в [Нойда] (местоположение)
- какая погода в [Нью-Дели] (местоположение)
- погода [Мумбаи] (местоположение)
- Погода сегодня в [Бангалоре] (местоположение)
- Погода [Калькутта] (местоположение)
- Сообщите мне погоду [Хайдарабад] (местоположение)
- Можете ли вы сказать мне погоду [Лондон] (местоположение)

## intent: city_info
- [Нью-Дели] (местонахождение)
- [Индия] (местоположение)
- [Мумбаи] (местоположение)
- [Нойда] (местоположение)
- [Калькутта] (местоположение)
- [Бангалор] (местонахождение)
- [Лондон] (местонахождение)

## intent: спасибо
- Благодарность
- Спасибо
- ОК



  • В файле domain.yml перечислены все намерения, ответы бота с их текстом, а также действия, которые может выполнить бот. Обратите внимание: любое действие или ответ, которые мы определяем (в nlu.md/ stories.md), должны быть перечислены в domain.yml.
 session_config:
  session_expiration_time: 60
  carry_over_slots_to_new_session: true

намерения:
- приветствовать
- до свидания
- bot_challenge
- Погода
- weather_for_location
- city_info
- Благодарность
сущности:
- место расположения
слоты:
  место расположения:
    тип: текст
ответы:
  utter_greet:
  - текст: Эй! 
  utter_goodbye:
  - текст: Пока
  - текст: До свидания
  utter_ask_location:
  - текст: откуда?
  - текст: В каком городе?
  utter_getting_weather:
  - текст: Хорошо, получаю погоду [место] ...
  utter_welcome:
  - текст: Добро пожаловать
  utter_iamabot:
  - текст: Я бот, работающий на Rasa.
действия:
- action_get_weather


  • Теперь мы определяем функцию «action_get_weather» в файле actions.py. Эта функция берет название города из сущности и получает погоду города с помощью OpenWeatherMap API.
 от ввода импорта Any, Text, Dict, List

from rasa_sdk import Action, Tracker
из rasa_sdk.events import SlotSet
из rasa_sdk.executor импортировать CollectingDispatcher
запросы на импорт


класс ActionCheckWeather (Действие):

    def name (self) -> Текст:
        вернуть "action_get_weather"
    
    def run (сам, диспетчер, трекер, домен):
        api_key = 'Ваш ключ API'
        loc = tracker.get_slot ('местоположение')
        current = requests.get ('http://api.openweathermap.org/data/2.5/weather?q= {} & appid = {}' .format (loc, api_key)). json ()
        печать (текущий)
        страна = текущая ['sys'] ['страна']
        город = текущий ['имя']
        condition = current ['weather'] [0] ['main']
        temperature_c = текущий ['основной'] ['темп »]
        влажность = текущая ['основная'] ['влажность']
        wind_mph = текущий ['ветер'] ['скорость']
        response = "" "Сейчас {} в {}. Температура {} градусов, влажность {}% и скорость ветра {} миль в час." "". format (condition, city, temperature_c , влажность, wind_mph)
        dispatcher.utter_message (ответ)
        return [SlotSet ('местоположение', местоположение)]


  • Теперь мы обучаем нашу модель с помощью команды rasa train . Это обучит нашу модель NLU.
  • Чтобы убедиться, что наша модель работает правильно, мы используем следующую команду:
 раса оболочка нлу


Модель NLU загружена. Введите сообщение и нажмите клавишу ВВОД, чтобы проанализировать его.
Следующее сообщение:
погода в Нойде
{
  "намерение": {
    "name": "weather_for_location",
    «уверенность»: 0,9999433755874634
  },
  "сущности": [
    {
      "entity": "location",
      «начало»: 11,
      «конец»: 16,
      "value": "Нойда",
      "экстрактор": "DIETClassifier"
    }
  ],
  "intent_ranking": [
    {
      "name": "weather_for_location",
      «уверенность»: 0,9999433755874634
    },
    {
      "name": "city_info",
      "уверенность": 5.397644417826086e-05
    },
    {
      "name": "привет",
      "уверенность": 1.0934791134786792e-06
    },
    {
      "name": "до свидания",
      "уверенность": 1.0303868975825026e-06
    },
    {
      "имя": "спасибо",
      "уверенность": 2.715441951295361e-07
    },
    {
      "name": "погода",
      "уверенность": 2.5835913675109623e-07
    },
    {
      "name": "bot_challenge",
      "уверенность": 4.761825422860966e-08
    }
  ],
  "response_selector": {
    "По умолчанию": {
      "отклик": {
        "имя": ноль,
        «уверенность»: 0,0
      },
      "рейтинг": [],
      "full_retrieval_intent": ноль
    }
  },
  "текст": "погода в Нойде"
}
Следующее сообщение:
погода в Дели
{
  "намерение": {
    "name": "weather_for_location",
    «уверенность»: 0,9984486103057861
  },
  "сущности": [
    {
      "entity": "location",
      "начало": 0,
      «конец»: 5,
      "значение": "дели",
      "экстрактор": "DIETClassifier"
    }
  ],
  "intent_ranking": [
    {
      "name": "weather_for_location",
      «уверенность»: 0,9984486103057861
    },
    {
      "name": "погода",
      «уверенность»: 0,0012639579363167286
    },
    {
      "имя": "спасибо",
      "уверенность": 9.82139608822763e-05
    },
    {
      "name": "до свидания",
      "уверенность": 8.915668877307326e-05
    },
    {
      "name": "привет",
      "уверенность": 6.841398135293275e-05
    },
    {
      "name": "city_info",
      "уверенность": 2.7903372028958984e-05
    },
    {
      "name": "bot_challenge",
      "уверенность": 3.7094062008691253e-06
    }
  ],
  "response_selector": {
    "По умолчанию": {
      "отклик": {
        "имя": ноль,
        «уверенность»: 0,0
      },
      "рейтинг": [],
      "full_retrieval_intent": ноль
    }
  },
  "текст": "погода в Дели"
}
Следующее сообщение:
какая погода
{
  "намерение": {
    "name": "погода",
    «уверенность»: 0,9636867642402649
  },
  "сущности": [],
  "intent_ranking": [
    {
      "name": "погода",
      «уверенность»: 0,9636867642402649
    },
    {
      "name": "weather_for_location",
      «уверенность»: 0,03303918614983559
    },
    {
      "имя": "спасибо",
      «уверенность»: 0,0017935443902388215
    },
    {
      "name": "до свидания",
      «уверенность»: 0,0011113830842077732
    },
    {
      "name": "bot_challenge",
      «уверенность»: 0,00020741281332448125
    },
    {
      "имя": "привет",
      «уверенность»: 0,0001540367811685428
    },
    {
      "name": "city_info",
      "уверенность": 7.643929166079033e-06
    }
  ],
  "response_selector": {
    "По умолчанию": {
      "отклик": {
        "имя": ноль,
        «уверенность»: 0,0
      },
      "рейтинг": [],
      "full_retrieval_intent": ноль
    }
  },
  "текст": "какая погода"
}

  • Как мы можем заметить, обученная выше модель NLU правильно классифицирует намерение с высокой точностью. Теперь перейдите в файл endpoints.yml и добавьте или раскомментируйте следующие строки:
 action_endpoint:
  url: "http: // localhost: 5055 / webhook"
  • Теперь откройте два окна командной строки, в одном окне выполните действия, используя следующую команду:
 действия rasa run

А в другом окне запустите оболочку rasa, используя следующую команду:

 раса оболочка


  • Мы также можем визуализировать график последовательности разговоров бота:
 раса визуализируйте

Рекомендации:

  • Документация Rasa

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.