Rasa安装以及项目初尝试

  • Rasa简介
  • Rasa安装
    • Windows系统下的环境要求
    • NLU 管道依赖项
      • 首选spaCy
      • 第二个选择:MITIE
  • Rasa教程
    • 1.创建新的项目
    • 2.构建NLU样本
    • 3.构建Core样本
    • 4.定义域
    • 5.定义你的模型配置
    • 6.训练NLU和CORE模型
    • 7.配置Http和Action
    • 8.和你的助手谈谈
    • 9.启动web服务
  • Rasa命令备忘单
  • Rasa架构

Rasa简介

Rasa是一个开源机器学习框架,用于构建上下文AI助手和聊天机器人。Rasa Open Source有两个主要模块:

  • NLU:实现意图识别槽值提取,它把用户的输入转换为结构化数据;
  • Core:是一个对话管理平台,用于预测、决定下一步做什么;

Rasa X是一个工具,可帮助您构建、改进和部署由Rasa框架提供支持的AI Assistants

Rasa安装

  • 创建环境
1
$ conda create -n rasa python=3.6
  • 激活环境
1
$conda activate rasa
  • Rasa 的推荐安装方式是通过pip:
1
pip --default-timeout=500 --extra-index-url https://pypi.rasa.com/simple install -U rasa-x

这将同时安装Rasa和Rasa X。如果你不想使用Rasa X,只需要运行pip --default-timeout=500 install -U rasa

在安装的过程中有可能会出现超时中断,可以尝试多执行几次上面的命令

Windows系统下的环境要求

确保安装了Microsoft vc++编译器,这样python就可以编译任何依赖项。你可以从Visual Studio获得编译器。下载安装程序并在列表中选择vc++构建工具。

VS 2017社区版(Community)下载地址:

在单个XX中,需要勾选“用于 CMake 的 Visual C++ 工具”。安装完毕后,将如下路径添加到环境变量PATH中,再重启电脑使之生效;

1
2
3
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin

NLU 管道依赖项

Rasa NLU有用于识别意图和实体的不同组件,其中大多数都有一些额外的依赖项。

当你训练NLU模型时,Rasa将检查是否安装了所有必需的依赖项,并告诉你缺少哪一个依赖项。选择管道的页面将帮助你选择要使用的管道。

首选spaCy

你可以用以下命令安装:

1
2
pip install rasa[spacy]==2.1.2
python -m spacy download zh_core_web_md

若要使用spacy 中文模型,需要通过代理下载并安装:

  • spacy 中文模型下载地址

  • spacy 中文模型安装
    (模型版本2.3.1支持spacy>=2.3.0,<2.4.0):

    1
    pip install zh_core_web_md-2.3.1.tar.gz
    1
    pip install https://github.com/explosion/spacy-models/releases/download/zh_core_web_md-2.3.1/zh_core_web_md-2.3.1.tar.gz

第二个选择:MITIE

MITIE后端对于小型数据集执行得很好,但是如果你有数百个示例,那么训练可能会花费很长时间。我们可能会在未来弃用MITIE后端。

下载MITIE源码和中文词向量模型total_word_feature_extractor_zh.dat(密码:p4vx),这里需要将该模型拷贝到创建的python项目data目录下(可任意位置),后面训练NLU模型时用到;

Mitie源码安装:

1
2
python setup.py build
python setup.py install

验证

待安装完毕后,使用如下命令查看详情

1
pip show rasa

Rasa项目初尝试

1.创建新的项目

第一步是创建一个新的Rasa项目。要做到这一点,运行下面的代码:

1
rasa init --no-prompt

rasa init命令创建rasa项目所需的所有文件,并根据一些示例数据训练一个简单的机器人。如果你省略了——no-prompt参数,将会询问你一些关于项目设置的问题。这将创建以下文件:

1
2
3
4
5
6
7
8
9
10
11
12
.
├── __init__.py
├── actions.py
├── config.yml
├── credentials.yml
├── data
│ ├── nlu.md
│ └── stories.md
├── domain.yml
├── endpoints.yml
└── models
└── <timestamp>.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 你的初始模型

最重要的文件用“*”标记。你将在本教程中了解所有这些文件。

2.构建NLU样本

Rasa助手的第一个部分是NLU模型。NLU代表自然语言理解,这意味着将用户消息转换为结构化数据。要使用Rasa做到这一点,你需要提供一些训练示例,展示Rasa应该如何理解用户消息,然后通过展示的这些示例来训练模型。

