目前,我正在创建一项 Alexa 技能,用于处理常见问题解答问题,以及导致直接回复的问题工作正常,但是我对 Alexa 何时需要另一个回复有疑问。
例如,如果用户询问,
“我应该吃什么”
Alexa 将回复“你想吃意大利面吗?”
用户会说"is"或“否”
- 如果用户说"is",Alexa 会回复“这是意大利面”;如果用户说“否”,Alexa 会给出其他建议
如果用户说出"is"或“否”之外的其他内容,系统会重新提示用户回答"is"或“否”。
目前我有以下代码:
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;
}
}
因此,代码可以工作,如果用户说出"is"或“否”以外的任何内容,则会循环重新提示,并给出我想要的正确响应。
但是我想知道是否有更好的方法来实现这一点,因为该功能当前位于 FunctionHandler 中,并且开关情况相当困惑,并且针对需要“是,否”确认的其他问题扩展当前代码也将相当困惑。
基本上我想知道是否有一种更简洁的方法可以在上面的代码中执行相同的功能。
最佳答案
正确使用 session 属性
您将为 yesintent 和 nointent 拥有单独的处理程序类。
当您的 WhatShouldIEat 处理程序向用户发送一个问题并期望得到“是 - 否”响应时,请设置 session 属性 lastHandler = WhatShouldIEat。
现在,当用户响应时,控件将进入 yeshandler 或 nohandler。在此,您可以从 session 属性中检查此"is"或“否”的用途,并调用特定的处理程序。 这样您就可以对其他问题使用相同的 yeshandler、nohandler。
现在由您决定在 session 属性中保存什么内容,无论是 bool 标志,还是任何变量或任何处理程序对象。目标是确定最后的操作。
此外,您可以使用堆栈数据结构来跟踪要调用的处理程序,以防需要执行多个操作。堆栈上的顶部项目(处理程序)将告诉要调用的最新操作。之后的下一项将告诉要调用的下一个操作。
关于c# - 谈话中如何处理是/否,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54451793/