Rasa中文聊天机器人开发指南(1):入门篇

文章目录

  • 1. Rasa简介与安装
    • 1.1 Rasa简介
    • 1.2 Rasa安装(v1.9.4)
      • 1.1 Ubuntu 16.04环境
      • 1.2 Windows10环境
  • 2. Rasa使用--构建简单聊天机器人
    • 2.1 构建NLU样本
      • 2.1.1 nlu.md
    • 2.2 构建Core样本
      • 2.2.1 stories.md
      • 2.2.2 domain.yml
    • 2.3 训练NLU和CORE模型
      • 2.3.1 config.yml
      • 2.3.2 模型训练
    • 2.4 配置Http和Action
      • 2.3.1 credentials.yml
      • 2.3.2 endpoints.yml
      • 2.3.3 action.py
    • 2.5 启动服务
      • 2.5.1 启动Rasa和Action服务
      • 2.5.2 创建、启动server.py
    • 2.6. 效果演示


RASA 开发中文指南系列博文:

  • Rasa中文聊天机器人开发指南(1):入门篇
  • Rasa中文聊天机器人开发指南(2):NLU篇
  • Rasa中文聊天机器人开发指南(3):Core篇
  • Rasa中文聊天机器人开发指南(4):RasaX篇
  • Rasa中文聊天机器人开发指南(5):Action篇

注:本系列博客翻译自Rasa官方文档,并融合了自己的理解和项目实战,同时对文档中涉及到的技术点进行了一定程度的扩展,目的是为了更好的理解Rasa工作机制。与本系列博文配套的项目GitHub地址:ChitChatAssistant,欢迎starissues,我们共同讨论、学习!


1. Rasa简介与安装

1.1 Rasa简介

Rasa是一个开源机器学习框架,用于构建上下文AI助手和聊天机器人。Rasa有两个主要模块:

  • NLU:实现意图识别槽值提取,它把用户的输入转换为结构化数据;
  • Core:是一个对话管理平台,用于预测、决定下一步做什么;

 Rasa X是一个工具,可帮助您构建、改进和部署由Rasa框架提供支持的AI Assistants

1.2 Rasa安装(v1.9.4)

1.1 Ubuntu 16.04环境

1. 安装python3.6和pip

 Rasa框架要求python的版本为3.6以上,由于ubuntu 16.04预装的是python 2.7,因此在安装rasa之前我们需要安装python3.6或者python 3.7,这里以安装python3.6为例:

# 编译安装python3.6.5
# 默认安装路径为/usr/local/,可在执行配置命令时使用--prefix=更改
$ sudo apt-get install openssl libssl-dev
$ sudo wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
$ sudo tar xzf Python-3.6.8.tgz
$ cd Python-3.6.8
$ sudo ./configure --with-ssl --enable-optimizations
$ sudo make
$ sudo make install

# 软链接到/usr/bin/python,可理解为生成快捷方式
# 当命令终端输入python命令,即进入python 3.6.8
# 如果需要使用其他版本,也是通过以下两个命令实现,只是python3.6改成其他版本
$ sudo rm /usr/bin/python
$ sudo ln -s /usr/local/bin/python3.6 /usr/bin/python

# 生成pip快捷方式,以支持pip命令
$ rm /usr/bin/pip
$ sudo ln -s /usr/local/bin/pip3 /usr/bin/pip

 需要注意的是,如果在更新包过程中比较慢,我们就需要更新源,具体步骤如下:

(1)备份源

$ sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup

(2)修改源

$ sudo vim /ect/apt/sources.list

 删除文件所有内容,将其替换为国内源,我这里使用网易的。

deb http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse

(3)使软件源生效

$ sudo apt-get update

2. 安装pipEnv,即创建虚拟环境

# 安装virtualenv
$ sudo pip install virtualenv
# 创建virtualenv快捷方式
# 如果不清楚virtualenv路径,可使用"find / -name virtualenv"命令查询
$ sudo ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv
# 查看是否安装成功
$ sudo virtualenv --version

 如果在使用pip下载包时容易出现“socket time out”异常,这是由于默认pip源或网络不稳定导致,我们可以使用清华大学的pip源镜像,具体配置如下:

