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

news2024/11/20 22:39:57

文章目录

    • 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 https://github.com/Chinese-NLP-book/rasa_chinese_book_code

1. fallback

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

NLU fallback

pipeline:
  - name: FallbackClassifier
    threshold: 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: RulePolicy
    core_fallback_threshold: 0.3
    core_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: 激活 rule
    steps:
    - intent: weather  # 出现该意图
    - action: weather_form # 执行该动作
    - active_loop: weather_form # 进入表单填词槽-询问过程

执行表单任务

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

- rule: 提交 form
  condition:
    - active_loop: weather_form
  steps:
    - 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: goodbye
    examples: |
      - 拜拜
      - 再见
      - 拜
      - 退出
      - 结束
  - intent: greet
    examples: |
      - 你好
      - 您好
      - hello
      - hi
      - 喂
      - 在么
  - intent: weather
    examples: |
      - 显示天气
      - 天气
      - 我需要不需要雨靴
      - 我该穿外套吗
      - 去外边要穿外衣吗
      - 去外边要带夹克吗
      - 外边需要雨伞吗
      - 天气是不是很凉快
      - 最近的天气是不是很冷
      - 天气预报
      - 天气很冷吗
      - 天气会不会很热
      - 天气温和吗
      - [北京](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_date
    examples: |
      - [明天](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_address
    examples: |
      - 告诉我[广州](address)怎么样
      - [广州](address)
      - 那么[辽宁](address)呢
      - [北京](address)啥情况
      - [厦门](address)怎么样
      - [武汉](address)呢
      - [香港](address)呢
      - 我在[杭州](address)
      - [上海](address)
      - 在[宁波](address)呢
      - [宁波](address)
      - [首都](address)
  - intent: affirm
    examples: |
      - 是
      - 是的
      - 没问题
      - 好
      - 好的
      - 可以
      - 挺好
      - 没错
      - 继续
      - 没毛病
  - intent: deny
    examples: |
      - 不
      - 不行
      - 没
      - no
      - 不可以
      - 算了
      - 不要
      - 不要了
      - 没有
  - intent: stop
    examples: |
      - 停
      - 停止
  - intent: chitchat/whoyouare
    examples: |
      - 你是谁啊
      - 你是谁啊?
      - 你是谁啊?
      - 你叫什么名字
      - 你叫什么名字呢
      - 你叫什么呀
      - 你叫什么呀?
      - 你叫什么呀?
      - 介绍一下自己
      - 介绍自己
  - intent: chitchat/whatyoucando
    examples: |
      - 你能干啥
      - 你能干什么
      - 你能干什么呢
      - 你能干啥呀
      - 你能干啥呀?
      - 你能干啥呀?
      - 你能做什么
      - 你能做什么?
      - 你能做什么?
      - 你能做什么呢
      - 你能做什么呢?
      - 你能做什么呢?
      - 你有哪些技能
      - 你有哪些技能?
      - 你有哪些技能?
      - 你的本领是什么
      - 你的本领是什么呢
  - synonym: 下个星期一
    examples: |
      - 下星期一
  - synonym: 今天
    examples: |
      - 早上
      - 中午
      - 晚上
      - 下午
      - 傍晚
      - 今日
  - synonym: 明天
    examples: |
      - 明日
  - synonym: 北京
    examples: |
      - 首都
  - synonym: 上海
    examples: |
      - 魔都

stories.yml

version: "3.0"
stories:
  - story: greet
    steps:
      - intent: greet
      - action: utter_greet
  - story: say goodbye
    steps:
      - intent: goodbye
      - action: utter_goodbye
  - story: chitchat
    steps:
      - intent: chitchat
      - action: respond_chitchat
  - story: form with stop then deny
    steps:
      - or:
          - intent: weather
          - intent: weather
            entities:
              - address: 上海
          - intent: weather
            entities:
              - date-time: 明天
          - intent: weather
            entities:
              - 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 form
    steps:
      - intent: weather
      - action: weather_form
      - active_loop: weather_form
  - rule: Submit form
    condition:
      # Condition that form is active.
      - active_loop: weather_form
    steps:
      - 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: cities
    examples: |
      - 江宁区
      - 常德市西洞庭管理区
      - 常德市津市市
      - 桂阳县

domain.yml

version: "3.0"
session_config:
  session_expiration_time: 60
  carry_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: text
    influence_conversation: false
    mappings:
      - entity: address
        type: from_entity
  date-time:
    type: text
    influence_conversation: false
    mappings:
      - entity: date-time
        type: 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: LanguageModelFeaturizer
    model_name: bert
    model_weights: bert-base-chinese
  - name: RegexFeaturizer
  - name: DIETClassifier
    epochs: 100
    learning_rate: 0.001
    tensorboard_log_directory: ./log
  - name: ResponseSelector
    epochs: 100
    learning_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_uttered
  bot_message_evt: bot_uttered
  session_persistence: false

rasa:
  url: "http://localhost:5002/api"

actions.py

from typing import Any, Dict, List, Text

from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher

from service.normalization import text_to_date
from service.weather import get_text_weather_date


class 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 failed
            msg = "暂不支持查询 {} 的天气".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
  • 测试结果:
    在这里插入图片描述

  • 缺少词槽的情况:
    在这里插入图片描述

  • 上下文继承

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Keras深度学习实战(40)——音频生成

Keras深度学习实战&#xff08;40&#xff09;——音频生成0. 前言1. 模型与数据集分析1.1 数据集分析1.2 模型分析2. 音频生成模型2.1 数据集加载与预处理2.2 模型构建与训练小结系列链接0. 前言 我们已经在《文本生成模型》一节中学习了如何利用深度神经网络生成文本&#x…

智能、人机融合智能和深度态势感知

内容摘要&#xff1a;人工智能的符号主义、联结主义和行为主义三大学派&#xff0c;分别从不同角度切入智能的本质&#xff0c;其研究观点相互补充但各有局限。在人机融合过程中&#xff0c;怎样进行人机功能分配&#xff0c;人机怎样融合学习、理解、决策、推理乃至感知。数据…

获取微信公众号token

access_token是公众号的全局唯一接口调用凭据&#xff0c;公众号调用各接口时都需使用access_token 接口调用请求说明 https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credential&appidAPPID&secretAPPSECRET参数说明 参数是否必填说…

牛!单表千万行数据库: LIKE 搜索优化手记

我们可以在 txt 列上建立索引&#xff0c;用于优化该查询&#xff1a; CREATE INDEX tbl_like_txt_idx ON [tbl_like] ( [txt] ) 应用索引后&#xff0c;查询速度大大加快&#xff0c;仅需 5 毫秒&#xff1a; 由此可知&#xff1a;对于左前缀匹配&#xff0c;我们可以通过增…

市政工控典型安全解决方案

汽车制造业 MES系统 DNC系统 生产 安全域1 管理层 工控安全隔离装置 交换机 安全配置核查系统 HMI 历史数据库 运行监控系统 实时数据库 打印机过程 安全域2 监控层 工控漏洞扫描系统 安全交换机 工控安全审计系统 工控入侵检测系统工程师站 A 操作员站 A 实时数据库A 操作员站…

Linux中的文件传输命令(scp、rsync)、Linux之间通过sshkey公钥免密登录

scp测试环境&#xff1a;centos7.7 最小化安装&#xff0c;默认是有scp命令 -r 递归复制整个目录 -p 保留源文件的修改时间、访问时间和权限 -v 详细方式显示输出 -P&#xff08;大写&#xff09;指定port&#xff08;端口&#xff09;输出scp命令使用格式 scp /filename 目…

Linux 程序开发 之 库打桩机制

目录前言一、库打桩定义二、编译时打桩三、链接时打桩四、运行时打桩五、处理目标文件的工具前言 Linux 链接器支持一个很强大的技术&#xff0c;称为库打桩(library interpositioning)&#xff0c;它允许你截获对共享库函数的调用&#xff0c;取而代之执行自己的代码。使用打桩…

m基于ACO蚁群优化的货车运输路线规划matlab仿真,考虑车辆载重,单位运输成本等因素

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 蚁群算法是通过对自然界中真实蚂蚁的集体行为的观察,模拟而得到一种仿生优化算法,它具有很好的并行性,分布性.根据蚂蚁群体不同的集体行为特征,蚁群算法可分为受蚂蚁觅食行为启发的模型和受孵化分…

渗透学习-靶场篇-WebGoat靶场(JWT攻击)

文章目录前言一、介绍JWTJWT令牌结构获取的令牌的基本过程二、攻击方式以及靶场的搭建1.安装cWebGoat2.空加密验证攻击3.字典爆破三、认证-键值逻辑前言 本次主要学习了javaweb项目方面任意出现的一些安全问题&#xff0c;最主要的是有关于JWT身份认证上的攻击&#xff0c;并利…

es的搜索服务

1、在项目中&#xff0c;创建一个搜索服务的模块&#xff1a;search-service 2、在新创建的搜索模块中添加依赖&#xff1a; <dependencies><!--nacos--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-start…

MyBatis-Plus中的逻辑删除使用

系列文章目录 Mybatis-PlusSpringBoot结合运用_心态还需努力呀的博客-CSDN博客MyBaits-Plus中TableField和TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus分页查询&#xff08;快速上手运用&#xff09;_心态还需努力呀的博客-CSDN博客_mybatis plus分页查询 MyBa…

【ESXi 7.x 升 8.x】ESXi 升级 —— 使用 ESXCLI 升级 ESXi(Offline Bundle ZIP)

目录3.1 示例 — 使用 ESXCLI 升级 ESXi&#xff08;Offline Bundle ZIP&#xff09;【目标&#xff1a;将 ESXi 6.5 U2 GA 升级为 7.0 U3f】&#xff08;1&#xff09;下载离线升级ZIP包&#xff08;2&#xff09;升级 ESXi① 查看离线包② 升级前确认ESXi版本③ 获取升级用的…

[附源码]Python计算机毕业设计大学生社团管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

ChatGPT教程之 01 什么是ChatGPT革命性的对话生成新工具

今天,我想揭开 ChatGPT 的神秘面纱——GANs*(生成对抗网络)的一个迷人的新应用程序,它在 AI 社区中引起了很大的轰动。 对于那些不熟悉 GAN 的人来说,它们是一种神经网络,它使用两个相互竞争的网络——一个生成器和一个鉴别器——来创建逼真的输出。生成器创建假输出,而…

Paper Note——经典Polyline类型Map论文损失函数

文章目录1. Hierarchical Recurrent Attention Networks for Structured Online Maps2. DAGMapper: Learning to Map by Discovering Lane Topology1. Hierarchical Recurrent Attention Networks for Structured Online Maps https://patrick-llgc.github.io/Learning-Deep-Le…

QT(4)-QAbstractItemView

QAbstractItemView1 说明2 常用函数2.1 交替行颜色2.1.1 alternatingRowColors2.1.2 setAlternatingRowColors2.2 autoScroll2.2.1 hasAutoScroll2.2.2 setAutoScroll2.3 autoScrollMargin2.3.1 autoScrollMargin2.3.2 setAutoScrollMargin2.4 defaultDropAction2.4.1 setDefau…

python--飞机大战

实现功能&#xff1a; 1&#xff1a;飞机的移动&#xff0c;发射子弹&#xff0c;手雷&#xff0c;生命值&#xff0c;生命条 2&#xff1a;敌飞机有3种形态&#xff08;小&#xff0c;中&#xff0c;大&#xff09;不同的飞机大小不一样&#xff0c;生命值不一样&#xff0c…

基于springboot+mybatis+mysql+vue在线订餐系统

基于springbootmybatismysqlvue在线订餐系统一、系统介绍二、功能展示1.主页(用户)2.菜单(用户)3.用户注册(用户)4.用户登陆(用户)5.我的订单(用户)6.我的购物车(用户)7.首页(管理员)8.用户管理(管理员)9.商品管理(管理员)9.订单管理(管理员)10.评论管理(管理员)三、获取源码一…

c++ 类型的转换

文章目录1. C语言中的类型转换1.1 隐式转换1.2 显示转换2. C的类型转换2.1 static_cast2.2 reinterpret_cast2.3 const_cast2.4 dynamic_cast3. 常见面试题前言&#xff1a; C给出了四种类型转换&#xff0c;这是做出的一些规范&#xff0c;为了减少隐式转换。隐式转换的问题&a…