Rasa系列教程(一) -- 系统及各组件介绍
目录
前言
一、传统对话机器人架构
二、对话系统流程
2.1 ASR语音识别
2.2 NLU自然语言理解
2.3 DM对话管理
2.4 NLG自然语言生成
2.5 TTS语音合成
三、Rasa组件介绍
3.1 Rasa简介
3.2 Rasa安装
3.3 Rasa项目基本流程
3.4 Rasa常用命令
3.4 Rasa常用命令
前言
人机对话是一个很难的问题,在商业与技术上都没有固定的套路,被称为NLP领域中“王冠上的钻石”。
一、传统对话机器人架构
早期的对话机器人架构主要基于模板和规则,如AIML(Artifical Intelligence Maekup Language)。这里以AIML的查询天气模板为例讲述规则系统。
<?xml version="1.0" encoding="utf-8"?>
<aiml version="1.0"><category>
<pattern>*</pattern>
<that>你现在在什么地方</that>
<template><think><set name="where"><formal><star/></formal></set></think><random><li><get name="where"/>是个好地方.</li><li>真希望我也在<get name="where"/>, 陪你.</li><li>我刚刚看了下<get name="where"/>的天气哦.</li></random>
</template>
</category><category>
<pattern>外面热吗</pattern>
<template>你现在在<get name="where"/>,<system>python getweather.py reltime <get name="where"></system>
</template>
</category></aiml>
规则的描述主要基于正则表达式。将用户的问题匹配到类似模板,可以取得预定义好的答案。事实上,像AliceBot这样基于AIML的对话机器人,拥有4万多个不同的类别数据,是一个海量的规则数据库。
使用规则的优点是:准确率高,但缺点明显:规则只能覆盖较少部分,且随着时间推移,规则越写越多,难以维护。此外,对话机器人还需要维护一个庞大的问答知识库,对用户的问题通过计算句子之间的相似度来寻找数据库中已有的最相近的问题,从而给出相应答案。
知乎和Quora等问答网站不希望用户提问很多重复的问题,因此对用户的每一个新的问题,这些网站都会和已有的问题进行匹配,从而产生一些skip-thought计算句向量等方法。
二、对话系统流程
当前人机对话按流程主要分为5个部分:
- ASR:语音识别模块;
- NLU:自然语言理解模块;
- DM:对话管理模块;
- NLG:自然语言生成模块;
- TTS:语音合成模块;
2.1 ASR语音识别
语音识别(Automatic Speech Recognition, ASR)也称语音转文字,是将人类的语音内容转换成相应文字的技术。这方面已经有比较多的商业解决方案(科大讯飞、百度等)和开源项目(Kaldi、DeepSpeech等),技术已经相对成熟。
2.2 NLU自然语言理解
自然语言理解(Natural Language Understanding, NLU)是一个比较宽泛的领域。这里的NLU是指分析用户语言中表达的意图(intent)和相关实体(entity)的技术。
NLU模块主要对用户的就问题在句子级别进行分类和意图识别,同时在词级别找出用户问题中的关键实体,并且进行实体槽填充。举个例子:用户说"我想吃羊肉泡馍",NLU要识别出用户的意图是"寻找餐馆",而关键实体是"羊肉泡馍"。有了意图和关键实体,就方便DM模块对后端数据库进行查询。
从NLP和机器学习角度看,意图识别是一个文本分类问题,实体槽填充是一个传统的命名实体识别问题。两者都需要标注数据。下面是Rasa中NLU数据的格式:
nlu:
- intent: greetexamples: |- 你好!- 早上好!- intent: restaurant_searchexamples: |- 找个吃[拉面](food)的店。- 这附近哪里有吃[麻辣烫](food)的地方。
这看上去和AIML数据非常像。然而NLU数据实际用到了以这些标注数据训练出的复杂的机器学习模型,表现能力和泛化能力大大增强。只要列出了"拉面"和"麻辣烫",如果出现"凉皮"、"糖葫芦"等词,Rasa良好的NLU系统依旧会把它们标注为食物。
一种常见的NLU架构方案如下图所示,对输入的文本首先经过分句、分词、词性标注等基础自然语言预处理。对某些应用来讲,指代消解是非常重要的步骤。将原有的指代词甚至零指代补全成完整名称,可以消除很多NLU数据的歧义。之后通过机器学习、深度学习、规则等方式进行意图识别和实体标注。
2.3 DM对话管理
对话管理(Dialog Management, DM)是指根据对话历史状态决定当前的动作或对用户的反应。DM模块是对话系统流程的控制中心,有着至关重要的作用。其首要任务是负责管理整个对话的流程。通过对上下文的维护和解析,DM模块要决定用户提供的意图是否明确,以及实体槽的信息是否足够,以进行数据库查询或开始执行相应的任务。
当DM模块认为用户提供的信息不全或模棱两可时,就要维护一个多轮对话的语境,不断引导式地询问用户以得到更多的信息,或者提供不同的可能选项让用户选择。DM模块要存储和维护当前对话的状态、用户的历史行为、系统的历史行为、知识库中的可能结果等。当DM模块认为已经清楚得到了全部需要的信息后,就会将用户的查询变成数据库查询语句去知识库(或知识图谱)中查询响应资料,或者实现和完成相应的任务(如购物下单,或者类似拨打电话等)。
一个DM例子如下图所示:
在实际中,DM模块肩负着大量杂活,是与使用需求强绑定的,大部分使用规则系统,实现和维护都比较繁琐。因此,在新的研究中,将DM模块的状态建模成一个序列标注的监督学习问题,甚至用强化学习加入一个用户模拟器来将DM模块训练成一个深度学习模型。我们后面会看到Rasa在其Core模块中是如何简洁又巧妙地实现DM的。
2.4 NLG自然语言生成
自然语言生成(natural Language Generation, NLG)是将意图和相应的实体转换成人类用户可以理解的文本的过程。当前主要的方案有模板法和神经网络序列生成法。模板法比较单一,然而是人工设计的,所以可读性最好。神经网络序列生成法的形式变化多样,类似千人千面,响应的质量和稳定性难以控制。目前在实际应用中,多以模板法为主,对模板法稍加改造(如随机选择一组模板中的一个)以克服其过于呆板的缺点。
NLG模块是机器与用户交互的"最后一公里"。闲聊机器人往往在大量语料上用一个seq2seq的生成模型,直接生成反馈给用户的自然语言。然而在垂直领域的任务型机器人中并不适用,用户需要的是解决问题的准确答案,而不是俏皮话。
当下很多人尝试用深度学习做端到端的以任务为目标的对话机器人,有的基于传统的对话机器人框架,即NLU+DM+NLG,每一个模块都换成深度学习模型,再加入用户模拟器进行强化学习,进行端到端的训练;还有的使用"Memort Networks"方式,偏向于seq2seq,将整个知识库都编码在一个复杂的深度网络中,再和编码过的问题结合起来解码生成答案。这主要应用在机器阅读理解上,注明的斯坦福的SQuAD比赛,有一些神乎其技的结果,但在垂直领域任务导向的对话机器人上的成功应用还有待观察。
2.5 TTS语音合成
语音合成也称文字转语音(Text to Speech, TTS),是将文字转换成人类可以理解的语音技术。TTS已经发展许多年,业界有比较成熟的解决方案,从效果来说达到了可以实用的地步。出于研发成本的考虑,在实际使用中多直接使用专业公司(科大讯飞、百度)提供的TTS引擎或服务。
三、Rasa组件介绍
3.1 Rasa简介
Rasa是一个用于构建对话机器人的开源机器学习框架,几乎覆盖了对话系统的所有功能,是目前主流的开源机器对话机器人框架。
Rasa框架包含4个部分:
- Rasa NLU:提取用户想要做什么和关键的上下文信息;
- Rasa Core:基于对话历史,选择最优的回复和动作;
- 通道(channel)和动作(action):连接对话机器人与用户及后端服务系统(使用界面),支持即时通信软件对接Rasa;
- tracker store、lock store、event broker等辅助系统;
Rasa的核心工作逻辑如下:
大多数机器人都需要调用外部服务来完成对应功能,例如,在天气查询机器人需要天气信息服务商的接口来完成实际天气情况的查询,订餐机器人需要调用外部服务完成金融消费和餐品下单。在Rasa中,这种由于具体业务决定的动作被称为自定义动作(custom action)。自定义动作运行在一个单独的服务器进程中,也被称为动作服务器(action server)。动作服务器通过HTTP和Rasa Core进行通信。
3.2 Rasa安装
安装Rasa非常容易,在命令行中使用pip命令即可安装。
pip install rasa
3.3 Rasa项目基本流程
构建一个完整的Rasa项目工程会有如下步骤:
(1)初始化项目
(2)准备NLU训练数据
(3)配置NLU模型
(4)准备故事(story)数据
(5)定义领域(domain)
(6)配置Rasa Core模型
(7)训练模型
(8)测试机器人
(9)让人们使用机器人
3.4 Rasa常用命令
Rasa常用命令如下表所示:
命令 | 功能 |
rasa init | 创建一个新的项目,包含样本训练模型、配置和动作 |
rasa train | 使用NLU训练数据、故事数据、配置训练模型,默认情况下模型保存在./models目录中 |
rasa interactive | 交互式的训练:通过和机器人对话修正可能的错误,并将对话数据导出 |
rasa run | 运行rasa服务器 |
rasa shell | 等价于执行rasa run命令,开启基于命令行界面的对话界面和机器人交流 |
rasa run actions | 运行rasa动作服务器 |
rasa x | 启动Rasa X服务器(如果没有安装Rasa X的话会提示安装) |
rasa -h | 打印Rasa命令的帮助信息 |
3.4 Rasa常用命令
成功安装Rasa后,开发者就可以使用Rasa自带的命令行工具创建一个示例项目:
rasa init
rasa init运行后会询问新创建的项目位于哪里(默认是当前目录),一级创建示例项目后是否立即训练模型(默认是Yes),开发者可以选择No,然后自己通过rasa train命令训练模型。
示例项目创建成功后,选择的项目目录下将会增加如下文件:
—— actions—— actions.py—— __init__.py
—— config.yml
—— credentials.yml
—— data—— nlu.py—— rules.py—— stories.py
—— domain.yml
—— endpoints.yml
—— tests—— test_stories.py
所有Rasa命令行工具都默认使用这套文件目录布局,因此这是创建Rasa工程的最佳方法。我们鼓励在命令行中运行rasa train命令来训练这个项目模型,并通过使用rasa shell命令来和机器人进行对话。
Rasa系列教程(一) -- 系统及各组件介绍相关推荐
- 【建站系列教程】3.1、cookie介绍
[建站系列教程]3.1.cookie介绍 cookie的应用场景 1 小说网站的字体.颜色.背景颜色设置 2 隐藏url里面的参数 cookie的通俗介绍 cookie的基本用法 js版本 jQuer ...
- Altium designer18系列教程一 建工程和封装介绍
Altium designer18系列教程一 建工程和封装介绍 AD18介绍 AD18建工程 AD18使用 AD整体规划和封装介绍 封装介绍(借鉴燕骏工作室AD系列教程封装介绍) 一.标准零件 二. ...
- hadoop系列(一)概念、组件介绍、安装环境、配置
hadoop系列(一)概念.组件介绍.安装环境.配置 一.大数据概念 概念 大数据:解决海量数据的采集.存储.分析计算的能力 大数据特点 Volume(大量) Velocity(高速) Variety ...
- STM32 基础系列教程 5 – 系统定时器
前言 学习stm32 systime的使用,用基本定时器产生定时1ms定时中断,用于参生1ms系统时钟节拍,并实现将1ms 节拍改成500us 或其它时间功能.并实产生的时间节拍为机基准实现控制LED ...
- vue系列教程之微商城项目|项目介绍
欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 欢迎加入团队圈子!与作者面对面!直接点击! 简介 这是一系列 ...
- endnote安装_EndNote X8 系列教程(一):软件介绍与安装
软件介绍 不管是毕业论文还是学术论文,插入参考文献是一件繁琐又令人头疼的的工作,目前,有很多款管理参考文献的软件工具,如CNKI E-Study,Notepress,EndNote等等.接下来,我 ...
- endnote一打开就自动关闭_EndNote系列教程(一):功能介绍与软件安装使用
写论文.做科研时最让人头疼的是什么?查找不到合适的文献?无法与合作伙伴轻松交流?参考文献格式傻傻分不清?EndNote 文献管理工具全方位帮你减轻文献搜索.整理.引用等冗杂工作带来的沉重负担. End ...
- Hyper-V 2016 系列教程52 常见的虚拟机文件格式介绍
常见的几种虚拟机文件格式如表5-2所示,表里包含了开放虚拟化通用文件格式.XenServer.VMware.Microsoft三大厂商的自已开发的文件格式. 表5-2 ...
- 轻松掌握Ajax.net系列教程
1.轻松掌握Ajax.net系列教程一:部署AJAX.NET 2.轻松掌握Ajax.net系列教程二:部署Ajax Control Toolkit 3.轻松掌握Ajax.net系列教程三:使用Casc ...
最新文章
- 【数据结构】最小生成树 Prim算法 Kruskal算法
- 如何把opencv编译到matlab,c – 为OpenCV编译MATLAB绑定
- (二)Mac系统Nginx的安装
- 前后端分离session_前后端分离:基于JWT用户认证分析
- php父子遍历,php无限分类父子追溯方法
- 调试利器:浏览器 Logger
- Linux下的Tomcat服务器修改server.xml中的8080端口号后出现不能访问首页
- Elasticsearch Curator使用
- matlab sdk7.1,免费试用MATLAB Compiler SDK
- 019,Intelidea右键新建选项没有Java class选项
- MVI - 继续来凑个热闹
- POI 读取 Excel 文件(2003版本与2007版本的差异之处)
- pandas实现多个excel合并统计
- Windows 10系统下载----生成iso镜像文件
- 担忧:房价八大预言,市场来检验。
- ubuntu里解决Firefox登陆12306问题
- 常用的HDFS Shell命令及解析
- 微信 小程序 python 商城_微信小程序——商城篇
- 门店定位怎么在地图上显示_怎样让自己的店地理位置显示在高德地图上
- Topic 17. 临床预测模型之缺失值识别及可视化
热门文章
- zigbee之OSAL操作系统
- excel中STDEV.P STDEV.S STDEVA STDEVPA STDEV STDEVP 的区别
- Pymol 移动配体操作
- excel条件格式使用_如何使用条件格式在Excel中创建进度栏
- VB.NET制作SQL用户登录界面代码
- MIT 6.S081 Operating System Lecture8 (非常随意的笔记)
- 概率论笔记:高斯分布的边缘概率
- Nested Logit交通方式划分-基于Biogeme
- IDEA 插件开发 一个表单提交的弹出框
- Perl完全自学手册图文教程