Получить имя намерения в slot_mapping

Я использую rasa forms заполнить слоты от пользователя. Я хочу, чтобы все сообщение пользователя было заполнено в слоте. Я просмотрел документы и узнал о сопоставлении слотов. Но в моем случае слоты динамические data.json, yml file and stories.md все созданы с использованием листа Excel, поэтому я не могу создавать определенные формы. Я создал общую форму, которая должна заполнить слот с пользовательским сообщением. Но так как я не знаю об именах слотов, я не могу его создать. Пожалуйста, помогите мне. Ниже мой код:

def slot_mappings(self):  # type: # () -> Dict[Text: Union[Dict, List[Dict]]]
    intent_name = tracker.latest_message['intent'].get('name')
    slot_names = df['slots'][df['Intent'] == intent_name].values
    slot_names = [x.strip() for x in slot_names[0].split(',')]
    slot_with_value = {}
    for itms in slot_names:
        slot_with_value[itms]="self.from_text()"
    res = ', '.join('{}: {}'.format(key, value) for key, value in slot_with_value.items())
    return res

в приведенном выше коде фрейм данных имеет поле в качестве слота, в котором хранится информация о слоте, относящаяся к этому намерению. Но в slot_mapping трекера нет, поэтому я не могу создать словарь, чтобы мой бот сохранял пользовательское сообщение в слоте.

ниже моя функция проверки, которая также не работает и хранит пользовательское сообщение в слоте.

def validate(self, dispatcher, tracker, domain):
    slot_values= self.extract_other_slots(dispatcher, tracker, domain)
    slot_to_fill = tracker.get_slot(REQUESTED_SLOT)
    user_input = tracker.latest_message['text']
    requested_slot = self.request_next_slot(dispatcher, tracker, domain)
    requested_slot = [elem['value'] for elem in requested_slot]

    intent_name = tracker.latest_message['intent'].get('name')
    slot_names = df['slots'][df['Intent'] == intent_name].values
    slot_names = [x.strip() for x in slot_names[0].split(',')]
    if slot_to_fill:
        slot_values.update(self.extract_requested_slot(dispatcher,tracker, domain))
        if not slot_values:
            # reject form action execution
            # if some slot was requested but nothing was extracted
            # it will allow other policies to predict another action
            raise ActionExecutionRejection(self.name(),
                                           "Failed to validate slot {0} "
                                           "with action {1}"
                                           "".format(slot_to_fill,
                                                     self.name()))

    for slot, value in slot_values.items():
        if slot in slot_names:
            if value is None:
                dispatcher.utter_message("Plese provide {}".format(slot))
                slot_values[slot] = None
            else:
                dispatcher.utter_message("Plese provide {}".format(slot))
                slot_values[slot] = user_input


    return [SlotSet(slot, value) for slot, value in slot_values.items()]

Скорее выполняет ActionExecutionRejectionпосле того, как пользователь дает некоторый вклад. Как я могу справиться с этим. Пожалуйста помоги

0 ответов

Другие вопросы по тегам