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

Slot Filling


Slot Filling (слот-филлинг) — процесс дозапроса информации для выполнения запроса клиента. Полученные данные в ходе дозапроса доступны для использования в сценарии.

Slots (слоты) — данные, которые клиент передает с запросом или в процессе дозапроса. У каждого слота есть обязательные атрибуты: Имя, Тип.

В данной статье рассматриваются вопросы:


Заполнение слотов из запроса

Подробнее о заполнении слотов в интерфейсе

Если рассматривать интент как функцию, которую клиент может вызвать, слот является переменной, параметром этой функции.

Например, для интента /Погода примером фразы может быть Погода в Лондоне сегодня и два слота City и Date. Для примера фразы в слот City попадет — Лондон, в слот Date — сегодня.

При этом заполненные слоты будут переданы в сценарий в переменной $parseTree._<ИмяСлота>. В значении переменной будет ассоциированное значение, при его отсутствии — текст.

Использование заполненных слотов в сценарии:

    state:
        intent!: /Погода
        a: Погода в {{ $parseTree._City }} на {{ $parseTree._Date }}

Атрибут Тип

Каждый слот должен иметь Тип, который соответствует сущности Тип = сущность. Этот тип определяет тип данных, которые попадут в слот. Вы можете использовать как системные, так и кастомные сущности.

Например, для слота Date с типом @zb.datetime: слово "сегодня" из запроса клиента попадет в сущность @zb.datetime и будет помещено в слот Date.

Если в интенте присутствует несколько слотов с одинаковым типом, то они будут заполнены последовательно.

При необходимости обработать произвольное количество слотов одного типа в запросе или переменные с разными типами сущностей, обращайтесь к структуре $entities, в которую будут переданы все найденные сущности в исходном виде.


Атрибут Обязательность

Каждый слот имеет атрибут Обязательность:

  • Если слот обязателен и при этом уточняющие вопросы не указаны, то система не будет выдавать этот интент без заполненного слота в ответах.
  • Если слот обязателен и при этом уточняющие вопросы указаны, то система может вернуть интент без этого слота. Интент будет обработан модулем слот-филлинга, клиенту будут заданы уточняющие вопросы.

Перед переходом к процессу слот-филлинга ознакомьтесь подробнее с заполнением слотов


Массивы в слотах

Для обработки запросов с повторяющимися сущностями в сценарии необходимо в заполненном слоте $parseTree._<ИмяСлота> иметь массив.

Переведите переключатель Массив в активное положение, чтобы в слот помещались все сущности данного типа, оформленные как массив:

массивы в слотах

Если переключатель Массив:

  • Не активен: в слот помещается первое обработанное значение данной сущности.
  • Активен: в слот помещаются все сущности данного типа, оформленные как массив. Если обнаружено только одно значение сущности, оно также оформляется как массив.

Подключение модуля слот-филлинга

Для подключения модуля слот-филлинга укажите в сценарии в файле main.sc:

require: slotfilling/slotFilling.sc
  module = sys.zb-common

Механизм обработки уточняющих вопросов

Система будет задавать уточняющие вопросы по очереди в порядке их определения для всех слотов, которые остались незаполненными.

В ответах клиента будет производиться поиск сущностей, соответствующих слотам. Если подходящие сущности были найдены, то соответствующий слот будет заполнен.

После того, как все слоты были заполнены, управление передается в основной сценарий со всеми заполненными слотами в $parseTree.

Выйти из сценария слот-филлинга возможно только, либо ответив на все вопросы, либо командой /start.

Рассмотрим сценарий:

    state:
        intent!: /Погода
        a: Погода в {{ $parseTree._City }} на {{ $parseTree._Date.value }}

При этом слоты заполнили следующим образом:

заполнение слотов

Здесь @City — кастомная сущность, в которой мы указали все города, доступные для прогноза погоды.

Запросы клиента:

  1. Погода на завтра в Москве: слоты заполнены, бот сразу предоставит ответ.
  2. Погода на завтра: слот City не заполнен, будут заданы уточняющие вопросы. Как только будет дан корректный ответ, управление перейдет в сценарий, бот даст ответ.
  3. Погода в Москве: слот Date не заполнен, будут заданы уточняющие вопросы. Как только будет дан корректный ответ, управление перейдет в основной, бот даст ответ.

Прерывание слот-филлинга

Условия прерывания процесса слот-филлинга вы можете сконфигурировать в файле chatbot.yaml в секции injector:

injector:
    slotfilling:
        maxSlotRetries: 1
        stopOnAnyIntent: true
        stopOnAnyIntentThreshold: 0.2

Здесь параметры:

  • maxSlotRetries — количество попыток для одного слота. Если клиент ответил указанное количество раз и слот не был заполнен, процесс слот-филлинга будет прерван. Последняя фраза клиента будет обработана в сценарии бота.
  • stopOnAnyIntent — принимает булево значение true/false, параметр прерывания процесса слот-филлинга по интенту.
  • stopOnAnyIntentThreshold — параметр соответствия, задающий минимально необходимую похожесть фразы на один из классов. Является параметром прерывания процесса слот-филлинга по интенту.
Прерывание по интенту

Если stopOnAnyIntent: true и запросу клиента соответствует интент с параметром confidence выше, чем stopOnAnyIntentThreshold, слот-филлинг будет прерван по интенту.

Параметр confidence — степень уверенности платформы JAICP, что введенная фраза относится к определенному интенту.

Обратите внимание, что важно учитывать контекст начала слот-филлинга. Например, если при прерывании в стейт с соответствующим интентом невозможно попасть (например, тег intent не глобальный), то запрос попадет в event!: noMatch.

Если параметры для прерывания в конфигурационном файле chatbot.yaml не указаны, слот-филлинг будет прерываться согласно параметрам по умолчанию:

injector:
    slotfilling:
        maxSlotRetries: 2
        stopOnAnyIntent: false
        stopOnAnyIntentThreshold: 0.2