Rasa 基于规则的对话管理: 天气预报机器人

编程入门 行业动态 更新时间:2024-10-26 10:33:02

Rasa 基于规则的对话管理: 天气预报<a href=https://www.elefans.com/category/jswz/34/1771107.html style=机器人"/>

Rasa 基于规则的对话管理: 天气预报机器人

文章目录

    • 1. fallback
      • NLU fallback
    • 2. 意图触发动作
    • 3. 表单
      • 定义表单
      • 激活表单
      • 执行表单任务
    • 4. 天气预报机器人
      • nlu.yml
      • stories.yml
      • rules.yml
      • cities.yml
      • domain.yml
      • config.yml
      • endpoints.yml
      • credentials.yml
      • actions.py
      • 测试

learn from

1. fallback

机器人不明白用户意思的时候,兜底的操作,答出 “对不起,xxx” 的友好提示

NLU fallback

pipeline:- name: FallbackClassifierthreshold: 0.6  ambiguity_threshold: 0.1

配置的意思:意图分类组件预测的结果中,最高的置信度 <= 0.6 or 最高的前2个意图得分之差 <= 0.1 ,那么 NLU 的意图 就会被替换为 nlu_fallback

比如,

rules:- rule: 要求用户重说steps:- intent: nlu_fallback- action: utter_please_rephrase

如果预测的下一个动作 置信度不高,或者有两个很相近的,也可以配置策略

policies:- name: RulePolicycore_fallback_threshold: 0.3core_fallback_action_name: "action_dafault_fallback"  # 很模糊时,配置执行该动作enable_fallback_prediction: True

2. 意图触发动作

  • 自定义意图触发动作
rules:
- rule: 意图 -> 动作映射steps:- intent: some_intent- action: some_action

在 policy 字段值为 RulePolicy 时,用户表达 意图后,100% 触发 配置的动作

3. 表单

理解用户意图后,引导用户填表,完毕后执行动作

需要规则策略

policies:- name: RulePolicy

定义表单

forms:weather_form:required_slots: # 表单必须指定该字段- address- date-time

激活表单

设定什么时候进入该表单, rule 指定

rules:- rule: 激活 rulesteps:- intent: weather  # 出现该意图- action: weather_form # 执行该动作- active_loop: weather_form # 进入表单填词槽-询问过程

执行表单任务

满足表单条件后,词槽全部填好,执行任务

- rule: 提交 formcondition:- active_loop: weather_formsteps:- action: weather_form- active_loop: null- slot_was_set:- requested_slot: null  # 所有词槽填完- action: action_weather_form_submit  # 执行动作

4. 天气预报机器人

tree

.
├── actions.py
├── config.yml
├── credentials.yml
├── data
│   ├── cities.yml
│   ├── nlu.yml
│   ├── responses.yml
│   ├── rules.yml
│   └── stories.yml
├── domain.yml
├── endpoints.yml
├── index.html
├── index.js
├── __init__.py
├── media
│   └── demo.png
├── README.md
└── service├── __init__.py├── normalization.py└── weather.py

nlu.yml

