You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:44:46