Alexa技能AMAZON.SearchQuery类型:如何正确响应stop/cancel指令?
处理Alexa槽位收集阶段终止指令的最佳实践
这确实是使用自由输入型槽位(比如AMAZON.SearchQuery)时很容易踩的坑,我之前做Alexa技能开发时也碰到过类似的情况。根据Alexa官方的对话设计规范和实际开发经验,给你分享几个靠谱的解决方案:
1. 优先处理内置终止意图
Alexa提供了AMAZON.StopIntent和AMAZON.CancelIntent这两个内置意图,官方要求无论对话处于什么阶段,都必须支持用户通过这两个指令终止会话。你需要在Lambda代码的最前端优先处理这些意图,确保它们不会被当成槽位输入。
举个Node.js的代码示例:
exports.handler = async (handlerInput) => { const request = handlerInput.requestEnvelope.request; // 先拦截内置终止意图,优先级最高 if (request.type === 'IntentRequest') { const intentName = request.intent.name; if (intentName === 'AMAZON.StopIntent' || intentName === 'AMAZON.CancelIntent') { return handlerInput.responseBuilder .speak('好的,下次再见!') .withShouldEndSession(true) .getResponse(); } } // 后续处理你的业务意图和槽位收集逻辑 if (request.type === 'IntentRequest' && request.intent.name === 'YourSearchIntent') { const searchSlot = request.intent.slots.SearchQuery; if (!searchSlot || !searchSlot.value) { // 触发槽位收集,同时提示用户可以终止 return handlerInput.responseBuilder .speak('请问你想搜索什么内容呢?如果不想继续了,可以说停止或者取消。') .reprompt('请告诉我你的搜索内容,或者说停止退出。') .addElicitSlotDirective('SearchQuery') .getResponse(); } // 处理搜索逻辑... } return handlerInput.responseBuilder .speak('抱歉,我没听清,请再说一遍。') .getResponse(); };
2. 确保控制台启用内置意图
在Alexa开发者控制台的技能模型里,检查是否已经启用了AMAZON.StopIntent和AMAZON.CancelIntent(默认是启用的,但偶尔会被误删)。不要给这两个意图添加自定义样本,避免和你的搜索槽位样本冲突,让Alexa的内置NLU自动识别终止指令。
3. 兜底:检查槽位值中的终止关键词
如果遇到极端情况(比如用户的发音导致Alexa误把终止指令识别成了搜索槽位值),可以在代码里做一层兜底检查,判断槽位值是否是stop/cancel这类关键词,如果是,直接触发终止逻辑:
// 在获取到槽位值后添加检查 if (searchSlot.value) { const lowerValue = searchSlot.value.toLowerCase(); if (lowerValue === 'stop' || lowerValue === 'cancel') { return handlerInput.responseBuilder .speak('好的,下次再见!') .withShouldEndSession(true) .getResponse(); } }
官方标准要求
Alexa的对话设计指南明确规定,技能必须支持用户在任何对话阶段通过stop或cancel终止会话,这是提升用户体验的核心要求之一。优先使用内置意图拦截的方式,是官方最推荐的标准处理流程。
内容的提问来源于stack exchange,提问作者stylecramper
相关产品推荐
相关产品推荐

