Rasa对话系统--篇章1

Rasa的官网   项目的github地址:Rasa_wechat   视频讲解(正文+编程+QA):bilibili

本篇文章大量参考基于Rasa_NLU的微信chatbot另一篇,并融入一些自己的理解和需求,可以结合在一起看。

对话系统==聊天盒子==chatbot  (一种是纯聊天型;一种是针对特定商业型)

NLU(Natural Language Understanding,自然语言理解),主要是意图识别+实体识别

DM(Dialogue Management,对话管理),主要是对话状态维护+数据库查询

NLG(Natural Language Generation,自然语言生成),主要是生成交互的自然语言

Rasa是rasa.ai提供的开源工具,支持Python 2和3,可以本地部署,自己针对实际需求训练和调整模型,在商业chatbot设计上应用较多。Rasa既支持英文,又支持中文,甚至支持任何语言,主要包含两大模块:rasa_nlu和rasa_core。

rasa_nlu是负责自然语言理解的,包括意图识别+实体识别;rasa_core是根据得到的意图(intent)和实体(entity)进行语言回复的(即,next_action)。

1.安装Rasa

pip install rasa_core  (安装)                         pip install -U rasa_core  (更新)

pip install rasa_nlu[tensorflow]  (安装)

2.对话流程的伪代码

input_string=""   ##输入

intent_object=intent(input_string)  ##意图识别

response=policy(intent_object)  ##回复生成

print(response)  ##返回用户

3.以一个简单的对话为例:

A:input_string="我饿了"

机器处理过程:intent_object=intent("我饿了")     response=policy(intent_object)="你想吃什么?"

机器人:print("你想吃什么?")

准备两种材料,一是NLU自然语言理解模块需要的,二是DM对话管理模块需要的

·训练数据:nlu  examples + dialogue stories

·配置文件:nlu  config + dialogue domain


3.1)自然语言理解 Rasa_nlu

针对用户的问题,NLU模块的任务是:意图识别+实体识别

意图识别:在句子级别进行分类(类似,文本分类),明确意图;

实体识别:在词级别找出用户问题的关键实体,进行实体槽填充(slot filling)

eg:用户说:“我想吃汉堡”,NLU模块首先识别出用户的意图“寻找餐馆”,其次识别出关键实体“汉堡”。有了意图和关键实体,就方便后面对话管理模块进行后端数据库的查询或是有缺失信息而来继续多轮对话补全或其他缺失的实体槽。【可以理解为,我们要从用户的输入中,提出越多越精确的关键词,将这些关键词们作为我们回答的依据,找到最匹配当前场景,当前状态的话进行回复。  可以扩展用户的信息包括{意图:寻找餐馆,关键实体:汉堡,时间:22:28,地点:北京中关村地铁站,天气:小雨,.......},后台根据这些信息,为用户提供一个恰当的回复。】

对用户输入语句进行理解的NLU工具很多,大多都是以服务的方式提供,如Google的API.ai,Microsoft的Luis.ai,Facebook的Wit.ai等。事实上,申请到这类API的话用几行代码即可完成一个chatbot,亦可参考使用图灵机器人和api.ai相关接口。如果想从零开始动手实现NLU,推荐阅读Do-it-yourself NLP for bot developers

3.2)Rasa_NLU的一个中文对话系统例子:rasa_nlu_chi

首先需要构建示例,作为意图识别和实体识别的训练数据:放在/data/nlu.json里

实体还可以扩展到多个词, 而且value不一定要是你句子中的词,这样一来,就能将同义词、误拼映射到同一个值上,比如下面这个例子:

Rasa也支持Markdown格式的训练语料

3.3)参考下面链接打一个简单的中文单轮对话模型

https://terrifyzhao.github.io/2018/09/17/Rasa使用指南01.html

3.3.1 安装Rasa

pip install rasa_core

pip install rasa_nlu[tensorflow]

3.3.2搭建stories对话场景

stories可以理解为对话的场景流程,可以告诉机器多轮对话场景下怎么处理,例如:我们希望的流程:用户问好--->机器人问用户今天过得怎么样--->用户反馈情绪--->机器根据不同的情绪进行回复,这里包含两个流程,一个是正面情绪的流程,一个是负面情绪的流程,因此需要写两个story,编写story。

##  story标题

*  意图

-  动作

将该图中的内容保存到stories.md文件中

3.3.3搭建domain

domain可以理解为机器的知识库,其中定义:意图、动作、对应动作反馈的内容

intent      意图

action      动作

templates      回答模板

entities      实体

slots    词槽

把该图片的内容保存到domain.yml文件中

Rasa Core的任务是在获得用户的意图后,选择正确的action,这些action就定义在domain中以utter_开头的内容,每一个action会根据templates中的情况来返回对应的内容。(注,此例子中没有定义词槽与实体,所以domain中暂时没有。)

3.3.4训练对话模型

下一步就是用神经网络去训练我们的Core模型了,我们可以直接执行以下命令,训练的模型将会存储在models/dialogue文件夹下。

python -m rasa_core.train -d domain.yml -s stories.md -o models/dialogue

可以看到,训练过程采用了一个神经网络,结构为:masking->lstm->dense->activation,这里简单介绍下masking层,在nlp领域,输入的内容可能不是一样长的,为了能统一处理数据需要定长,因此某些值需要补0或者截取多余内容,但是补0的部分其实是没有意义的,masking层能让这些补0的部分不参与之后的计算,从而提升运算效率。

生成的dialogue模型

3.3.5尝试和机器人交流

用训练好的模型来运行我们的机器人,执行以下命令

python -m rasa_core.run -d models/dialogue

此时我们的机器人还无法判断用户的意图,只能根据输入的意图返回特定的答案,所以我们只能输入一些结构化的数据,例如输入我们之前在domian中定义好的意图,输入的信息需要以 /开头,我们可以直接输入意图 /greet,当然,如果你想让机器人回答更多的内容,请在stories与domain中添加更多的内容。

简单总结:

1]安装rasa    2]搭建stories对话场景,即编写stories.md文件    3]搭建domain,即编写domain.yml文件

4]训练对话模型  python -m rasa_core.train -d domain.yml -s stories.md -o models/dialogue

5]尝试和机器人交流  python -m rasa_core.run -d models/dialogue

以上是一个能够运行的简单模型,未添加意图识别。



3.4)参考下面链接打一个简单的中文单轮对话模型(能够进行意图识别)

https://terrifyzhao.github.io/2018/09/17/Rasa使用指南01.html

3.4.1添加nlu模块,配置nlu.md意图文件

rasa_nlu理解用户句子,输出意图、关键词等

首先定义一个对应的意图可能会出现的文本内容文件nlu.md

将该图中的内容存入nlu.md文件中

3.4.2添加nlu模块,配置nlu_config.yml文件

我们还需要一个nlu的配置文件,nlu_config.yml,由于我们是中文系统,所以language对应的是zh,如果你需要英文的对话请修改为en。

将该图片的内容存入nlu_config.yml文件

3.4.3训练具有意图识别的模型

准备好之后就可以开始训练NLU模型了,执行以下命令

python -m rasa_nlu.train -c nlu_config.yml --data nlu.md -o models --fixed_model_name nlu --project current --verbose

3.4.4尝试和机器人对话

添加完NLU模型之后我们就能让机器识别自然语言了,我们执行下以下命令。

python -m rasa_core.run -d models/dialogue -u models/current/nlu


重要参考资料:

【1】基于Rasa_NLU的微信chatbot

【2】https://terrifyzhao.github.io/2018/09/17/Rasa使用指南01.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容