# 如果已经存在pip.conf文件,只需要执行第二步即可
$ sudo mkdir ~/.pip
$ sudo vim ~/.pip/pip.conf

 然后,pip.conf的文件内容如下:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=pypi.tuna.tsinghua.edu.cn
disable-pip-version-check = true
timeout = 6000

3. 创建新的项目,运行在python虚拟环境

$ sudo mkdir chitchat_assistant
$ sudo cd chitchat_assistant
$ sudo virtualenv env
$ sudo source env/bin/activate

 如果看到以下结果说明操作成功:
在这里插入图片描述
 这里我们创建一个名为weather_assistant的python项目,然后为其配置虚拟环境,其中env是虚拟环境的名称,会自动被创建。对于该Python项目,使用pip下载的所有苦将独立于系统或其他项目环境,保存在当前目录的env的目录下,如果需要退出虚拟环境,可以再项目目录使用下面命令:

$ sudo deactivate

4. 安装rasa,自动生成rasa项目所需文件

# 安装rasa, 由于网络问题,延长超时时间
# 如果仍然超时异常,多执行几次
$ sudo pip --default-timeout=500 install -U rasa

# 生成文件
$ sudo rasa init --no-prompt

注:如果出现No matching distribution found for tensorflow>=2.1.0异常,可以通过执行pip3 install --upgrade tensorflow rasa命令解决。

 执行rasa init命令的目的为自动生成开发一个Rasa项目所需的所有必要文件,包括执行训练NLU和对话模型。有了这些文件我们便可以不作任何修改就能使Rasa项目跑起来,更重要的是,对于未来一些具体业务来说,也是修改这些文件的内容,这些文件名称及其作用如下表所示(还是英文更原汁原味):

__init__.py an empty file that helps python find your actions
actions.py code for your custom actions
config.yml ‘*’ configuration of your NLU and Core models
credentials.yml details for connecting to other services
data/nlu.md ‘*’ your NLU training data
data/stories.md ‘*’ your stories
domain.yml ‘*’ your assistant’s domain
endpoints.yml details for connecting to channels like fb messenger
models/.tar.gz your initial model

rasa还提供了其他命令,详情参见此文。

5. 测试助手

$ sudo rasa shell

 打印如下:
Rasa中文聊天机器人开发指南(1):入门篇_第1张图片

1.2 Windows10环境

1. 创建一个新的python项目
Rasa中文聊天机器人开发指南(1):入门篇_第2张图片
 注意,要完成这步你需要确保win10已经安装python3.6或者python3.7,由于我是在Pycharm IDE上开发的,如果你希望与我相同的环境,那么也需要安装Pycharm,这里推荐2018.3.5 professional版本。

2. 安装rasa

pip --default-timeout=500 install -U rasa

 打开Pycharm命令终端,输入以上命令安装rasa开发环境,在安装的过程中有可能会出现超时中断,可以尝试多执行几次上面的命令。待安装完毕后,可以执行pip show rasa命令查看rasa版本信息。

(venv) E:\ComPython\ChitChatAssistant>pip show rasa
Name: rasa
Version: 1.7.0
Summary: Open source machine learning framework to automate text- and voice-based conversations: NLU, dialogue management, connect to Slack, Facebook, and more - Create chatbots and voice assistants
Home-page: https://rasa.com
Author: Rasa Technologies GmbH
Author-email: hi@rasa.com
License: Apache 2.0
Location: e:\compython\chitchatassistant\venv\lib\site-packages
Requires: pytz, matplotlib, gast, apscheduler, pykwalify, rasa-sdk, pydot, sanic-jwt, attrs, networkx, absl-py, ruamel.yaml, colorclass, tensorflow-probability, requests, scikit-learn, sanic, colorhash, aiohttp, async-generator, mattermostwrappe
r, coloredlogs, python-telegram-bot, scipy, setuptools, pika, tensorflow-cpu, rocketchat-API, scikit-learn, packaging, SQLAlchemy, slackclient, sanic-cors, python-socketio, multidict, python-engineio, numpy, pymongo, boto3, gevent, fbmessenger,
terminaltables, webexteamssdk, PyJWT, twilio, python-dateutil, jsonschema, redis, questionary, jsonpickle, tqdm, tensor2tensor, sklearn-crfsuite, prompt-toolkit
Required-by:

