织梦CMS - 轻松建站从此开始!

罗索

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

jackyhwei 发布于 2020-11-27 14:46 点击:次 
本文将介绍如何使用 Rasa NLU 和 Rasa Core 来构建一个简单的带 Web UI 界面的中文天气情况问询机器人(chatbot)。 源代码地址 https://github.com/howl-anderson/WeatherBot 功能 这个机器人可以根据你提供的城市
TAG: 机器人  NLU  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 中)如下:

  1. language: "zh" 
  2.  
  3. pipeline: 
  4. - name: "nlp_mitie" 
  5.   model: "data/total_word_feature_extractor.dat" 
  6. - name: "tokenizer_jieba" 
  7. - name: "ner_mitie" 
  8. - name: "ner_synonyms" 
  9. - name: "intent_featurizer_mitie" 
  10. - name: "intent_classifier_sklearn" 

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

  1.   "rasa_nlu_data": { 
  2.     "common_examples": [ 
  3.       { 
  4.         "intent": "weather_address_date-time", 
  5.         "entities": [ 
  6.           { 
  7.             "start": 2, 
  8.             "end": 4, 
  9.             "value": "上海", 
  10.             "entity": "address" 
  11.           }, 
  12.           { 
  13.             "start": 4, 
  14.             "end": 6, 
  15.             "value": "明天", 
  16.             "entity": "date-time" 
  17.           } 
  18.         ], 
  19.         "text": "我要上海明天的天气" 
  20.       }, 
  21.       { 
  22.         "intent": "weather_address_date-time", 
  23.         "entities": [ 
  24.           { 
  25.             "start": 0, 
  26.             "end": 2, 
  27.             "value": "上海", 
  28.             "entity": "address" 
  29.           }, 
  30.           { 
  31.             "start": 2, 
  32.             "end": 4, 
  33.             "value": "明天", 
  34.             "entity": "date-time" 
  35.           } 
  36.         ], 
  37.         "text": "上海明天的天气" 
  38.       }, 
  39.       ... 
  40.   } 

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

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

Rasa Core

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

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

  1. intents: 
  2.   - greet 
  3.   - goodbye 
  4.   - weather_address_date-time 
  5.   - weather_address 
  6.   - weather_date-time 
  7.  
  8. slots: 
  9.   address: 
  10.     type: text 
  11.   date-time: 
  12.     type: text 
  13.   matches: 
  14.     type: unfeaturized 
  15.  
  16. entities: 
  17.   - address 
  18.   - date-time 
  19.  
  20. actions: 
  21.   - utter_greet 
  22.   - utter_ask_address 
  23.   - utter_ask_date-time 
  24.   - utter_working_on_it 
  25.   - bot.ActionReportWeather 
  26.   - utter_report_weather 
  27.   - utter_goodbye 
  28.  
  29. templates: 
  30.   utter_greet: 
  31.     - text: "你好,请说出需要提供天气预测服务的地点和时间" 
  32.  
  33.   utter_working_on_it: 
  34.     - text: "正在查询中,请稍后 ..." 
  35.  
  36.   utter_goodbye: 
  37.     - text: "再见!" 
  38.  
  39.   utter_ask_address: 
  40.     - text: "哪里呢?" 
  41.  
  42.   utter_ask_date-time: 
  43.     - text: "什么时候?" 
  44.  
  45.   utter_report_weather: 
  46.     - text: "{matches}" 
  47.  
  48.   utter_other: 
  49.     - text: "系统不明白您说的话" 

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

  1. ## simple path with greet 
  2. * greet 
  3.   - utter_greet 
  4. * weather_address_date-time{"address": "上海", "date-time": "明天"} 
  5.   - utter_working_on_it 
  6.   - action_report_weather 
  7.   - utter_report_weather 
  8.  
  9. ## simple path 
  10. * weather_address_date-time{"address": "上海", "date-time": "明天"} 
  11.   - utter_working_on_it 
  12.   - action_report_weather 
  13.   - utter_report_weather 
  14.  
  15. ## address + date-time path with greet 
  16. * greet 
  17.   - utter_greet 
  18. * weather_address{"address": "上海"} 
  19.   - utter_ask_date-time 
  20. * weather_date-time{"date-time": "明天"} 
  21.   - utter_working_on_it 
  22.   - action_report_weather 
  23.   - utter_report_weather 
  24.  
  25. ... 

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

  1. python -m rasa_core.train -s stories.md -d domain.yml -o models/dialogue --epochs 500 

依赖

python 版本

python 3

python 依赖

  1. pip install -r requirements.txt 

下载数据和模型

功能入口

申请 API key

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

启动服务

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

  1. SENIVERSE_KEY=xxx python ./webchat.py 

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

(Xiaoquan Kong)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/202011/17771.html]
本文出处:Xiaoquan Kong 作者:Xiaoquan Kong 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
相关文章
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容