Создание чатбота с помощью RASA — Часть 2
В этой статье продолжим создание нашего бота начатого в первой части.
Rasa Core
Rasa Core, полностью независимая часть фреймворка от Rasa NLU. Так при создание бота с качестве модели NLU можно использовать другие фреймворки, например DialogFlow, Wit, или Luis.
Большая часть полезной информации описывающий что такое Rasa Core описана в официальной документации Rasa Core
Основными компонентами Rasa Core являются:
- domain – по сути это описание мира бота. Все что он знает, говорит и отслеживает должно быть описано в этом файле.
- stories – так как бот использует машинное обучение, чтобы определить, что ему делать в той или иной ситуации, то ему нужно предоставить данные для определения дальнейших действий.
Создание «мира» бота
Для начало создадим все необходимы каталоги.
- В главной директории проекта создадим папку agents.
Сразу создадим масштабируемую архитектуру проекта, например в будущем, у нас может быть несколько ботов. А боты работают лучше, когда они настроены на работу с определенной группой задач, например, с путешествиями или погодой. Создать бота, который должен справляться как с путешествиями, так и с погодой, было бы гораздо сложнее, поэтому во многих случаях лучше создать двух отдельных ботов. Таким образом, наша структура папок должна предоставлять возможность создавать множество ботов в будущем.
- В папке agents, создадим папку agent007. Это будет главной папкой для всего что будет связано с нашим ботом.
- В папке agent007 создадим папку domain. Здесь создадим файл domain.yml.
Intents
В нашем описание NLU мы создали несколько intents которые сможет обрабатывать наш бот. Но так как Rasa NLU и Rasa Core полностью независимые компоненты фреймворка нам необходимо дополнительно описать intents в файле domain.
И так добавим следующее строки в наш domain.yml.
intents: - cancel_mission - current_mission - describe - frustrated - goodbye - hello - say_your_name - start_mission - store_name
Entities
Entities — это сущности извлеченные NLU из вводимого текста. Их так же необходимо описать в нашем domain.yml.
entities: - user_name - mission_destination - mission_objective - location - person
Slots
Slots это сущности которые бот сможет запоминать. Разница между slots и entities по начало может быть совсем не очевидна, так как эти понятие очень похожи. entities это сущности которые могут быть извлечены из вводимого текста и обработаны в actions, а slots которые могут быть просто сохранены для дальнейшего выбора действий. Slots влияет на машинное обучения, а также на выбор сценария сделанного ботом. Entities не оказывают на это ни какого влияния.
Выбор типа slot очень важен потому что это влияет на предсказания диалога. Но нужно учесть что алгоритмы машинного обучения не используют действительные значения slot. Для примера, если я выберу тип slot “text,” это не будет означать что бот сможет прочитать текст что бы понять как действовать дальше, он только сможет увидеть что у нас есть текст или у нас нету текста и затем принять решения как действовать дальше.
Добавим slots в наш domain.yml:
slots: location: type: text person: type: text
Templates
Templates — это объекты которые возвращает бот пользователю. В нашем пример бот всегда будет возвращать текст, но он также может возвращать кнопки (buttons) и картинки.
Добавим templates в domain.yml:
templates: utter_hello: - "I never left" - "We have some unfinished business" - "I always wondered how I would feel when I saw you again" - "{user_name}. Let me tell you the secret of the world." utter_goodbye: - "I think we understand one another" - "Ok, I'll just go take the Aston Martin out for a spin then." - "I am invincible." - "Then you have my resignation, sir." - "Until we meet again {user_name}" utter_my_name_is: - "The name's Bond. James Bond." - "I believe we haven't be properly introduced. my name is Bond... James Bond." - "Bond. James Bond." utter_mission_cancelled: - "Mission Cancelled! Now... I have some unfinished business to attend to." - "I'll call you back..." - "Message received. Loud and clear." utter_ease_tension: - "I admire your courage..." - "Well, we have had our kicks" - "Perhaps you would like a drink. Shaken.... not stirred." - "This never happened to the other fellow"
Actions
Actions это действия которые наш бот может осуществлять. В нашем примере наш бот может только отвечать нам, но так же во фреймворке можно создать свои собственные actions.
Добавим несколько actions в domain.yml:
actions: - utter_hello - utter_goodbye - utter_my_name_is - utter_mission_cancelled - utter_ease_tension
Stories
Stories — это способ обучения поведения бота во всех возможных ситуациях которые наш бот сможет распознать. Этот файл состоит из описание ситуации и описание действий на эту ситуацию. Смысл этого можно представить на примере, если нам нужно обучить ребенка быть вежливым и в определенных ситуациях говорить спасибо. То мы можем сказать ему что если кто нибудь откроет тебе дверь тебе нужно сказать спасибо. В формате stories это можно было бы описать так:
## open_door_scenario_1 * open_door - utter_thank_you
В данном случае
строка ##open_door_scenario_1 - это просто название ситуации для бота это ничего не означает
строка * open_door - это название распознанного intent
строка - utter_thank_you - это название действия actions
Далее опишем несколько ситуаций которые наш бот сможет распознать и среагировать соответствующим образом. Мы опишем несколько простых и очевидных ситуаций:
- Hello -> utter_hello
- Goodbye -> utter_goodbye
- Hello -> utter_hello -> say_your_name -> utter_my_name_is
- Frustrated -> utter_ease_tension
Описание этих ситуаций в нашем stories.md будет выглядеть следующим образом:
## 204958098 * hello - utter_hello ## 103489713 * goodbye - utter_goodbye ## 12034981048 * hello - utter_hello * say_your_name - utter_my_name_is ## 1304981340 * frustrated - utter_ease_tension
Обучение
Далее мы обучим нашего бота, но прежде чем это сделать я опишу, для чего нужно обучение. Используя описанный выше пример «open_door» и научив ребенка говорить «спасибо», будет ли это достаточно. Каждый раз, когда кто-то открывает ему дверь, он должен будет сказать спасибо. Но что, если кто-то откроет ему окно или банку консерв? Если мы хотим предусмотреть все возможные ситуации, то мы должны будем описать очень много ситуаций, что в большинстве случаем практически не реализуемо. Поэтому нам нужно будет воспользоваться таким понятием как вероятность. Если кто-то открывает для нас что то, что вы раньше не предусмотрели в файле историй, у нас, появиться некоторая probably (вероятность), следует ли сказать спасибо.
Так же во фреймворке существуют различные правила обучения которые называются “policies” (политиками). Для большинства ботов политика по умолчанию предпочтительный выбор. В нашем примере мы немножко изменим политику по умолчанию только в демонстрационных целях.
Внутри папки agent007, создадим файл config.yml. В этом файле опишем наши настройки политики обучения. Мы используем Memoization policy, которая запоминает stories так что бот будет точно следовать описанному сценарию поведения. Так же мы добавили Keras policy, стандартная политика машинного обучения для предугадывания следующего шага поведения, когда бот столкнется с не описанной ситуацией. Если бот не сможет предугадать следующий шаг он будет действовать согласно политики по умолчанию описанному в Fallback policy.
Наш файл настроек config.yml будет выглядеть следующим образом:
policies: - name: KerasPolicy epochs: 100 max_history: 3 augmentation: 20 batch_size: 10 validation: 0.2 - name: Fallbackpolicy fallback_action_name: 'action_default_fallback' - name: MemoizationPolicy max_history: 5 - name: FormPolicy
Если вы раньше не сталкивались с машинным обучением, я приведу описания некоторых стандартных понятий в машинном обучение .
- Max History сообщает боту, насколько предыдущий разговор повлияет на текущий прогноз. У вас может возникнуть соблазн сделать это число максимально большим, но будьте осторожны. Чем больше это число тем дольше будет идти процесс обучения. Обычно оно не должно быть больше 4.
- Epochs – машинное обучение с учителем (как в нашем случае) включает в себя машинное тестирование алгоритма на основе известных результатов, чтобы понят на сколько точен результат обучения, и автоматическое изменения настроек параметров и алгоритма, чтобы попытаться повысить точность результата. Для этого ему нужно выполнить много разных «прогонов» прогноза. Это так называемые эпохи (epochs). Обычно количество эпох устанавливается так, чтобы число было достаточно большим, чтобы можно было бы получить хорошую сходимость по точности.
- Batch_size – многие алгоритмы имеют тенденцию работать лучше, когда они проверяют точность группы прогнозов вместо, одного прогноза за раз. Это связано с так называемым «градиентным спуском». Так же пакеты помогают машинному обучению обходим ловушки с «переобучением».
- Augmentation – Мы можем улучшить наши истории, программно, автоматически создавая больше похожих сценариев. Это очень полезно, так что нам не нужно будет вручную описывать огромное количество историй.
- Validation – алгоритмы машинного обучения должны проверять свою точность на предмет чего-либо. В нашем случае это число означает процент данных который будут использоваться для проверки нашей точности, а оставшийся процент будет использован для обучения. 20 процентов обычно довольно типичное значения этого параметра.
Далее запустим процесс обучения. В следующую команду мы передали расположение файла stories.md, расположения файла domain.yml, расположения модели NLU models/dialog, а так же расположения файла настроек обучения config.yml
python -m rasa_core.train -d domain/domain.yml -s stories.md -o models/dialog -c config.yml
Тестирование бота
После обучения мы можем проверить как работает наш бот. Для запуска, бота нам нужны только два аргумента: папка сценария поведения и расположение моделей NLU.
python -m rasa_core.run -d models/dialog -u ../../nlu/agent/default/default