Задавайте вопросы еще раз, если у пользователя возникло определенное намерение.

Я пытаюсь создать чат-бота, который в основном состоит из двух задач: Задача 1. Попросите пользователей поделиться своим пин-кодом и выбрать категорию. Получите результаты, используя эти два входа, и отобразите сообщение. Задача 2. 1. После завершения потока - если пользователь говорит «помощь коронавируса» - спросите его, хочет ли он получить их для указанного выше пин-кода, если нет - дайте ему возможность ввести новый пин-код.

Следуйте аналогичной схеме для категории. Например (допустим, пользователь попросил - Бесплатная еда в 600036)

Пользователь: corona help Бот: хотите получить ресурсы для - 600036. Нажмите да, чтобы подтвердить, и нет, чтобы изменить другой пин-код. Пользователь: нет Бот: Пожалуйста, поделитесь пин-кодом. Пользователь: 500081 Бот: Хотите получить «Бесплатную еду» . Нажмите «Да» для подтверждения и «Нет» для изменения. Пользователь: Да. Бот: Показать результаты для 500081 и Free Food.

Я уже выполнил задачу 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()]

Есть идеи, как этого добиться?


person nick    schedule 14.05.2021    source источник
comment
Возможно, вам лучше задать такой вопрос на форуме здесь   -  person fkr    schedule 21.05.2021


Ответы (1)


Я предполагаю, что булавка - это большая часть вашего 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 для вашей формы, чтобы убедиться, что правильный слот повторно запрашивается, вы можете узнать больше об этом здесь.

person fkr    schedule 21.05.2021