【问题标题】:bifurcation with questions amazon lex亚马逊 lex 问题分岔
【发布时间】:2020-10-14 02:13:18
【问题描述】:

如何使用 lambda 验证在 amazon lex 中执行此流程?我已经尝试过,但问题是循环的,没有提前谢谢!!

这是我目前拥有的代码,如果发生的话,从 slot1 到 slot2,但是当我尝试从 slot2 转到 slot3 时,slot2 循环并且不前进,谢谢!!

exports.handler = (事件、上下文、回调) => {
    常量 sessionAttributes = event.sessionAttributes;
    常量插槽 = event.currentIntent.slots;
    
    常量槽 1 = 槽。槽 1;
    常量 slot2 = slot.Slot2;
    常量 slot3 = 插槽.Slot3;
    
    常量 optSlot1 = ['1','2'];
    常量 optSlot2 = ['1','2'];
    常量 optSlot3 = ['1','2'];
    
        如果(插槽 1 === optSlot1[0]){
    
        让响应 = {
            
          对话动作:{
            类型:“ElicitSlot”,
             意图名称:event.currentIntent.name,
             插槽:插槽,
             slotToElicit : "slot2",
            
          }
        }
        回调(空,响应);
    }
    
    
        if(slot2 === optSlot2[0] || slot2 === optSlot2[1]) {
    
        让响应 = {
            
          对话动作:{
            类型:“ElicitSlot”,
             意图名称:event.currentIntent.name,
             插槽:插槽,
             slotToElicit : "slot3",
            
          }
        }
        回调(空,响应);
    }

    };

【问题讨论】:

  • 欢迎来到 StackOverflow。为了提供帮助,您必须提供更多信息。 (1) 您目前在 Lambda 中使用什么代码来尝试此操作? (2) 你能举一个对话例子来解释你所说的“问题是循环的,不前进的”是什么意思吗?
  • 我已经更正了问题,感谢您的建议!

标签: node.js amazon-web-services aws-lambda amazon-lex


【解决方案1】:

您的 slot2 不断被引出,因为您对 slot1 的第一个 IF 语句继续解析为 true,因此它再次将引出 slot2 返回给 Lex,而您的其余代码永远不会到达。

在检查值是什么之前,您应该考虑检查插槽是否为空。例如,我选择将我的机器人的 Lambda 代码写成这样:

                             --((pseudo code))--
if slot1 is empty then 
    elicit slot1
else                                           --slot1 is filled
    if slot1 is Yes then 
        if slot2 is empty then 
            elicit slot2
        else                                   --slot2 is filled
            if slot3 is empty
                elicit slot3
            else                               --slot3 is filled
               ...and so on
        end
    else                                       --slot1 is No
        elicit slotDates
end

您可以根据您的对话流程对其进行简化,但这是基本理念。更深入的对话也会让您更深入地了解嵌套的 if 语句。当你阅读代码时,你可以沿着它的分支向下走。


小贴士(请随意忽略此建议):

const optSlot1 = ['1','2'];
    ...
if(slot1 === optSlot1[0]) {...

随着您的机器人变得越来越复杂,这将很难理解,因为您必须不断地从对话逻辑中向后滚动以查看该插槽的选项。您可以让自己更轻松,让用户更自然,并更多地使用 Lex 的内置槽值识别。

例如,当您有一个是/否的布尔问题时,您可以在 Lex 中创建一个自定义 SlotType,提供 2 个值“是”和“否”,然后为每个值提供许多同义词,例如“是的,是的,是的,没错,当然,当然”。这样,机器人可以提出一个自然的开放式问题,而用户可以自然地做出回应。

您应该避免像老式自动电话接线员那样使用 Lex,它会像这样用勺子喂用户如何回答每个问题:“如果是,请输入 1。如果不是,请输入 2”Lex 比那个。

因此,如果您使用 Lex 来确定用户所说的内容并将其等同于“是”或“否”并用其中一个值填充空位,那么您的代码将如下所示:

const slot1 = event.slots.slot1
if (slot1 == "Yes") { ...

更容易阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2015-06-15
    • 1970-01-01
    • 2015-10-12
    • 2016-04-17
    • 2015-10-15
    相关资源
    最近更新 更多