无名之辈FTER责编
夕颜出品
程序人生(ID:coder_life)
本文翻译自Rasa官方文档,并融合了自己的理解和项目实战,同时对文档中涉及到的技术点进行了一定程度的扩展,目的是为了更好的理解Rasa工作机制。与本文配套的项目GitHub?
Rasa的故事是一种训练数据的形式,用来训练Rasa的对话管理模型。故事是用户和人工智能助手之间的对话的表示,转换为特定的格式,其中用户输入表示为相应的意图(和必要的实体),而助手的响应表示为相应的操作名称。Rasa核心对话系统的一个训练示例称为一个故事。这是一个故事数据格式的指南。两段对话样本示例:
!--##表示story的描述,没有实际作用--##greet+location/price+cuisine+numpeople*greet-utter_greet*inform{"location":"rome","price":"cheap"}-action_on_it-action_ask_cuisine*inform{"cuisine":"spanish"}-action_ask_numpeople*inform{"people":"six"}-action_ack_dosearch!--FormAction--##happypath*request_weather-weather_form-form{"name":"weather_form"}-form{"name":null}
Story格式大致包含三个部分:
1.用户输入(UserMessages)
使用*开头的语句表示用户的输入消息,我们无需使用包含某个具体内容的输入,而是使用NLU管道输出的intent和entities来表示可能的输入。需要注意的是,如果用户的输入可能包含entities,建议将其包括在内,将有助于policies预测下一步action。这部分大致包含三种形式,示例如下:
(1)*greet表示用户输入没有entity情况;
(2)*inform{"people":"six"}表示用户输入包含entity情况,响应这类intent为普通action;
(3)*request_weather表示用户输入Message对应的intent为formaction情况;
2.动作(Actions)
使用-开头的语句表示要执行动作(Action),可分为utteranceactions和customactions,其中,前者在domain.yaml中定义以utter_为前缀,比如名为greet的意图,它的回复应为utter_greet;后者为自定义动作,具体逻辑由我们自己实现,虽然在定义action名称的时候没有限制,但是还是建议以action_为前缀,比如名为inform的意图fetch_profile的意图,它的response可为action_fetch_profile。
3.事件(Events)
Events也是使用-开头,主要包含槽值设置(SlotSet)和激活/注销表单(Form),它是是Story的一部分,并且必须显示的写出来。SlotEvents和FormEvents的作用如下:
(1)SlotEvents
SlotEvents的作用当我们在自定义Action中设置了某个槽值,那么我们就需要在Story中Action执行之后显著的将这个SlotSet事件标注出来,格式为-slot{"slot_name":"value"}。比如,我们在action_fetch_profile中设置了Slot名为account_type的值,代码如下:
fromrasa_sdk.actionsimportActionfromrasa_sdk.eventsimportSlotSetimportrequestsclassFetchProfileAction(Action):defname(self):return"fetch_profile"defrun(self,dispatcher,tracker,domain):url="