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对话管理??樾枰?/p>

·训练数据: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阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容