Coding01

Coding 点滴

0%

基于 Docker和 Nginx 构建轻量级 Rasa 开发部署环境 (四)

今天想着如何快速的将 Rasa API 融入之前的项目中,如在我的公众号 coding01里增加一个自动回复聊天机器人。

长期以来,我一直用 Laradock,Laradock 本身也集成了一些好用的开发部署工具,如 Nginx,certbot 等,在学习使用 Rasa 时,想着以最快的速度构建开发部署 Rasa 接口,所以今天我主要采用常规的做法——基于 Nginx 和 Docker 部署 Rasa。

注:由于 Rasa X 自成体系,在学习过程中,我还是放在「学习 Kubernetes 的系列」中去了解 Rasa X 的使用。

前言

在之前的文章中,有描述过如何在公众号里加入自动聊天机器人的文章,欢迎大家查阅:有机器人要菜单没什么用,文章里利用 EasyWeChat 和 ChatterBot 简单搭建一个公众号「自动回复机器人」,利用 EasyWeChat 桥接好公众号和机器人。今天的目的其实就是「把 ChatterBot 替换成 Rasa」。

起点:docker-compose

通过 rasa init 或者在 rasa 已有项目目录下创建 docker-compose.yml 文件。

1
2
3
4
5
6
7
8
9
10
version: '3.0'
services:
rasa:
image: rasa/rasa:1.10.8-full
ports:
- 5005:5005
volumes:
- ./:/app
command:
- run

执行 docker-compose up -d,看看效果:

发一个 api 请求:

1
2
3
curl -XPOST http://localhost:5005/webhooks/rest/webhook \
-H "Content-type: application/json" \
-d '{"sender": "test", "message": "hello"}'

加入 actions 镜像

第一步,在项目根目录创建 actions 文件夹,并将我们的 actions 代码移到文件夹 actions 下,同时创建空的 actions/__init__.py 文件,保证我们的 rasa/rasa-sdk 镜像自动找到 actions/actions.py:

1
2
3
mkdir actions
mv actions.py actions/actions.py
touch actions/__init__.py

第二步,如果我们的 actions 需要用到第三方插件,则可以在 actions 下创建文件 requirements-actions.txt

第三步,创建 Dockerfile 文件,构建镜像。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Extend the official Rasa SDK image
FROM rasa/rasa-sdk:2.0.0a1

# Use subdirectory as working directory
WORKDIR /app

# Copy any additional custom requirements, if necessary (uncomment next line)
# COPY actions/requirements-actions.txt ./

# Change back to root user to install dependencies
USER root

# Install extra requirements for actions code, if necessary (uncomment next line)
# RUN pip install -r requirements-actions.txt

# Copy actions folder to working directory
COPY ./actions /app/actions

# By best practices, don't run the code with root user
USER 1001

构建镜像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
docker build . -t yemeishu/rasaactions:0.0.1

// 过程
Sending build context to Docker daemon 25.29MB
Step 1/5 : FROM rasa/rasa-sdk:2.0.0a1
---> 2824b7c5c4ea
Step 2/5 : WORKDIR /app
---> Using cache
---> 3a5f4ca5a749
Step 3/5 : USER root
---> Using cache
---> 4aea165d622a
Step 4/5 : COPY ./actions /app/actions
---> 88412ef28945
Step 5/5 : USER 1001
---> Running in 185f70fa52aa
Removing intermediate container 185f70fa52aa
---> fa9dc8d4555e
Successfully built fa9dc8d4555e
Successfully tagged yemeishu/rasaactions:0.0.1

发布镜像:

1
docker push yemeishu/rasaactions:0.0.1

项目关联 actions 镜像

在之前的 docker-compose.yml 增加 app service。

1
2
3
4
5
6
7
8
9
10
11
12
13
version: '3.0'
services:
rasa:
image: rasa/rasa:1.10.8-full
ports:
- 5005:5005
volumes:
- ./:/app
command:
- run
app:
image: yemeishu/rasaactions:0.0.1
expose: 5055

这样就可以通过端口 5005,将服务提供给 rasa service 使用,即可以在 endpoints.yml 修改关联路径。

1
2
action_endpoint:
url: http://app:5055/webhook

此处验证:「略」

与 Laradock nginx 连接

到此,基本的配置都没问题了,接下来我们加入中文回复。

具体参考:Rasa 开篇之 hello world

训练我们的 model:

1
docker-compose exec rasa rasa tran

重启容器:

1
docker-compose restart rasa

在与 Laradock nginx 连接之前,我们需要将容器 rasa 关联到 laradock network 上:

1
docker network connect laradock_backend hello_rasa_1

可以通过命令查看:

1
docker network inspect laradock_backend

关联后,就可以在 nginx 配置上用容器名字代替 ip 关联了,具体 nginx 配置文件:

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
upstream chatbot {
server hello2_rasa_1:5005 weight=10 max_fails=3 fail_timeout=30s;
}

server {

listen 80;
listen [::]:80;

server_name chatbot.test;

location / {
proxy_pass http://chatbot/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}

location /.well-known/acme-challenge/ {
root /var/www/letsencrypt/;
log_not_found off;
}
}

最后在 /etc/hosts 加入域名关联,就可大功告成。

我们执行下请求命令:

总结

回到开头的说的如何在公众号加入聊天功能,将在下回继续了。

今天主要学到的知识点在于,如何用最小的 docker 配置(摒弃 Rasa X),完成和 nginx 容器关联,获得请求接口,以备后续调用。

Welcome to my other publishing channels