Создание намерений

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

Понятие намерений

Чтобы помощник мог распознавать, что говорит пользователь, независимо от того, как пользователь формулирует свое сообщение, нам нужно предоставить примеры сообщений, из которых помощник может учиться. Поэтому группируем эти примеры в соответствии с идеей или целью, которую выражает сообщение, что также называется намерением (intent). Намерениями могут быть: приветствие, согласие, отказ, вопрос об имени и многое другое.

Для каждого намерения перечисляются его примеры, чтобы система поняла, что от неё требуется. Например, фразы "Доброго времени суток" или "Доброе утро" могут принадлежать одному намерению с названием приветствие. Независимо от того, в какой форме человек поздоровался, ядро RASA далее оперирует только именем намерения приветствие.

Картинка

По возможности намерения должны быть хорошо различимы. Например, система будет путаться, если в одном намерении "Да" будут примеры "да", "конечно", а во втором намерении "Согласие" - примеры "да, согласен", "конечно, буду". В этом случае лучше объединить эти намерения в одно.

Правила внесения намерений в базу чат-бота

  1. Не допускаются намерения с крайне низким числом примеров. В противном случае NLU не сможет полноценно понять, что из себя представляет это намерение и в чём его смысл и, следовательно, не сможет научиться корректно его определять в ситуациях, когда полученный текст очень слабо похож на какой-либо в обучающих примерах.

  2. Не допускается сильный разброс в количестве обучающих примеров в намерениях.

  3. Примеры для намерения нужно составлять не просто по ключевым/опорным словам/словосочетаниям, но и добавлять различный контекст к ним. То есть опорные слова должны быть в обучающих примерах в разных местах, должно быть много разных вариантов употребления опорных слов и количество слов в обучающих примерах так же должно отличаться. Ключевое/опорное слово/словосочетание - это самое значимое слово в некотором наборе обучающих примеров, которое несёт больше всего смысла. Например, ключевое/опорное слово "оплатить" или "оплатить картой" в намерении "Как оплатить картой". В таком случае, контекстом будут примеры вида "как оплатить", "хочу оплатить картой", "можно ли оплатить", "хотел бы оплатить картой", "оплату картой принимаете" или даже "вы карту принимаете".

  4. Не допускается использование одних и тех же или очень похожих по смыслу обучающих примеров в разных намерениях. Это приведёт к ошибкам при распознавании намерений, потому что NLU будет сложно определить, какое именно намерение имеется ввиду.

  5. Необходимо прорабатывать и анализировать основные паттерны поведения людей в тех темах/проблемах/сценариях, которым мы хотим обучить NLU.

Дополнение базы намерений

Создавать намерения можно не только через файл nlu.yml, но и через интерфейс чат-бота. Чтобы добавить намерение:

  1. В интерфейсе чат-бота наведите курсор на левое меню и выберите чат из раскрывающегося списка.

Картинка

  1. Выберите раздел "NLU" бокового меню.

Картинка

  1. Введите тренировочную фразу в поле – "Пользователь говорит…", например, "когда начинается учебный год в МарГУ".

3 go to field

  1. Нажмите на кнопку ENTER для добавления фразы в намерения.
    Фраза добавлилась к намерению "никакого намерения".
  2. Нажмите на "никакого намерения" для изменения, так как это намерение не подходит для этой фразы. Появится поле "Фильтровать или создать".

Картинка

  1. Введите новое намерение "начало_учебного_года" в поле "Фильтровать или создать" и нажмите "Создать новое намерение".

Картинка 8. Фраза перешла в намерение "начало_учебного_года". Нажмите "Сохранить".

Картинка

Можем наблюдать успешное добавление фразы в общий список намерений.

Картинка

Так и происходит процесс добавления намерений. Например, на данном фото показана база намерений "начало_учебного_года". После добавления или создания намерений и сущностей необходимо обучать бота. Для этого нажимите на кнопку "Тренировать", который находится в правом верхнем углу.

Картинка

Обучение намерениям

Для определения фразы пользователя к одному из намерений в NLU-модуле обучается сложная нейронная сеть, для работы которой входные тексты превращаются в векторы (массивы) вещественных чисел, называемых признаками (futures).

При построении вектора признаков используются:

  • метод мешка слов (bag of words);
  • векторизации слов embedding (word2vec);
  • N-грамм букв (отдельные буквы N=1, пары последовательных букв N=2 и т.д.).

Соответствующие настройки в файле config.yml, позволяют использовать предобученные для данного языка векторы слов, что позволяет NLU понимать синонимы и близкие по смыслу слова, не описанные в примерах intent. Благодаря N-граммам, RASA достаточно эффективно борется с опечатками в словах.

Чем больше приведено примеров для данного намерения, тем лучше обучается система. Однако, при этом существует опасность пересечения похожих фраз из различных намерений, что может снизить качество классификации. Поэтому файл data/nlu.yml с намерениями необходимо время от времени тестировать.