今天想着如何快速的将 Rasa API 融入之前的项目中,如在我的公众号 coding01[1]里增加一个自动回复聊天机器人。
长期以来,我一直用 Laradock[2],Laradock 本身也集成了一些好用的开发部署工具,如 Nginx,certbot 等,在学习使用 Rasa 时,想着以最快的速度构建开发部署 Rasa 接口,所以今天我主要采用常规的做法——基于 Nginx 和 Docker 部署 Rasa。
注:由于 Rasa X 自成体系,在学习过程中,我还是放在「学习 Kubernetes 的系列」中去了解 Rasa X 的使用。
前言
在之前的文章中,有描述过如何在公众号里加入自动聊天机器人的文章,欢迎大家查阅:有机器人要菜单没什么用[3],文章里利用 EasyWeChat 和 ChatterBot 简单搭建一个公众号「自动回复机器人」,利用 EasyWeChat 桥接好公众号和机器人。今天的目的其实就是「把 ChatterBot 替换成 Rasa」。
起点:docker-compose
通过 rasa init
或者在 rasa 已有项目目录下创建 docker-compose.yml
文件。
version: '3.0'
services:
rasa:
image: rasa/rasa:1.10.8-full
ports:
- 5005:5005
volumes:
- ./:/app
command:
- run
执行 docker-compose up -d
,看看效果:
发一个 api 请求:
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
:
mkdir actions
mv actions.py actions/actions.py
touch actions/__init__.py
第二步,如果我们的 actions 需要用到第三方插件,则可以在 actions 下创建文件 requirements-actions.txt
。
第三步,创建 Dockerfile 文件,构建镜像。
# 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
构建镜像:
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
发布镜像:
docker push yemeishu/rasaactions:0.0.1
项目关联 actions 镜像
在之前的 docker-compose.yml
增加 app service。
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
修改关联路径。
action_endpoint:
url: http://app:5055/webhook
此处验证:「略」
与 Laradock nginx 连接
到此,基本的配置都没问题了,接下来我们加入中文回复。
具体参考:Rasa 开篇之 hello world[4]
训练我们的 model:
docker-compose exec rasa rasa tran
重启容器:
docker-compose restart rasa
在与 Laradock nginx 连接之前,我们需要将容器 rasa 关联到 laradock network 上:
docker network connect laradock_backend hello_rasa_1
可以通过命令查看:
docker network inspect laradock_backend
关联后,就可以在 nginx 配置上用容器名字代替 ip 关联了,具体 nginx 配置文件:
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 容器关联,获得请求接口,以备后续调用。
参考
[1] coding01 https://mp.weixin.qq.com/s/lOJmUEH7QcewHngcLJbssw
[2] Laradock http://laradock.io
[3] 有机器人要菜单没什么用 https://mp.weixin.qq.com/s/j-3mBrchblQgSyVZ5gGUSQ
[4] Rasa 开篇之 hello world https://mp.weixin.qq.com/s/HpPxrG2Sr67Sz_nEJHH2PA