Переход по стейтам
Сценарий чатбота описывается в виде текстового файла с древовидной структурой. То есть одни элементы сценария являются вложенными по отношению к другим. Эти элементы являются состояниями системы, в которые она может перейти в ходе диалога. Такие состояния называются стейтами. Более общие стейты включают в себя стейты с конкретной тематикой.
Переход в стейт
Переход в стейт происходит в следующих случаях:
При использовании в одном сценарии паттернов, интентов и групп примеров, обработка правил активаций происходит с приоритетом по мере убывания: q!, eg!, intent!.
В стейт с глобальным тегом переход диалога возможен из любого другого стейта. Локальный тег активен только в контексте диалога, переход в стейт возможен из ближайшего родительского или дочерних стейтов.
- Запрос клиента попал в паттрен тега
q. - Из родительского стейта, если запрос клиента попал во вложенный стейт.
- Из любого стейта, если для
qуказан флагfromState. Этот флаг определяет стейт, из которого возможен переход по данному паттерну. - При активации тега
go!илиgo.
Обработка правил активации
Когда система находится в каком-либо стейте, активируются правила, привязанные непосредственно к этому стейту и ко всем его родителям. При этом правила активации, привязанные к этому стейту, имеют наибольший приоритет.
Таким образом, в разных стейтах могут быть объявлены одинаковые правила активации, но обрабатываться они будут в зависимости от состояния, в котором находится система.
Рассмотрим сценарий:
patterns:
$Yes = (да|конечно)
$No = (нет|не|да ну)
theme: /
state: Start
q!: $regexp</start>
go!: ../зарядка
state: зарядка
a: Вы делаете зарядку по утрам?
state: каждый день
q: * $Yes *
a: Вы делаете зарядку каждый день?
state:
q: * $Yes *
a: Молодец!
state:
q: * $No *
a: Зарядка должна стать привычкой!
state:
q: * $No *
a: Зарядка пробуждает тело и мозг, поработай над собой!Сценарий демонстрирует как обрабатываются ответы клиента да/нет в зависимости от активного стейта.
Рассмотрим процесс выполнения этого сценария:
- Запускается сценарий,
go!перенаправляет клиента в стейтзарядка. - Бот задает вопрос
Вы делаете зарядку по утрам?из стейтазарядка. - После этого система останется в текущем стейте, в котором активны паттерны
q: * $Yes *,q: * $No *. - Клиент отвечает
даи система переходит в стейтзарядка/каждый день. Далее бот спрашиваетВы делаете зарядку каждый день?, система активирует следующий набор паттернов. - Следующий ответ клиента система будет интерпретировать в контексте
зарядка/каждый день. Ответы активируют паттерны вложенных стейтов, так как они имеют больший приоритет.