Из того, что я понимаю, вы хотите извлечь слоты начальной и конечной даты из одного и того же предложения, если пользователь говорит что-то вроде: "Я хочу отпуск с 21 сентября по 23 сентября", а бот не просит дата окончания снова.
Поскольку вы анализируете даты и диапазоны дат, я рекомендую включить Duckling в качестве компонента в конвейер NLU. Он возвращает простую строку, если это одна дата, и дикт с полями from
и to
, если это диапазон дат. Таким образом, в вашем коде действия вы можете проверить тип возвращаемого объекта и заполнить оба слота или только один из них.
Кроме того, как упоминал Мукул, вам придется использовать сопоставления слотов, чтобы сопоставить сущность «время», возвращенную Утенком, с вашими слотами.
Возможно, ваше окончательное решение будет выглядеть примерно так (я не включил слот типа отпуска).
class LeaveForm(FormAction):
def name(self) -> Text:
return "leave_form"
@staticmethod
def required_slots(tracker: Tracker) -> List[Text]:
return ['start_date', 'end_date']
def validate_start_date(self,
value: Text,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any],
) -> Optional[Text]:
# Check if value is a Duckling date-range.
if isinstance(value, dict):
# Since both the fields are populated, the form
# will no longer prompt the user separately for the end_date
return {
'start_date': value['from'],
'end_date': value['to']
}
else:
return {
'start_date': value
}
def slot_mappings(self) -> Dict[Text, Union[Dict, List[Dict]]]:
return {
"start_date": self.from_entity(entity="time"),
"end_date": self.from_entity(entity="time")
}
def submit(self, dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict]:
dispatcher.utter_template('utter_submit', tracker)
return []