RASA学习分享
一、Rasa Installation
Environment:Windows 10 64Bit
Step 1: Create virtual environmnent
1 | conda create -n rasa_pyenv python=3.6 |
Step 2: Activate virtual environment and install rasa-x
1 | conda activate rasa_pyenv |
Windows系统下的环境要求:
确保安装了Microsoft vc++编译器,这样python就可以编译任何依赖项。你可以从Visual Studio获得编译器。下载安装程序并在列表中选择vc++构建工具。
遇到的坑:
① 提示ujson在编译时出错,原因是没有安装microsoft vc++编译器。根据提示去https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/下载了编译器并安装,在安装列表中勾选vc++生成工具,完成vc++的安装。
② 安装过程中,经常网络出错,尤其装tensorflow时,这个多试几次,找个网络稳定的时间就好了。
③ 重新安装rasa x,成功。
Step 3: Initial rasa
1 | rasa init |
创建rasa项目所需的所有文件,并根据一些示例数据训练一个简单的机器人。如果你省略了——no-prompt
参数,将会询问你一些关于项目设置的问题(可以补充项目路径,训练rasa初始模型)。
将创建以下文件:
.
├── init.py
├── actions.py
├── config.yml
├─ credentials.yml
├── data
│ ├── nlu.md
│ └── stories.md
├── domain.yml
├── endpoints.yml
└── models
└──
文件名称 | 作用说明 |
---|---|
init.py | 帮助python查找操作的空文件 |
actions.py | 为你的自定义操作编写代码 |
config.yml ‘*’ | 配置NLU和Core模型 |
credentials.yml | 连接到其他服务的详细信息 |
data/nlu.md ‘*’ | 你的NLU训练数据 |
data/stories.md ‘*’ | 你的故事 |
domain.yml ‘*’ | 你的助手的域 |
endpoints.yml | 接到fb messenger等通道的详细信息 |
models/.tar.gz | 你的初始模型 |
Step 4: Start rasa
1 | rasa x |
在本机启动rasa(需要切换至Step 3 rasa init后指定的目录)。
问题:
1 | RuntimeError: Event loop is closed |
原因暂时未知。
老师补充:https://forum.rasa.com/t/error-this-event-loop-is-already-running/24017/2
(问题暂定为rasa x的依赖包不兼容):
1 | pip install google-auth==1.10.1 prompt-toolkit==2.0.10 questionary==1.4.0 SQLAlchemy==1.3.12 urllib3==1.25.7 |
实际并未解决。
解决方案:创建python环境为py3.6。
二、Why rasa
Runs locally
No Network overhead没有网络开销
Control QoS(Quality of Service )可控的服务质量
Deploy anywhere
Own your data
Don’t hand data over to big tech co’s(不要将数据交给大型技术公司)
avoid vender lock-in(避免供应商锁定)
Hackable(可控的)
Tune models for your use case
三、FIVE LEVELS OF AI ASSISTANT ENTERPRISE
企业AI助手的五个等级
level1:Notification Assistants(通知助手)
level2:FAQ Assistants (常见问题助手)Frequently Asked Question
level3: Contextual Assistants (可基于上下文语义理解的助手)
level4:Personalized Assistants (个性化的助理)
level5:Autonomous Organization of Assistants(自治组织的助手)
四、RASA Architecture
4.0 Rasa框架
下图显示了使用Rasa构建的助手如何响应消息的基本步骤:
步骤如下:
- 收到消息并将其传递给解释器,解释器将其转换为包含原始文本,意图和找到的任何实体的字典。这部分由NLU处理。
Tracker
是跟踪对话状态的对象。它接收新消息进入的信息。- 策略接收
Tracker
的当前状态。 - 该政策选择接下来采取的行动。
- 选择的操作由
Tracker
记录。 - 响应被发送给用户。
消息可以是人类输入的文本,
也可以是按钮按下等结构化输入。
Rasa提供对话系统中的两个核心模块:NLU和对话管理。
NLU:利用规则、机器学习,统计学习,深度学习等方法,对一条人类语言进行文本分析,分析得到的主要结果为意图intent以及实体entity信息。其中,意图对应task-orient对话系统中的intent。而实体信息则用于对话系统中的槽填充。
对话管理:在rasa中,对话管理的主要职责是通过NLU的分析得到的意图和实体信息,进行槽位填充,然后结合前几轮对话的状态,根据某种策略(策略可以是人工规则,或者机器学习,深度学习,强化学习训练得到的策略模型),决定应当如何对当前用户的对话进行回应。因此rasa的对话管理是包括槽填充的。
RASA的组成模块
1、NLU:
determines what the user wants and captures key contextual information
2、Core:
selects the next best response or action based on conversation history
3、Channels and integrations and action server:
connect assistant to users and backend systems
4、NLG
4.1 Rasa config file
Rasa配置文件(./configu.yml)定义了模型要用到的 Rasa NLU 和 Rasa Core 组件,官方示例这个配置文件,这里面 NLU 模型将使用 supervised_embeddings pipeline。
1 | # Configuration for Rasa NLU. |
4.2 Rasa NLU
Rasa NLU是Rasa的核心模块之一,这个模块用于对用户消息内容进行语义理解,并将结果转换成结构化的数据。在 Rasa 这里,需要提供一份训练数据,Rasa NLU 会基于这份数据进行模型训练,然后通过模型对用户消息进行语义理解,主要是意图识别和槽值提取。
在对话系统的NLU中,意图识别(Intent Detection,简写为ID)和槽位填充(Slot Filling,简写为SF)是两个重要的子任务。其中,意图识别可以看做是NLP中的一个分类任务,而槽位填充可以看做是一个序列标注任务,在早期的系统中,通常的做法是将两者拆分成两个独立的子任务。但这种做法跟人类的语言理解方式是不一致的,事实上我们在实践中发现,两者很多时候是具有较强相关性的,比如下边的例子:
1.我要听[北京天安门, song] — Intent:播放歌曲
2.帮我叫个车,到[北京天安门, location] — Inent:打车
3.播放[忘情水, song] — Intent:播放歌曲
4.播放[复仇者联盟, movie] — Intent:播放视频
1和2中,可以看到同样是“北京天安门”,由于意图的不同,该实体具备完全不同的槽位类型。3和4中,由于槽位类型的不同,导致了最终意图的不同,这往往意味着,在对话系统中的后继流程中将展现出完全不同的行为——-打开网易音乐播放歌曲 or 打开爱奇艺播放电影。
随着对话系统的热度逐渐上升,研究的重点也逐渐倾向于将两个任务进行联合,以充分利用意图和槽位中的语义关联。那么,问题来了,我们该如何进行联合呢?从目前的趋势来看,大体上有两大类方法:
- 多任务学习:按Multi-Task Learning的套路,在学习时最终的loss等于两个任务的loss的weight sum,两者在模型架构上仍然完全独立,或者仅共享特征编码器。
- 交互式模型:将模型中Slot和Intent的隐层表示进行交互,引入更强的归纳偏置,最近的研究显示,这种方法的联合NLU准确率更高。
接下来,我们将对这两类方法涉及到的部分文献进行分析,为大家的研究提供参考。
参考:Intent Detection and Slot Filling
Rasa NLU 怎么识别语义【entity】的:
entity标注:
中括号,how much do I have on my [savings] (“account”) account
大括号,即字典的形式,描述能力更强 how much money is in my [checking] [“entity”: “account”] account
同义词标注:
Synonym
正则表达式:
Regular Expression
Rasa NLU训练数据样例(./data/nlu.yml):
1 | version: "2.0" |
其中:
标识 | 说明 |
---|---|
intents | 意图 |
actions | 动作 |
templates | 回答模板 |
entities | 实体 |
slots | 词槽 |
4.3 Rasa Core
(Dialogue Manager = Dialogue State Tracking + Dialogue Ploicy)
Rasa core主要包含两个内容,stories和domain。
4.3.1 Stories
stories可以理解为对话的场景流程,我们需要告诉机器我们的多轮场景是怎么样的,例如,在下文的例子中,我们希望的流程是这样的:用户问好 -> 机器问用户今天过得怎么样 -> 用户反馈情绪 -> 机器根据不同的情绪进行回复,这里其实包含两个流程,一个正面情绪的流程与一个负面情绪的流程,因此,我们也需要编写两个story,接下来我们看下怎么编写story。
对话管理(dialogue management)是对话系统或者聊天机器人的核心,在 Rasa 中由 Rasa Core 负责,而这部分的训练数据在Rasa 中由 Stories 提供。Stories可以理解为对话的场景流程,一个 story 是一个用户和AI小助手之间真实的对话,这里面包含了可以反映用户输入(信息)的意图和实体以及小助手在回复中应该采取的 action(行动)。
1 | version: "2.0" |
4.3.2 Rasa Domain
Domain 可以理解为机器的知识库,其中定义了意图(intents),动作(actions),以及对应动作所反馈的内容模板(templates),例如它能预测的用户意图,它可以处理的 actions,以及对应 actions 的响应内容。
**`Domain`定义了机器人助手所处的世界。** **它指定了机器人应该知道的`意图(intents)、实体(entities)、槽位(slots)和操作(actions)`。另外,它还可以包含机器人能够说的内容的`模板(templates)`。**PS:新版本的actions和templates合并成为response。为AI小助手准备的 domain 存储在 domain.yml 文件中,可以观察一下这份样例数据:
1 | ession_config: |
这些将通过 Rasa Core 管理,Rasa Core 的核心工作就是在对话的每一步选择正确的 action 去执行。在这个例子中,actions 是简单的向用户发送一条消息,这些 actions 定义在domain中,以 utter_开头,AI小助手将会根据内容模板(templates) 回复消息。
4.4 Rasa Core Train
如果添加了 NLU 或者 Core 数据,或者修改了domain和配置文件,需要重新训练模型,用下面的这条命令即可,这个命令将调用Rasa Core或者NLU的训练函数以及在 models/ 目录下存储训练模型。
1 | rasa train |
其他补充
1、Rasa常见任务命令
命令 | 作用 | |
---|---|---|
rasa_init | 创建一个新的项目,包含示例训练数据,动作和配置文件 | |
rasa_train | 使用NLU数据和stories训练模型,保存模型在./models 中 |
|
rasa interactive | 通过交谈开启一个新的交互学习会话来创建新的训练数据 | |
rasa shell | 加载训练模型,与助手通过命令行交谈 | |
rasa run | 使用训练的模型开启一个Rasa服务 | |
rasa run actions | 使用Rasa SDK开启action服务器 | |
rasa visualize | 可视化stories | |
rasa test | 使用测试NLU数据和故事来测试训练好的Rasa模型 | |
rasa data split nlu | 根据指定的百分比执行NLU数据的拆分 | |
rasa data convert nlu | 在不同格式之间转换NLU训练数据 | |
rasa x | 在本地启动Rasa X | |
rasa -h | 显示所有可用命令 |
2、wikipedia和百度百科语料生成了一个total_word_feature_extractor_chi.dat,分享如下。”
1 | 链接:http://pan.baidu.com/s/1micEF0G 密码:opli |
放入到data/total_word_feature_extractor_zh.dat
5、domain.yaml中intents actions response是怎么对应的
助教答案:
NLP 路线
Reference
1、RASA用户指南
3、基于RASA的task-orient对话系统解析(二)——对话管理核心模块
4、基于RASA的task-orient对话系统解析(三)——基于rasa的会议室预定对话系统实例
6、Rasa 入坑指南二:基于 Rasa 构建天气查询机器人
8、NLP学习路线