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

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

源代码地址

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

功能

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

功能截图

特性

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

能力范围

  • 受限于天气数据提供方的能力,这个机器人只能查询 中国大陆地区市级城市 三天以内 (今天,明天,后天) 的气象数据,不能查询过去(昨天,前天)等历史数据。
  • 受限于开发时间,这个机器人 不提供 诸如 这个星期五、下个星期一 这种需要计算才能得到日期给定方式。也 不能提供 诸如 绝对日期:三月一号、六一儿童节日 这种日期的查询能力。
  • 因为使用的是免费的天气查询接口,所以 会有配额限制,可能会因为 超出调用次数 ,而在一个小时内不能用。同时网络查询接口可能存在不稳定因素,导致 没有结果返回或者出现异常尝试多次重新发送请求可解决问题

在线演示

Demo for 天气预报查询机器人

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": 0,
            "end": 2,
            "value": "上海",
            "entity": "address"
          },
          {
            "start": 2,
            "end": 4,
            "value": "明天",
            "entity": "date-time"
          }
        ],
        "text": "上海明天的天气"
      },
      ...
  }
}

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

python -m rasa_nlu.train -c nlu_model_config.yaml -d nlu.json --fixed_model_name current -o models

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: "{matches}"

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

Rasa Core 还需要通过 故事(story) 的形式让框架学习正确的对话管理样本,格式为 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 -m rasa_core.train -s stories.md -d domain.yml -o models/dialogue --epochs 500

依赖

python 版本

python 3

python 依赖

pip install -r requirements.txt

下载数据和模型

功能入口

申请 API key

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

启动服务

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

SENIVERSE_KEY=xxx python ./webchat.py

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271