如果用户触发了特定意图,请再次提问

时间:2021-05-14 13:19:48

标签: rasa-nlu rasa rasa-core

我正在尝试构建一个主要由 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,
        tracker: Tracker,
        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,
        dispatcher,
        tracker: Tracker,
        domain: "DomainDict",
    ) -> List[Dict[Text, 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()]

任何想法如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

我假设大头针是您 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 的更多信息。

相关问题