This site is no longer updated.Go to new Conversational Cloud docs

Переход по стейтам


Сценарий чатбота описывается в виде текстового файла с древовидной структурой. То есть одни элементы сценария являются вложенными по отношению к другим. Эти элементы являются состояниями системы, в которые она может перейти в ходе диалога. Такие состояния называются стейтами. Более общие стейты включают в себя стейты с конкретной тематикой.


Переход в стейт

Переход в стейт происходит в следующих случаях:

  • Запрос клиента попал в один из глобальных тегов: q!, e!, eg! или intent!.

При использовании в одном сценарии паттернов, интентов и групп примеров, обработка правил активаций происходит с приоритетом по мере убывания: 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: Зарядка пробуждает тело и мозг, поработай над собой!

Сценарий демонстрирует как обрабатываются ответы клиента да/нет в зависимости от активного стейта.

Рассмотрим процесс выполнения этого сценария:

  1. Запускается сценарий, go! перенаправляет клиента в стейт зарядка.
  2. Бот задает вопрос Вы делаете зарядку по утрам? из стейта зарядка.
  3. После этого система останется в текущем стейте, в котором активны паттерны q: * $Yes *, q: * $No *.
  4. Клиент отвечает да и система переходит в стейт зарядка/каждый день. Далее бот спрашивает Вы делаете зарядку каждый день?, система активирует следующий набор паттернов.
  5. Следующий ответ клиента система будет интерпретировать в контексте зарядка/каждый день. Ответы активируют паттерны вложенных стейтов, так как они имеют больший приоритет.