据我了解,如果用户说“我想从 9 月 21 日到 9 月 23 日休假”之类的话,您想从同一个句子中提取开始日期和结束日期,而不是让机器人再次询问结束日期.
由于您正在解析日期和日期范围,因此我建议您将 Duckling 作为一个组件包含在 NLU 管道中。如果它是单个日期,它返回一个纯字符串,如果它是一个日期范围,它返回一个带有from
和to
字段的 dict。因此,在您的操作代码中,您可以检查返回实体的类型并填充两个插槽或仅填充其中一个。
此外,就像 Mukul 提到的那样,您将不得不使用插槽映射将 Duckling 返回的“时间”实体映射到您的插槽。
您的最终解决方案可能看起来像这样(我没有包括休假类型插槽)。
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 []