文章目录
RASA 开发中文指南系列博文:
注:本系列博客翻译自Rasa官方文档,并融合了自己的理解和项目实战,同时对文档中涉及到的技术点进行了一定程度的扩展,目的是为了更好的理解Rasa工作机制。与本系列博文配套的项目地址:,欢迎star和,我们共同讨论、学习!
1. Rasa简介与安装 1.1 Rasa简介
Rasa是一个开源机器学习框架,用于构建上下文AI助手和聊天机器人。Rasa有两个主要模块:
Rasa X是一个工具,可帮助您构建、改进和部署由Rasa框架提供支持的AI
1.2 Rasa安装(v1.9.4) 1.1 16.04环境
1. 安装.6和pip
Rasa框架要求的版本为3.6以上,由于 16.04预装的是 2.7,因此在安装rasa之前我们需要安装.6或者 3.7,这里以安装.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 main
deb - main
deb - main
deb - main
deb - main
deb-src main
deb-src - main
deb-src - main
deb-src - main
deb-src - main
(3)使软件源生效
$ sudo apt-get update
2. 安装,即创建虚拟环境
# 安装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下载包时容易出现“ time out”异常,这是由于默认pip源或网络不稳定导致,我们可以使用清华大学的pip源镜像,具体配置如下:
# 如果已经存在pip.conf文件,只需要执行第二步即可
$ sudo mkdir ~/.pip
$ sudo vim ~/.pip/pip.conf
然后,pip.conf的文件内容如下:
[]
index-url =
[]
-host=
-pip--check = true
= 6000
3. 创建新的项目,运行在虚拟环境
$ sudo mkdir chitchat_assistant
$ sudo cd chitchat_assistant
$ sudo virtualenv env
$ sudo source env/bin/activate
如果看到以下结果说明操作成功:
这里我们创建一个名为的项目,然后为其配置虚拟环境,其中env是虚拟环境的名称,会自动被创建。对于该项目,使用pip下载的所有苦将独立于系统或其他项目环境,保存在当前目录的env的目录下,如果需要退出虚拟环境,可以再项目目录使用下面命令:
$ sudo deactivate
4. 安装rasa,自动生成rasa项目所需文件
# 安装rasa, 由于网络问题,延长超时时间
# 如果仍然超时异常,多执行几次
$ sudo pip --default-timeout=500 install -U rasa
# 生成文件
$ sudo rasa init --no-prompt
注:如果出现No found for >=2.1.0异常,可以通过执行pip3 -- rasa命令解决。
执行rasa init命令的目的为自动生成开发一个Rasa项目所需的所有必要文件,包括执行训练NLU和对话模型。有了这些文件我们便可以不作任何修改就能使Rasa项目跑起来,更重要的是,对于未来一些具体业务来说,也是修改这些文件的内容,这些文件名称及其作用如下表所示(还是英文更原汁原味):
.pyan empty file that helps find your
.py
code for your
.yml ‘*’
of your NLU and Core
.yml
for to other
data/nlu.md ‘*’
your NLU data
data/.md ‘*’
your
.yml ‘*’
your ’s
.yml
for to like fb
/.tar.gz
your model
rasa还提供了其他命令,详情参见此文。
5. 测试助手
$ sudo rasa shell
打印如下:
1.2 环境
1. 创建一个新的项目
注意,要完成这步你需要确保win10已经安装.6或者.7,由于我是在 IDE上开发的,如果你希望与我相同的环境,那么也需要安装,这里推荐2018.3.5 版本。
2. 安装rasa
pip --default-timeout=500 install -U rasa
打开命令终端,输入以上命令安装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] # 注:由于第一步始终没成功过,没尝试过这个命令的意义
由于自己在线安装尝试了很多次都拉不下来,因此只能走离线安装的方式,有三个步骤:
(2)Jieba
# 安装Jieba中文分词
pip install jieba
4. 创建rasa配置文件
当rasa开发环境安装好,接下来就需要创建rasa开发所有必要文件,而这些文件就是第1.1(4)小节列举出来的那些文件。在的项目中,我们需要手动创建之,最后应该如下图所示:
注:如果使用默认的pip源很慢,也可以选择使用清华镜像。在C盘用户目录下创建一个命名为“pip”的文件夹,如C:\Users\\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+.6+rasa1.9.1报 : DLL load 异常?
解决:rasa1.9使用的是.1.0,该版本需要DLL,下载 .x64.exe安装即可解决。
Q2:缺少slack模块?
解决:pip slack
pip
Q3:: ‘...’ has no ‘pb’?
解决:注释掉"/lib/.6/site-///v1.py"中
# = .pb
# = .
2. Rasa使用–构建简单聊天机器人
Rasa工作原理:
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 .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 .yml
.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 .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 模型训练
当所有样本和配置文件准备好后,接下来就是训练模型了,打开命令终端执行下面的命令,该命令会同时训练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;
评论(0)