文章目录
- 简介
- 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架构
- 收到消息并将其传递给解释器(Interpreter),解释器将其转换为包含原始文本,意图和找到的任何实体的字典。这部分由NLU处理。
- 跟踪器(Tracker)是跟踪对话状态的对象。它接收新消息进入的信息。 策略(Policy)接收跟踪器的当前状态。
- 该策略选择接下来采取的操作(action)。
- 选择的操作由跟踪器记录。
- 响应被发送给用户。
安装环境要求
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
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正常启动后,会生成一个账号/密码的登录信息,这个马上可以用上
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
然后进行访问
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