Создание чат-бота с 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 проявляется, когда вы даете ему больше данных для обучения. Или даже разверните чат-бота, и он учится на взаимодействиях. Это сделает его способным обрабатывать случаи, которые еще не введены в обучающие данные. Вы также можете изменить политики, по которым он обучает модель. Возможно, об этом в следующем посте.
Ваше здоровье.
Больше таких статей можно найти здесь.