Amazon lex пропускает слот на основе разрешенного значения предыдущего слота - PullRequest
0 голосов
/ 26 мая 2020

В моем намерении бота amazon lex 7 слотов.

{
  slot1: null,
  slot2: null,
  slot3: null,
  slot4: null,
  slot5: null,
  slot6: null,
  slot7: null
}

slot2 имеет 2 значения разрешения. Да или Нет .
slot3 имеет 3 значения разрешения.

Я хочу достичь, если Да, выбрано, затем отобразить значения в слот3 и заполнить намерение.

Если выбрано Нет , пропустите слот3 и продолжите с другими слотами.

Ниже приведен лямбда-код, используемый для хука кода инициализации и проверки , обязательно прочтите комментарии:

exports.handler = async(event) => {
  if (event.currentIntent.slots.slot2 != null) {
    if (event.currentIntent.slots.slot4 == null) {
    // handle slot2 "yes" or "no"
      switch (event.currentIntent.slots.slot2) {
        case 'No':
          return {
            dialogAction: {
              type: "ElicitSlot",
              intentName: event.currentIntent.name,
              slots: event.currentIntent.slots,
              slotToElicit: "slot4"

            }
          };
      }
    }

    // If slot2 value is yes and any one of the value from slot3 is selected then fulfill the intent. Alo if you can tell me that we can add some call to action on slot3 value clicks like mailto: or tel: it will be really helpful.
    if (event.currentIntent.slots.slot2 === "Yes" && event.currentIntent.slots.slot3 != null) {
      return {
        dialogAction: {
          type: "Close",
          fulfillmentState: "Fulfilled",
          message: {
            contentType: "PlainText",
            content: "Fullfillment text"
          }
        }
      }
    }

    // here I am trying to remove slot3 from the intent when slot2 value is "no"
    if (event.currentIntent.slots.slot2 === "No" && event.currentIntent.slots.slot4 != null) {
      delete event.currentIntent.slots.slot3;
    }

  }

// default return dialog action
  return {
    dialogAction: {
      type: "Delegate",
      slots: event.currentIntent.slots
    }
  };
};

Ответы [ 2 ]

0 голосов
/ 23 июня 2020

Перейдя от slot1 к slot3, можете ли вы перейти к slot5, а этот slot5 отправить меня на slot6? Я не смог решить эту проблему, я могу перейти только к одному слоту, но когда я пытаюсь перейти к другому слоту, он циклически повторяется, если он обновляет свое значение, но не меняет слот? спасибо!

0 голосов
/ 28 мая 2020

Выглядит неплохо.

Во-первых, 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
        ...
...