【问题标题】:How to handle yes/no in conversation如何在对话中处理是/否
【发布时间】:2019-01-31 00:45:52
【问题描述】:

目前我正在创建一个处理常见问题的 Alexa 技能,以及导致直接回复的问题可以正常工作,但是我对 Alexa 何时期望另一个回复有疑问。

例如,如果用户询问,

  • “我应该吃什么”

  • Alexa 会回复“你想吃意大利面吗?”

  • 用户会说“是”或“否”

    • 如果用户说“是”,alexa 会回复“这是意大利面”,或者如果用户说“不”,则建议其他内容
  • 如果用户说的是或否以外的任何其他内容,它会再次提示用户说是或否。

目前我有以下代码:

if (intentName == "WhatShouldIEat")
{
    EatQuestion = true;
    reprompt = "Answer with yes or no";
    return MakeSkillResponse(FAQHelper.getQuestionInformation(intentName)); //returns the voice response on alexa
}

//Check if users says yes or no for for eating that food
if (EatQuestion)
{
    switch (intentName)
    {
        case "AMAZON.YesIntent":
            intentName = "YesFood"; //sets response to when user says yes
            EatQuestion = false;
            reprompt = "Ask me another question";
            break;
        case "AMAZON.NoIntent":
            intentName = "NoFood"; //sets response for when user says no
            EatQuestion = false;
            reprompt = "Ask me another question";
            break;
        default:
            intentName = "YesNoPrompt"; //Alexa will ask the user to say either yes or no
            break;
    }
}    

所以代码可以工作,如果用户说的是或否以外的任何内容,它将循环重新提示,并给出我想要的正确响应。

但是我想知道是否有更好的方法来实现这一点,因为该功能当前位于 FunctionHandler 中,并且与 switch 案例相当混乱,并且将当前代码扩展为其他需要是,不确认的问题也会很乱。

基本上我想知道是否有更简洁的方法可以在上面的代码中执行相同的功能。

【问题讨论】:

    标签: c# alexa alexa-skills-kit


    【解决方案1】:

    正确使用 Session 属性

    yesintent 和 nointent 将有单独的处理程序类。

    当您的 whatShouldIEat 处理程序向用户发送一个期望是 - 否响应的问题时,请设置会话属性 lastHandler = whatShouldIEat。

    现在当用户响应时,控件将进入 yeshandler 或 nohandler。在此,您可以从会话属性中检查此 yes 或 no 的用途并调用特定的处理程序。 这样,您也可以对其他问题使用相同的 yeshandler、nohandler。

    现在由你决定你想在会话属性中保存什么,无论是布尔标志,还是任何变量或任何处理程序对象。目标是确定最后的操作。

    此外,您可以使用 Stack 数据结构来跟踪要调用的处理程序,以防需要执行多个操作。堆栈上的顶部项目(处理程序)将告诉要调用的最新操作。之后的下一项将告诉要调用的下一个动作。

    【讨论】:

      【解决方案2】:

      您也可以为此使用States。类似于 Shailesh Pratapwar 提供的答案,这会将状态存储在会话数据中,然后根据用户当前所处的状态进行响应。这是来自我们Adventure Game Alexa Skill and Google Action Course 的“冒险游戏”用户流示例:

      如果这有帮助,您可以在此处找到介绍状态概念的完整部分:Step 5: Introduction to States

      【讨论】:

        【解决方案3】:

        AMAZON.YesIntentAMAZON.NoIntent 将在用户说“是”或“否”时触发,并且可能有其他问题可以以“是”或“否”作为答案。您可以使用sessionAttributes 确定或跟踪之前询问的内容或对话的上下文。

        使用 sessionAttributes
        想象一下您对"states" 的技能。每个多轮对话都有一个状态,一个状态意味着你的对话的上下文或你在说什么。因此,只要有对话,您就可以在sessionAttributes 中设置状态/上下文,以便在下一个请求进入时根据state 采取行动。

        例如:

        User: What should I eat?
        
        [SelectFoodIntent is triggered]
        [SelectFoodIntent handler receives this request]
        [SelectFoodIntent can set usefull information like]
        "sessionAttribute": {
           "state":"SELECT_FOOD",
           "givenChoice":"pasta"
        } 
        [SelectFoodIntent sends the response back with the sessionAttribute]
        
        Alexa: "Do you want to eat pasta?"
        
        User: no
        
        [AMAZON.NoIntent is triggered]
        

        当请求进入您的后端时,您将获得您之前设置的所有sessionAttributes,然后您可以确定state"SELECT_FOOD",因此对于Pasta 来说是“否”。现在您可以回复其他食物并相应地设置sessionAttributes

        "sessionAttribute": {
           "state":"SELECT_FOOD",
           "givenChoice":"Noodle"
        } 
        
        Alexa: What about some noodle?
        
        User: Yes
        

        AMAZON.YesIntent 被触发,在sessionAttributes 的帮助下,您知道它是“Noodle”的“是”。

        方法是首先考虑state,并在其中包含必要的意图。同样的意图可能会用于不同的状态,如AMAZON.YesIntentAMAZON.NoIntent。因此,您将在每个状态下都有一组意图处理程序,仅针对该特定状态触发。

        请记住,也可能存在没有state 的请求,因此请确保您的代码也能处理它。

        例如:

        +-----------------+------------------+---------------------+
        | State           | FOOD_SELECT      | PLACE_ORDER         |
        +-----------------+------------------+---------------------+
        | Inetnt Handlers | AMAZON.YesIntent | AMAZON.YesIntent    |
        +                 +------------------+---------------------+
        |                 | AMAZON.NoIntent  | AMAZON.NoIntent     |
        +                 +------------------+---------------------+
        |                 |                  | SelectAddressIntent |
        +-----------------+------------------+---------------------+
        

        查看ask-nodejs-sdk。这将帮助您以更少的开发工作来实现这一目标。

        【讨论】:

        • 抱歉回复晚了,但是我如何判断一个特定的意图是否需要一个是 - 否响应,或者它只是一个回答特定一句话答案的问题?我知道我可以将会话属性设置为是非问题,但是我如何从意图名称中首先知道它是一个是,否问题?
        • 另外,使用 sessionattributes 和拥有一个专门用于存储先前意图名称等的类有什么区别?
        猜你喜欢
        • 2020-01-17
        • 1970-01-01
        • 2013-02-18
        • 1970-01-01
        • 2012-08-27
        • 2013-09-15
        • 2012-05-07
        • 2020-03-14
        • 1970-01-01
        相关资源
        最近更新 更多