本文将介绍如何使用 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!
(Xiaoquan Kong) |