#python #rasa-nlu #rasa-core
#python #rasa-nlu #rasa-ядро
Вопрос:
Я работал с rasa, и есть вещи formAction
, которые я до сих пор не очень хорошо понимаю, мой вопрос сегодня: почему? my formAction
активирован, но не сохраняет никаких slotvalue
, если я использую его неправильно? Вот мой код:
class HotelForm(FormAction):
def name(self):
# type: () -> Text
return "formaejemplo"
@staticmethod
def required_slots(tracker):
return ["tipo_habitacion"]
def slot_mappings(self):
return {'tipo_habitacion':[self.from_entity(entity='tipo_habitacion',intent=['gethabitacion','peticion_habitacion'])]}
@staticmethod
def habitaciones_db():
return ["individual","doble","suite","suite doble"]
def submit(self, dispatcher, tracker, domain):
dispatcher.utter_template('utter_listo', tracker)
return []
def validate(self,dispatcher: CollectingDispatcher,tracker: Tracker,domain: Dict[Text, Any]) -> List[Dict]:
slot_values = self.extract_other_slots(dispatcher, tracker, domain)
print('slot values:',slot_values)
slot_to_fill = tracker.get_slot(REQUESTED_SLOT)
if slot_to_fill:
print('slot values:',slot_values)
slot_values.update(self.extract_requested_slot(dispatcher,tracker, domain))
if not slot_values:
try:
return super().validate(dispatcher, tracker, domain)
except ActionExecutionRejection as e:
# could not extract entity
dispatcher.utter_message(
"Sorry, I could not parse the value correctly. n"
"Please double check your entry otherwise I will ask you this forever"
)
return []
for slot, value in slot_values.items():
print('Slot: ',slot)
print('valor: ',values)
if slot == 'tipo_habitacion':
if value.lower() not in self.habitaciones_db():
dispatcher.utter_template('utter_wrong_tipo_habitacion', tracker)
# validation failed, set slot to None
slot_values[slot] = None
# validation succeed, set the slots values to the extracted values
return [SlotSet(slot, value) for slot, value in slot_values.items()]
когда я печатаю values ( slotvalues
) на консоли, он всегда пустой.
Ответ №1:
когда вы print('slot values:',slot_values)
в первый раз, он собирает только дополнительные слоты (объекты для требуемых слотов, которые он не запрашивал, но все равно взял). У вас не должно быть ни одного из них, поскольку у вас есть только один требуемый слот.
Что касается второго раза print('slot values:',slot_values)
, когда вы делаете это раньше slot_values.update(self.extract_requested_slot(dispatcher,tracker, domain))
, так что это точно те же значения, что и раньше. Попробуйте распечатать его после обновления. Если вы не столкнулись с if not slot_values
логикой, то она должна правильно печататься, если вы переместите ее после обновления.
Правильно ли он печатался, когда вы делали эти строки?
print('Slot: ',slot)
print('valor: ',values)