version: "3.0"
nlu:- intent: goodbyeexamples: |- 拜拜- 再见- 拜- 退出- 结束- intent: greetexamples: |- 你好- 您好- hello- hi- 喂- 在么- intent: weatherexamples: |- 显示天气- 天气- 我需要不需要雨靴- 我该穿外套吗- 去外边要穿外衣吗- 去外边要带夹克吗- 外边需要雨伞吗- 天气是不是很凉快- 最近的天气是不是很冷- 天气预报- 天气很冷吗- 天气会不会很热- 天气温和吗- [北京](address)会不会阴雨- [上海](address)什么天气- 不好意思可以帮我查[香港](address)的天气- [厦门](address)啥天气- [上海](address)多热- [台北市](address)温度- [台南市](address)几度- [上海](address)啥温度- [台南市南区](address)现在几度- [上海](address)的天气- [上海](address)的天气怎么样- [首都](address)的天气- [首都](address)的天气怎么样- [魔都](address)的天气- [魔都](address)的天气怎么样- 我要[上海](address)[明天](date-time)的天气- 我要[上海](address)[后天](date-time)的天气- [上海](address)[明天](date-time)的天气- [上海](address)[昨天](date-time)的天气- [上海](address)[前天](date-time)的天气- [上海](address)[后天](date-time)的天气- [下个星期五](date-time)[南京](address)的天气- [明天](date-time)[北京](address)什么天气- [沈阳](address)[五天后](date-time)的天气怎么样- [下星期一](date-time)[北京](address)的天气呢- [今天](date-time)[天津](address)的预报- [青岛](address)[明天](date-time)的- [下星期日](date-time)的[苏州](address)- [两天后](date-time)的[上海](address)- [三天后](date-time)的[武汉](address)呢- [三天后](date-time)[杭州](address)多云吗- [十月三号](date-time)[沈阳](address)会下雨吗- [明天](date-time)[台北](address)天气- [今天](date-time)[台北](address)的天气如何- [三天后](date-time)[台北](address)的天气- [北京](address)[今天](date-time)的天气如何- [杭州](address)[今天](date-time)的天气怎么样- [下个星期五](date-time)[台北](address)天气好吗- [今天](date-time)[台北](address)天气如何- [今天](date-time)[上海](address)的天气- [两天前](date-time)[上海](address)的天气如何- [今天](date-time)[台北市](address)的天气如何- [明天](date-time)[北京](address)我需要不需要雨衣- [下星期日](date-time)[北京](address)外边需要毛线帽吗- [今天](date-time)[北京](address)去外边要穿羊毛袜吗- [三月五号](date-time)[北京](address)去外边要穿外衣吗- [下个星期五](date-time)我在[厦门](address)需要带伞吗- [上海](address)[三天后](date-time)多少度- [明天](date-time)[上海](address)的温度如何- [今天](date-time)[上海](address)的气温如何- [明天](date-time)[马来西亚](address)最近的天气是不是很冷- [下星期一](date-time)[马来西亚](address)天气凉快吗- [下星期日](date-time)[马来西亚](address)的天气会很热吗- [首都](address)[明天](date-time)的天气- [魔都](address)[下午](date-time)的天气- [首都](address)[明天](date-time)的天气怎么样- [魔都](address)[下午](date-time)的天气怎么样- [今天](date-time)天气如何- 你知道[现在](date-time)外面冷不冷么- 我还想知道[一月一号](date-time)的天气- 稍后[晚上](date-time)会下雨吗- [今天](date-time)会不会晴朗- [昨天](date-time)几度- [9月初四](date-time)的天气如何- [明天](date-time)天气多少摄氏度- [今天](date-time)天气- [昨天](date-time)什么天气- [明天](date-time)要不要戴手套- [今天](date-time)去外边要穿毛衣吗- [明天](date-time)去外边要带雨伞吗- [两天后](date-time)我需要不需要雨靴- [下星期一](date-time)在外边需要墨镜吗- [明天](date-time)的天气会温和吗- [今天](date-time)天气很热不- [今天](date-time)天气几度- [两天后](date-time)的天气会不会很冷- [明天](date-time)的天气是不是很暖- intent: info_dateexamples: |- [明天](date-time)- [后天](date-time)- [下个星期日](date-time)怎么样- 还需要[昨天](date-time)的- 我还要[昨天](date-time)的- [明天](date-time)如何- [后天](date-time)如何- [星期六](date-time)呢- [后天](date-time)的呢- [明天](date-time)的怎么说- [两天后](date-time)的大概什么样- [前天](date-time)的- 帮我查查[三天前](date-time)- 帮我查查[下星期五](date-time)的- 还要[明天](date-time)的- intent: info_addressexamples: |- 告诉我[广州](address)怎么样- [广州](address)- 那么[辽宁](address)呢- [北京](address)啥情况- [厦门](address)怎么样- [武汉](address)呢- [香港](address)呢- 我在[杭州](address)- [上海](address)- 在[宁波](address)呢- [宁波](address)- [首都](address)- intent: affirmexamples: |- 是- 是的- 没问题- 好- 好的- 可以- 挺好- 没错- 继续- 没毛病- intent: denyexamples: |- 不- 不行- 没- no- 不可以- 算了- 不要- 不要了- 没有- intent: stopexamples: |- 停- 停止- intent: chitchat/whoyouareexamples: |- 你是谁啊- 你是谁啊?- 你是谁啊?- 你叫什么名字- 你叫什么名字呢- 你叫什么呀- 你叫什么呀?- 你叫什么呀?- 介绍一下自己- 介绍自己- intent: chitchat/whatyoucandoexamples: |- 你能干啥- 你能干什么- 你能干什么呢- 你能干啥呀- 你能干啥呀?- 你能干啥呀?- 你能做什么- 你能做什么?- 你能做什么?- 你能做什么呢- 你能做什么呢?- 你能做什么呢?- 你有哪些技能- 你有哪些技能?- 你有哪些技能?- 你的本领是什么- 你的本领是什么呢- synonym: 下个星期一examples: |- 下星期一- synonym: 今天examples: |- 早上- 中午- 晚上- 下午- 傍晚- 今日- synonym: 明天examples: |- 明日- synonym: 北京examples: |- 首都- synonym: 上海examples: |- 魔都

