Перейти к основному содержимому

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, и бот объяснит, как сразу оплатить курс.