Выглядит неплохо.
Во-первых, slot3
не удаляйте. По сути, в любое время, когда вам не нужно использовать слот, просто оставьте его или установите значение null
и убедитесь, что в консоли Lex он не отмечен галочкой, как требуется, вот и все. Если вы удалите его, ваш ответ больше не будет соответствовать всем слотам, которые ожидает Lex.
Вы используете DialogAction
: «Delegate», что позволяет Lex определять, какой слот вызывать следующим. Итак, после того, как Лекс обнаружит slot2
, я считаю, что Лекс просто выберет следующий слот. Однако Лекс может выбрать следующий слот обязательный в качестве приоритета над необязательными слотами, поэтому еще раз убедитесь, что slot3
не отмечен галочкой, как требуется.
Чтобы лучше контролировать ваш разговор , вы можете вообще не захотеть использовать Delegate, а вместо этого создайте лог c разговора в точности по своему вкусу, используя только ElicitSlot, чтобы гарантировать, что правильные слоты будут выбраны в правильных точках разговора.
Если я упрощу ваш код, он будет выглядеть так:
if slot2 != null
if slot4 == null
if slot2 == No
elicit slot4
if slot2 == Yes and slot3 != null
fulfill intent
else
delegate
Есть некоторые вещи, которые вы можете исправить, и, увидев это таким образом, вы можете пролить свет на проблему, но, возможно, у вас есть планы по расширению это, и для этого есть причина, например, почему вы используете case case только с одним case (на данный момент?).
Рассмотрите более простой и контролируемый подход без делегата:
if slot1 == null
elicit slot1
else // slot1 filled
if slot2 == null
elicit slot2
else // slot2 filled
(validate slot2 value)
if slot2 == Yes
if slot3 == null
elicit slot3
else // slot3 filled
(validate slot3 value)
fulfill intent
if slot2 == No
elicit slot4
...