在Docker上运行Rasa

这是如何使用Docker构建Rasa助手的指南。如果你之前没有使用过Rasa,我们建议你先从Rasa教程开始。

安装Docker

如果你不确定是否安装了Docker,可以通过运行下面的命令来检查:

docker -v && docker-compose -v
# Docker version 18.09.2, build 6247962
# docker-compose version 1.23.2, build 1110ad01

如果你的计算机上安装了Docker,则输出应显示已安装的Docker和Docker Compose版本。如果该命令不起作用,则必须安装Docker。有关详细信息,请参阅Docker安装

使用Rasa和Docker构建助手

本节将介绍以下内容: - 创建你的Rasa项目并训练初始模型 - 通过Docker与你的AI助手交谈 - 选择Docker镜像标记 - 使用Docker训练你的Rasa模型 - 使用Docker与你的助手交谈 - 使用Docker运行Rasa服务

创建项目

就像在教程中一样,你将使用rasa init命令来创建项目。唯一的区别是你将使用镜像rasa/rasa在Docker容器中运行Rasa。,请运行以下命令初始化项目:

docker run -v $(pwd):/app rasa/rasa init --no-prompt

这个命令是什么意思? - -v $(pwd):/app将当前工作目录挂载到Docker容器中的工作目录。这意味着你在计算机上创建的文件将在容器内可见,并且容器中创建的文件将同步回你的计算机。 - rasa/rasa是要运行的docker镜像的名称。 - Docker镜像将rasa命令作为其入口点,这意味着你不必键入rasa init,只需init即可。

运行此命令将产生大量输出: - 创建了Rasa项目 - 使用项目的训练数据训练初始模型

要检查命令是否正确完成,请查看工作目录的内容:

ls -1

初始项目文件应该都在那里,以及包含训练的模型的models目录。

注意: 默认情况下,Docker以root用户身份运行容器。因此,这些容器创建的所有文件都将由root拥有。如果要使用其他用户运行容器,请参阅docker和docker-compose的文档。

和你的助手交谈

要与新训练的助手交谈,请运行以下命令:

docker run -it -v $(pwd):/app rasa/rasa shell

这将启动一个shell,你可以在其中与助手聊天。请注意,此命令包含参数-it,这意味着你以交互方式运行Docker,并且你可以通过命令行提供输入。对于需要交互式输入的命令,例如rasa shellrasa interactive,你需要传递-it参数。

自定义你的模型

选择一个标记

为了使镜像尽可能小,我们发布了安装了不同依赖项的rasa / rasa镜像的不同标记。有关依赖性的更多信息,请参阅选择管道

所有标签都以版本开头 - latest标记对应于当前的主版本。标记是: - {version} - {version}-spacy-en - {version}-spacy-de - {version}-mitie-en - {version}-full

{version}标记包含运行supervised_embeddings管道所需的所有依赖项。如果你使用具有预训练词向量的组件,则需要选择相应的标记。或者,你可以使用-full标记,其中包括所有管道依赖项。

注意: 你可以在此处查看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

这是该命令中发生的事情: - -v$(pwd):/app:将项目目录安装到Docker容器中,以便Rasa可以使用你的训练数据训练模型 - rasa / rasa:latest-full:使用标记为latest-full的Rasa镜像 - train:在容器内执行rasa train命令。有关更多信息,请参阅命令行界面。 - 在这种情况下,我们还传递了域文件,训练数据和模型输出目录的位置值,以显示如何自定义这些值。你也可以省略这些,因为我们传递了默认值。

注意: 如果你使用的是自定义NLU组件或策略,则必须将模块文件添加到Docker容器中。你可以通过挂载文件或将其包含在你自己的自定义镜像中来实现此目的(例如,如果自定义组件或策略具有额外的依赖关系)。通过设置环境变量PYTHONPATH = $PYTHONPATH:<模块的目录>,确保模块位于Python模块搜索路径中。

运行Rasa服务

要在生产中运行AI助手,请在credentials.yml中配置所需的消息和语音通道。如果此文件不存在,请使用以下命令创建:

touch credentials.yml

然后根据你连接的通道进行编辑。之后,运行训练模型:

docker run \
  -v $(pwd)/models:/app/models \
  rasa/rasa:latest-full \
  run

命令说明: - -v $(pwd)/models:/app/models:在容器中挂载已训练的Rasa模型目录 - rasa/rasa:latest-full:使用标记为latest-full的Rasa镜像 - run:执行rasa run命令。有关更多信息,请参阅命令行界面

