Формы, слоты и бизнес-логика¶
Добавление слотов и их типы¶
Слоты¶
Слоты — это контейнеры, которые мы можем создать для хранения информации в контексте беседы.
Слоты — это память вашего бота. Они действуют как хранилище ключей и значений, которое можно использовать для хранения информации, предоставленной пользователем (например, их родной город), а также информации, собранной о внешнем мире (например, результат запроса к базе данных).
Слоты бывают разных типов. Например, неспециализированные слоты можно использовать только для хранения информации, тогда как другие типы слотов могут влиять и на ход разговора.
Слоты определяются в разделе слотов домена (файл domain.yml
) с их именем, типом и тем, должны ли они и как они должны влиять на поведение цифрового ассистента. В следующем примере определяется слот с именем slot_name
, типом text
и предопределенным отображением from_entity
.
Если использовать интерфейс Wisebot, то сущности и слоты нужно прописывать в настройках проекта (секция Домен по умолчанию).
Хранение информации в слотах¶
Информация может храниться в слотах разными способами:
От сущностей¶
Чтобы сохранить значение объекта в слот (обычно в качестве объекта выступает сущность, например, Фамилия, Имя, Отчество, название города, организация, цвет, маркировка и т.п.), нужно создать слот с таким же именем. Рассмотрим следующий пример. Создадим сущность FIO
, которая будет содержать Фамилию, Имя и Отчество пользователя.
Создадим одноименный слот FIO
текстового типа во разделе Диалоги во вкладке Слоты.
При таком способе задания сущностей и слотов ФИО пользователя будет автоматически сочетаться с сущностью (объектом). Это означает, что каждый раз, когда сущность ФИО обнаруживается в ходе разговора, её значение будет сохранено и перезаписано в слот FIO
.
Для вставки слота в контекст диалога перед ответом нажмите на Слот и выберите необходимый из списка.
Так выглядит диалог со вставленным слотом:
Пример работы слота в виджете:
Из пользовательских действий¶
Добавить информацию в слот можно при выполнении Action-скрипта. При вставке Action-скрипта в диалог необходимо нажать на Действие.
Пример программного кода пользовательского действия:
class SetUserName(Action):
def name(self):
return 'action_set_user_name'
def run(self, dispatcher, tracker, domain):
return [SlotSet("color", "голубой")]
Доступ к значениям слотов в ответах¶
Теперь можно повторно использовать значение слота в ответе, поместив имя слота в фигурные скобки, например: {FIO}
Типы слотов¶
- Текстовые слоты
Текстовый слот имеет тип text
и используется для хранения текстовых значений. Например,
Если influence_conversation
установлено в значение true
, поведение ассистента будет меняться в зависимости от того, установлен слот или нет. Различные тексты больше не влияют на разговор. Это означает, что следующие две истории равны:
stories:
- story: Китайская кухня
steps:
- intent: inform
- slot_was_set:
- cuisine: китайская
- story: Русская кухня
steps:
- intent: inform
- slot_was_set:
- cuisine: русская
В интерфейсе Wisebot задание текстового слота производится в виде
- Категориальные слоты
Это слоты хранения с типом categorical
, которые могут принимать одно из N значений. Например,
Если для свойства influence_conversation
установлено значение true
, поведение помощника будет меняться в зависимости от конкретного значения слота. Значение по умолчанию __other__
автоматически добавляется к пользовательским значениям. Все встречающиеся значения values
, которые явно не определены в слоте, сопоставляются с __other__
. Значение __other__
не следует использовать как определяемое пользователем значение.
В интерфейсе Wisebot задание категориального слота производится в виде
- Логические слоты
Булевы (логические) слоты можно рассматривать как частный случай категориальных слотов: они могут быть только true
или false
. Они имеют тип bool
. Например,
Если для свойства influence_conversation
установлено значение true
, поведение помощника будет меняться в зависимости от того, пуст ли слот, установлено значение true
или установлено значение false
. Обратите внимание, что пустой слот bool
влияет на разговор иначе, чем если бы слот имел значение false
.
- Числовые слоты
Эти слоты, имеющие тип float
, предназначены для хранения действительных чисел. Например,
По умолчанию для данных слотов устанавливаются значения 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
.
- Слоты любого типа
Эти слоты имеют тип any
и используются для хранения произвольных значений (они могут быть любого типа, например, словари или списки). Например,
Слоты типа any
всегда игнорируются во время разговоров. Свойство influence_conversation
не может быть установлено в true
для слота этого типа. Если мы хотим сохранить пользовательскую структуру данных, которая должна влиять на разговор, нужно использовать пользовательский тип слота.
- Список слотов
Это слот с типом list
, который предназначен для хранения списков значений. Например,
Если для свойства influence_conversation
установлено значение true
, поведение помощника будет меняться в зависимости от того, пуст ли список или нет. Длина списка, хранящегося в слоте, не влияет на диалог. Имеет значение только то, равна ли длина списка нулю или отличной от нуля.
Сопоставление слотов¶
В Rasa имеется четыре механизма сопоставления для заполнения слотов на основе последнего пользовательского сообщения.
В дополнение к предопределенным сопоставлениям мы можем определить еще и пользовательское сопоставление слотов. Все сопоставления пользовательских слотов должны содержать сопоставление типа custom
.
Сопоставления слотов указываются в виде списка словарей YAML под ключом mappings
в файле домена. Сопоставления слотов имеют приоритет в том порядке, в котором они перечислены в домене. Для заполнения слота будет использовано первое найденное сопоставление слотов.
По умолчанию сопоставления слотов применяются после каждого пользовательского сообщения, независимо от контекста диалога.