RASA 对话管理系统DEMO及资源:三,response & action实现
发布于 2021-04-03 07:36
一、使用场景
对于简单的任务式对话,不需要使用action。可直接用response实现。
但是当你需要做复杂操作时,比如查询数据库、生成语音、查询视频等,就需要有一个处理这些任务的类,在特定的story或rule规则下,供调用。
在DEMO中实现了response,以及两个action。
二,response
在本质上,response就是一个action,只不过它非常简单,只是以文字的形式进行对象反馈,且response就预先设好的几个回答。
因此,response和action一样,可以被story及rules引用,在特定的intent下提供具体的应对回复。
在DEMO中,预设了3个response场景,下面来看如何实现。
1)在domain.yml中可设置response:
responses:
utter_say_hi:
- text: "你好,很高兴认识你!"
utter_no_thanks:
- text: "不用谢。"
- text: "you are welcomed."
utter_goodbye:
- text: "byebye."
- text: "再见"
以上分别定义了三个文字类的response: utter_say_hi, utter_no_thanks, utter_goodbye
2)在story中编剧本,引用response
stories:
story: say hi
steps:
intent: say_hi
action: utter_say_hi
story: thankyou
steps:
intent: thankyou
action: utter_no_thanks
story: goodbye
steps:
intent: goodbye
action: utter_goodbye
3) 保证对话中触发相应的intent,在此场景中,你必须定义say_hi, thankyou, goodbye这三个intent
在domain中定义intent:
intents:
- say_hi
- thankyou
- goodbye
在nlu.yml中设置学习的例句:
nlu:
intent: say_hi
examples: |
你好
小鹰小鹰
早上好
hi
- hello
intent: thankyou
examples: |
谢谢
感谢
多谢
thank you
- thanks
intent: goodbye
examples: |
再见
就这样吧
再会
bye
三,action 实现
DEMO中实现了两个action:
一个是action_recognize,即当判断intent为recognition时调用的。
另一个是action_chitchat,即当意图为out_of_scope,或当nlu判断为nlu_fallback时进行调用。chitchat服务是另起的,在此不做讲解。
下面重点说如何创建action_recognize:
1)在rasa项目中创建actions文件夹,并新建actions.py
2) 如果没有装rasa_sdk,应先安装:https://pypi.org/project/rasa-sdk/
3) 一系列的import,用于引入rasa_sdk的核心对象
4)创建继承于Action的类,有两个必须实现的方法, name及run
class ActionRecognize(Action):
def name(self) -> Text:
return "action_recognize"
def run(self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
'''定义返回结构'''
forr={
"action_name":'action_recognize',
"message":'',#各种失败信息,初始为空str
'action_code':'',#用返回码,对应各种情况
}
cs_dict=tracker.current_state()
cs_message=cs_dict['latest_message']['text'] #最新的消息
cs_entity=cs_dict['latest_message']['entities'] #[{'entity': 'animal', 'start': 0, 'end': 2, 'value': '大象', 'extractor': 'RegexEntityExtractor'}]
#print("input message: ",cs_message," entities: ",cs_entity)
'''预设本action可以处理的实体清单'''
verified_entity=['狮子','大象','山羊','老虎','猴子','企鹅','章鱼'] #用于存放已进行数据准备的entity列表
'''根据entity的情况,进行信息匹配'''
if len(cs_entity)==0:
forr['message']='没有抓到实体哦。*from action_recognize*'
forr['action_code']='AC1 NO ENTITIES'
else:
for e in cs_entity:
if e['value'] not in verified_entity:
print("entity: ",e['entity']," not in verified_entity,返回action_code:AC2 WRONG VERIFIED_ENTITY")
forr['message']='实体'+e['value']+'未在预设清单中 *from action_recognize*'
forr['action_code']='AC2 WRONG VERIFIED_ENTITY'
else:
forr['message']='实体“'+e['value']+'”已准确抓取 *reply: action_recognize*'
forr['action_code']='AC3 NO ENTITY DATA'
print(e['value']+'没有入库资料,需要另行处理')
####################定义用户返回的信息部份,使用dispatcher回传信息####################
dispatcher.utter_message(text=json.dumps(forr))
return []
ActionRecognize派生于Action类,Action类具体可参照源码。
action_recognize这个名字,在story或rules里被直接引用,如果要名,需要重新训练过nlu模块。
- rule: call custom action
steps:
- intent: recognition
- action: action_recognize
tracker是rasa的一个核心类,通过tracker.current_state(),可以获取消息目前的状态信息,即通过NLU模块处理后的字典信息,可分离出message, 被ner模块识别entity等关键信息。
dispatcher类,顾名思义,用于对话调度,它可以将信息传回nlu core。
这两个类一进一出,可以完成最基本的I/O操作。
RASA对话体验
若需获取本项目相关 源码、配置资源,网盘链接:
https://pan.baidu.com/s/1zwe2PD1B-XOwh3bTizn5Lw
本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。
相关素材