当前,我正在创建一种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中,并且与切换用例相当混乱,并且将当前代码扩展为需要是的其他问题,也无需确认很乱。
基本上我想知道上面的代码中是否有更干净的方法来实现相同的功能。
答案 0 :(得分:0)
正确使用会话属性
对于yesintent和nointent,您将有单独的处理程序类。
当您的whatShouldIEat处理程序将问题发送回用户,希望是-没有响应时,请设置会话属性lastHandler = whatShouldIEat。
现在,当用户响应时,控件将进入yeshandler或nohandler。在此,您可以从会话属性中检查“是”或“否”的含义,然后调用特定的处理程序。 这样,您可以对其他问题使用相同的yeshandler,nohandler。
现在由您决定要保存在会话属性中的内容,无论它是布尔标志还是任何变量或任何处理程序对象。目的是确定最后的行动。
此外,在要执行多个操作的情况下,可以使用堆栈数据结构来跟踪要调用的处理程序。堆栈中的最高项(处理程序)将告知要调用的最新操作。之后的下一个项目将告知要调用的下一个动作。
答案 1 :(得分:0)
您也可以使用States
。与Shailesh Pratapwar提供的答案类似,它将状态存储在会话数据中,然后根据用户当前所处的状态进行响应。这是我们Adventure Game Alexa Skill and Google Action Course中“冒险游戏”用户流程的示例:
如果这有帮助,您可以在这里找到介绍状态概念的完整部分:Step 5: Introduction to States。
答案 2 :(得分:0)
AMAZON.YesIntent
或AMAZON.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"
,因此对于意大利面。现在,您可以再吃另一种食物,并相应地设置sessionAttributes
。
"sessionAttribute": {
"state":"SELECT_FOOD",
"givenChoice":"Noodle"
}
Alexa: What about some noodle?
User: Yes
AMAZON.YesIntent
被触发,在sessionAttributes
的帮助下,您知道它对“ Noodle”是“是”。
方法是首先考虑state
,并在其内部具有必要的意图。而同样的意图可能会在不同状态下使用,如AMAZON.YesIntent
或AMAZON.NoIntent
。所以,你将有一个集中的每个状态下意向处理将只对特定状态触发的。
请记住,也可能有不带state
的请求,因此请确保您的代码也能处理该请求。
例如:
+-----------------+------------------+---------------------+
| State | FOOD_SELECT | PLACE_ORDER |
+-----------------+------------------+---------------------+
| Inetnt Handlers | AMAZON.YesIntent | AMAZON.YesIntent |
+ +------------------+---------------------+
| | AMAZON.NoIntent | AMAZON.NoIntent |
+ +------------------+---------------------+
| | | SelectAddressIntent |
+-----------------+------------------+---------------------+
签出ask-nodejs-sdk。这将帮助您以更少的开发工作来实现这一目标。