事先说明:本系列Rasa教程基于Rasa 1.6.1版本。
Rasa是一个开源机器学习框架,可用于构建具有上下文理解能力的AI助手(assistant)。
Rasa有两个主要模块:
Rasa X 是一个用以改进Rasa构建的上下文助理的工具,包括用户界面和 REST API。
rasa 安装:
pip install rasa
如果想要同时安装rasa 和 rasa x:
pip install rasa-x --extra-index-url https://pypi.rasa.com/simple
在当前目录创建Rasa project:
rasa init
如果使用如下命令:
rasa init --no-prompt
该命令创建Rasa项目需要的文件,以及训练一个简单对话机器人需要的数据。如果命令不使用--no-prompt
标识,那么在创建过程中需要回答几个关于项目创建的问题。
使用rasa init --no-prompt
创建项目后目录下的文件:
创建的文件如下,其中*
标记的为最重要的部分:
Rasa的NLU(即自然语言理解)模块,用来将用户消息转换成结构数据。在Rasa中,可以通过提供训练示例,告诉Rasa如何理解用户消息,然后训练获得模型。可以看一下上述初始化的项目下的nlu.md
文件内容:
## 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
## intent:bot_challenge
- are you a bot?
- are you a human?
- am I talking to a bot?
- am I talking to a human?
其中以**##**开始的行定义了意图(intents),是具有相同含义消息的集合。Rasa中NLU模块的任务是,预测用户输入的消息的正确意图。具体数据格式可以参见NLU Training Data Format。
config.yml
配置文件将会在NLU和Core中用到。上述项目中的config.ml文件的内容为:
# 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
在上述例子中,NLU模型会使用supervised_embeddings
流水线。不同NUL模型的流水线可以在这里查看。
其中language
和pipeline
这两个关键词,用来定义NLU模型应该如何构建。policies
关键词定义核心模型中使用到的policies,更多关于policies的可以查看这里。
在这个阶段,通过Stories将教Rasa assistant 如何响应用户的消息,这个叫做对话管理,由于Core model所决定。
Core model以训练"stories"的形式从真实对话中进行学习。一个story是用户和assistant之间的真实的一次对话。带有意图和实体的行反应了用户的输入和assistant将响应的action名。上述项目的stories.md
内容如下:
## 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
## bot challenge
* bot_challenge
- utter_iamabot
用户说hello 时候,意图分类为greet
,assistant 根据utter_greet
进行回复。以-
为起始的句子表示 assistant 所做出的 action。本系列教程中所有的actions都是发送给用户的,比如utter_greet
。需要注意的是,一个action是可以做任务事情的,包括调用 API 或者与外部世界进行交互。更多关于Stories的具体格式可以参考这里。
下一个事情需要处理的是定义一个领域(Domain)。Domain定义了 assistant 所处的世界:期望从用户那边获取什么输入,assistant 能够预测什么行为,如何做出响应,存储什么消息。domain 相关的内容存储在domain.yml
文件中。上述上面的domain.yml
内容如下:
intents:
- greet
- goodbye
- affirm
- deny
- mood_great
- mood_unhappy
- bot_challenge
actions:
- utter_greet
- utter_cheer_up
- utter_did_that_help
- utter_happy
- utter_goodbye
- utter_iamabot
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"
utter_iamabot:
- text: "I am a bot, powered by Rasa."
session_config:
session_expiration_time: 60
carry_over_slots_to_new_session: true
其中intents
:定义了期望用户的输入,即意图分类的详情;
actions:定义了 assistant 能够说什么和做什么;
templates:定义了 assistant 相应的消息模板。
这些是如何一起协调工作的呢?Rasa核心的任务是针对每个对话选择合正确的响应。在这个例子中,我们的响应是简单的发送消息给用户,这里面的响应都用utter_
开头。assistant 根据模板进行响应。可以参见 Custom Actions 创建更复杂的响应。
一旦添加了新的NLU或Core数据,或更新 domain 或配置文件的时候,就需要重新训练模型。执行下面的命令rasa train
。这个命令会调用Rasa Core 和NLU的训练函数,并将训练得到的模型存储到models/目录下面。这个命令会自动重新训练更新的部分。
到目前为止就建立了一个基于机器学习的对话助手。下一步通过执行下面的命令和assistant进行对话:
rasa shell