使用Python装饰器开发Alexa技能:区分Yes Intent触发来源
解决Alexa技能中区分Yes Intent触发场景的问题
这确实是Alexa技能开发里很常见的场景,用会话状态标记的方法完全可行,而且是处理Yes/No这类通用意图区分触发场景的标准方案。我来给你一步步拆解怎么实现:
核心思路
通过在会话属性中添加一个状态标记(比如current_context),当你向用户询问“是否继续当前游戏”时,把这个状态设置为特定值(比如CONFIRMING_START_OVER)。之后当用户触发Yes/No Intent时,先检查这个状态值,就能精准判断用户的回复对应哪个场景,处理完后记得重置状态,避免影响后续交互。
具体代码实现
1. 修改StartOverIntent处理函数,添加状态标记
当检测到有游戏正在进行并询问用户时,给会话属性添加状态标记,同时要保持会话处于打开状态(让Alexa等待用户回复):
@sb.request_handler(can_handle_func=is_intent_name("AMAZON.StartOverIntent")) def start_over_intent_handler(handler_input): session_attr = handler_input.attributes_manager.session_attributes game_in_progress = int(session_attr.get('game_in_progress', 0)) # 加上默认值更安全 if game_in_progress == 1: # 设置会话状态,标记当前是在确认是否重启游戏 session_attr['current_context'] = 'CONFIRMING_START_OVER' speech_text = "您当前有游戏正在进行,是否继续?" # 返回保持会话打开的响应,等待用户回复 return handler_input.response_builder.speak(speech_text).ask(speech_text).response else: # 没有游戏在进行时的逻辑,比如直接启动新游戏 session_attr['game_in_progress'] = 1 speech_text = "开始新游戏!" return handler_input.response_builder.speak(speech_text).response
2. 处理Yes Intent,根据状态区分场景
在Yes Intent的处理函数中,先检查current_context的值,判断是否是来自重启游戏的确认:
@sb.request_handler(can_handle_func=is_intent_name("AMAZON.YesIntent")) def yes_intent_handler(handler_input): session_attr = handler_input.attributes_manager.session_attributes current_context = session_attr.get('current_context', '') if current_context == 'CONFIRMING_START_OVER': # 用户确认重启游戏,执行重启逻辑 session_attr['game_in_progress'] = 1 # 根据你的实际需求调整游戏状态 session_attr.pop('current_context', None) # 重置状态标记,避免影响后续交互 speech_text = "好的,开始新游戏!" else: # 其他场景下的Yes逻辑,比如之前的其他询问 speech_text = "好的,继续之前的操作!" return handler_input.response_builder.speak(speech_text).response
3. 补充处理No Intent(可选但建议)
同样,在No Intent里也要对应处理这个状态,比如用户选择不重启,继续当前游戏:
@sb.request_handler(can_handle_func=is_intent_name("AMAZON.NoIntent")) def no_intent_handler(handler_input): session_attr = handler_input.attributes_manager.session_attributes current_context = session_attr.get('current_context', '') if current_context == 'CONFIRMING_START_OVER': session_attr.pop('current_context', None) # 重置状态标记 speech_text = "好的,继续当前游戏!" else: # 其他场景下的No逻辑 speech_text = "好的,取消操作!" return handler_input.response_builder.speak(speech_text).response
为什么这个方法可行?
会话属性(session_attributes)是和当前用户的会话绑定的,只会在本次交互会话中存在,关闭会话后就会清空。通过它来记录当前的交互上下文,能精准区分通用意图的触发场景,这是Alexa官方推荐的上下文管理方式,完全符合技能开发的最佳实践。
内容的提问来源于stack exchange,提问作者Brussel
相关产品推荐
相关产品推荐

