1. Rasa简介与安装
1.1 Ubuntu 16.04环境
1.2 Windows10环境
1.1 Rasa简介
1.2 Rasa安装(v1.9.4)
2. Rasa使用--构建简单聊天机器人
2.5.1 启动Rasa和Action服务
2.5.2 创建、启动server.py
2.3.1 credentials.yml
2.3.2 endpoints.yml
2.3.3 action.py
2.3.1 config.yml
2.3.2 模型训练
2.2.1 stories.md
2.2.2 domain.yml
2.1.1 nlu.md
2.1 构建NLU样本
2.2 构建Core样本
2.3 训练NLU和CORE模型
2.4 配置Http和Action
2.5 启动服务
2.6. 效果演示
RASA 开发中文指南系列博文:
Rasa中文聊天机器人开发指南(4):RasaX篇
Rasa中文聊天机器人开发指南(5):Action篇
注:本系列博客翻译自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/<timestamp>.tar.gz | your initial model |
rasa还提供了其他命令,详情参见此文。
5. 测试助手
$ sudo rasa shell
打印如下:
1. 创建一个新的python项目
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.0Summary: 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.0Location: 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
# 在线安装Mitiepip 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
Rasa工作原理:
首先,将用户输入的Message传递到Interpreter(Rasa NLU模块),该模块负责识别Message中的'意图(intent)“和提取所有'实体”(entity)数据;
其次,Rasa Core会将Interpreter提取到的意图和识别传给Tracker对象,该对象的主要作用是跟踪会话状态(conversation state);
第三,利用policy记录Tracker对象的当前状态,并选择执行相应的action,其中,这个action是被记录在Track对象中的;
最后,将执行action返回的结果输出即完成一次人机交互。
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_weatherslots: date-time: type: unfeaturized address: type: unfeaturizedentities: - date-time - addressactions: - 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_fallbackforms: - weather_formresponses: 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: '<verify>'# secret: '<your secret>'# page-access-token: '<your page access token>'#slack:# slack_token: '<your slack token>'# slack_channel: '<the slack channel>'#socketio:# user_message_evt: <event name for user message># bot_message_evt: <event name for but messages># session_persistence: <true/false>#mattermost:# url: 'https://<mattermost instance>/api/v4'# team: '<mattermost team>'# user: '<bot username>'# pw: '<bot token>'# webhook_url: '<callback URL>'# you don't need to provide anything here - this channel doesn't# require any credentialsrest:
如果希望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, Listfrom rasa_sdk import Tracker, Actionfrom rasa_sdk.events import UserUtteranceReverted, Restartedfrom rasa_sdk.executor import CollectingDispatcherfrom rasa_sdk.forms import FormActionfrom actions import ChatApisfrom actions.WeatherApis import get_weather_by_dayfrom requests import ( ConnectionError, HTTPError, TooManyRedirects, Timeout)# action weather_formclass 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_fallbackclass 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的命令终端,看到下面的信息时说明启动成功
:
在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, jsonifyfrom flask import requestimport requestsimport jsonimport 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
当Rasa Server、Action Server和Server.py运行后,在浏览器输入测试:
http://127.0.0.1:8088/ai?content=询广州明天的天气
终端调用效果为:
当然,我这里只是为了演示功能是否正常,如果你对交互效果比较感兴趣,可以自己写一个APP或者web UI交互页面,调用该接口即可。另外就是,本项目目前还不完善,比如训练样本不足、NLU置信度较低以及对话样本中的unhappy情况没有考虑等等,这些问题将在这个系列接下来的文章进行讲解优化。最后,给出本项目的GitHub地址,如果觉得对你有用,欢迎star
和issues
,我们共同讨论、学习!
联系客服