大家好,欢迎来到IT知识分享网。
RASA 开发中文指南系列博文:
- Rasa中文聊天机器人开发指南(1):入门篇
- Rasa中文聊天机器人开发指南(2):NLU篇
- Rasa中文聊天机器人开发指南(3):Core篇
- Rasa中文聊天机器人开发指南(4):RasaX篇
- Rasa中文聊天机器人开发指南(5):Action篇
注:本系列博客翻译自Rasa官方文档,并融合了自己的理解和项目实战,同时对文档中涉及到的技术点进行了一定程度的扩展,目的是为了更好的理解Rasa工作机制。与本系列博文配套的项目GitHub地址:ChitChatAssistant,欢迎star
和issues
,我们共同讨论、学习!
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
删除文件所有内容,将其替换为国内源,我这里使用网易的。
(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
的文件内容如下:
3. 创建新的项目,运行在python虚拟环境
$ sudo mkdir chitchat_assistant $ sudo cd chitchat_assistant $ sudo virtualenv env $ sudo source env/bin/activate
$ 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.2 Windows10环境
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源码根目录,执行下面的命令:
(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
2. Rasa使用–构建简单聊天机器人
- 首先,将用户输入的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: "<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 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的命令终端,看到下面的信息时说明启动成功
:
(2)启动Action服务
在Pycharm命令终端,输入下面命令:
# 启动action服务 # 注:该服务的--port默认为5055,如果使用默认则可以省略 Python -m rasa run actions --port 5055 --actions actions --debug
- 参数说明
- 当在Pycharm的命令终端,看到下面的信息时说明
启动成功
:
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;
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 Server、Action Server和Server.py运行后,在浏览器输入测试:
http://127.0.0.1:8088/ai?content=询广州明天的天气
终端调用效果为:
当然,我这里只是为了演示功能是否正常,如果你对交互效果比较感兴趣,可以自己写一个APP或者web UI交互页面,调用该接口即可。另外就是,本项目目前还不完善,比如训练样本不足、NLU置信度较低以及对话样本中的unhappy情况没有考虑等等,这些问题将在这个系列接下来的文章进行讲解优化。最后,给出本项目的GitHub地址,如果觉得对你有用,欢迎
star
和issues
,我们共同讨论、学习!RASA中文聊天机器人Github地址:ChitChatAssistant
参考:Rasa中文聊天机器人开发指南(1):入门篇
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/140316.html