3. 安装Mitie和Jieba

(1)MITIE

# 在线安装Mitie
pip install git+https://github.com/mit-nlp/MITIE.git
pip install rasa[mitie]  # 注:由于第一步始终没成功过,没尝试过这个命令的意义

 由于自己在线安装尝试了很多次都拉不下来,因此只能走离线安装的方式,有三个步骤:

  • 首先,下载MITIE源码和中文词向量模型total_word_feature_extractor_zh.dat(密码:p4vx),这里需要将该模型拷贝到创建的python项目data目录下(可任意位置),后面训练NLU模型时用到;

  • 其次,安装Visual Studio 2017 ,需要勾选“用于 CMake 的 Visual C++ 工具”,因为编译MITIE源码需要Cmake和Visual C++环境。安装完毕后,将C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin添加到环境变量中,再重启电脑使之生效;

  • 从Pycharm的命令终端进行Mitie源码根目录,执行下面的命令:

    python setup.py build
    python setup.py install

(2)Jieba

# 安装Jieba中文分词
pip install jieba

4. 创建rasa配置文件

 当rasa开发环境安装好,接下来就需要创建rasa开发所有必要文件,而这些文件就是第1.1(4)小节列举出来的那些文件。在PyCharm的python项目中,我们需要手动创建之,最后应该如下图所示:
Rasa中文聊天机器人开发指南(1):入门篇_第3张图片

注:如果使用默认的pip源很慢,windows也可以选择使用清华镜像。在C盘用户目录下创建一个命名为“pip”的文件夹,如C:\Users\jiangdg\pip,然后再创建一个名为pip.ini文件,内容如下:

[global]
index-url=https://pypi.tuna.tsinghua.edu.cn/simple 
[install]  
trusted-host=pypi.tuna.tsinghua.edu.cn
disable-pip-version-check = true  
timeout = 6000 

注意:

Q1:win10+python3.6+rasa1.9.1报tensorflow ImportError: DLL load failed异常?
解决:rasa1.9使用的是tensorflow2.1.0,该版本需要DLL,下载 vc_redist.x64.exe安装即可解决。

Q2:缺少slack模块?
解决:pip install slack
pip install slackclient

Q3:AttributeError: module ‘tensorboard.plugins.pr_curve.summary’ has no attribute ‘pb’?
解决:注释掉"/lib/python3.6/site-packages/tensorboard/summary/v1.py"中
# pr_curve_pb = _pr_curve_summary.pb
# pr_curve_raw_data_pb = _pr_curve_summary.raw_data_pb

2. Rasa使用–构建简单聊天机器人

 Rasa工作原理:
Rasa中文聊天机器人开发指南(1):入门篇_第4张图片

  • 首先,将用户输入的Message传递到Interpreter(Rasa NLU模块),该模块负责识别Message中的"意图(intent)“和提取所有"实体”(entity)数据;
  • 其次,Rasa Core会将Interpreter提取到的意图和识别传给Tracker对象,该对象的主要作用是跟踪会话状态(conversation state);
  • 第三,利用policy记录Tracker对象的当前状态,并选择执行相应的action,其中,这个action是被记录在Track对象中的;
  • 最后,将执行action返回的结果输出即完成一次人机交互。

2.1 构建NLU样本

2.1.1 nlu.md

 NLU模型训练样本数据:

## intent:greet
- 你好
- 你好啊
- 早上好
- 晚上好
- hello
- hi
- 嗨
- 嗨喽
- 见到你很高兴
- 嘿
- 早
- 上午好
- hello哈喽
- 哈喽哈喽
- hello hello
- 喂喂

