闲聊模型的实践并应用到rasa
2019-11-20 本文已影响0人
colin_gao
前言
我们都知道rasa是用来做任务型对话的,但有时候不在自定义意图里面就比较难处理。我们相到的办法就是在policies
里面配置FallbackPolicy
,当nlu_threshold和core_threshold低于给定的阈值时候就会走对应的action。要么你回复"不好意思,我还不知道这个呀!",要么你弄个faq做一个检索式回复,之前接过图灵机器人接口接入了闲聊。但是如果能够自己训练一个闲聊岂不是美哉。
生成式的nlg还是得基于seq2seq。尝试下来UNILM模型的效果最好。所以将UNILM结合了rasa做了一个兜底的工作。
UNILM
UNILM(Unified Language Model Pre-training for Natural Language Understanding and Generation),提出了一种简洁的预训练方法,直接复用了bert的结构和参数。
具体的理论和代码解释参考苏大佬的从语言模型到Seq2Seq:Transformer如戏,全靠Mask
代码
直接干货吧,代码是基于苏大佬代码改的。代码地址:https://pan.baidu.com/s/1-Que9-6NW0v-lh0ngYn-uw 密码:v6al
rasa中应用
rasa中应用就很简单了,直接自定义一个defaultfallback的action,比如:
class ActionDefaultFallback(Action):
def name(self):
return "action_default_fallback"
def run(self, dispatcher, tracker, domain):
text = tracker.latest_message.get('text')
# get_response方法就是闲聊的服务接口调用
message = get_response(text)
dispatcher.utter_message("{}".format(message['text']))
return [UserUtteranceReverted()]
然后就是在config.yml文件里面配置对应的policy,比如:
- name: FallbackPolicy
fallback_action_name: 'action_default_fallback'
nlu_threshold: 0.6
core_threshold: 0.3
ok,可能还有更好的nlg方法,都可以尝试。但就rasa,他只是个框架,我们可以灵活使用。 : )