week2-使用RASA制作你的第一个对话机器人

RASA学习分享

一、Rasa Installation

Environment:Windows 10 64Bit

Step 1: Create virtual environmnent

1
2
3
4
5
6
7
8
9
10
11
12
conda create -n rasa_pyenv python=3.6

"""
# Windows 默认的虚拟环境位于anaconda安装目录下的env目录中;
# Linux则是位于$HOME/.conda/envs/rasa_pyenv中;
# 若要指定安装位置,则:
# conda create -p (/opt/environment/.conda/envs/env_name) (python=2.7)
# 若要删除虚拟环境,则:
# conda env remove -p D:/Programs/Python/Miniconda3/envs/rasa_poetry
# 或者
# conda env remove -n rasa_pyenv3
"""

Step 2: Activate virtual environment and install rasa-x

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
conda activate rasa_pyenv

# Plan A:
pip3 install rasa-x --extra-index-url https://pypi.rasa.com/simple

# ==================================================================
# Plan B:
## 1. Clone Repo:
git clone https://github.com/RasaHQ/rasa.git
## 2. Install Poetry(弊端:经常断线,重新执行命令会报错,只能手动pip安装对应的包之后再重复执行命令):
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
source ~/.poetry/env
poetry install
# ==================================================================
# Plan C:
## 2. (option) PyCharm install Poetry Plugin:
https://plugins.jetbrains.com/plugin/14307-poetry

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
└── .tar.gz

文件名称 作用说明
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构建的助手如何响应消息的基本步骤:

步骤如下:

  1. 收到消息并将其传递给解释器,解释器将其转换为包含原始文本,意图和找到的任何实体的字典。这部分由NLU处理。
  2. Tracker是跟踪对话状态的对象。它接收新消息进入的信息。
  3. 策略接收Tracker的当前状态。
  4. 该政策选择接下来采取的行动。
  5. 选择的操作由Tracker记录。
  6. 响应被发送给用户。

消息可以是人类输入的文本,

也可以是按钮按下等结构化输入。

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
2
3
4
5
6
7
8
9
10
11
# Configuration for Rasa NLU.
# https://rasa.com/docs/rasa/nlu/components/
language: en
pipeline: supervised_embeddings

# Configuration for Rasa Core.
# https://rasa.com/docs/rasa/core/policies/
policies:
- name: MemoizationPolicy
- name: KerasPolicy
- name: MappingPolicy

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 打开爱奇艺播放电影。

随着对话系统的热度逐渐上升,研究的重点也逐渐倾向于将两个任务进行联合,以充分利用意图和槽位中的语义关联。那么,问题来了,我们该如何进行联合呢?从目前的趋势来看,大体上有两大类方法:

  1. 多任务学习:按Multi-Task Learning的套路,在学习时最终的loss等于两个任务的loss的weight sum,两者在模型架构上仍然完全独立,或者仅共享特征编码器。
  2. 交互式模型:将模型中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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
version: "2.0"
nlu:
- intent: greet
examples: |
- hey
- hello
- hi
- hello there
- good morning
- good evening
- moin
- hey there
- let's go
- hey dude
- goodmorning
- goodevening
- good afternoon
- yhugy
- intent: goodbye
examples: |
- good afternoon
- cu
- good by
- cee you later
- good night
- bye
- goodbye
- have a nice day
- see you around
- bye bye
- see you later

其中:

标识 说明
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: "2.0"

stories:

- story: happy path
steps:
- intent: greet
- action: utter_greet
- intent: mood_great
- action: utter_happy

- story: sad path 1
steps:
- intent: greet
- action: utter_greet
- intent: mood_unhappy
- action: utter_cheer_up
- action: utter_did_that_help
- intent: affirm
- action: utter_happy

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ession_config:
session_expiration_time: 60
carry_over_slots_to_new_session: true
intents:
- greet
- goodbye
- affirm
- deny
- mood_great
- mood_unhappy
- bot_challenge
responses:
utter_greet:
- text: Hey! How are you?
utter_cheer_up:
- image: https://i.imgur.com/nGF1K8f.jpg
text: 'Here is something to cheer you up:'
utter_did_that_help:
- text: Did that help you?
utter_happy:
- text: Great, carry on!
utter_goodbye:
- text: Bye

这些将通过 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

3、pipeline和baseline是什么?

4、nlp中的实体关系抽取方法总结

5、domain.yaml中intents actions response是怎么对应的

助教答案:

NLP 路线


Reference

1、RASA用户指南

2、基于RASA的task-orient对话系统解析(一)

3、基于RASA的task-orient对话系统解析(二)——对话管理核心模块

4、基于RASA的task-orient对话系统解析(三)——基于rasa的会议室预定对话系统实例

5、Rasa 入坑指南一:初识 Rasa

6、Rasa 入坑指南二:基于 Rasa 构建天气查询机器人

7、Rasa ChatBot

8、NLP学习路线

9、自然语言处理(NLP)的一般处理流程

------ 本文结束------
Donate comment here.

欢迎关注我的其它发布渠道