使用 Rasa 构建天气查询机器人

本文将介绍如何使用 Rasa NLU 和 Rasa Core 来构建一个简单的带 Web UI 界面的中文天气情况问询机器人(chatbot)。

源代码地址

https://github.com/howl-anderson/WeatherBot

功能

这个机器人可以根据你提供的城市(北京、上海等)和日期(明天、后天等),查询出相应的天气预报。

功能截图

特性

使用 Frame-based 对话管理方案,如果上述两个 Slot (既城市和天气),有任意一个用户未提供,对话管理系统会负责让你澄清相关 Slot 的值。

能力范围

受限于天气数据提供方的能力,这个机器人只能查询中国大陆地区市级城市三天以内(今天,明天,后天)的气象数据,不能查询过去(昨天,前天)等历史数据。

受限于开发时间,这个机器人不提供诸如这个星期五、下个星期一这种需要计算才能得到日期给定方式。也不能提供诸如绝对日期:三月一号、六一儿童节日这种日期的查询能力。

因为使用的是免费的天气查询接口,所以会有配额限制,可能会因为超出调用次数,而在一个小时内不能用。同时网络查询接口可能存在不稳定因素,导致没有结果返回或者出现异常尝试多次重新发送请求可解决问题

Rasa NLU

Rasa NLU 提供了提取用户意图和词槽的功能。具体原理和使用等不在这里详述,请访问文章TODO。这里我们使用的 Rasa NLU 的 pipeline 配置(在项目文件nlu_model_config.yaml中)如下:

language:"zh"

pipeline:

-name:"nlp_mitie"

model:"data/total_word_feature_extractor.dat"

-name:"tokenizer_jieba"

-name:"ner_mitie"

-name:"ner_synonyms"

-name:"intent_featurizer_mitie"

-name:"intent_classifier_sklearn"

所用的训练数据 (在项目文件nlu.json中)如下(内容过长,已做截断):

{

"rasa_nlu_data": {

"common_examples": [

{

"intent":"weather_address_date-time",

"entities": [

{

"start":2,

"end":4,

"value":"上海",

"entity":"address"

},

{

"start":4,

"end":6,

"value":"明天",

"entity":"date-time"

}

],

"text":"我要上海明天的天气"

},

{

"intent":"weather_address_date-time",

"entities": [

{

"start":,

"end":2,

"value":"上海",

"entity":"address"

},

{

"start":2,

"end":4,

"value":"明天",

"entity":"date-time"

}

],

"text":"上海明天的天气"

},

...

}

}

训练所用的命令为 (在项目文件train_NLU.bash中):

python-mrasa_nlu.train-cnlu_model_config.yaml-dnlu.json--fixed_model_namecurrent-omodels

Rasa Core

Rasa Core 负责对话管理。具体原理和使用等不在这里详述,请访问文章TODO。Rasa core 需要提供一个 domain 文件,里面设定了整个对话机器人的小宇宙,它能知道的所有的意图、词槽和动作。

本项目所用的 domain (在项目文件domain.yml中),其内容为:

intents:

-greet

-goodbye

-weather_address_date-time

-weather_address

-weather_date-time

slots:

address:

type:text

date-time:

type:text

matches:

type:unfeaturized

entities:

-address

-date-time

actions:

-utter_greet

-utter_ask_address

-utter_ask_date-time

-utter_working_on_it

-bot.ActionReportWeather

-utter_report_weather

-utter_goodbye

templates:

utter_greet:

-text:"你好,请说出需要提供天气预测服务的地点和时间"

utter_working_on_it:

-text:"正在查询中,请稍后 ..."

utter_goodbye:

-text:"再见!"

utter_ask_address:

-text:"哪里呢?"

utter_ask_date-time:

-text:"什么时候?"

utter_report_weather:

-text:""

utter_other:

-text:"系统不明白您说的话"

Rasa Core 还需要通过的形式让框架学习正确的对话管理样本,格式为 Markdown 格式。本项目中的 Story (在项目文件stories.md中)定义如下(内容过长,已做截断):

## simple path with greet

*greet

-utter_greet

*weather_address_date-time{"address": "上海", "date-time": "明天"}

-utter_working_on_it

-action_report_weather

-utter_report_weather

## simple path

*weather_address_date-time{"address": "上海", "date-time": "明天"}

-utter_working_on_it

-action_report_weather

-utter_report_weather

## address + date-time path with greet

*greet

-utter_greet

*weather_address{"address": "上海"}

-utter_ask_date-time

*weather_date-time{"date-time": "明天"}

-utter_working_on_it

-action_report_weather

-utter_report_weather

...

训练所用的命令为 (在项目文件train_CORE.bash中):

python-mrasa_core.train-sstories.md-ddomain.yml-omodels/dialogue--epochs500

依赖

python 版本

python 3

python 依赖

pip install -r requirements.txt

下载数据和模型

: 从https://github.com/howl-anderson/MITIE_Chinese_Wikipedia_corpus下载,解压缩后放置到对应位置

:通过运行生成

:通过运行生成

功能入口

申请 API key

本项目目前使用心知天气提供天气数据,该平台为个人提供免费的 API,但任然需要用户注册并申请 API key 才能使用。用户注册后可以自行找到。

启动服务

将如下的替换成你的 API key,然后执行即可

SENIVERSE_KEY=xxx python ./webchat.py

启动成功后,请用浏览器访问http://localhost:5500, 你将得到 web 页面,have fun!

在线演示

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180909G1488200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券