## intent:goodbye
- goodbye
- bye
- bye bye
- 88
- 886
- 再见
- 拜
- 拜拜
- 拜拜,下次再聊
- 下次见
- 回头见
- 下次再见
- 下次再聊
- 有空再聊
- 先这样吧
- 好了,就说这么多了
- 好了,先这样
- 没事

## intent:whoareyou
- 你是谁
- 我知道你吗
- 谁
- 我认识你吗
- 这是谁啊
- 是谁
- 请问你是谁
- 请问我认识你吗
- 你是哪位
- 你是?
- 是谁?
- 可以告诉我你的名字吗
- 你叫什么名字

## intent:whattodo
- 你支持什么功能
- 你有什么功能
- 你能干什么
- 你能做什么

## intent:thanks
- 谢谢
- thanks
- thank you
- 真的太感谢你了,帮了我大忙
- 谢谢你帮了我大忙
- 你帮了我大忙,谢谢你小智
- 非常感谢
- 谢了

## intent:deny
- 不
- no
- 不可以
- 不是的
- 不认同
- 否定
- 不是这样子的
- 我不同意你的观点
- 不同意
- 不好
- 你长得很美,就不要想得太美。
- 拒绝
- 不行

## intent:affirm
- 是的
- 当然
- 好的
- ok
- 嗯
- 可以
- 你可以这么做
- 你做得可以啊
- 同意
- 听起来不错
- 是这样的
- 的确是这样子的
- 我同意你的观点
- 对的
- 好滴
- 行
- 还行
- 当然可以

## intent: request_weather
- 天气
- 查询天气
- 帮我查天气信息
- 我想知道[明天](date-time)的天气
- [星期一](date-time)的天气
- [今天](date-time)的天气怎么样
- 帮我查下[后天](date-time)的天气
- 查下[广州](address)的天气怎么样
-  [长沙](address)的天气
- [深圳](address)[明天](date-time)的天气
- 查下[今天](date-time)[上海](address)的天气
- 帮我查查[佛山](address)这[周六](date-time)的天气

2.2 构建Core样本

2.2.1 stories.md

 对话模型,或称Core模型训练样本:

## greet
* greet
    - utter_answer_greet

## say affirm  with greet
* greet
    - utter_answer_greet
* affirm
    - utter_answer_affirm
    
## say affirm 
* affirm
    - utter_answer_affirm
    
## say no with greet
* greet
    - utter_answer_greet
* deny
    - utter_answer_deny
    
## say no 
* deny
    - utter_answer_deny


## say goodbye
* goodbye
    - utter_answer_goodbye
    
## thanks with greet
* greet
    - utter_answer_greet
* thanks
    - utter_answer_thanks
    
## thanks
* thanks
    - utter_answer_thanks
    
## who are you with greet
* greet
    - utter_answer_greet
* whoareyou
    - utter_answer_whoareyou
    
## who are you
* whoareyou
    - utter_answer_whoareyou
    
## who are you with greet
* greet
    - utter_answer_greet
* whoareyou
    - utter_answer_whoareyou
    
## what to do
* whattodo
    - utter_answer_whattodo
    
## what to do with greet
* greet
    - utter_answer_greet
* whattodo
    - utter_answer_whattodo    
    
## happy path
* request_weather
    - weather_form
    - form{"name": "weather_form"}
    - form{"name": null}

2.2.2 domain.yml

 domain.yml文件相当于AI助手的大脑,记录了系统所有的信息。

intents:
  - affirm
  - deny
  - greet
  - goodbye
  - thanks
  - whoareyou
  - whattodo
  - request_weather

slots:
  date-time:
    type: unfeaturized
  address:
    type: unfeaturized

entities:
  - date-time
  - address

actions:
  - utter_answer_affirm
  - utter_answer_deny
  - utter_answer_greet
  - utter_answer_goodbye
  - utter_answer_thanks
  - utter_answer_whoareyou
  - utter_answer_whattodo
  - utter_ask_date-time
  - utter_ask_address
  - action_default_fallback

