В этой статье приведен пример создание простого чатбота на основе фреймворка RASA. RASA — это открытый и весьма популярный фреймворк для создания чатботов на Python с использованием машинного обучения. Он состоит из двух независимых компонент Rasa NLU и Rasa Core.
Rasa NLU (Natural Language Understanding — Понимание естественного языка). Его главная цель это преобразование ввода пользователя на естественном языке в объекты с которыми может работать программа.
Rasa Core — Это компонент отвечает со создание сценария работы чатбота.
И так что такое Rasa NLU? Для примера, рассмотрим ситуацию когда кто нибудь отправит чатботу одну из подобных фраз:
Движок NLU принимает на вход одну из таких фразу и конвертирует во что типа “yes.” В данном случае “yes” в определениях фреймворка называется intent.
В дополнение к определению типа фразы возможно так же извлечение полезной информации из фразы.
Для примера, если кто нибудь скажет фразу “Give me directions from home to 4th street.” Rasa NLU может извлечь entities и вернуть объект:
{ "intent": "directions", "entities": { "from": "home", "to": "4th street" } }
Команда инсталляции:
pip install rasa_nlu
Для работы Rasa необходимы библиотеки машинного обучения. В нашем примере мы будем использовать spaCy + sklearn. После основной установки нужно будет инсталлировать spacy как основной движок NLU, следующей командой:
pip install rasa_nlu[spacy]
Нам также потребуется загрузить корпус Английского языка (среднего размера) командой:
python –m spacy download en_core_web_md
Далее создадим линк “en” на этот корпус командой:
python –m spacy link en_core_web_md en
В Rasa NLU есть две главные сущности: intents и entities. Intents это распознанные и классифицированные строки на естественном языке того что введет пользователь.
Для примера, я могу ввести фразу “What is the weather today?” или “How’s the weather” или “Can you tell me what the weather is outside?” Все три фразы разные, но вопрос по сути один и тот же. Мы можем создать intent с названием “weather” и когда пользовать будет вводить похожую фразу NLU движок будет определять ее как intent “weather.”
Entities вторая базовая концепция в Rasa NLU. Entities это те данные которые могут быть извлечены из пользовательского ввода.
Для примера, я могу сказать “Give me directions from 84th Street to Main Street” или “How do I get from Boston to New York.” В этом примере, intent может быть назван “directions,” но сущности начальной точки маршрута и конечной точки маршрута будут entities и их можно будет извлечь из пользовательского ввода.
Когда NLU движок возвратит результат работы по данному примеру то он может выглядеть примерно так:
{ "intent": { "name": "directions", "confidence: 0.98761341 }, "entities": [ { "entity" : "from", "value" : "Boston", "start" : 18, "end" : 24, "extractor" : "ner_crf" }, { "entity" : "to", "value" : "New York", "start" : 28, "end" : 36, "extractor" : "ner_crf" } ], "intent_ranking": [ { "name": "directions", "confidence": 0.98761341 }, { "name": "hello", "confidence": 0.01238659 } ]
В этом примере движок определил на 98.7% что пользователь ввел intent “directions” а “Boston” и “New York” были распознаны как entities и извлечены как “from” и “to”, соотвественно.
Rasa NLU так же существуют концепции синонимов и regex, но в этой статье мы это рассматривать не будем.
Мы создадим бота которого мы назовем Джеймс”.
Для начало создадим папку проекта Chatbot. В этой папке создадим другую папку nlu.
В RASA существует два формата данных для обучения: JSON и Markdown. Во многих учебниках описывается JSON формат, но с этим форматом не удобно работать без дополнительных программных средств. С увеличением обучаемых данных будет все сложнее вносить изменения в JSON файл, поэтому мы будем работать с форматом markdown.
Сейчас нам необходимо решить что наш бот будет делать и что он будет понимать.
Что мы хотим что бы наш бот понимал и делал? Мы можем начать с этого небольшого списка intents
Теперь определимся с сущностями которые сможет извлечь наш бот из беседы. Это список наших entities.
В начале (для быстроты) создадим файл с названием train.md и запишем все наши intends туда. Но с ростом данных, с файлом станет сложно работать. Поэтому гораздо лучше создавать отдельные файлы для каждого intends (мы сделаем это чуть позже).
Содержимое train.md:
## intent:hello - hi - hello - hey ## intent:goodbye - bye - goodbye - c ya # intent:store_name - my name is [Jason](user_name) <!-- this is how we extract entities --> - call me [Fred](user_name)
Здесь #intent:имя интенда, далее со следующей строки идет список фраз по которым будет определятся intent. Желательно для каждого интента использовать несколько фраз и если по intent будет извлекать entities то что бы движок NLU смог корректно извлечь данные, обязательно нужно как минимум 2 примера. Одного примера будет не достаточно.
Для запуска процесса обучения NLU необходим файл настроек в котором будет как минимум указано
В папке nlu создадим новый файл config.yml со следующим содержимым:
language: "en" pipeline: "spacy_sklearn"
Теперь когда у нас есть данные и файл настроек мы можем запустить процесс обучения.
В командной строке в папке nlu введите слудющую команду:
python -m rasa_nlu.train --config config.yml --data data/ --path agent
Вы увидите вывод сообщений на консоли о процессе обучения, и когда все будет готово, вы увидите успешное сообщение, так же обратите внимание, что в папке nlu появилась новая папка с именем agent.
Что бы убедиться что все работает мы можем запустит тест с помощью запуска временного http сервера:
python -m rasa_nlu.server --path agent
После запуска сервера мы может обратит к нему с тестовыми запросами на определения корректности распознавания intends. Для этого можно использовать curl или любой другой инструмент так как postman, которые позволяет отправлять REST запросы. Я буду использовать curl. Отправим два запроса и убедимся что все работает:
curl 'http://localhost:5000/parse?q=hello'
curl 'http://localhost:5000/parse?q=my%20name%20is%20jason'
Далее наведем порядок в наших тренировочных данных.
Внутри папки data, создадим для каждого intent новый файл с именами <name_of_intent>.md . Скопируем все фразы для каждого intent из train.md. Далее удалим train.md.
После этого у нас измениться команда запуска обучения rasa_nlu:
python -m rasa_nlu.train --config config.yml --data data/ --path agent
На этом процесс настройки NLU завершен, далее мы сможем создать сценарий диалогов нашего бота.
Краткий перевод: https://vuejs.org/guide/components/v-model.html Основное использование v-model используется для реализации двусторонней привязки в компоненте. Начиная с Vue…
Сегодня мы рады объявить о выпуске Vue 3.4 «🏀 Slam Dunk»! Этот выпуск включает в…
Vue.js — это универсальный и адаптируемый фреймворк. Благодаря своей отличительной архитектуре и системе реактивности Vue…
Недавно, у меня истек сертификат и пришлось заказывать новый и затем устанавливать на хостинг с…
Каким бы ни было ваше мнение о JavaScript, но всем известно, что работа с датами…
Все, кто следит за последними событиями в мире адаптивного дизайна, согласятся, что введение контейнерных запросов…