对话系统Rasa-入门教程 [翻译]

基本流程

  1. 安装rasa
  2. 创建新项目
  3. 查看NLU(自然语言理解)训练数据
  4. 定义模型的配置
  5. 写第一个stories(一个story,指的是用户和机器的一次对话)
  6. 定义领域
  7. 训练模型
  8. 与助手进行对话

1. 安装rasa

pip install rasa-x --extra-index-url https://pypi.rasa.com/simple

2. 创建新项目

rasa init --on-prompt

该命令对应的输出如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Welcome to Rasa! 🤖

To get started quickly, an initial project will be created.
If you need some help, check out the documentation at https://rasa.com/docs/rasa.

Created project directory at '/home/jovyan'.
Finished creating project structure.
Training an initial model...
Training Core model...
Core model training completed.
Training NLU model...
NLU model training completed.
Your Rasa model is trained and saved at '/home/jovyan/models/20190917-070346.tar.gz'.
If you want to speak to the assistant, run 'rasa shell' at any time inside the project directory.

该命令创建Rasa项目需要的文件,以及训练一个简单对话机器人需要的数据。如果命令不使用--no-prompt标识,那么在创建过程中需要回答几个关于项目创建的问题。

创建的文件如下,其中*标记的为最重要的部分:

  • __init__.py,用来帮助Python找到action的空文件
  • actions.py,用来自定义actions的文件
  • config.yml *,NLU和核心模型的配置文件
  • credentials.yml,用来连接到其他服务
  • data/nlu.md *,用于NLU训练的数据
  • data/stories.md *,故事集
  • domain.yml *,助手领域(assistant's domain)
  • endpoints.yml,连接到类似于fb的通信对象的详细配置
  • models/<timestamp>.tar.gz,初始化模型

3. 查看NLU(自然语言理解)训练数据

Rasa助手的第一块内容是NLU模型。NLU是自然语言理解,用来将用户消息转换成结构数据。在Rasa中,可以通过提供训练示例,告诉Rasa如何理解用户消息,然后训练获得模型。可以看一下nlu.md的文件内容:

 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
## intent:greet
- hey
- hello
- hi
- good morning
- good evening
- hey there

## intent:goodbye
- bye
- goodbye
- see you around
- see you later

## intent:affirm
- yes
- indeed
- of course
- that sounds good
- correct

## intent:deny
- no
- never
- I don't think so
- don't like that
- no way
- not really

## intent:mood_great
- perfect
- very good
- great
- amazing
- wonderful
- I am feeling very good
- I am great
- I'm good

## intent:mood_unhappy
- sad
- very sad
- unhappy
- bad
- very bad
- awful
- terrible
- not very good
- extremely sad
- so sad

##开始的行定义了你的意图,是具有相同含义消息的集合。Rasa的任务是,预测用户输入的消息的正确意图。具体数据格式可以参见: Training Data Format

4. 定义模型的配置

该配置文件,你的模型将会使用到的NLU和核心部分。这个例子中,NLU模型会使用supervised_embeddings流水线。不同NUL模型的流水线可以在这里查看。config.ml文件的内容为:

 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

其中language和pipeline两个关键词,用来定义NLU模型应该如何构建。policies关键词定义核心模型中使用到的policies

5. 写第一个stories

在这个阶段,你将教助手如何响应你的消息。这个叫做对话管理,受你的核心模型处理。

核心模块以训练stories的形式从真实的对话中进行学习。一个story是用户和助手之间真实的一次对话。意图和实体的行反应了用户的输入和助手将响应的行为名。

下面是一个简单的对话。用户说hello,助手回复hello。如下:

1
2
3
## story1
* greet
	- utter_greet

关于story的详细介绍可以参见:Stories.

-开头的行表示助手采取的措施。在这个教程中,所有消息的响应都是发给用户的,如utter_greet,但是通常情况下,一个响应行为可以处理任何事情,包括调用API,以及和外面的世界的交互。下面给出了data/stories.md中的内容。

 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
## happy path
* greet
  - utter_greet
* mood_great
  - utter_happy

## sad path 1
* greet
  - utter_greet
* mood_unhappy
  - utter_cheer_up
  - utter_did_that_help
* affirm
  - utter_happy

## sad path 2
* greet
  - utter_greet
* mood_unhappy
  - utter_cheer_up
  - utter_did_that_help
* deny
  - utter_goodbye

## say goodbye
* goodbye
  - utter_goodbye

6. 定义领域

下一个事情需要处理的是定义一个领域( 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
24
25
26
27
28
29
30
31
intents:
  - greet
  - goodbye
  - affirm
  - deny
  - mood_great
  - mood_unhappy

actions:
- utter_greet
- utter_cheer_up
- utter_did_that_help
- utter_happy
- utter_goodbye

templates:
  utter_greet:
  - text: "Hey! How are you?"

  utter_cheer_up:
  - text: "Here is something to cheer you up:"
    image: "https://i.imgur.com/nGF1K8f.jpg"

  utter_did_that_help:
  - text: "Did that help you?"

  utter_happy:
  - text: "Great carry on!"

  utter_goodbye:
  - text: "Bye"

intents,定义了期望用户的输入;actions:定义了助手能够说什么做什么;templates:定义了助手相应的消息模板。

这些是怎么一起协调工作的呢?Rasa核心的任务是针对每个对话选择合正确的响应。在这个例子中,我们的响应是简单的发送消息给用户,这里面的响应都用utter_开头。助手根据模板进行响应。可以参见 Custom Actions 创建更复杂的响应。

7. 训练模型

一旦我们添加了新的NLU或核心数据,或更新领域或配置文件的时候,我们需要重新训练模型。执行下面的命令rasa train。这个命令会调用Rasa核心和NLU训练函数,并将训练得到的模型存储到models/目录下面。这个命令会自动重新训练更新的部分。

8. 与助手进行对话

恭喜,到目前为止你建立了一个基于机器学习的对话助手。

下一步通过执行下面的命令和助手进行对话:rasa shell

原文链接

https://rasa.com/docs/rasa/user-guide/rasa-tutorial/