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