导航菜单
首页 » 问答 » 正文

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

文章目录

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)

二维码