forms:
  - weather_form

responses:
  utter_answer_affirm:
    - text: "嗯嗯,好的!"
    - text: "嗯嗯,很开心能够帮您解决问题~"
    - text: "嗯嗯,还需要什么我能够帮助您的呢?"

  utter_answer_greet:
    - text: "您好!请问我可以帮到您吗?"
    - text: "您好!很高兴为您服务。请说出您要查询的功能?"

  utter_answer_goodbye:
    - text: "再见"
    - text: "拜拜"
    - text: "虽然我有万般舍不得,但是天下没有不散的宴席~祝您安好!"
    - text: "期待下次再见!"
    - text: "嗯嗯,下次需要时随时记得我哟~"
    - text: "see you!"

  utter_answer_deny:
    - text: "主人,您不开心吗?不要离开我哦"
    - text: "怎么了,主人?"

  utter_answer_thanks:
    - text: "嗯呢。不用客气~"
    - text: "这是我应该做的,主人~"
    - text: "嗯嗯,合作愉快!"

  utter_answer_whoareyou:
    - text: "您好!我是小蒋呀,您的AI智能助理"

  utter_answer_whattodo:
    - text: "您好!很高兴为您服务,我目前只支持查询天气哦。"

  utter_ask_date-time:
    - text: "请问您要查询哪一天的天气?"

  utter_ask_address:
    - text: "请问您要查下哪里的天气?"

  utter_default:
    - text: "没听懂,请换种说法吧~"

2.3 训练NLU和CORE模型

2.3.1 config.yml

 训练NLU和Core模型配置文件:

language: "zh"

pipeline:
- name: "MitieNLP"
  model: "data/total_word_feature_extractor_zh.dat"
- name: "JiebaTokenizer"
- name: "MitieEntityExtractor"
- name: "EntitySynonymMapper"
- name: "RegexFeaturizer"
- name: "MitieFeaturizer"
- name: "SklearnIntentClassifier"

policies:
  - name: KerasPolicy
    epochs: 500
    max_history: 5
  - name: FallbackPolicy
    fallback_action_name: 'action_default_fallback'
  - name: MemoizationPolicy
    max_history: 5
  - name: FormPolicy

2.3.2 模型训练

 当所有样本和配置文件准备好后,接下来就是训练模型了,打开Pycharm命令终端执行下面的命令,该命令会同时训练NLU和Core模型,具体如下:

python -m rasa train --config configs/config.yml --domain configs/domain.yml --data data/
  • 参数说明:
usage: rasa train [-h] [-v] [-vv] [--quiet] [--data DATA [DATA ...]]
                  [-c CONFIG] [-d DOMAIN] [--out OUT]
                  [--augmentation AUGMENTATION] [--debug-plots]
                  [--dump-stories] [--fixed-model-name FIXED_MODEL_NAME]
                  [--persist-nlu-data] [--force]
                  {core,nlu} ...

positional arguments:
  {core,nlu}
    core                指定训练的模型为core模型
    nlu                 指定选了的模型为nlu模型

optional arguments:
  -h, --help            帮助信息;
  --data                指定NLU和Core模型所有样本文件,默认为data目录;
  -c 或--config         指定policy和nlu pipeline配置文件,默认为根目录下config.ym;
  -d 或--domain         指定domain.yml文件,默认为根目录下domain.yml;
  --out                 指定模型文件输出路径,默认为自定生成models;
  --augmentation        指定训练时需要多少数据augmentation(扩展),默认为50;
  --debug-plots         一般不用
  --dump-stories        是否开启将flattened stories保存到文件,默认为false;
  --fixed-model-name    指定生成的模型文件名称,默认none
  --persist-nlu-data    是否一定要将nlu训练数据保存到模型,默认为false;
  --force               是否强化模型当训练数据没有变化时,默认为false

Python Logging Options:
  -v, --verbose         开启打印日志;
  -vv, --debug          开启调试模式;
  --quiet               设置日志打印级别为WARNING;

2.4 配置Http和Action

