Form是rasa的一个很重要的组成,通过form可以引导user提交关键信息,从而配合完成相应的任务。在之前实现《让自家的智能语音助手实现todo任务的添加》的时候,我尝试使用了form,这是我第一次在rasa中使用form,今天空下来了,自己小结下。
首先需要在domain中定义form,同时也要定义这个form会引用那个entity,这些在slot中也要一起定义。然后是设计stories,即在什么场景下会使用这个form。和其他actions的story定义类似,先有一个用户的intent发起,比如我的“查找任务”story就如下定义:
## query_task //这个是story名字
*query_task // 用户intent
- utter_ask_task_id //chatbot询问任务编号
- query_task_form //告诉chatbot要使用form
- form{“name”: “query_task_form”} //告诉chatbot使用哪个form,只有按照这个格式写,form才真正被调用
- form{“name”: null} //告诉chatbot结束使用form
定义好form,rasa train完成模型训练,接下来修改actions。和普通action的定义一样,先要定义一个class,如Class ActionQueryTaskForm(FormAction),注意括弧内要填写“FormAction”,代表这是一个form action。这个class里会包含四个def,分别定义如下:
def name(self) -> Text:
return "query_task_form"
# 这个函数返回anctions名字,与domain中定义的form名字对应。
@staticmethod
def required_slots(tracker: Tracker) -> List[Text]:
return ["id"]
# 这个函数返回form关联的entity是哪一个,如果是多个,就在return中添加。
def slot_mappings(self) -> Dict[Text, Union[Dict, List[Dict]]]:
return {
"id": [self.from_entity(entity="id"), self.from_text()]
}
# 这个函数返回slot_mapping映射,如果缺少了这个函数,anction运行时会报“Failed to extract slot content with action query_task_form”。
def submit(
self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any],
) -> Dict[Text, Any]:
//main action code
return []
# 这个函数相当于普通actions中的run,它是指将form收集的信息提交后需要做什么,是action的执行主体。
form完成了如上定义后,在和chatbot互动时就能按照我在stories中定义的场景应用了。当然,rasa中的form使用必定还有其他内容,等我用到的时候再来小结。