当前位置: 首页 > 工具软件 > rasa-ui > 使用案例 >

Rasa官方教程翻译9 使用Docker运行Rasa

赵飞语
2023-12-01

这是一个关于如何使用Docker构建Rasa智能助手的指南。如果你之前没有使用过Rasa,我们建议你先从Rasa Tutorial开始。

安装Docker

使用Rasa和Docker构建智能助手

设置

与智能助手交互

自定义模型

选择标签

使用Docker训练自定义Rasa模型

运行Rasa服务

使用Docker Compose运行多个服务

添加自定义Actions

新建一个自定义Action

添加Action服务

添加自定义依赖项

添加自定义跟踪器存储

使用PostgreSQL 作为跟踪器存储

使用MongoDB作为跟踪器存储

使用Redis作为跟踪器存储

使用自己实现的的跟踪器存储

 

安装Docker

如果不确定是否安装了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

使用Rasa和Docker构建智能助手

本节将涵盖以下内容:

  • 设置Rasa项目并训练初始模型
  • 通过Docker与你的人工智能助手交互
  • 选择一个Docker 镜像标签
  • 使用Docker训练你的Rasa模型
  • 使用Docker与你的智能助手交互
  • 使用Docker运行Rasa服务

设置

像教程( tutorial)中一样,你将使用rasa init命令创建一个项目。唯一的区别是,你将在Docker容器内运行Rasa,使用rasa/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用户。 如果你想使用其他账户运行容器可以查看 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}
  • {version}-spacy-en
  • {version}-spacy-de
  • {version}-mitie-en
  • {version}-full

{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

 

运行上面命令的结果:

  • -v $(pwd):/app: 把你的工程目录挂载到Docker容器中以便于Rasa能在你的训练数据集上训练模型。
  • rasa/rasa:latest-full: 使用 latest-full标签的Rasa镜像
  • train: 在容器中执行rasa train命令。更多信请查看 Command Line Interface.

在本例中,我们也传入领域文件路径,训练数据和模型输出目录,以显示如何自定义这些参数。你也可以忽略这些参数,因为我们会传递默认值。

Note

如果你使用自定义的NLU组件或策略,你必须把模型文件添加到容器中。你可以通过挂载文件或打包进你自己的镜像(例如,如果自定义组件或策略有额外的依赖)来完成此操作通过配置环境变量 PYTHONPATH=$PYTHONPATH:<directory of your module>,确保你的模块在Python的模块搜索路径中。 

运行Rasa服务

如果要在生产环境中运行你的AI助手,请在credentials.yml文件中配置你的 Messaging and Voice Channels。如果此文件不存在,用下面命令创建它:

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命令。想了解更多信息查看 Command Line Interface.

使用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文件中声明为一个服务。第一个服务是rasa服务。

该命令类似于docker run命令。ports参数定义了容器和宿主机之间的端口映射。在本例中,rasa服务的5005端口映射到主机的5005端口。这个端口就是Rasa服务的REST 接口端口。

 

注意

由于Docker Compose启动了一组Docker容器,因此在执行run命令后无法再连接到单个容器的命令行。

执行命令下面运行docker-compose.yml文件中配置的服务:

docker-compose up

添加自定义Action

要创建复杂的智能助手,你要使用 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作为跟踪器存储

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

postgres:

  image: postgres:latest

然后把PostgreSQL添加到节点配置文件config/endpoints.ymltracker_store部分中:

tracker_store:

  type: sql

  dialect: "postgresql"

  url: postgres

  db: rasa

用MongoDB作为跟踪器存储

首先把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.ymltracker_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添加到节点配置文件config/endpoints.ymltracker_store部分中:

tracker_store:

  type: redis

  url: redis

使用自己实现的Tracker Store

如果你自定义实现跟踪器存储,把这个存储添加到Rasa中有两项需要设置:

  • 扩展Rasa镜像
  • 额外挂载到容器

然后按Tracker Stores中描述,把所需配置添加到节点配置文件endpoints.yml中。如果你想把你的tracker store组件(比如某个数据库)作为Docker Compose文件的一部分,请在其中添加相应的服务和配置。

 

 

 类似资料: