如何在Bixby中为Yes/No绑定多Intent及代码处理与参数传递
这个问题其实戳中了对话式AI里很常见的「上下文关联」痛点——毕竟Yes/No本身是完全无歧义的回答,必须绑定之前的提问语境才能生效。我来给你一步步拆解清楚怎么实现:
核心思路:用会话上下文追踪待确认的Intent
用户的Yes/No回答完全依赖你之前发起的提问,所以关键是:在你向用户抛出确认问题(比如“是否想了解波士顿的天气?”)时,把当前「待触发的Intent」和相关参数(比如波士顿)保存到会话状态中,等用户回复时再匹配关联。
具体实现步骤
1. 先做好会话状态的存储
你需要一个会话存储(可以是内存对象、数据库、Redis缓存等),用来记录每个用户的对话状态,核心字段包括:
pending_intent:当前等待用户确认的Intent(比如WeatherIntent或NewsIntent)pending_params:和待确认Intent绑定的参数(比如天气的城市、新闻的分类)
举个简单的内存存储示例:
# 模拟会话存储,key是用户ID,value是会话状态 session_store = {} # 初始化用户会话状态的辅助函数 def init_session(user_id): if user_id not in session_store: session_store[user_id] = { "pending_intent": None, "pending_params": {} }
2. 发起确认提问时,更新会话状态
当你向用户发起确认请求时,同步更新会话状态,把待确认的Intent和参数存进去:
# 当你问用户「是否想了解波士顿的天气?」时 def ask_weather_confirmation(user_id): init_session(user_id) # 更新会话状态:标记待确认的是WeatherIntent,参数是波士顿 session_store[user_id]["pending_intent"] = "WeatherIntent" session_store[user_id]["pending_params"] = {"city": "波士顿"} return "是否想了解波士顿的天气?" # 当你问用户「是否想了解体育新闻?」时 def ask_news_confirmation(user_id): init_session(user_id) session_store[user_id]["pending_intent"] = "NewsIntent" session_store[user_id]["pending_params"] = {"category": "体育"} return "是否想了解体育新闻?"
3. 处理用户的Yes/No回复
当用户回复Yes/No时,先读取会话状态里的pending_intent,以此判断Yes对应哪个Intent,同时传递预存的参数:
def handle_user_reply(user_id, reply): init_session(user_id) current_state = session_store[user_id] pending_intent = current_state["pending_intent"] pending_params = current_state["pending_params"] # 处理Yes的情况 if reply.lower() in ["yes", "是"]: if not pending_intent: return "抱歉,我不太清楚你指的是什么,可以先告诉我你想了解什么吗?" # 根据待确认Intent分发处理逻辑 if pending_intent == "WeatherIntent": result = handle_weather(pending_params) elif pending_intent == "NewsIntent": result = handle_news(pending_params) else: result = "抱歉,我暂时无法处理这个请求" # 处理完后清空待确认状态,避免后续混淆 clear_pending_state(user_id) return result # 处理No的情况 elif reply.lower() in ["no", "否"]: clear_pending_state(user_id) return "好的,那你想了解其他内容吗?比如天气或者新闻?" # 非Yes/No回复,按正常Intent识别流程处理 else: return handle_normal_intent(reply) # 辅助函数:清空待确认状态 def clear_pending_state(user_id): session_store[user_id]["pending_intent"] = None session_store[user_id]["pending_params"] = {} # WeatherIntent的具体处理函数(接收参数) def handle_weather(params): city = params.get("city") return f"好的,{city}当前气温22℃,晴转多云,适合外出。" # NewsIntent的具体处理函数(接收参数) def handle_news(params): category = params.get("category") return f"这是最新的{category}新闻:XX队以3-1击败对手,夺得本赛季总冠军!"
4. 关键注意事项
- 会话状态要持久化:如果是多用户场景,不能只用内存存储,要存在数据库或缓存里,避免服务重启后丢失状态
- 及时清空待确认状态:处理完Yes/No后一定要重置
pending_intent和pending_params,否则下一次用户的Yes会匹配到旧的Intent - 处理冲突场景:如果用户在待确认状态下发起新的请求(比如还没回答天气的Yes/No,就问新闻),可以选择覆盖旧的待确认状态,或者提示用户先完成当前的确认
内容的提问来源于stack exchange,提问作者Rahul Gupta
相关产品推荐
相关产品推荐

