Подход 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
Рекомендации
Я настоятельно рекомендую использовать самый простой подход. После того, как вы запустите живого бота, вы должны проверить, как его используют пользователи, и посмотреть, нужна ли более сложная комбинация намерений (если вы используете многоцелевые намерения).