stories.yml

version: "3.0"
stories:- story: greetsteps:- intent: greet- action: utter_greet- story: say goodbyesteps:- intent: goodbye- action: utter_goodbye- story: chitchatsteps:- intent: chitchat- action: respond_chitchat- story: form with stop then denysteps:- or:- intent: weather- intent: weatherentities:- address: 上海- intent: weatherentities:- date-time: 明天- intent: weatherentities:- date-time: 明天- address: 上海- action: weather_form- active_loop: weather_form- intent: stop- action: utter_ask_continue- intent: deny- action: action_deactivate_loop- active_loop: null

rules.yml

version: "3.0"
rules:- rule: activate weather formsteps:- intent: weather- action: weather_form- active_loop: weather_form- rule: Submit formcondition:# Condition that form is active.- active_loop: weather_formsteps:- action: weather_form- active_loop: null- slot_was_set:- requested_slot: null# The action we want to run when the form is submitted.- action: action_weather_form_submit

cities.yml

version: "3.0"
nlu:- lookup: citiesexamples: |- 江宁区- 常德市西洞庭管理区- 常德市津市市- 桂阳县

domain.yml

version: "3.0"
session_config:session_expiration_time: 60carry_over_slots_to_new_session: true
intents:- goodbye- greet- weather- chitchat- deny- stop- affirm- info_date- info_address
entities:- address- date-time
slots:address:type: textinfluence_conversation: falsemappings:- entity: addresstype: from_entitydate-time:type: textinfluence_conversation: falsemappings:- entity: date-timetype: from_entity
responses:utter_greet:- text: 你好,请说出需要提供天气预测服务的地点和时间utter_goodbye:- text: 再见!utter_ask_address:- text: 想查询哪里的天气呢?utter_ask_date-time:- text: 想查询什么时候的天气呢?utter_ask_continue:- text: 是否要继续?utter_default:- text: 系统不明白您说的话,请换个说法。
actions:- utter_ask_address- utter_ask_date-time- utter_goodbye- utter_greet- utter_ask_continue- utter_default- respond_chitchat- action_weather_form_submit
forms:weather_form:ignored_intents: []required_slots:- address- date-time

config.yml

recipe: default.v1
language: zh
pipeline:- name: JiebaTokenizer- name: LanguageModelFeaturizermodel_name: bertmodel_weights: bert-base-chinese- name: RegexFeaturizer- name: DIETClassifierepochs: 100learning_rate: 0.001tensorboard_log_directory: ./log- name: ResponseSelectorepochs: 100learning_rate: 0.001- name: EntitySynonymMapper
policies:- name: MemoizationPolicy- name: TEDPolicy- name: RulePolicy

endpoints.yml

action_endpoint:url: "http://localhost:5055/webhook"

credentials.yml

socketio:user_message_evt: user_utteredbot_message_evt: bot_utteredsession_persistence: falserasa:url: "http://localhost:5002/api"

actions.py

from typing import Any, Dict, List, Textfrom rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcherfrom service.normalization import text_to_date
from service.weather import get_text_weather_dateclass WeatherFormAction(Action):def name(self) -> Text:return "action_weather_form_submit"def run(self, dispatch: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any]) -> List[Dict]:city = tracker.get_slot("address")date_text = tracker.get_slot("date-time")date_object = text_to_date(date_text)if not date_object:  # parse date_time failedmsg = "暂不支持查询 {} 的天气".format([city, date_text])dispatch.utter_message(msg)else:try:weather_data = get_text_weather_date(city, date_object, date_text)except Exception as e:exec_msg = str(e)dispatch.utter_message(exec_msg)else:dispatch.utter_message(weather_data)return []

测试

rasa train

搜索 心知天气,注册获取免费的 api key
运行动作服务器 SENIVERSE_KEY=XXX rasa run actions
windows set %SENIVERSE_KEY%=xxx

rasa run --cors "*"
python -m http.server
  • 测试结果:

  • 缺少词槽的情况:

  • 上下文继承

更多推荐

Rasa 基于规则的对话管理: 天气预报机器人

本文发布于:2024-03-12 15:26:18,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1731818.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:机器人   天气预报   规则   Rasa

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!