intentGroup
Тег активации intentGroup
объявляет вложенные интенты, по которым диалог может перейти в стейт.
По родительскому интенту, указанному после тега, стейт не активируется.
Если вы хотите, чтобы диалог мог перейти в стейт и по родительскому интенту, используйте для него отдельный тег intent
:
state: Nested state
intentGroup: /Example
intent: /Example
intentGroup
— это локальный тег: переход по нему возможен только из ближайшего родительского, из соседних или дочерних стейтов.Значение
После тега записывается путь к интенту.
При записи пути символ /
выступает разделителем между уровнями вложенности:
/hi
— путь составлен из символа/
и названия интента./hi/politely
— вложенный интент. Уровень вложенности интентов не ограничен.
Параметры
Параметр | Тип | Описание | Значение по умолчанию |
---|---|---|---|
fromState | Строка | Путь до стейта, из которого возможен переход в текущий стейт по данному тегу intentGroup . | — |
toState | Строка | Путь до стейта, в который возможен переход из текущего стейта по данному тегу intentGroup . | — |
onlyThisState | Логический | • Если true и указан параметр fromState , то переход в текущий стейт возможен строго из стейта в значении fromState , но не из его вложенных. • Если true и указан параметр toState , то переход в стейт в значении toState возможен строго из текущего стейта, но не из его вложенных. | false |
Примеры использования
state: Start
q!: $regex</start>
a: Здравствуйте! Хотите купить наш курс?
state: Yes
intent: /Согласие
a: Хотите оплатить курс целиком или по частям?
# В зависимости от ответа пользователя
# сработает интент `/Курсы/Цена/При оплате сразу` или `/Курсы/Цена/В рассрочку`.
state: CoursesPayment
intentGroup: /Курсы/Цена
script: $faq.pushReplies();
state: No
intent: /Отказ
a: Хорошо. Если передумаете, пишите!
# Стейт ChangeMind будет активирован,
# если пользователь отказался от курса, но позже передумал и что-то о нем спросил.
state: ChangeMind
intentGroup: /Курсы || fromState = "/Start/No", onlyThisState = true
a: Вы передумали? Отлично! Сейчас я вам все расскажу.
script: $faq.pushReplies();
# У всех вложенных интентов, для которых используется intentGroup, одинаковый приоритет.
# Если запрос с одинаковым весом попадет в несколько вложенных интентов, сработает случайный интент:
state: CoursesGeneralQuestions
intentGroup: /Курсы
# Вложенные интенты: `/Курсы/Время начала` и `/Курсы/Дата начала`.
# У запроса «Когда начинается курс?» одинаковый вес для обоих интентов, поэтому может сработать любой из них.
script: $faq.pushReplies();
Порядок срабатывания стейтов
Стейты могут срабатывать с разными приоритетами, если пути до интентов пересекаются или совпадают:
-
При использовании
intentGroup
илиintentGroup!
. -
При совместном использовании
intentGroup
иintent
или аналогичных глобальных тегов. -
При активной настройке
nlp.considerContextDepthInStateSelectionV2
вchatbot.yaml
.
Закономерности:
-
Чем больше уровень вложенности интента, тем выше приоритет стейта.
В примере ниже, если был распознан интент
/Курсы/Цена/При оплате сразу
, будет активирован стейтCoursesPrice
, а неCourses
.state: Courses
intentGroup: /Курсы
script: $faq.pushReplies();
state: CoursesPrice
intentGroup: /Курсы/Цена
script: $faq.pushReplies();Рассмотрим пример сценария ниже, в котором глобальный тег
intentGroup!
используется для подключения базы знаний к сценарию. Предположим, что был распознан интент/KnowledgeBase/FAQ.Курсы/Цена
:- Сработает стейт
PriceInt
, потому что в нем есть тегintent!
и он получит наибольший приоритет. - Приоритет стейта
FAQ.Courses
будет меньше, потому что он может сработать только по тегуintentGroup!
. - Стейт
AllFaqs
получит наименьший приоритет, поскольку активируется по самой общей группе. - Стейт
Price
не сработает вообще:/KnowledgeBase/FAQ.Курсы/Цена
— это родительский интент.
state: AllFaqs
intentGroup!: /KnowledgeBase
a: Нашел ответ в базе знаний.
script: $faq.pushReplies();
state: FAQ.Courses
intentGroup!: /KnowledgeBase/FAQ.Курсы
a: Вас интересуют наши курсы? Я нашел такой ответ:
script: $faq.pushReplies();
state: Price
intentGroup!: /KnowledgeBase/FAQ.Курсы/Цена
script: $faq.pushReplies();
state: PriceInt
intent!: /KnowledgeBase/FAQ.Курсы/Цена
script: $faq.pushReplies(); - Сработает стейт
-
Если запрос с одинаковым весом попадает и в стейт с
intent
, и в стейт сintentGroup
, то у стейта, который активирует тегintent
, будет приоритет.state: CoursesUnknown
intentGroup: /Курсы
a: Кажется, вы спросили меня про наши курсы, но я не все понял. Меня еще не научили отвечать на такие вопросы.
state: CoursesDate
intent: /Курсы/Дата начала
a: Фиксированной даты начала курса нет. Вы можете присоединиться к курсу, когда вам удобно.Запрос пользователя Когда начинается курс? может попасть в оба стейта, но активируется стейт с
intent
— у него больший приоритет. Бот ответит более специфичным ответом, а не ответом-заглушкой. -
Значение
nlp.considerContextDepthInStateSelectionV2
вchatbot.yaml
может повлиять на порядок срабатывания стейтов. При значенииtrue
бот учитывает расстояние до стейта, поэтому уintentGroup
во вложенном стейте возникает преимущество перед другими интентами:state: Start
q!: $regex</start>
a: Здравствуйте! Кажется, вы хотите купить наш курс.
state: PayInInstallments
intentGroup: /Оплата в рассрочку
a: Сейчас объясню, как купить наш курс в рассрочку.
state: PayAllAtOnce
intentGroup: /Оплата полностью
a: Сейчас пришлю инструкцию, как сразу оплатить наш курс.Бот находится в стейте
Start
. Запрос Как сразу оплатить курс? имеет вес 1 для интента/Оплата полностью/Как оплатить сразу?
и 0,3 для интента/Оплата в рассрочку/Как оплатить в рассрочку?
. Если указано значениеtrue
, будет активирован вложенный стейтPayInInstallments
, и бот объяснит, как купить курс в рассрочку. При значенииfalse
вложенность стейта не влияет на порядок их срабатывания: будет активирован стейтPayAllAtOnce
, и бот объяснит, как сразу оплатить курс.