Перейти к содержанию

Формы, слоты и бизнес-логика

Добавление слотов и их типы

Слоты

Слоты — это контейнеры, которые мы можем создать для хранения информации в контексте беседы.

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

Слоты бывают разных типов. Например, неспециализированные слоты можно использовать только для хранения информации, тогда как другие типы слотов могут влиять и на ход разговора.

Слоты определяются в разделе слотов домена (файл domain.yml) с их именем, типом и тем, должны ли они и как они должны влиять на поведение цифрового ассистента. В следующем примере определяется слот с именем slot_name, типом text и предопределенным отображением from_entity.

slots:
   slot_name:
      type: text
      mappings:
         - type: from_entity
            entity: entity_name

Если использовать интерфейс Wisebot, то сущности и слоты нужно прописывать в настройках проекта (секция Домен по умолчанию).

Image

Хранение информации в слотах

Информация может храниться в слотах разными способами:

От сущностей

Чтобы сохранить значение объекта в слот (обычно в качестве объекта выступает сущность, например, Фамилия, Имя, Отчество, название города, организация, цвет, маркировка и т.п.), нужно создать слот с таким же именем. Рассмотрим следующий пример. Создадим сущность FIO, которая будет содержать Фамилию, Имя и Отчество пользователя.

Image

Создадим одноименный слот FIO текстового типа во разделе Диалоги во вкладке Слоты.

Image

Image

При таком способе задания сущностей и слотов ФИО пользователя будет автоматически сочетаться с сущностью (объектом). Это означает, что каждый раз, когда сущность ФИО обнаруживается в ходе разговора, её значение будет сохранено и перезаписано в слот FIO.

Image

Для вставки слота в контекст диалога перед ответом нажмите на Слот и выберите необходимый из списка.

Image

Так выглядит диалог со вставленным слотом:

Image

Пример работы слота в виджете:

Image

Из пользовательских действий

Добавить информацию в слот можно при выполнении Action-скрипта. При вставке Action-скрипта в диалог необходимо нажать на Действие.

Пример программного кода пользовательского действия:

class SetUserName(Action):
      def name(self):
            return 'action_set_user_name'

      def run(self, dispatcher, tracker, domain):
            return [SlotSet("color", "голубой")]

Доступ к значениям слотов в ответах

Теперь можно повторно использовать значение слота в ответе, поместив имя слота в фигурные скобки, например: {FIO}

Image

Типы слотов

  • Текстовые слоты

Текстовый слот имеет тип text и используется для хранения текстовых значений. Например,

slots:
   cuisine:
      type: text
      mappings:
         - type: from_entity
            entity: кухня

Если influence_conversation установлено в значение true, поведение ассистента будет меняться в зависимости от того, установлен слот или нет. Различные тексты больше не влияют на разговор. Это означает, что следующие две истории равны:

stories:
   - story: Китайская кухня
      steps:
         - intent: inform
         - slot_was_set:
               - cuisine: китайская

   - story: Русская кухня
      steps:
         - intent: inform
         - slot_was_set:
               - cuisine: русская

В интерфейсе Wisebot задание текстового слота производится в виде

Image

  • Категориальные слоты

Это слоты хранения с типом categorical, которые могут принимать одно из N значений. Например,

slots:
  risk_level:
    type: categorical
    values:
      - низкий
      - средний
      - высокий
    mappings:
      - type: custom

Если для свойства influence_conversation установлено значение true, поведение помощника будет меняться в зависимости от конкретного значения слота. Значение по умолчанию __other__ автоматически добавляется к пользовательским значениям. Все встречающиеся значения values, которые явно не определены в слоте, сопоставляются с __other__. Значение __other__ не следует использовать как определяемое пользователем значение.

В интерфейсе Wisebot задание категориального слота производится в виде

Image

  • Логические слоты

Булевы (логические) слоты можно рассматривать как частный случай категориальных слотов: они могут быть только true или false. Они имеют тип bool. Например,

slots:
  is_authenticated:
    type: bool
    mappings:
      - type: custom

Если для свойства influence_conversation установлено значение true, поведение помощника будет меняться в зависимости от того, пуст ли слот, установлено значение true или установлено значение false. Обратите внимание, что пустой слот bool влияет на разговор иначе, чем если бы слот имел значение false.

Image

  • Числовые слоты

Эти слоты, имеющие тип float, предназначены для хранения действительных чисел. Например,

slots:
  temperature:
    type: float
    min_value: -35.0
    max_value: 38.0
    mappings:
      - type: custom

По умолчанию для данных слотов устанавливаются значения max_value=1.0, min_value=0.0.

Если для свойства influence_conversation установлено значение true, поведение ассистента будет меняться в зависимости от значения слота. Если значение находится между min_value и max_value, используется конкретное значение числа. Все значения ниже min_value будут рассматриваться как min_value, а все значения выше max_value будут рассматриваться как max_value. Следовательно, если max_value установлено значение 1, нет никакой разницы между значениями слота 2 и 3.5.

Image

  • Слоты любого типа

Эти слоты имеют тип any и используются для хранения произвольных значений (они могут быть любого типа, например, словари или списки). Например,

slots:
  shopping_items:
    type: any
    mappings:
      - type: custom

Слоты типа any всегда игнорируются во время разговоров. Свойство influence_conversation не может быть установлено в true для слота этого типа. Если мы хотим сохранить пользовательскую структуру данных, которая должна влиять на разговор, нужно использовать пользовательский тип слота.

Image

  • Список слотов

Это слот с типом list, который предназначен для хранения списков значений. Например,

slots:
   shopping_list:
      type: list
      mappings:
         - type: from_entity
            entity: shopping_item

Если для свойства influence_conversation установлено значение true, поведение помощника будет меняться в зависимости от того, пуст ли список или нет. Длина списка, хранящегося в слоте, не влияет на диалог. Имеет значение только то, равна ли длина списка нулю или отличной от нуля.

Image

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

В Rasa имеется четыре механизма сопоставления для заполнения слотов на основе последнего пользовательского сообщения.

В дополнение к предопределенным сопоставлениям мы можем определить еще и пользовательское сопоставление слотов. Все сопоставления пользовательских слотов должны содержать сопоставление типа custom.

Сопоставления слотов указываются в виде списка словарей YAML под ключом mappings в файле домена. Сопоставления слотов имеют приоритет в том порядке, в котором они перечислены в домене. Для заполнения слота будет использовано первое найденное сопоставление слотов.

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