查看并添加NLU模型的训练样本数据(即intent):data/nlu.md。以添加【点外卖】为例:

  • 确定 意图 名称:request_takeway;
  • 确定需要的 槽位:refreshments、tea、address、phone_number;
  • 确定 用户 query;
  • 确定 当 某个 槽位 为空时,Bot 通过回复 什么获取 对应 槽位值
1
2
3
4
5
6
7
8
9
10
11
- intent: request_takeway
examples: |
- 点份外卖
- 点一份[肠粉](refreshments),一杯[茉莉花茶](tea),送到[南山区](address),电话号码为[13025240602](phone_number)
- 麻烦送一份[蛋糕](refreshments)到[南山区](address)
- ...

- intent: request_weather
examples: |
- 天气
- 查询天气

Rasa的工作是预测用户向助手发送新消息时的正确意图。你可以在训练数据格式中找到数据格式的所有细节。

3.构建Core样本

在这个阶段,你将教会你的助手如何回复你的信息。这称为对话管理(dialogue management),由你的Core模型来处理。

Core模型以训练“故事”的形式从真实的会话数据中学习。故事是用户和助手之间的真实对话。

在 NLU 识别出 query 的意图和槽位之后,需要确定其所触发的对应事件!

下面是一个简单对话的例子 stories.md

1
2
3
4
5
6
stories:

- story: greet
steps:
- intent: greet
- action: utter_greet

4.定义域

领域文件:domain.yml

域相当于AI助手的大脑,定义了助手所处的环境:它应该期望得到什么用户输入、它应该能够预测什么操作、如何响应以及存储什么信息。

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
intents:
- greet
- request_weather

slots:
date-time:
type: unfeaturized
address:
type: unfeaturized

entities:
- date-time
- address

actions:
- utter_greet
- action_default_fallback

forms:
- weather_form

responses:
utter_greet:
- text: "Hey! How are you?"
- text: "您好!请问我可以帮到您吗?"
- text: "您好!很高兴为您服务。请说出您要查询的功能?"

session_config:
session_expiration_time: 60
carry_over_slots_to_new_session: true
解释说明
intents 你希望用户说的话
actions 你的助手能做的和能说的
templates 你的助手可以说的东西的模板字符串
  • Rasa Core 工作机制:

    在对话的每个步骤中选择正确的操作来执行。在本例中,我们的操作只是向用户发送一条消息。这些简单的话语操作是从域中以utter_开头的操作。助手将根据templates部分中的模板返回一条消息。

5.定义你的模型配置

配置文件:config.yml

配置文件定义了模型将使用的NLU和Core组件。你可以在这里了解不同的NLU管道。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
language: "zh"

pipeline:
- name: "MitieNLP"
model: "data/total_word_feature_extractor_zh.dat"
- name: "JiebaTokenizer"
dictionary_path: "data/dict"
- name: "MitieEntityExtractor"
- name: "EntitySynonymMapper"
- name: "RegexFeaturizer"
- name: "MitieFeaturizer"
- name: "SklearnIntentClassifier"

policies:
- name: TEDPolicy
epochs: 100
max_history: 5
- name: FallbackPolicy
fallback_action_name: 'action_default_fallback'
- name: MemoizationPolicy
max_history: 5
- name: FormPolicy

languagepipeline键指定应该如何构建NLU模型。policies键定义Core模型将使用的策略。

6.训练NLU和CORE模型

每当我们添加新的NLU或Core数据,或更新域或配置时,我们都需要根据示例故事和NLU数据重新训练一个神经网络。为此,运行下面的命令。该命令将调用Rasa Core和NLU训练函数,并将训练后的模型存储到models/目录中。该命令只会在数据或配置发生更改时自动对不同的模型部件进行重新训练。

1
2
训练模型:rasa train
数据增强:rasa train --augmentation 20
1
python -m rasa train --config configs/config.yml --domain configs/domain.yml --data data/

7.配置Http和Action

要在生产中运行AI助手,请在credentials.yml中配置所需的消息和语音通道

当我们需要通过Http的形式访问Rasa Server时,就需要在该文件中配置rest:。rest通道将为您提供一个rest端点(即Rasa Server),用于向其发送消息,响应该请求将发送回bots消息。根据这个文档的说明,当我们请求Rasa Server的URL应为:

1
http://rasaServerIP:rasaServerPort/webhooks/rest/webhook

