Работа с несколькими намерениями в чате - PullRequest
1 голос
/ 26 февраля 2020

Я занимаюсь разработкой бота для банковских целей с использованием RASA. У меня есть намерения по переводу средств, истории транзакций, займу, балансу, платежам по счетам и т. Д. c. Я реализовал намерения для обработки функций по одному. И теперь я хочу работать с несколькими намерениями одновременно.

Например, если пользователь говорит:

Показать мои последние транзакции, а затем оплатить мой счет после отображения баланса.

Как я могу справиться эти виды входных данных, когда пользователь запрашивает более одной или двух функциональных возможностей в одном высказывании?

Я знаю, я могу реализовать намерения с несколькими сущностями, но это, кажется, не работает для меня, так как у меня так много намерений, которые я не могу позволить себе создавать намерениями с помощью комбинации из 2 или 3 объектов.

Возможно ли вообще реализовать использование RASA или любой другой технологии для создания чат-бота?

1 Ответ

1 голос
/ 26 февраля 2020

Подход 1 - многоцелевые

Вы можете использовать многоцелевые (не путать с множественными сущностями). Что вам нужно сделать, это:

  • Записать пример nlu данных для цели отдельно (что у вас уже есть)
  • Записать nlu данные для комбинаций с несколькими намерениями. Теоретически, Rasa будет использовать информацию из примеров как с одним, так и с несколькими намерениями для правильной категоризации. Это означает, что вам не нужно так много обучающих примеров в мульти-намерении
  • Напишите несколько историй, которые имеют дело с этими мульти-намерениями
  • Укажите разделитель в конфигурации токенизатора: intent_split_symbol: "+"

Обратите внимание, что вам нужно иметь как данные NLU для мульти-намерений, которые вы хотите поддерживать, так и истории, иначе Rasa не распознает их в NLU и не будет ничего делать в ядре.

Ссылки:

Пример

Это может дать вам что-то вроде этого:

nlu.md

# intent:show transactions
- please show me my latest transactions
- show me my transactions
- ...

# intent:pay bill
- pay my bill please
- i want to pay my bill
- go ahead and pay the bills
- ...

# intent:show transactions+pay bill
- Show my latest transactions and then pay my bill after showing the balance.
- show me my transactions and go ahead and pay the bills
- 

Обратите внимание, что вы можете написать скрипт для автоматической генерации нескольких примеров мульти-намерений из отдельных намерений

Stories.md

# story 1
* show transactions
- action_show_transactions

# story 2
* pay bill
- action_pay_bill

# story 3 (combined)
* show transactions+pay bill
- action_show_transactions
- action_pay_bill

config.yml

language: "en"

pipeline:
- name: "WhitespaceTokenizer"
  intent_split_symbol: "+"
- name: "CountVectorsFeaturizer"
- name: "EmbeddingIntentClassifier"

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

Подход 2 - инструкции в качестве сущностей

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

Затем вы можете выполнить действие action_execute_instructions, которое касается всех из них. Он будет смотреть на сущности из последнего сообщения и выполнять все, что вам нужно.

То, как вы понимаете инструкции, будет сильно зависеть от того, как вы решили определить сущности и как вам удастся сопоставить их с желаемой инструкцией. Для этого есть SynonymMapper, но он совсем не гибкий и потерпит неудачу, если у вас есть новый пример, который не совсем соответствует. В этом случае вам лучше написать собственный компонент конвейера NLU.

Если честно, я не думаю, что это хороший подход. Скорее, сущности должны быть сущностями (ie: объекты, местоположения и т. Д. c.)

nlu.md

# intent:ask_action
- [Show my latest transactions](instruction) and then [pay my bill](instruction) after showing the balance.
- [show me my transactions](instruction) and go ahead and [pay the bills](instruction)
- [pay the bill](instruction)

Stories.md

# story 1
* ask_action
- action_execute_instructions

Рекомендации

Я настоятельно рекомендую использовать самый простой подход. После того, как вы запустите живого бота, вы должны проверить, как его используют пользователи, и посмотреть, нужна ли более сложная комбинация намерений (если вы используете многоцелевые намерения).

...