基础环境搭建 1、拉取python:3.9-slim 镜像
docker pull python:3.9-slim
2、配置docker容器的网络环境
docker network ls docker network create rasa-network 方法一: docker network connect rasa-netwrk 容器名称 方法二:启动容器的时候加入:(本文选择此种方法) docker run -itd --network rasa-network 容器名称 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-get update apt-get install gnupg1 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 cp /etc/apt/sources.list /etc/apt/sources.list.bakecho "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-testcd rasa-testrasa 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测试模型
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 jsonimport requestsurl = "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 jsonimport secretsimport requestsdef 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服务的一键启停。
新建start-rasa.sh文件,内容如下:
#!/bin/bash echo "starting rasa-server..." cd /root/rasa-servernohup rasa run actions > /root/actions.log 2>&1 &nohup rasa run --enable-api > /root/server.log 2>&1 &cd /rootecho "rasa-server started!"
在start-rasa.sh所在目录下,运行命令source start-rasa.sh
即可启动rasa服务。
上述脚本中,2>&1是用来将标准错误2重定向到标准输出1中,1前面的&是为了让bash将1解释成标准输出而不是文件1,而最后一个&是为了让bash在后台执行。
新建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服务。