2.3.1 credentials.yml

 credentials.yml为配置连接到其他服务的详细(认证)信息,当我们需要通过Http的形式访问Rasa Server时,就需要在该文件中配置rest:。rest通道将为您提供一个rest端点(即Rasa Server),用于向其发送消息,响应该请求将发送回bots消息。根据这个文档的说明,当我们请求Rasa Server的URL应为:

http://rasaServerIP:rasaServerPort/webhooks/rest/webhook

该文件内容如下:

#facebook:
#  verify: ""
#  secret: ""
#  page-access-token: ""

#slack:
#  slack_token: ""
#  slack_channel: ""

#socketio:
#  user_message_evt: 
#  bot_message_evt: 
#  session_persistence: 

#mattermost:
#  url: "https:///api/v4"
#  team: ""
#  user: ""
#  pw: ""
#  webhook_url: ""

# you don't need to provide anything here - this channel doesn't
# require any credentials
rest:

2.3.2 endpoints.yml

 如果希望rasa server(注:指rasa core)能够连接到其他web,我们可以再endpoints.yml这个文件中进行配置,比如为了实现custom action,我们就需要在该文件中对action server进行配置,又比如我们将nlu模块放到其他的web项目中,就需要在该文件中配置nlu server等等。endpoints.yml文件内容如下:

# 指定action server的url
# 当然,也可以将action server单独实现在一个web server项目中
# 那么这个url为"https://yourWebIp:yourWebPort/webhook“
action_endpoint:
 url: "http://localhost:5055/webhook"
 
# 配置nlu(单独创建一个web项目):
#  url: "http://10.0.0.153:5000/"

# 配置tracker信息存储服务器
#tracker_store:
#    type: mongod
#    url: mongodb://localhost:27017
#    db: rasa
#    username:
#    password:
#    auth_source: rasa

2.3.3 action.py

 当Rasa NLU识别到用户输入Message的意图后,Rasa Core对话管理模块就会对其作出回应,而完成这个回应的模块就是action。Rasa Core支持三种action,即default actions、utter actions以及 custom action,这部分我们将在后面详细讲解。另外,本项目为了测试,还对接了图灵机器人和心知天气的API,代码就没有给出了,感兴趣的可以再文末Github源码中查看,这里只给出default action和custom action代码。具体如下:

from typing import Dict, Text, Any, List

from rasa_sdk import Tracker, Action
from rasa_sdk.events import UserUtteranceReverted, Restarted
from rasa_sdk.executor import CollectingDispatcher
from rasa_sdk.forms import FormAction

from actions import ChatApis
from actions.WeatherApis import get_weather_by_day
from requests import (
    ConnectionError,
    HTTPError,
    TooManyRedirects,
    Timeout
)


# action weather_form
class WeatherForm(FormAction):

    def name(self) -> Text:
        """Unique identifier of the form"""

        return "weather_form"

    @staticmethod
    def required_slots(tracker: Tracker) -> List[Text]:
        """A list of required slots that the form has to fill"""

        return ["date-time", "address"]

    def submit(
        self,
        dispatcher: CollectingDispatcher,
        tracker: Tracker,
        domain: Dict[Text, Any],
    ) -> List[Dict]:
        """Define what the form has to do
            after all required slots are filled"""
        address = tracker.get_slot('address')
        date_time = tracker.get_slot('date-time')

        date_time_number = text_date_to_number_date(date_time)

        if isinstance(date_time_number, str):  # parse date_time failed
            dispatcher.utter_message("暂不支持查询 {} 的天气"
                                     .format([address, date_time_number]));
         else:
             weather_data = get_text_weather_date(address, 
                                     date_time, date_time_number)
             dispatcher.utter_message(weather_data);
         return [Restarted()]
            
            
# action_default_fallback
class ActionDefaultFallback(Action):
    """Executes the fallback action and goes back to the previous state
    of the dialogue"""

    def name(self):
        return 'action_default_fallback'

    def run(self, dispatcher, tracker, domain):

        # 访问图灵机器人API(闲聊)
        text = tracker.latest_message.get('text')
        message = ChatApis.get_response(text)
        if message is not None:
            dispatcher.utter_message(message)
        else:
            dispatcher.utter_template('utter_default', tracker, silent_fail=True)
        return [UserUtteranceReverted()]

