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: "再见"

undefined

以上分别定义了三个文字类的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的核心对象

undefined

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 我们将第一时间删除。

相关素材