如何通过Python API从Watson Assistant捕获用户名并在密码验证后展示
问题分析与修复方案
你的代码核心问题是没有利用Watson Assistant的上下文(context)跨对话轮次保存状态,局部变量user_name_captured和User_name会在每次请求时被重置,导致输入密码时无法获取之前捕获的用户名。另外还存在逻辑错误和代码冗余问题,以下是具体修复:
核心问题点
- 局部变量无法跨对话保留:
user_name_captured和User_name是每次请求都会重新初始化的局部变量,上一轮捕获的用户名状态无法传递到输入密码的轮次。 - 密码处理逻辑错误:处理
password实体时,错误地将当前输入的密码文本赋值给User_name,而不是读取之前存储的用户名。 - 代码冗余:重复定义了
response_payload,且存在缩进错误。
修复后的代码
intents = response['intents'] entities = response['entities'] context = response['context'] # 从上下文读取已有的状态,默认未捕获用户名 user_name_captured = context.get('user_name_captured', False) User_name = context.get('User_name', '') watson_response = "" if entities: first_entity = entities[0]['entity'] if first_entity == 'user_name': # 捕获用户名并存入上下文 User_name = payload['text'] print(User_name) # 更新上下文状态 context['User_name'] = User_name context['user_name_captured'] = True watson_response = "Please enter your password" elif first_entity == 'password': # 从上下文获取之前捕获的用户名 User_name = context.get('User_name', '') if User_name: watson_response = f"Welcome {User_name}, please select an option to proceed or let me know what's on your mind." else: watson_response = "User name is missing. Please provide your user name first." # 确保response_payload只定义一次 response_payload = { 'text': watson_response, 'context': context # 必须返回更新后的上下文,让Watson保存状态 } return jsonify(response_payload)
修复说明
- 利用上下文存储状态:从
context中读取已有的用户名和捕获状态,而不是每次初始化局部变量,确保对话状态跨轮次保留。 - 修正密码处理逻辑:处理密码时,从上下文获取之前存储的用户名,而非当前输入的密码文本。
- 更新并返回上下文:修改上下文后,必须将更新后的
context包含在响应payload中,Watson才会保存这些状态到下一轮对话。 - 清理冗余代码:移除重复的
response_payload定义,修复缩进问题。
内容的提问来源于stack exchange,提问作者Shaik Saad Abdul Tawwab
相关产品推荐
相关产品推荐