2.5 启动服务

2.5.1 启动Rasa和Action服务

(1)启动Rasa服务

 在Pycharm命令终端,输入下面命令:

# 启动rasa服务
# 该服务实现自然语言理解(NLU)和对话管理(Core)功能
# 注:该服务的--port默认为5005,如果使用默认则可以省略
python -m rasa run --port 5005 --endpoints configs/endpoints.yml --credentials configs/credentials.yml --debug
  • 参数说明
usage: rasa run [-h] [-v] [-vv] [--quiet] [-m MODEL] [--log-file LOG_FILE]
                [--endpoints ENDPOINTS] [-p PORT] [-t AUTH_TOKEN]
                [--cors [CORS [CORS ...]]] [--enable-api]
                [--remote-storage REMOTE_STORAGE]
                [--ssl-certificate SSL_CERTIFICATE]
                [--ssl-keyfile SSL_KEYFILE] [--ssl-ca-file SSL_CA_FILE]
                [--ssl-password SSL_PASSWORD] [--credentials CREDENTIALS]
                [--connector CONNECTOR] [--jwt-secret JWT_SECRET]
                [--jwt-method JWT_METHOD]
                {actions} ... [model-as-positional-argument]

positional arguments:
  {actions}
    actions             运行action server
  model-as-positional-argument 

optional arguments:
  -h, --help              
  						显示帮助信息;
  -m MODEL, --model MODEL 
  						指定训练好的模型路径,默认使用models目录。
  						如果模型存储路径改变,则需要该参数指定;
  --log-file LOG_FILE     
  						指定保存logs文件,默认为None;
  --endpoints ENDPOINTS   
  						指定endpoints.yml文件路径,默认为None;

Python Logging Options:
  -v, --verbose         
  						设置日志等级为INFO;
  -vv, --debug          
  						开启调试
  --quiet               
  						设置日志等级为WARNING,默认为None;

Server Settings:
  -p PORT, --port PORT  
  						设置运行rasa serve的端口号,默认为5005;
  -t AUTH_TOKEN, --auth-token AUTH_TOKEN
                        开启token身份验证,默认为None;
  --cors [CORS [CORS ...]]
  --enable-api          
  						启动web服务器API通道,默认值:False;
  --remote-storage REMOTE_STORAGE
                        设置rasa模型远程位置,如果有的话;
  --ssl-certificate SSL_CERTIFICATE
                        设置SSL证书,默认为None;
  --ssl-keyfile SSL_KEYFILE
                        设置SSL密钥文件,默认为None;
  --ssl-ca-file SSL_CA_FILE
                        设置CA文件便于SSL证书验证,默认为None;
  --ssl-password SSL_PASSWORD
  						设置SSL密钥文件密码,默认为None;

Channels:
  --credentials CREDENTIALS
                        指定credentials.yml文件路径;
  --connector CONNECTOR
                        Service to connect to. (default: None)

JWT Authentication:
  --jwt-secret JWT_SECRET
                        指定jwt-secret;
  --jwt-method JWT_METHOD
                        指定jwt-method;

 当在Pycharm的命令终端,看到下面的信息时说明启动成功
Rasa中文聊天机器人开发指南(1):入门篇_第5张图片
(2)启动Action服务

在Pycharm命令终端,输入下面命令:

# 启动action服务
# 注:该服务的--port默认为5055,如果使用默认则可以省略
Python -m rasa run actions --port 5055 --actions actions --debug 
  • 参数说明
usage: rasa run actions [-h] [-v] [-vv] [--quiet] [-p PORT]
                        [--cors [CORS [CORS ...]]] [--actions ACTIONS]
                        [--ssl-keyfile SSL_KEYFILE]
                        [--ssl-certificate SSL_CERTIFICATE]
                        [--ssl-password SSL_PASSWORD]

