我要使用这个框架搭建一个AI Assistant or Chatbot,且语义库和行为库都是高度可维护的

以下参考RASA官方文档

一.环境搭建

1.安装Python

截至目前为止{2020-01-20】,Rasa支持Python 3.6/3.7(第一次安装python的话去官网下载的往往是最新版,需注意不要超过了Rasa官方要求)

2.创建虚拟环境(强烈建议)

python3 -m venv --system-site-packages ./venv

  启用环境

.\venv\Scripts\activate

3.安装Rasa

首先确保pip版本最新

 pip install -U pip

 

pip install rasa

  二,创建测试项目

1.创建,如果想自动配置可增加--no-prompt在命令后面

rasa init

根据提示信息分配项目路径,对机器人进行初始训练

创建结束后,可使用命令行与机器人进行简单对话测试

创建命令会在项目目录中创建以下文件

__init__.py an empty file that helps python find your actions
actions.py 自定义采用行为
config.yml ‘*’ NLU及核心模型的配置文件
credentials.yml details for connecting to other services
data/nlu.md ‘*’ NLU训练数据
data/stories.md ‘*’ 故事模型
domain.yml ‘*’ 作用域配置文件
endpoints.yml details for connecting to channels like fb messenger
models/<timestamp>.tar.gz your initial model

2.NLU数据

NLU(Natural Language Understanding):用于将用户信息转化为计算机能够识别的结构化数据,为了让AI更加智能化,我们需要提供各训练种样本来让它知道如何理解用户信息

 查看NLU数据:

cat data/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

##开头的行用于定义一组信息的自然意图(intents)

3.定义模型配置

配置文件用于定义NLU及模型要使用到的核心组件

查看配置:

cat config.yml
# 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

languagepipline键表明了创建NLU模型的规则,policies 键定义了核心模型的使用规则

4.创建一个训练故事(Story)

这里可以学习到如何相应用户信息,也就是会话管理(dialogue management),这是由核心模型来处理的

核心模型通过以训练故事的方式提供的真实对话数据进行学习.一则训练故事相当于一组用户与聊天机器人的对话

下面是一个简单对话的例子,用户说你好,机器人回复你好。将这组对话转换为训练故事如下:

## story1
* greet
   - utter_greet

##行指定故事名称

*行是根据用户信息得到的自然意图

-行是机器人根据自然意图分析得出的采用行为

在这个示例里面,采用行为即是回复用户utter_greet类信息,但通常采用行为可以做任何事情,如通过调用API访问与其他系统进行联动

查看故事模板:

cat data/stories.md

5.定义作用域

作用域定义了助手存在于哪一个宇宙:可能受到什么样的用户输入,应该预测什么样得采用行为,如何进行响应以及应该存储什么样的信息.

作用域配置存放在domain.yml中

cat domain.yml
intents 预期用户意图
actions 可采用行为
templates 行为对应的回复模板信息

6.训练模型

当我们想增加新的NLU或核心数据,或更新作用域和配置时,我们需要通过训练故事样本及NLU数据重新训练神经网络。运行下面的命令,将会调用Rasa核心及NLU训练函数,并将训练后的模型保存在models/目录.

该命令进针对模型中变化的数据或配置进行自动训练。

rasa train

7.与机器人聊天

rasa shell

三.Rasa_NLU

Rasa NLU曾经是一个独立的库,但它现在是Rasa框架的一部分。

Rasa_NLU是一个开源的、可本地部署并配套有语料标注工具RASA NLU Trainer。其本身可支持任何语言,中文因其特殊性需要加入特定的tokenizer作为整个流程的一部分。

Rasa NLU 用于聊天机器人中的意图识别实体提取。例如,下面句子:

"I am looking for a Mexican restaurant in the center of town"

返回结构化数据:

{
  "intent": "search_restaurant",
  "entities": {
    "cuisine" : "Mexican",
    "location" : "center"
  }
}

Rasa_NLU_Chi 作为 Rasa_NLU 的一个 fork 版本,加入了jieba 作为中文的 tokenizer,实现了中文支持。

该部分简单介绍基于 Rasa_NLU_Chi 构建一个本地部署的特定领域的中文 NLU 系统的过程。

1.Pipeline

Rasa NLU 支持不同的 Pipeline,其后端实现可支持spaCy、MITIE、MITIE + sklearn 以及 tensorflow,其中 spaCy 是官方推荐的,另外值得注意的是从 0.12 版本后,MITIE 就被列入 Deprecated 了。
本例使用的 pipeline 为 MITIE+Jieba+sklearn, Rasa NLU 的配置文件为 config_jieba_mitie_sklearn.yml如下:

language: "zh"

pipeline:
  - name: "MitieNLP"
    model: "data/total_word_feature_extractor_zh.dat" #加载 mitie 模型
  - name: "JiebaTokenizer" #使用 jieba 进行分词
  - name: "MitieEntityExtractor" #mitie 的命名实体识别
  - name: "EntitySynonymMapper"
  - name: "RegexFeaturizer"
  - name: "MitieFeaturizer" #特征提取
  - name: "SklearnIntentClassifier" #sklearn 的意图分类模型
policies:
  - name: MemoizationPolicy
  - name: KerasPolicy
  - name: MappingPolicy

2. 准备工作:训练MITIE模型文件

a.安装cmake

下载官网:https://cmake.org/download/
解压后把bin目录配置到path的环境变量中。
例如:F:\mitie_about\cmake-3.12.2-win64-x64\bin

b.安装boost

下载官网:https://www.boost.org/

解压好以后。打开cmd窗口。cd到boost解压以后的文件夹目录下 。或者直接按住shift,鼠标右键。里面有一个在此处打开cmd或者在此处打开power shell 窗口。总之名字可能因为windows版本而不太一样。但最终目的都是在该路径下打开cmd窗口。然后在里面输入.\bootstrap.bat ,运行这个文件。
等几分钟。安装好之后。再输入.\b2 --prefix=F:\boost\bin install
然后把这个目录增加到系统的环境变量中
如F:\boost\bin\bin

c.安装mitie

$  git clone https://github.com/mit-nlp/MITIE.git
$ cd MITIE
$ python setup.py build
$ python setup.py install

d.安装jieba

$ pip install jieba

e.安装Rasa_NLU_Chi

$ git clone https://github.com/crownpku/Rasa_NLU_Chi.git // clone 源码
$ cd Rasa_NLU_Chi
$ python setup.py install  // 安装依赖

f.配置MITIE模型

由于在pipeline中使用了MITIE,所以需要一个训练好的MITIE模型(先进行中文分词)。MITIE模型是非监督训练得到的,类似于word2vec中的word embedding,需要大量中文语料,训练该模型对内存要求较高,并且非常耗时,直接使用网友分享的中文的维基百科和百度百科语料生成的模型文件。
实际应用中,如果做某个特定领域的 NLU 并收集了很多该领域的语料,可以自己去训练 MITIE 模型,具体训练方法可以参考MITIE - Github
下载后将文件放在项目目录,并将路径填写在上文中配置文件的model行。

3. rasa_nlu 语料

得到MITIE词向量模型之后,就可以使用标注好语料训练Rasa NLU模型。
Rasa提供了数据标注平台: rasa-nlu-trainer

那标注好的数据是什么样的呢?

标注好的语料存储在json文件中,具体格式如下所示,包含textintententities,实体中startend是实体对应在text中的起止index

data/examples/rasa/demo-rasa_zh.json为例:

{
  "rasa_nlu_data": {
    "common_examples": [
      {
        "text": "你好",
        "intent": "greet",
        "entities": []
      },
      {
        "text": "我想找地方吃饭",
        "intent": "restaurant_search",
        "entities": []
      },
      {
        "text": "我想吃火锅啊",
        "intent": "restaurant_search",
        "entities": [
          {
            "start": 2,
            "end": 5,
            "value": "火锅",
            "entity": "food"
          }
        ]
      }
    ]
  }
} 

4. 训练模型

 到目前,已经获取了训练所需的标注好的语料,以及词向量模型MITIE文件。接下来就可以训练Rasa_NLU模型了

模型训练命令

rasa train nlu -c config_jieba_mitie_sklearn.yml --nlu demo-rasa_zh.json --out models/chi

所需参数:

  • 训练配置文件:-c
  • 训练语料:-u
  • 模型保存路径:--out

模型训练完成后,会在--out指定的路径下保存训练好的模型文件

 5.测试分词,实体提取与意图预测

启动服务

$ rasa run nlu -m models\chi\

-m 指定服务使用的模型

 输入一句话:

  • intent:预测到的意图
  • entity:提取出的实体
  • intent_ranking:预测到的所有意图的概率排行

 以上三部分内容会随着训练与样本的增加变得越来越准确和丰富