RASA 开发中文指南系列博文:
注:本系列博客翻译自Rasa官方文档,并融合了自己的理解和项目实战,同时对文档中涉及到的技术点进行了一定程度的扩展,目的是为了更好的理解Rasa工作机制。与本系列博文配套的项目GitHub地址:ChitChatAssistant,欢迎star
和issues
,我们共同讨论、学习!
Rasa是一个开源机器学习框架,用于构建上下文AI助手和聊天机器人。Rasa有两个主要模块:
意图识别
和槽值
提取,它把用户的输入转换为结构化数据;Rasa X是一个工具,可帮助您构建、改进和部署由Rasa框架提供支持的AI Assistants
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/ |
your initial model |
rasa还提供了其他命令,详情参见此文。
5. 测试助手
$ sudo rasa shell
1. 创建一个新的python项目
注意,要完成这步你需要确保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项目中,我们需要手动创建之,最后应该如下图所示:
注:如果使用默认的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
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)的天气
对话模型,或称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}
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: "没听懂,请换种说法吧~"
训练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
当所有样本和配置文件准备好后,接下来就是训练模型了,打开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;
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:
如果希望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
当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()]
(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的命令终端,看到下面的信息时说明启动成功
:
(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的命令终端,看到下面的信息时说明启动成功
:
"""
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
)
python server.py
当Rasa Server、Action Server和Server.py运行后,在浏览器输入测试:
http://127.0.0.1:8088/ai?content=询广州明天的天气
终端调用效果为:
当然,我这里只是为了演示功能是否正常,如果你对交互效果比较感兴趣,可以自己写一个APP或者web UI交互页面,调用该接口即可。另外就是,本项目目前还不完善,比如训练样本不足、NLU置信度较低以及对话样本中的unhappy情况没有考虑等等,这些问题将在这个系列接下来的文章进行讲解优化。最后,给出本项目的GitHub地址,如果觉得对你有用,欢迎star
和issues
,我们共同讨论、学习!
RASA中文聊天机器人Github地址:ChitChatAssistant