我具有Alexa技能,在该技能下,用户提出问题并发出适当的响应。例:
用户:首都哈里斯堡在哪个州?
Alexa:宾夕法尼亚州
我当时使用询问意图来实现此目的(会话保持活动状态),但是在提交我的技能时,该会话保持打开状态而无需任何用户输入,但收到了回复。
我不希望会话结束。我希望用户能够不断提出问题。处理此问题的最佳方法是什么?
我考虑过通过在每个答案的末尾添加一个问题来实现这一目标。例:
用户:首都哈里斯堡在哪个州?
Alexa:宾夕法尼亚州。还有什么别的可以帮你?
上面的问题是我不确定如何处理是/否答复。
任何帮助,将不胜感激。
最佳答案
您建议的修复程序是合理的,并且是Alexa技能的一种常见模式-Alexa支持内置的意图AMAZON.YesIntent
和AMAZON.NoIntent
,这些意图已经配置为侦听一组相关的话语,例如“是”,“否”等。对于“是”的意图,您可能想再次使用:ask
问题,例如“您想问什么问题?”,而对于“否”的意图,您可能希望:tell
与用户说再见,以及这种用法Tell会结束会议。
国家管理
就是说,您不希望Alexa总是以这种方式回答“是”-如果您的技能有其他互动,而您对这个问题的回答是“没有意义”怎么办?
要解决此问题,请查看alexa-sdk中的skill state management。从文档中:
Alexa-sdk使用状态管理器将传入的意图路由到正确的函数处理程序。状态以字符串形式存储在表示属性当前状态的会话属性中。您可以通过在定义意图处理程序时将状态字符串附加到意图名称来模拟内置的意图路由,但是alexa-sdk可以帮助您实现这一点。
因此,当您的alexa技能回答问题时,部分响应逻辑可以将状态设置为:
this.handler.state = 'AskAnotherQuestion';
对于
AskAnotherQuestion
这样的状态字符串,您可以使用:1.文字意图
将一个名为
AMAZON.YesIntentAskAnotherQuestion
的条目添加到您的意图处理程序中,以处理从字面上附加了状态的YesIntent的yes响应。例:
'AMAZON.YesIntentAskAnotherQuestion': function() {
this.emit(':ask', 'What would you like to ask?', 'Could you repeat that?');
},
2. Alexa-SDK状态处理程序
使用alexa-sdk
CreateStateHandler(state, obj)
创建一个意图处理程序,将传递的状态附加到所有条目。例:
const askQuestionHandlers = Alexa.CreateStateHandler('AskAnotherQuestion', {
'AMAZON.YesIntent': function() {
this.emit(':ask', 'What would you like to ask?', 'Could you repeat that?');
},
'AMAZON.NoIntent': function() {
this.emit(':tell', 'See you later!');
}
// NOTE: Add another intent here that routes to your question answering logic,
// so that the user can just immediately ask their question again without
// saying yes or no.
}
有关CreateStateHandler的代码完整示例实现,请参见skill state management文档。
骑士
如果没有在YesIntent中设置其他状态,则此技能将停留在“ AskAnotherQuestion”状态。对于您的问题中定义的范围,这可能是好的,但是请记住,随着技能变得越来越复杂,您可能希望切换到其他状态。
将状态重置为null或为空目前很麻烦,并且需要设置多个字段。关于此问题和建议的解决方法的讨论可以在此github issue中找到。
进一步阅读
Alexa Skills Kit Documentation - Standard Built-in Intents
关于node.js - Alexa session 保持打开状态,无需任何用户输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47935089/