Создание чатбота с помощью RASA – Часть 1

Spread the love

В этой статье приведен пример создание простого чатбота на основе фреймворка RASA. RASA – это открытый и весьма популярный фреймворк для создания чатботов на Python с использованием машинного обучения. Он состоит из двух независимых компонент Rasa NLU и Rasa Core.

Rasa NLU (Natural Language Understanding – Понимание естественного языка). Его главная цель это преобразование ввода пользователя на естественном языке в объекты с которыми может работать программа.

Rasa Core – Это компонент отвечает со создание сценария работы чатбота.

Что такое Rasa NLU и как с ним работать.

И так что такое Rasa NLU? Для примера, рассмотрим ситуацию когда кто нибудь отправит чатботу одну из подобных фраз:

  • Yes
  • Yeah
  • Sure thing
  • Yep
  • That’s right
  • Correct

Движок NLU принимает на вход одну из таких фразу и конвертирует во что типа “yes.” В данном случае “yes” в определениях фреймворка называется intent.

В дополнение к определению типа фразы возможно так же извлечение полезной информации из фразы.

Для примера, если кто нибудь скажет фразу “Give me directions from home to 4th street.”  Rasa NLU может извлечь  entities и вернуть объект:

{
    "intent": "directions",
    "entities": {
        "from": "home",
        "to": "4th street"
    }
}

Инсталляция Rasa NLU

Команда инсталляции:

pip install rasa_nlu

Настройка spaCy + sklearn

Для работы 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

Настройка NLU

Intents

В 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 движок будет определять ее как intentweather.”

Entities

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% что пользователь ввел intentdirections” а “Boston” и “New York” были распознаны как entities и извлечены как “from” и “to”, соотвественно.

Rasa NLU так же существуют концепции синонимов и regex, но в этой статье мы это рассматривать не будем.

Приступим к созданию бота

Мы создадим бота которого мы назовем Джеймс”.

Для начало создадим папку проекта Chatbot. В этой папке создадим другую папку nlu

Планирование данных для обучения

В RASA существует два формата данных для обучения: JSON и Markdown.  Во многих учебниках описывается JSON формат, но с этим форматом не удобно работать без дополнительных программных средств.  С увеличением обучаемых данных будет все сложнее вносить изменения в JSON файл, поэтому мы будем работать с форматом markdown.

Сейчас нам необходимо решить что наш бот будет делать и что он будет понимать. 

Какие у нас будут intents

Что мы хотим что бы наш бот понимал и делал?  Мы можем начать с этого небольшого списка intents

  • hello – пусть бот отвечал бы на приветствие
  • goodbye – пусть бот отвечал бы на прощание
  • store_name – мы хотим что мы могли бы назвать ему наше имя и заставить его запомнить его
  • say_your_name – мы хотим, чтобы он сказал нам свое имя
  • current_mission – мы хотим, чтобы он мог сказать нам, какова его нынешняя миссия
  • cancel_mission – мы хотим, чтобы он мог отменить свою текущую миссию
  • start_mission – мы хотим иметь возможность отправить его на новую миссию
  • frustrated – мы хотим сказать ему, что он расстраивает нас, потому что он недостаточно умен
  • describe – мы хотим, чтобы он мог рассказать нам о местах, где он был, и о людях, которых он знает

Какие у нас будут entities

Теперь определимся с сущностями которые сможет извлечь наш бот из беседы.  Это список наших entities.

  • user_name – имя пользователя
  • mission_destination – место где будет начинаться миссия
  • mission_objective – цель мисси
  • location – места в течение миссии
  • person – персоны в течение миссии

Создадим данные для обучения

В начале (для быстроты) создадим файл с названием train.md и запишем все наши intends туда. Но с ростом данных, с файлом станет сложно работать. Поэтому гораздо лучше создавать отдельные файлы для каждого intends (мы сделаем это чуть позже).

  1. Внутри папки  nlu, создадим новую папку data
  2. Внутри папки data создадим новый файл train.md

Содержимое 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 необходим файл настроек в котором будет как минимум указано

  • используемых язык
  • какой pipeline будет использоваться.  О том что такое pipelines можно более подробно почитать в официальной документации.  Мы же будет использовать spacy_sklearn

В папке nlu создадим новый файл config.yml со следующим содержимым:

language: "en"

pipeline: "spacy_sklearn"

Обучение NLU

Теперь когда у нас есть данные и файл настроек мы можем запустить процесс обучения.

В командной строке в папке 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'

Далее наведем порядок в наших тренировочных данных.

Разделим train.md на отдельные файлы

Внутри папки 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 завершен, далее мы сможем создать сценарий диалогов нашего бота.

Оригинал


Spread the love