问题描述
我正在尝试构建一个主要由 2 个任务组成的聊天机器人:任务 1. 要求用户分享他们的密码并选择类别。使用这两个输入获取结果并显示消息。任务 2. 1. 流程结束后 - 如果用户说“电晕帮助” - 提示他询问他是否想要获取上述给定的密码,否则 - 给他一个输入新密码的规定。
对于类别也遵循类似的流程。例如(假设用户要求 - 600036 中的免费食物)
用户:corona help Bot:您想获取- 600036 的资源吗。按是确认,按否更改另一个密码用户:否 Bot:请分享密码用户:500081 Bot:您想获取“免费食物” 。按是确认,否更改用户:是 Bot:显示 500081 和免费食物的结果
我已经完成了任务 1,但在任务 2 中遇到了困难。我想知道如何在触发特定意图时提出问题并填充所需的空位。
这是我的 rules.yml:
version: "2.0"
rules:
- rule: trigger corona help
steps:
- intent: corona_help
- action: action_check_user_intent
- rule: Activate form
steps:
- intent: greet
- action: user_details_form
- active_loop: user_details_form
- rule: Submit form
condition:
# Condition that form is active.
- active_loop: user_details_form
steps:
# Form is deactivated
- action: user_details_form
- active_loop: null
- slot_was_set:
- requested_slot: null
# The actions we want to run when the form is submitted.
- action: action_submit
Actions.py:
class ValidateUserDetailsForm(FormValidationAction):
def name(self) -> Text:
return "validate_user_details_form"
def validate_pin_code(self,slot_value: Any,dispatcher: Collectingdispatcher,tracker: Tracker,domain: DomainDict,) -> Dict[Text,Any]:
print("HERE1")
url = f"https://api.postalpincode.in/pincode/{slot_value}"
r = requests.get(url)
data = json.loads(r.content)
status = data[0]['Status']
print(status)
if status == 'Error':
dispatcher.utter_message(text="Invalid PIN code. Enter again.")
return {"pin_code": None}
else:
return {"pin_code": slot_value}
class ActionCheckUserIntent(Action):
def name(self) -> Text:
return "action_check_user_intent"
def run(
self,dispatcher,domain: "DomainDict",) -> List[Dict[Text,Any]]:
intent = tracker.latest_message['intent'].get('name')
print(intent)
pin_code = tracker.get_slot("pin_code")
print(pin_code)
category = tracker.get_slot("category")
if intent == "corona_help":
dispatcher.utter_message(response="utter_ask_confirm_pin_code")
return {"confirm_pin_code": None,"confirm_category": None}
class ActionSubmit(Action):
def name(self) -> Text:
return "action_submit"
def run(
self,Any]]:
pin_code = tracker.get_slot("pin_code")
category = tracker.get_slot("category")
print("HERE2")
pin_code_url = f"https://api.postalpincode.in/pincode/{pin_code}"
r1 = requests.get(pin_code_url)
data1 = json.loads(r1.content)
city = data1[0]['PostOffice'][0]['district']
print("HERE3")
city_url = "http://ec2-3-23-130-174.us-east-2.compute.amazonaws.com:8000/cities"
r2 = requests.get(city_url)
data2 = json.loads(r2.content)
cities = data2['data']
if city in cities:
city = city.replace(" ","%20")
category = category.replace(" ","%20")
print("HERE4")
category_url = f"http://ec2-3-23-130-174.us-east-2.compute.amazonaws.com:8000/resource?city={city}&category={category}"
r = requests.get(category_url)
data = json.loads(r.content)
data = data['data']
print(data)
if not data:
print("HERE5")
dispatcher.utter_message(text="No resources found.")
return []
# return [AllSlotsReset()]
contact = data[0]["contact"]
description = data[0]["description"]
organisation = data[0]["organisation"]
phone = data[0]["phone"]
state = data[0]["state"]
category = category.replace("%20"," ")
dispatcher.utter_message(response="utter_submit",pin_code=pin_code,category=category,contact = contact,description = description,organisation = organisation,phone = phone,state = state
)
# return [AllSlotsReset()]
# elif intent == "corona_help":
else:
dispatcher.utter_message(text="No resources found.")
# return [AllSlotsReset()]
任何想法如何实现这一目标?
解决方法
我假设大头针是您 user_details_form
的大部分。如果是这样,处理此问题的一种方法是重新启动 user_details_form:
- rule: corona help with previous pin code
steps:
- intent: corona_help
- action: utter_ask_confirm_pin_code
- intent: affirm # they want to use previous code
- action: do_the_thing_with_old_pin_code
- rule: corona help with new pin code
steps:
- intent: corona_help
- action: utter_ask_confirm_pin_code
- intent: deny # they don't want to use previous code
- action: user_details_form
- active_loop: user_details_form
您可能需要为表单覆盖 required_slots
以确保重新询问正确的位置,您可以阅读有关 here 的更多信息。