这是一个关于如何使用Docker构建Rasa智能助手的指南。如果你之前没有使用过Rasa,我们建议你先从Rasa Tutorial开始。
安装Docker
使用Rasa和Docker构建智能助手
设置
与智能助手交互
自定义模型
选择标签
使用Docker训练自定义Rasa模型
运行Rasa服务
使用Docker Compose运行多个服务
添加自定义Actions
新建一个自定义Action
添加Action服务
添加自定义依赖项
添加自定义跟踪器存储
使用PostgreSQL 作为跟踪器存储
使用MongoDB作为跟踪器存储
使用Redis作为跟踪器存储
使用自己实现的的跟踪器存储
如果不确定是否安装了Docker,可以运行以下命令进行检查:
docker -v && docker-compose -v
# Docker version 18.09.2, build 6247962
# docker-compose version 1.23.2, build 1110ad01
如果你已经安装了Docker,命令应该会显示你安装的Docke和Docker Compose的版本。如果该命令没有输出,你必须先安装Docker。Docker的安装请参考Docker Installation。
本节将涵盖以下内容:
设置
像教程( tutorial)中一样,你将使用rasa init命令创建一个项目。唯一的区别是,你将在Docker容器内运行Rasa,使用rasa/rasa镜像。使用下面命令初始化你的工程:
docker run -v $(pwd):/app rasa/rasa init --no-prompt
这个命令是什么意思呢?
运行这个命令会产生很多输出。该命令将产生下面结果:
要查看命令是否正确运行,可以查看工作目录下的内容:
ls -1
工程初始化文件会保存在工作目录,训练模型保存在models目录中。
注意
默认情况下Docker以root用户身份运行容器。因此,容器创建的所有的文件都属于root用户。 如果你想使用其他账户运行容器可以查看 documentation of docker 和 docker-compose 。
与助手交互
要与你新训练的智能助手交互,运行下面命令:
docker run -it -v $(pwd):/app rasa/rasa shell
上面命令将启动一个解释器让你与智能助手交互。注意该命令包含的 -it标志,意味着你以交互的方式运行Docker,并通过命令行与Docker交互。对于像rasa shell和rasa interactive这样需要交互输入的命令,你需要传递-it标志。
选择标签
为了使镜像尽可能小,我们发布了安装了不同依赖的rasa/rasa镜像的标签。查看 Choosing a Pipeline了解更多关于依赖的信息。
所有的标签以版本号开头,latest标签对应与当前主版本。标签列表:
{version}标签的镜像包含了supervised_embeddings管道运行所需要的全部依赖。如果你使用的组件里带有预训练的词向量,则需要选择相应的标签。或者,你可以使用 -full标签,该标签包含了所有的管道依赖。
注意
你可以在这里(here)查看Rasa Docker所有版本和标签的镜像列表。
使用Docker训练自定义Rasa模型
在config.yml文件中编辑你需要的管道,并把你的NLU和Core数据放在data/目录下。现在你可以运行下面命令训练Rasa模型:
docker run \
-v $(pwd):/app \
rasa/rasa:latest-full \
train \
--domain domain.yml \
--data data \
--out models
运行上面命令的结果:
在本例中,我们也传入领域文件路径,训练数据和模型输出目录,以显示如何自定义这些参数。你也可以忽略这些参数,因为我们会传递默认值。
Note
如果你使用自定义的NLU组件或策略,你必须把模型文件添加到容器中。你可以通过挂载文件或打包进你自己的镜像(例如,如果自定义组件或策略有额外的依赖)来完成此操作。通过配置环境变量 PYTHONPATH=$PYTHONPATH:<directory of your module>,确保你的模块在Python的模块搜索路径中。
如果要在生产环境中运行你的AI助手,请在credentials.yml文件中配置你的 Messaging and Voice Channels。如果此文件不存在,用下面命令创建它:
touch credentials.yml
然后根据你连接的频道进行编辑。之后,运行下面命令训练模型:
docker run \
-v $(pwd)/models:/app/models \
rasa/rasa:latest-full \
run
命令描述:
要将Rasa与其他服务(如用于自定义操作的服务器)一起运行,建议使用Docker Compose。Docker Compose提供了简单的方式同时运行多个容器而不需要使用多个命令。
首先创建文件docker-compose.yml:
touch docker-compose.yml
向文件中添加下面内容:
version: '3.0'services:
rasa:
image: rasa/rasa:latest-full
ports:
- 5005:5005
volumes:
- ./:/app
command:
- run
文件以要使用的Docker Compose的编写规范版本号开头。每个容器在docker compose文件中声明为一个服务。第一个服务是rasa服务。
该命令类似于docker run命令。ports参数定义了容器和宿主机之间的端口映射。在本例中,rasa服务的5005端口映射到主机的5005端口。这个端口就是Rasa服务的REST 接口端口。
注意
由于Docker Compose启动了一组Docker容器,因此在执行run命令后无法再连接到单个容器的命令行。
执行命令下面运行docker-compose.yml文件中配置的服务:
docker-compose up
要创建复杂的智能助手,你要使用 Custom Actions。继续上面的例子,你可能想要添加一个给用户讲笑话的action使他们高兴起来。
创建一个自定义action
首先在目录actions中创建自定义的action:
mkdir actions# Rasa SDK expects a python module.# Therefore, make sure that you have this file in the directory.
touch actions/__init__.py
touch actions/actions.py
然后使用Rasa SDK构建自定义action,例如:
import requestsimport jsonfrom rasa_sdk import Action
class ActionJoke(Action):
def name(self):
return "action_joke"
def run(self, dispatcher, tracker, domain):
request = requests.get('http://api.icndb.com/jokes/random').json() # make an api call
joke = request['value']['joke'] # extract a joke from returned json response
dispatcher.utter_message(joke) # send the message back to the user
return []
然后,把自定义action添加到你的故事和领域文件。继续使用rasa init命令构建机器人的例子,用action_joke来代替data/stories.md文件中的utter_cheer_up,并且把action_joke添加到领域文件。
添加action服务
自定义action 由action服务运行。要将其和Rasa实例一起运行,要把action_server服务添加到docker-compose.yml文件中。
version: '3.0'services:
rasa:
image: rasa/rasa:latest-full
ports:
- 5005:5005
volumes:
- ./:/app
command:
- run
action_server:
image: rasa/rasa-sdk:latest
volumes:
- ./actions:/app/actions
这将拉取包含action服务的Rasa SDK镜像,把自定义action挂载到其中,然后启动服务。
要让Rasa使用自定义的action服务,你必须告诉Rasa它的位置。将此添加到endpoints.yml文件(如果不存在请创建这个文件)中:
action_endpoint:
url: http://action_server:5055/webhook
执行docker-compose up命令把action服务和Rasa一起启动。
添加自定义依赖项
如果自定义action需要额外的系统依赖或Python库,可以通过扩展官方镜像添加它们。
为此,创建一个Dockerfile文件,在其中扩展官方镜像和添加你的自定义依赖项。例如:
# Extend the official Rasa SDK image
FROM rasa/rasa-sdk:latest
# Add a custom system library (e.g. git)
RUN apt-get update && \
apt-get install -y git
# Add a custom python library (e.g. jupyter)
RUN pip install --no-cache-dir jupyter
然后,你可以通过下面命令构建镜像,并且在docker-compose.yml文件中用它代替rasa/rasa-sdk镜像。
docker build . -t <name of your custom image>:<tag of your custom image>
默认情况下,所有的对话保存在内存中。这意味着你重启Rasa服务时会丢失所有的会话信息。如果你想持久化你的会话,你可以使用不同的跟踪器存储 Tracker Store。
首先把PostgreSQL添加到docker-compose文件中:
postgres:
image: postgres:latest
然后把PostgreSQL添加到节点配置文件config/endpoints.yml的tracker_store部分中:
tracker_store:
type: sql
dialect: "postgresql"
url: postgres
db: rasa
首先把MongoDB添加到docker-compose文件中。下面的例子添加了MongoDB和UI(可以跳过这个),可以通过localhost:8081访问该例子。该例子中MongoDB的用户名和密码是rasa和example。如下:
mongo:
image: mongo
environment:
MONGO_INITDB_ROOT_USERNAME: rasa
MONGO_INITDB_ROOT_PASSWORD: examplemongo-express:
image: mongo-express
ports:
- 8081:8081
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: rasa
ME_CONFIG_MONGODB_ADMINPASSWORD: example
然后把MongoDB添加到节点配置文件config/endpoints.yml的tracker_store部分中:
tracker_store:
type: mongod
url: mongodb://mongo:27017
username: rasa
password: example
然后用docker-compose up命令启动所有的组件。
首先把Redis添加到docker-compose文件中:
redis:
image: redis:latest
然后把Redis添加到节点配置文件config/endpoints.yml的tracker_store部分中:
tracker_store:
type: redis
url: redis
使用自己实现的Tracker Store
如果你自定义实现跟踪器存储,把这个存储添加到Rasa中有两项需要设置:
然后按Tracker Stores中描述,把所需配置添加到节点配置文件endpoints.yml中。如果你想把你的tracker store组件(比如某个数据库)作为Docker Compose文件的一部分,请在其中添加相应的服务和配置。