Чат-боты на Python и Rasa
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. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.