基于docker实现rasa容器化部署

基础环境搭建

1、拉取python:3.9-slim 镜像

docker pull python:3.9-slim

2、配置docker容器的网络环境

# 首先查看、创建一个网络 rasa-network 
docker network ls
docker network create rasa-network
#将容器加入网络当中
方法一:
docker network connect rasa-netwrk 容器名称
方法二:启动容器的时候加入:(本文选择此种方法)
docker run -itd --network rasa-network 容器名称
# 在外面查看各个容器的IP地址
docker network inspect rasa-network

3、创建rasa容器

# 设置容器名称、网络桥接、端口号、镜像名称
docker run -id --name=rasa-test --network rasa-network -p 5005:5005 python:3.9-slim
# 进入容器
docker exec -it rasa-test /bin/bash

4、将容器的源更改为官方源(阿里源)

# 更新apt
apt-get update
# 下载gnupg
apt-get install gnupg1
# 设置公钥,否则无法使用阿里源
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
# 原文件备份
cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 更改为阿里源并更新apt-get
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse">/etc/apt/sources.list

5、更新apt

apt-get clean && apt-get update

5、将pip源更改为国内源(清华源)

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

安装rasa

1、安装rasa

安装最新版:
pip install rasa
也可在安装时指定版本号:
pip install rasa==3.4.0

2、rasa相关命令介绍,rasa的官方文档:https://rasa.com/docs/rasa/

  • rasa init:创建一个新的项目,包含示例训练数据,actions和配置文件。
  • rasa train:使用NLU数据和stories训练模型,模型保存在./models中。
  • rasa test:使用测试NLU数据和stories来测试Rasa模型。
  • rasa shell:通过命令行的方式加载训练模型,然后同聊天机器人进行对话。
  • rasa run:使用训练模型开启一个Rasa服务。
  • rasa run actions:使用Rasa SDK开启action服务器。
  • rasa interactive:开启一个交互式的学习会话,通过会话的方式,为Rasa模型创建一个新的训练数据。
  • telemetry:Configuration of Rasa Open Source telemetry reporting.
  • rasa visualize:可视化stories。
  • rasa data:训练数据的工具。
  • rasa export:通过一个event broker导出会话。
  • rasa evaluate:评估模型的工具。
  • rasa x:在本地启动Rasa X。
  • -h, –help:帮助命令。
  • –version:查看Rasa版本信息。

创建rasa项目

1、初始化rasa项目

mkdir rasa-test
cd rasa-test
rasa init

2、如果要实现中文分词、意图分类和实体识别,则还需要安装 jieba、transformers组件

pip install jieba
pip install transformers

3、编写nlu.yml文件,准备自定义的NLU训练数据,主要用于意图分类模型训练。

version: "3.1"

nlu:
- intent: greet
examples: |
- hey
- hello
- hi

其中intent: greet表示意图为greet,examples是具体的简单例子。稍微复杂点的例子格式是:[实体值](实体类型名),比如[明天](日期)[上海](城市)的天气如何?其中的日期和城市就是NLP中实体识别中的实体了。除了intent之外,该文件还可以包含同义词synonym、正则表达式regex和查找表lookup等。

4、修改config.yml文件,配置NLU模型,主要是配置pipeline。

(1)其中pipeline主要是分词组件、特征提取组件、NER组件和意图分类组件等,通过NLP模型进行实现,并且组件都是可插拔可替换的。

(2)如果LanguageModelFeaturizer配置了bert-base-chinese,则需要事先下载tf_model.h5文件,该文件是基于tensorflow的中文bert预训练模型,下载链接如下:

链接:https://pan.baidu.com/s/1QLdmfxGJJE_xsPgaplhcOQ?pwd=oo14 
提取码:oo14

5、根据实际需要编写 story 故事数据(stories.yml文件)和 rule 规则数据(rules.yml文件)。

version: "3.1"

stories:

- story: happy path
steps:
- intent: greet
- action: utter_greet
- intent: mood_great
- action: utter_happy

- story: sad path 1
steps:
- intent: greet
- action: utter_greet
- intent: mood_unhappy
- action: utter_cheer_up
- action: utter_did_that_help
- intent: affirm
- action: utter_happy

- story: sad path 2
steps:
- intent: greet
- action: utter_greet
- intent: mood_unhappy
- action: utter_cheer_up
- action: utter_did_that_help
- intent: deny
- action: utter_goodbye