optional arguments:
  -h, --help            
  						显示帮助信息
  -p PORT, --port PORT  
  						指定action server的端口号,默认为5055;
  --cors [CORS [CORS ...]]
                        开启CORS;
  --actions ACTIONS     
  						指定action.py等文件所在包路径;
  --ssl-certificate SSL_CERTIFICATE
                        设置SSL证书,默认为None;
  --ssl-keyfile SSL_KEYFILE
                        设置SSL密钥文件,默认为None;
  --ssl-ca-file SSL_CA_FILE
                        设置CA文件便于SSL证书验证,默认为None;

Python Logging Options:
  -v, --verbose         
  						设置日志等级为INFO;
  -vv, --debug          
  						开启调试
  --quiet               
  						设置日志等级为WARNING,默认为None;

 当在Pycharm的命令终端,看到下面的信息时说明启动成功
Rasa中文聊天机器人开发指南(1):入门篇_第6张图片

2.5.2 创建、启动server.py

"""
    server.py
    ~~~~~~~~~

    web server,定义前端调用接口

    :date: 2020-02-14 14:36:00
    :author: by jiangdg
"""

from flask import Flask, jsonify
from flask import request
import requests
import json
import logging

app = Flask(__name__)


@app.route('/ai', methods=['GET', 'POST'])
def webToBot():
    """
    前端调用接口
        路径:/ai
        请求方式:GET、POST
        请求参数:content
    :return: response rasa响应数据
    """
    content = request.values.get('content')
    if content is None:
        return 'empty input'
    response = requestRasabotServer('jiangdg', content)
    # return response.text
    # utf-8转中文
    return response.text.encode('utf-8').decode("unicode-escape")


def requestRasabotServer(userid, content):
    """
        访问rasa服务
    :param userid: 用户id
    :param content: 自然语言文本
    :return:  json格式响应数据
    """
    params = {'sender': userid, 'message': content}
    botIp = '127.0.0.1'
    botPort = '5005'
    # https://rasa.com/docs/rasa/user-guide/connectors/your-own-website/#rest-channels
    # POST /webhooks/rest/webhook
    rasaUrl = "http://{0}:{1}/webhooks/rest/webhook".format(botIp, botPort)
    return requests.post(
        rasaUrl,
        data=json.dumps(params),
        headers={'Content-Type': 'application/json'}
    )


if __name__ == '__main__':

    print("##### webIp={}, webPort={}".format(webIp, webPort))
    # 初始化日志引擎
    fh = logging.FileHandler(encoding='utf-8', mode='a', filename='chitchat.log')
    logging.basicConfig(
        handlers=[fh],
        level=logging.INFO,
        format='%(asctime)s - %(levelname)s - %(message)s',
        datefmt='%a, %d %b %Y %H:%M:%S',
    )

    # 启动服务,开启多线程、debug模式
    # 浏览器访问http://127.0.0.1:8088/ai?content="你好"
    webIp = '127.0.0.1'
    webPort = '8088'
    app.run(
        host=webIp,
        port=int(webPort),
        threaded=True,
        debug=True
    )

  • 启动server.py
python server.py

2.6. 效果演示

Rasa ServerAction ServerServer.py运行后,在浏览器输入测试:

http://127.0.0.1:8088/ai?content=询广州明天的天气

终端调用效果为:

Rasa中文聊天机器人开发指南(1):入门篇_第7张图片

 当然,我这里只是为了演示功能是否正常,如果你对交互效果比较感兴趣,可以自己写一个APP或者web UI交互页面,调用该接口即可。另外就是,本项目目前还不完善,比如训练样本不足、NLU置信度较低以及对话样本中的unhappy情况没有考虑等等,这些问题将在这个系列接下来的文章进行讲解优化。最后,给出本项目的GitHub地址,如果觉得对你有用,欢迎starissues,我们共同讨论、学习!

RASA中文聊天机器人Github地址:ChitChatAssistant

你可能感兴趣的:(【Rasa,Stack】,【NLP】)