如果希望rasa server(注:指rasa core)能够连接到其他web,我们可以再endpoints.yml这个文件中进行配置,比如为了实现custom action,我们就需要在该文件中对action server进行配置,又比如我们将nlu模块放到其他的web项目中,就需要在该文件中配置nlu server等等。endpoints.yml文件内容如下:

1
2
3
4
5
6
7
8
# 指定action server的url
# 当然,也可以将action server单独实现在一个web server项目中
# 那么这个url为"https://yourWebIp:yourWebPort/webhook“
action_endpoint:
url: "http://localhost:5055/webhook"

# 配置nlu(单独创建一个web项目):
# url: "http://10.0.0.153:5000/"

当Rasa NLU识别到用户输入Message的意图后,Rasa Core对话管理模块就会对其作出回应,而完成这个回应的模块就是action。

8.和你的助手谈谈

恭喜你! 🚀 你刚刚建立了一个完全由机器学习驱动的助手。 下一步就是尝试一下!

运行以下命令在本地终端与助手对话:

1
2
rasa shell
rasa interactive

你也可以用Rasa X来收集更多的对话以提高你的助手: 尝试安装Rasa X

1
2
3
4
# 仅支持和兼容ujson 1.35, 下载ujson 1.35的wheel文件
pip install ujson-1.35-cp37-cp37m-win_amd64.whl
#
pip install rasa-x --extra-index-url https://pypi.rasa.com/simple

https://forum.rasa.com/t/error-failed-building-wheel-for-ujson-while-installing-rasa-x-using-pip/31377/4

9.启动web服务

(1)启动Rasa服务

1
2
3
4
# 启动rasa服务
# 该服务实现自然语言理解(NLU)和对话管理(Core)功能
# 注:该服务的--port默认为5005,如果使用默认则可以省略
python -m rasa run --port 5005 --endpoints configs/endpoints.yml --credentials configs/credentials.yml --debug

(2)启动Custom Action服务

1
2
3
4
5
6
# Then start action manager
rasa run actions

# 启动action服务
# 注:该服务的--port默认为5055,如果使用默认则可以省略
Python -m rasa run actions --port 5055 --actions actions --debug

(3)创建、启动server.py

1
uvicorn api.main:app --reload --port 8089

(4)效果演示

Rasa ServerAction ServerServer.py运行后,在浏览器输入测试:

1
http://127.0.0.1:8088/ai?content=你好

Rasa命令行 备忘单

命令行界面(CLI)为你提供易于记忆的常见任务命令。

命令 作用说明
rasa init 使用示例训练数据,操作和配置文件创建新项目
rasa train 使用你的NLU数据和故事训练模型,在./model中保存训练的模型
rasa interactive 启动交互式学习会话,通过聊天创建新的训练数据
rasa shell 加载已训练的模型,并让你在命令行上与助手交谈
rasa run 使用已训练的的模型启动Rasa服务。有关详细信息,请参阅运行服务文档
rasa run actions 使用Rasa SDK启动操作服务
rasa visualize 可视化故事
rasa data validate 验证域文件,NLU数据或故事数据中是否存在任何错误
rasa test 使用你的测试NLU数据和故事测试已训练的Rasa模型
rasa data split nlu 根据指定的百分比执行NLU数据的拆分
rasa data convert nlu 在不同格式之间转换NLU训练数据
rasa x 在本地启动Rasa X
rasa -h 显示所有可用命令

具体介绍,可以查看 Rasa 命令行界面

Rasa架构

此图显示了使用Rasa构建的助手如何响应消息的基本步骤:

在这里插入图片描述

  1. 用户输入Message,送入Rasa NLU
  2. NLU识别Message中的”意图(intent)“和提取所有”实体”(entity)数据
  3. Tracker用于跟踪对话状态,输出Embedding
    用户意图的Embedding
    上一步系统动作的Embedding
    实体的Embedding
  4. Policy记录Tracker对象的当前状态,并选择执行相应的action
  5. Tracker记录系统行为action,下一次提供给Policy使用
  6. 返回消息给用户

在Docker上运行Rasa

http://rasachatbot.com/9_Running_Rasa_with_Docker/

参考

Rasa中文聊天机器人开发指南

https://jiangdg.blog.csdn.net/article/details/104328946

RASA中文聊天机器人Github地址:ChitChatAssistant

Rasa 聊天机器人中文官方文档|磐创AI


Rasa安装以及项目初尝试
http://example.com/2020/12/14/2020-12-14-Rasa安装以及项目初尝试/
作者
NSX
发布于
2020年12月14日
许可协议