Создание чат-бота с Rasa

Вступление

Прежде чем приступить к разработке, давайте сначала остановимся на требованиях и причинах, по которым мы углубились в упомянутую технологию. Я хотел создать чат-бота, который может узнавать намерения пользователя, разумно взаимодействовать, выполнять действия, если пользователи об этом просят, обеспечивать эффективный механизм обучения и, что наиболее важно, не использует никаких платных услуг. Существует множество онлайн-сервисов (например, wit.ai), которые предоставляют хорошие функции NLU, но взимают плату за трафик. Это привело меня к поиску фреймворка с открытым исходным кодом, который может обеспечить достаточную независимость при создании бота. Один из таких инструментов - Раса.

Rasa - решение для чат-бота

Rasa предоставляет набор инструментов для создания полноценного чат-бота на вашем локальном рабочем столе и совершенно бесплатно. Их ведущие инструменты:

  • Rasa NLU: решение для понимания естественного языка, которое принимает вводимые пользователем данные и пытается определить намерение и извлечь доступные сущности.
  • Rasa Core: решение для управления диалогами пытается построить вероятностную модель, которая определяет набор действий, которые необходимо выполнить, на основе предыдущего набора пользовательских входов.

Некоторые ключевые слова, которые вы найдете многократно используемыми в публикации, относятся к функциям / инструментам Rasa,

  • Намерение. Рассматривайте его как цель или цель пользовательского ввода. Если пользователь скажет: «Какой сегодня день?», Целью будет поиск дня недели.
  • Сущность. Считайте это полезной информацией, которую можно извлечь из вводимых пользователем данных. Из предыдущего примера мы понимаем, что цель - найти день недели, но какой даты? Если мы извлечем «Today» в качестве объекта, мы сможем выполнить действие для сегодняшнего дня.
  • Действия: как следует из названия, это операция, которую может выполнить бот. Это может быть ответ на что-то взамен, запрос к базе данных или что-то еще, что возможно с помощью кода.
  • Истории: это пример взаимодействия между пользователем и ботом, определяемый с точки зрения зафиксированных намерений и выполненных действий. Таким образом, разработчик может упомянуть, что делать, если вы получаете ввод с определенным намерением с / без каких-либо сущностей. Например, если пользователь намерен найти день недели, а объект - сегодня, найдите день недели сегодня и ответьте.

Чтобы это работало, Rasa нужны файлы, в которых хранится вся информация об обучении и модели для создания бота. Чтобы дать краткий обзор, наиболее важные из них:

  • Обучающий файл NLU: он содержит набор примеров пользовательского ввода, а также их сопоставление с подходящим намерением и сущностями, присутствующими в каждом из них. Чем больше разнообразных примеров вы предоставите, тем лучше станут возможности вашего бота по NLU. Найдите один интерактивный способ создания обучающих данных здесь.
  • Файл историй: содержит множество историй, из которых можно поучиться. Из каждой истории создается вероятностная модель взаимодействий.
  • Файл домена: здесь вы перечисляете все намерения, сущности, действия и аналогичную информацию. Вы также можете добавить образцы шаблонов ответов ботов и использовать их в качестве действий.

Хватит говорить, приступим к разработке бота!

Понимание естественного языка

Давайте сначала научим бота понимать язык пользователя, чтобы он мог классифицировать намерение и извлекать сущности. Для этого мы создадим образец обучающего файла nlu.

Учебный файл NLU (nlu_train.md):

Здесь имя намерения определяется после «## intent:», и все примеры пользовательского высказывания для этого намерения упомянуты ниже. Обратите внимание на намерение `query_days_in_month`, мы также упомянули сущности. Формат - [слово] (entity_name), поэтому пример высказывания пользователя - «Сколько дней в январе», и в нем «Январь» - это сущность с именем «месяц».

Теперь мы определим конвейер, который будет использоваться для обучения модели NLU, здесь мы будем использовать для этого spacy.

файл конфигурации (nlu_config.yml)

Теперь мы готовы обучать модель NLU! Давайте сделаем это на Python.

Это обучит модель nlu и сохранит ее в файле «models / nlu /». Давайте попробуем проверить, как работает модель.

Результат выглядит примерно так:

Как видите, модель отлично смогла привязать вопрос пользователя к своему намерению (проверьте раздел «name‘ под ‘intent‘). В нем говорится, что для первого вопроса намерение было «query_days_in_month», а извлеченная сущность - «январь» (отметьте «value» под 'сущности'). Одна интересная вещь заключается в выводе второго вопроса, хотя мы не предоставили это в примере, он отлично смог угадать намерение и даже извлечь сущность «марш».

Хорошо, но чат-бот готов только наполовину, нам еще нужно построить управление диалогами.

Управление диалогом

Во-первых, давайте определим файл домена, который содержит несколько примеров шаблонов, которые мы можем использовать для ответа пользователю.

Файл домена (domain.yml):

Здесь мы перечислили намерения и сущности (все они присутствуют в обучающем файле nlu), а также некоторые шаблоны и действия. Шаблоны содержат ответы, которые должен давать бот, в данном случае я хочу, чтобы бот поприветствовал, попрощался, а также ответил на заданный пользователем вопрос о количестве дней в месяце. И прямо сейчас бот будет отвечать только на эти три типа ответов месяца (бот не зависит от високосных лет, тупой бот)

Теперь давайте создадим образец взаимодействия пользователя с ботом.

Файл Stories (stories.md):

Здесь мы определяем пример взаимодействия между ботом и пользователем в форме истории. Это происходит примерно так: если пользователь что-то говорит и имеет намерение «приветствовать», бот выполнит действие «utter_greet». Еще один пример. Если сообщение пользователя имеет намерение «query_days_in_month» и «февраль», то бот выполнит действие «utter_answer_28_days».

Теперь давайте обучим часть управления диалогами,

Здесь вы можете изменить политику обучения, в которой вы можете определить свой собственный LSTM или RNN для диалогового обучения. Один важный момент, «max_history», используется для определения того, как одно действие зависит от предыдущих вопросов. Если max_history равен 1, то он просто запоминает индивидуальное намерение и связанные с ним действия. Из-за нехватки обучающих данных (огромное количество историй) я просто заставляю его запоминать правила сейчас, вы можете создать несколько примеров историй и увидеть истинный потенциал управления диалогами rasa.

Теперь мы закончили. Посмотрим, сможет ли бот ответить нам и ответит на наш вопрос.

И это так!

Заключение

Сопоставление каждой комбинации намерения-сущности с его действием в историях довольно неэффективно. Просто подумайте об индивидуальном сопоставлении каждого месяца с его ответом. А как насчет високосного года? Ну, со всем этим можно справиться с помощью настраиваемых действий, где действие вызывает функцию Python со всей информацией, такой как намерение и сущность. Теперь в коде Python вы можете выполнить все необходимые проверки и вернуть сообщение.

Также истинный потенциал rasa nlu и core проявляется, когда вы даете ему больше данных для обучения. Или даже разверните чат-бота, и он учится на взаимодействиях. Это сделает его способным обрабатывать случаи, которые еще не введены в обучающие данные. Вы также можете изменить политики, по которым он обучает модель. Возможно, об этом в следующем посте.

Ваше здоровье.

Больше таких статей можно найти здесь.