上述内容可看做是用户和机器人一个完整的真实的对话流程,对话策略可通过机器学习或者深度学习的方式从其中进行学习。

6、编写domain.yml文件,定义领域domain,包含了聊天机器人的所有信息,包括意图(intent)、实体(entity)、词槽(slot)、动作(action)、表单(form)和回复(response)等。

7、配置Rasa Core模型,主要是配置policies。policies主要是对话策略的配置,常用的包括TEDPolicy、UnexpecTEDIntentPolicy、MemoizationPolicy、AugmentedMemoizationPolicy、RulePolicy、Custom Policies等,并且策略之间也是有优先级顺序的。

8、使用rasa train训练模型

rasa train
或者
rasa train nlu
rasa train core

如果在配置pipeline时,作了如下配置,则表示rasa会从pre-models目录下加载bert-base-chinese预训练模型,所以需要将刚才下载的tf_model.h5文件拷贝到pre-models目录,

例如:pre-models/models–bert-base-chinese/snapshots/8d2a91f91cc38c96bb8b4556ba70c392f8d5ee55

然后再启动模型训练。

- name: LanguageModelFeaturizer
model_name: 'bert'
model_weights: 'bert-base-chinese'
cache_dir: 'pre-models'

rasa的模型训练会使用data目录中的数据作为训练数据,使用config.yml作为配置文件,并将训练后的模型保存到models目录中。

9、使用rasa test测试模型

rasa test

10、让用户使用聊天机器人

可以通过shell用指定的模型进行交互:

rasa shell -m models/nlu-xxx.tar.gz
也可不指定模型,默认使用最新一次训练的模型:
rasa shell

此外,还可以通过api的方式,进行交互验证:

rasa run --enable-api
也可同时指定服务端口号:
rasa run --enable-api --port 8080

然后用户可通过API访问聊天机器人,也可通过postman访问,api请求格式如下:

仅解析意图

请求地址:localhost:5005/model/parse
命令行:curl -X POST localhost:5005/model/parse -d ‘{“text”: “hello”}’
  • 代码示例
import json
import requests

url = "http://localhost:5005/model/parse"
data = {"text": "hello"}
data = json.dumps(data, ensure_ascii=False)
data = data.encode(encoding="utf-8")
r = requests.post(url=url, data=data)
print(json.loads(r.text))

完整对话

请求地址:localhost:5005/webhooks/rest/webhook
命令行:curl -X POST localhost:5005/webhooks/rest/webhook -d {“sender”: "user1", “message”: "hello"}
  • 代码示例
import json
import secrets
import requests
def post(url, data=None):
data = json.dumps(data, ensure_ascii=False)
data = data.encode(encoding="utf-8")
r = requests.post(url=url, data=data)
r = json.loads(r.text)
return r

sender = secrets.token_urlsafe(16)
url = "http://localhost:5005/webhooks/rest/webhook"
message = input("Your input -> ")
data = {
"sender": sender,
"message": message
}
print(post(url, data))

rasa服务部署

采用shell脚本文件,实现rasa服务的一键启停。

  1. 新建start-rasa.sh文件,内容如下:
#!/bin/bash
echo "starting rasa-server..."

cd /root/rasa-server
nohup rasa run actions > /root/actions.log 2>&1 &
nohup rasa run --enable-api > /root/server.log 2>&1 &
cd /root

echo "rasa-server started!"

在start-rasa.sh所在目录下,运行命令source start-rasa.sh即可启动rasa服务。

上述脚本中,2>&1是用来将标准错误2重定向到标准输出1中,1前面的&是为了让bash将1解释成标准输出而不是文件1,而最后一个&是为了让bash在后台执行。

  1. 新建stop-rasa.sh文件,内容如下:
#!/bin/bash

#根据进程名杀死进程
if [ $# -lt 1 ]
then
echo "缺少参数:pro_name"
return 1
fi

PROCESS=`ps -ef | grep $1 | grep -v grep | grep -v PPID | awk '{print $2}'`
for i in $PROCESS
do
echo "Kill the $1 process [ $i ]"
kill -9 $i
done

在stop-rasa.sh所在目录下,运行命令source stop-rasa.sh rasa即可停止所有rasa服务。