В этой статье продолжим создание нашего бота начатого в первой части.
Rasa Core, полностью независимая часть фреймворка от Rasa NLU. Так при создание бота с качестве модели NLU можно использовать другие фреймворки, например DialogFlow, Wit, или Luis.
Большая часть полезной информации описывающий что такое Rasa Core описана в официальной документации Rasa Core
Основными компонентами Rasa Core являются:
Для начало создадим все необходимы каталоги.
Сразу создадим масштабируемую архитектуру проекта, например в будущем, у нас может быть несколько ботов. А боты работают лучше, когда они настроены на работу с определенной группой задач, например, с путешествиями или погодой. Создать бота, который должен справляться как с путешествиями, так и с погодой, было бы гораздо сложнее, поэтому во многих случаях лучше создать двух отдельных ботов. Таким образом, наша структура папок должна предоставлять возможность создавать множество ботов в будущем.
В нашем описание 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 — это сущности извлеченные NLU из вводимого текста. Их так же необходимо описать в нашем domain.yml.
entities: - user_name - mission_destination - mission_objective - location - person
Slots это сущности которые бот сможет запоминать. Разница между slots и entities по начало может быть совсем не очевидна, так как эти понятие очень похожи. entities это сущности которые могут быть извлечены из вводимого текста и обработаны в actions, а slots которые могут быть просто сохранены для дальнейшего выбора действий. Slots влияет на машинное обучения, а также на выбор сценария сделанного ботом. Entities не оказывают на это ни какого влияния.
Выбор типа slot очень важен потому что это влияет на предсказания диалога. Но нужно учесть что алгоритмы машинного обучения не используют действительные значения slot. Для примера, если я выберу тип slot “text,” это не будет означать что бот сможет прочитать текст что бы понять как действовать дальше, он только сможет увидеть что у нас есть текст или у нас нету текста и затем принять решения как действовать дальше.
Добавим slots в наш domain.yml:
slots: location: type: text person: type: text
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 в domain.yml:
actions: - utter_hello - utter_goodbye - utter_my_name_is - utter_mission_cancelled - utter_ease_tension
Stories — это способ обучения поведения бота во всех возможных ситуациях которые наш бот сможет распознать. Этот файл состоит из описание ситуации и описание действий на эту ситуацию. Смысл этого можно представить на примере, если нам нужно обучить ребенка быть вежливым и в определенных ситуациях говорить спасибо. То мы можем сказать ему что если кто нибудь откроет тебе дверь тебе нужно сказать спасибо. В формате stories это можно было бы описать так:
## open_door_scenario_1 * open_door - utter_thank_you
В данном случае
строка ##open_door_scenario_1 - это просто название ситуации для бота это ничего не означает
строка * open_door - это название распознанного intent
строка - utter_thank_you - это название действия actions
Далее опишем несколько ситуаций которые наш бот сможет распознать и среагировать соответствующим образом. Мы опишем несколько простых и очевидных ситуаций:
Описание этих ситуаций в нашем 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
Если вы раньше не сталкивались с машинным обучением, я приведу описания некоторых стандартных понятий в машинном обучение .
Далее запустим процесс обучения. В следующую команду мы передали расположение файла 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
Краткий перевод: https://vuejs.org/guide/components/v-model.html Основное использование v-model используется для реализации двусторонней привязки в компоненте. Начиная с Vue…
Сегодня мы рады объявить о выпуске Vue 3.4 «🏀 Slam Dunk»! Этот выпуск включает в…
Vue.js — это универсальный и адаптируемый фреймворк. Благодаря своей отличительной архитектуре и системе реактивности Vue…
Недавно, у меня истек сертификат и пришлось заказывать новый и затем устанавливать на хостинг с…
Каким бы ни было ваше мнение о JavaScript, но всем известно, что работа с датами…
Все, кто следит за последними событиями в мире адаптивного дизайна, согласятся, что введение контейнерных запросов…