您建议的修复是合理的,并且是 Alexa 技能中的常见模式——Alexa 支持内置意图 AMAZON.YesIntent 和 AMAZON.NoIntent,这些意图已经配置为侦听一组相关话语,例如“是”、“否” ” 等等。对于“是”的意图,您可能想再次向:ask 提出“您想问什么问题?”之类的问题,而对于“没有”的意图,您可能想要: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.
}
请参阅 skill state management 文档以获取 CreateStateHandler 的代码完整示例实现。
注意事项
如果不在 YesIntent 中设置其他状态,此技能将卡在“AskAnotherQuestion”状态。对于您问题中定义的范围,这可能没问题,但请记住,随着您的技能变得更加复杂,您可能希望切换到其他状态。
将状态重置为 null 或空目前很麻烦,需要设置多个字段。可以在github issue 中找到有关此问题的讨论和建议的解决方法。
进一步阅读