使用Docker Compose运行多个服务

要将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文件中声明为service 。第一项服务是rasa服务。

该命令类似于docker run命令。ports部分定义容器和你的主机系统之间的端口映射。在这种情况下,它会在你的主机的5005端口上提供5005rasa服务。这是Rasa的REST Channel接口的端口。

注意: 由于Docker Compose启动了一组Docker容器,因此在执行run命令后不再可能连接到单个容器的命令行。

要运行docker-compose.yml中配置的服务,请执行:

docker-compose up

添加自定义操作

要创建更复杂的助手,你需要使用自定义操作。继续上面的示例,你可能希望添加一个操作,告诉用户一个笑话来给他们加油。

创建自定义操作

首先在actions目录中创建自定义操作:

mkdir actions
# Rasa SDK需要一个python模块。
# 因此,请确保你在目录中包含此文件。
touch actions/__init__.py
touch actions/actions.py

然后使用Rasa SDK构建自定义操作,例如:

import requests
import json
from 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()  # 调用api
    joke = request['value']['joke']  # 从返回的json响应中提取一个笑话
    dispatcher.utter_message(joke)  # 将消息发送回用户
    return []

接下来,在故事和域文件中添加自定义操作。继续使用rasa init中的示例机器人,将data/stories.md中的utter_cheer_up替换为自定义操作action_joke,并将action_joke添加到域文件中的操作。

添加操作服务

自定义操作由操作服务运行。要将其与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

这会为包含操作服务的Rasa SDK提取镜像,将自定义操作安装到其中,然后启动服务。

要指示Rasa使用操作服务,你必须告诉Rasa它的位置。将此添加到你的endpoints.yml(如果它不存在,创建它):

action_endpoint:
  url: http://action_server:5055/webhook

运行docker-compose up以与Rasa一起启动操作服务。

添加自定义依赖项

如果你的自定义操作具有系统或Python库的其他依赖项,则可以通过扩展官方镜像来添加这些依赖项。

为此,请创建一个名为Dockerfile的文件,在该文件中扩展官方镜像并添加自定义依赖项。例如:

# 扩展官方Rasa SDK映像
FROM rasa/rasa-sdk:latest

# 添加自定义系统库(例如git)
RUN apt-get update && \
    apt-get install -y git

# 添加自定义python库(例如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服务,所有对话都将丢失。如果你想要保留对话,可以使用其他跟踪器存储

使用PostgreSQL作为跟踪器存储

首先将PostgreSQL添加到docker-compose文件中:

postgres:
  image: postgres:latest

然后将PostgreSQL添加到端点配置config/endpoints.yml文件中的的tracker_store部分:

tracker_store:
  type: sql
  dialect: "postgresql"
  url: postgres
  db: rasa

使用MongoDB作为跟踪器存储

首先将MongoDB添加到docker-compose文件中。下面的示例添加了MongoDB以及一个UI(你可以跳过此步骤),可以通过localhost:8081访问。MongoDB实例的用户名和密码指定为rasaexample

mongo:
  image: mongo
  environment:
    MONGO_INITDB_ROOT_USERNAME: rasa
    MONGO_INITDB_ROOT_PASSWORD: example
mongo-express:
  image: mongo-express
  ports:
    - 8081:8081
  environment:
    ME_CONFIG_MONGODB_ADMINUSERNAME: rasa
    ME_CONFIG_MONGODB_ADMINPASSWORD: example

然后将MongoDB添加到端点配置endpoints.yml文件中的的tracker_store部分:

tracker_store:
  type: mongod
  url: mongodb://mongo:27017
  username: rasa
  password: example

然后使用docker-compose up启动所有组件。

使用Redis作为跟踪器存储

首先将Redis添加到docker-compose文件中:

redis:
  image: redis:latest

然后将Redis添加到端点配置endpoints.yml文件中的tracker_store部分:

tracker_store:
  type: redis
  url: redis

使用自定义跟踪器存储实现

如果你有踪器存储的自定义实现,则有两个选项可将此存储添加到R​​asa: - 扩展Rasa镜像 - 作为volume安装

然后将所需配置添加到端点配置endpoints.yml文件中,如跟踪器存储中所述。如果你希望跟踪器存储组件(例如某个数据库)成为Docker Compose文件的一部分,请在其中添加相应的服务和配置。