文章目录

  • 简介
  • Rasa架构
  • 安装环境要求
  • 环境安装
  • python
  • rasa
  • rasa-x
  • rasa构建系统大致流程
  • 命令使用
  • 定制一个极简可运行的中文对话样例
  • nlu
  • stories
  • domain
  • train
  • 关键依赖(出错时,参考)
  • 常用命令


简介

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

  • Rasa NLU :用于理解用户消息,包括意图识别和实体识别,它会把用户的输入转换为结构化的数据。
  • Rasa Core:是一个对话管理平台,用于举行对话和决定下一步做什么。

Rasa X是一个工具,可帮助您构建、改进和部署由Rasa框架提供支持的AI Assistants。 Rasa X包括用户界面和REST API。

官方文档

Rasa架构

ubuntu20 安装 redis 并配置开机自启动 ubuntu安装raspi-config_聊天机器人

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

安装环境要求

Rasa Version     : 2.3.3
Rasa SDK Version : 2.8.1
Rasa X Version   : 0.37.0
Python Version   : 3.6.9
Operating System : Ubuntu-18.04
pip 			 : 21.2.2
numpy			 :1.16.6
pyjwt			 : 2.0.0

环境安装

python

ubuntu18安装步骤略

# 安装python3.7
sudo apt install python3.7
# 查看python版本
python3 -V
# 安装pip3
sudo apt install python3-pip
# 更新pip3
python3 -m pip install -U pip

默认pip源或网络不稳定容易失败,修改为清华大学镜像源

#  如果已经存在pip.conf文件,只需要执行第二步即可
sudo mkdir ~/.pip
sudo vim~/.pip/pip.conf

然后,pip.conf的文件内容如下:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=pypi.tuna.tsinghua.edu.cn
disable-pip-version-check = true
timeout = 6000

rasa

安装rasa, 由于网络问题,延长超时时间,如果仍然超时异常,多执行几次

# 该命令运行时间较长,会安装完所有的依赖
sudo pip --default-timeout=500 install -U rasa==2.3.3
# 生成文件
sudo rasa init --no-prompt

注:如果出现No matching distribution found for tensorflow>=2.1.0异常,可以通过执行pip3 install --upgrade tensorflow rasa命令解决。

初始化

执行rasa init命令的目的为自动生成开发一个Rasa项目所需的所有必要文件,包括执行训练NLU和对话模型。

初始化项目:rasa init
启动Rasa API:rasa run --enable-api
访问http://localhost:5005/ 检验是否启动成功

文件说明

有了这些文件我们便可以不作任何修改就能使Rasa项目跑起来,更重要的是,对于未来一些具体业务来说,也是修改这些文件的内容,这些文件名称及其作用如下表所示:

init.py

空文件

actions.py

可以自定义 actions 的代码文件

config.yml ‘*’

Rasa NLU 和 Rasa Core 的配置文件

credentials.yml

定义和其他服务连接的一些细节,例如rasa api接口

data/nlu.md ‘*’

Rasa NLU 的训练数据

data/stories.md ‘*’

Rasa stories 数据

domain.yml ‘*’

Rasa domain 文件

endpoints.yml

和外部消息服务对接的 endpoins 细则,例如 fb messenger

models/.tar.gz

初始训练的模型数据

测试

sudo rasa shell

ubuntu20 安装 redis 并配置开机自启动 ubuntu安装raspi-config_nlp_02

rasa-x

接下来安装可视化创建客服机器人的工具rasa-x,这里下载比较慢,所以需要用到后备镜像:

pip3 install -i  https://pypi.rasa.com/simple rasa-x==0.37.0 --extra-index-url https://pypi.tuna.tsinghua.edu.cn/simple --use-deprecated=legacy-resolver

其中-i 表示要用后面的链接为首选包下载源,因为rasa-x没有发到pypi里面,所以它本身的包必须从官网上去下载,比较慢

# pyjwt 版本错误时,卸载重装,然后重新执行rasa-x安装命令
sudo pip3 uninstall pyjwt
pip3 install pyjwt==2.0.0

rasa x正常启动后,会生成一个账号/密码的登录信息,这个马上可以用上

ubuntu20 安装 redis 并配置开机自启动 ubuntu安装raspi-config_ubuntu_03

The server is running at http://localhost:5002/login?username=me&password=SGgVp0qLzHua

接着就可以在浏览器访问http://localhost:5002.登录rasa web页面的时候需要输入密码,
就是上面rasa x启动的密码SGgVp0qLzHua,当然这个密码可以改,修改上面密码命令如下:

export RASA_X_PASSWORD="my-secure-password"
rasa x

做到这一步仍然只能本地访问,还没有到真正可以到外网可以访问

为了共享您的机器人,可以使用ngrok执行此操作。ngrok下载和安装请点击这里 ngrok一旦安装好,在命令后运行以下命令:

./sunny clientid 隧道id

然后进行访问

ubuntu20 安装 redis 并配置开机自启动 ubuntu安装raspi-config_nlp_04

rasa构建系统大致流程

  • 编写配置domain.yml文件,配置内容包括:设计的槽位,NLU需要识别的实体列表、意图列表,bot回复用户的模板,配置可在story中直接引用的action,配置自定义的form。
  • 编写配置config.yml文件,配置内容包括:使用的NLU模块类(实体抽取、意图识别等),使用的策略列表。
  • 编写stories.md文件,设计话术流程模板。
  • 开发自定义的NLU模块,根据实际需要添加所需的模块。如添加extractor和classifier模块,分别对应实体抽取和意图识别两个模块,可以结合人工规则和机器学习模型。
  • 开发自定的form action模块,在validate中定义自己的处理逻辑。当然也可以重写action的run方法,在其中添加自己的逻辑。
  • 配置endpoints.yml文件,这个文件是用于配置action服务地址的。因为之前说过action是一个独立于主流程的服务,因此需要配置其服务接口。
  • 配置credentials.yml文件, 将对话系统作为一个独立开放的api服务提供给业务方,而rasa支持将对话系统封装成一个restful_api服务。

