RASA 对话管理系统DEMO及资源:三,response & action实现

jiaying系列 网页版演示地址:ai.moneymeeting.club

一、使用场景

对于简单的任务式对话,不需要使用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: "你好,很高兴认识你!"
  - text: "hi, 我是小鹰,记得关注我哦。"
  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
  1. 保证对话中触发相应的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操作。

DEMO体验(注:无需注册,不要求获取个人信息),若小程序码无法显示,请搜索微信小程序:小鹰微智,或请前往主页www.moneymeeting.club

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210330184930524.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Rob3I5a2luZw==,size_16,color_FFFFFF,t_70)

如果有疑问,可加微信,注备rasa,微信号:aiwabao2021

若需获取本项目相关 源码、配置资源,网盘链接:

https://pan.baidu.com/s/1zwe2PD1B-XOwh3bTizn5Lw

获取提取码,可关注公众号:智会无界,并在后台回复: rasa

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210330185058237.png)

rasa系列文章的源码解读,亦将发布在此公众号上,如有需要可持续关注更新

NLP系列:

对话管理系统RASA免费资源
中文语音合成TTS免费API
中文语音识别ASR免费API
机器翻译NMT免费资源

CV系列:

OCR中英文识别免费API

市场数据系列:

免费股票日线数据API

你可能感兴趣的:(nlp,自然语言处理,机器学习,tensorflow,深度学习,神经网络)