命令使用

命令

简介

rasa init

使用示例训练数据,操作和配置文件创建一个新项目。位于空目录下运行即可

rasa train

使用您的NLU数据和故事来训练模型,并将训练后的模型保存在中./models。

rasa interactive

开始一个交互式学习会话,以通过聊天创建新的训练数据。

rasa shell

加载经过训练的模型,并允许您在命令行上与助手交谈。

rasa run

使用训练有素的模型启动Rasa服务器。有关详细信息,请参见配置HTTP API文档。

rasa run actions

使用Rasa SDK启动动作服务器。

rasa visualize

把stories可视化,生成一个html文件,本地可以打开。

rasa test

使用您的测试NLU数据和故事测试经过训练的Rasa模型。

rasa data split nlu

根据指定的百分比对NLU数据进行拆分。

rasa data convert nlu

在不同格式之间转换NLU训练数据。

rasa export

将对话从跟踪商店存储到事件代理。

rasa x

在本地启动RasaX。

rasa -h

显示所有可用命令。

定制一个极简可运行的中文对话样例

nlu

Rasa NLU 是核心模块之一,NLU 是英文 Natural Language Understanding 的简称,也就是自然语言理解,这个模块用于对用户消息内容进行语义理解,并将结果转换成结构化的数据。

在 Rasa 这里,需要提供一份训练数据,Rasa NLU 会基于这份数据进行模型训练,然后通过模型对用户消息进行语义理解,主要是意图识别和槽值提取,我们来看看这份NLU训练数据样例是什么样的:

cat data/nlu.yml 
## intent:greet
- 你好
- 早上好
- 中午好
- 晚上好

## intent:mood_happy
- 很好
- 不错
- 我很好


## intent:mood_unhappy
- 很难过
- 糟糕极了

其中以 ## 开头的行就是用户定义的 intents(意图),下面是一组有相同意图的消息内容。
Rasa NLU 的工作就是当用户发送新的消息内容时正确预测该消息的意图,给AI小助手使用,从而做出准确的呼应。

stories

stories里面设计了对话场景:用户问好 -> 机器问用户今天过得怎么样 -> 用户反馈情绪 -> 机器根据不同的情绪进行回复,这里包含两个流程,一个正面情绪的流程与一个负面情绪的流程,因此也需要编写两个story,所以stories数据如下:

cat data/stories.md 
## story_happy
* greet
  - utter_greet
* mood_happy
  - utter_happy

## story_unhappy
* greet
  - utter_greet
* mood_unhappy
  - utter_unhappy

domain

domain 包含了整个对话场景下的意图,动作,以及对应动作所反馈的内容模板:

cat domain.yml                                  
intents:
  - greet
  - mood_happy
  - mood_unhappy

actions:
  - utter_greet
  - utter_happy
  - utter_unhappy

templates:
  utter_greet:
  - text: "你好,今天过得如何"

  utter_happy:
  - text: "那很不错"

  utter_unhappy:
  - text: "发生了什么事,可以说给我吗?"

train

现在可以用命令"rasa train"训练模型了,训练完毕后,模型文件会存储在models目录下。

可通过 "rasa shell nlu"命令看一下 nlu 输出的结构化数据:

NLU model loaded. Type a message and press enter to parse it.
Next message:
你好
{
  "intent": {
    "name": "greet",
    "confidence": 0.9552139043807983
  },
  "entities": [],
  "intent_ranking": [
    {
      "name": "greet",
      "confidence": 0.9552139043807983
    },
    {
      "name": "mood_unhappy",
      "confidence": 0.09797228127717972
    },
    {
      "name": "mood_happy",
      "confidence": 0.0
    }
  ],
  "text": "你好"
}
Next message:
糟糕极了
{
  "intent": {
    "name": "mood_unhappy",
    "confidence": 0.9557749032974243
  },
  "entities": [],
  "intent_ranking": [
    {
      "name": "mood_unhappy",
      "confidence": 0.9557749032974243
    },
    {
      "name": "mood_happy",
      "confidence": 0.1225115954875946
    },
    {
      "name": "greet",
      "confidence": 0.0
    }
  ],
  "text": "糟糕极了"
}
Next message:
感觉不好
{
  "intent": {
    "name": null,
    "confidence": 0.0
  },
  "entities": [],
  "intent_ranking": [],
  "text": "感觉不好"
}

通过最后一个case可以看出,这个例子由于对中文没有做任何相关的预处理,另外数据量非常少,所以模型除了可以记住nlu里已有的数据外,对于新信息处理的能力几乎为零。

所以在接下来 rasa shell 对话中,我们只能用固定的case进行测试。

关键依赖(出错时,参考)

numpy==1.16.6
rasa==2.3.3
rasa-sdk==2.8.1
rasa-x==0.37.0
scipy==1.5.4
tensorflow==2.3.3
tensorflow-addons==0.12.0
tensorflow-estimator==2.3.0
tensorflow-hub==0.10.0
tensorflow-probability==0.11.1
tensorflow-text==2.3.0

常用命令

查看5005端口是否被占用 netstat -aon | findstr 5005
启动Rasa API服务(跨域)rasa run --enable-api --cors "*"
启动Rasa API服务(保存日志)rasa run --enable-api --log-file out.log
启动Rasa API服务(指定模型)rasa run --enable-api -m models
启动Rasa API服务(指定token)rasa run --enable-api --auth-token 12345678