Rasa Core实践 报时机器人

文章目录

    • 1. 领域 domain
    • 2. 故事 story
      • 用户消息
      • 机器人动作与事件
      • 辅助符号
    • 3. 动作 action
      • 回复动作
      • 表单
      • 默认动作
      • 自定义动作
    • 4. 词槽 slot
      • 词槽和对话行为
      • 词槽类型
      • 词槽映射
    • 5. 策略 policy
    • 6. 端点 endpoints.yml
    • 7. rasa SDK、自定义动作
      • 自定义动作
      • 运行自定义动作
    • 8. rasa 支持的客户端
    • 9. 实战:报时机器人
      • nlu.yml
      • stories.yml
      • domain.yml
      • config.yml
      • endpoints.yml
      • actions.py
      • 测试

learn from https://github.com/Chinese-NLP-book/rasa_chinese_book_code

rasa core 对话记录 和 选择下一个动作

1. 领域 domain

定义了所有信息:

  • 意图、实体、词槽、动作、表单、回复

意图、实体 应该 跟 rasa nlu 中的保持一致

utter_ 开头的回复 表示 渲染同名模板发送给用户

responses:utter_greet:- "你好 {name}!" # {name} 是模板变量

回复 还支持 富文本,指定通道

会话配置:会话过期时间,是否继承历史词槽

2. 故事 story

version: "3.0"
stories:- story: happy pathsteps:- intent: greet- action: utter_greet- story: query timesteps:- intent: query_time- action: action_query_time

必须要有的 key 是 story、steps
steps 表示用户和机器人之间的交互

用户消息

	- intent: inform  # 用户意图entities:- location: "上海" # 实体信息- price: "实惠"

机器人动作与事件

动作: action
返回事件:词槽事件(对词槽的值进行变更)、active_loop 事件(激活or取消激活表单)

辅助符号

  • 检查点符号,checkpoint 减少故事中重复的部分,名字相同的检查点可以互相跳转
    不同的故事之间,可以通过一个尾部,一个首部 相同的 checkpoint 连接成一个新的故事

  • or 语句

stories:
- story:steps:# 上一个step...- action: utter_ask_confirm- or:- intent: affirm- intent: thankyou- action: action_handle_affirmation

大部分相同,仅有其中一个步骤用户的意图不同

3. 动作 action

接受用户输入、对话状态信息,按照业务逻辑处理,并输出改变对话状态的事件和回复消息

回复动作

与 domain 里的 回复 关联在一起

当调用这类动作时,会自动查找回复中的同名的模板并渲染

表单

收集任务所需的所有要素

默认动作

rasa内置的一些默认动作

自定义动作

满足后端交互计算需求,如查数据库、第三方api请求

4. 词槽 slot

词槽必须要有 名字类型

slots:slot_name: # 名字type: text  # 类型influence_conversation: falseinitial_value: "hello"  # 初始值mappings: # 映射- type: from_entityentity: entity_name

词槽和对话行为

设置 influence_conversation bool 选项: 词槽是否影响对话行为

词槽类型

text、bool、category(枚举)、float(需要设置取值范围)、list、any(不影响系统动作预测)

词槽映射

如上mappings 字段,from_entity 表示将读取某个实体(entity指定)的值来赋值词槽

5. 策略 policy

策略负责学习故事,从而预测动作

有一些内置的策略,他们有优先级,除非是专家,不要随意修改优先级

数据增强: 使用 Rasa 命令时,添加 -- augmentation 来设定数据增强的数量

6. 端点 endpoints.yml

定义了 rasa core 和 其他服务进行连接的配置信息

7. rasa SDK、自定义动作

安装 rasa时,默认安装
单独安装 pip install rasa-sdk

自定义动作

class ActionQueryTime(Action):def name(self) -> Text:return "action_query_time"def run(self,dispatcher: CollectingDispatcher,tracker: Tracker,domain: Dict[Text, Any],) -> List[Dict[Text, Any]]:current_time = datetime.now().strftime("%H:%M:%S")dispatcher.utter_message(text=current_time)return []
  • 重写 name() 向服务器申明动作名字
  • 重写 run() 获取当前对话信息
    tracker 对象(对话状态追踪,获取历史实体、词槽等)
    domain 对象
    用户消息对象 dispatcher
    根据这些信息完成业务动作,如想改变对话状态,需要返回事件发送给 rasa服务器,没有的话,返回 []

运行自定义动作

跟rasa一起安装的sdk,rasa run actions
单独安装的 python -m rasa_sdk --actions actions

8. rasa 支持的客户端

支持 Facebook、Rasa Webchat、Chatroom

跟 IM 连接的组件 称为 connector 其负责实现通信协议

rasa支持自定义 连接器,支持同时使用多个连接器连接IM,需要在 credentials.yml 文件中配置如何连接客户端

9. 实战:报时机器人

tree

.
├── actions.py
├── config.yml
├── credentials.yml
├── data
│   ├── nlu.yml
│   └── stories.yml
├── domain.yml
├── endpoints.yml
├── __init__.py
├── media
│   └── demo.png
├── README.md
└── tests└── conversation_tests.md

nlu.yml

version: "3.0"
nlu:- intent: greetexamples: |- 你好- 您好- hello- hi- 喂- 在么- intent: goodbyeexamples: |- 拜拜- 再见- 拜- 退出- 结束- intent: query_timeexamples: |- 现在几点了- 什么时候了- 几点了- 现在什么时候了- 现在的时间- intent: query_dateexamples: |- [今天](date)几号- [今天](date)是几号- [昨天](date)几号- [明天](date)几号- [今天](date)的日期- [今天](date)几号了- [明天](date)的日期- 几号- intent: query_weekdayexamples: |- [今天](date)星期几- [明天](date)星期几- [昨天](date)星期几- [今天](date)是星期几- 星期几

stories.yml

version: "3.0"
stories:- story: happy pathsteps:- intent: greet- action: utter_greet- story: query timesteps:- intent: query_time- action: action_query_time- story: query datesteps:- intent: query_date- action: action_query_date- story: query weekdaysteps:- intent: query_weekday- action: action_query_weekday- story: say goodbyesteps:- intent: goodbye- action: utter_goodbye

domain.yml

version: "3.0"
session_config:session_expiration_time: 60carry_over_slots_to_new_session: true
intents:- greet- goodbye- query_time- query_date- query_weekday
entities:- date
slots:date:type: textinfluence_conversation: falsemappings:- type: from_entityentity: date
responses:utter_greet:- text: 你好,我是 Silly,我可以帮你查询时间、日期和星期几。你可以对我说「现在几点了?」、「今天几号?」或者「明天星期几?」。utter_goodbye:- text: 再见!
actions:- action_query_time- action_query_date- action_query_weekday- utter_goodbye- utter_greet

config.yml

recipe: default.v1
language: zh
pipeline:- name: JiebaTokenizer- name: LanguageModelFeaturizermodel_name: "bert"model_weights: "bert-base-chinese"- name: DIETClassifierepochs: 100tensorboard_log_directory: ./loglearning_rate: 0.001
policies:- name: MemoizationPolicy- name: TEDPolicymax_history: 5epochs: 100- name: RulePolicy

endpoints.yml

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

actions.py

from typing import Any, Text, Dict, List
from datetime import datetime, timedeltafrom rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcherdef text_date_to_int(text_date):if text_date == "今天":return 0if text_date == "明天":return 1if text_date == "昨天":return -1# in other casereturn Noneweekday_mapping = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"]def weekday_to_text(weekday):return weekday_mapping[weekday]class ActionQueryTime(Action):def name(self) -> Text:return "action_query_time"def run(self,dispatcher: CollectingDispatcher,tracker: Tracker,domain: Dict[Text, Any],) -> List[Dict[Text, Any]]:current_time = datetime.now().strftime("%H:%M:%S")dispatcher.utter_message(text=current_time)return []class ActionQueryDate(Action):def name(self) -> Text:return "action_query_date"def run(self,dispatcher: CollectingDispatcher,tracker: Tracker,domain: Dict[Text, Any],) -> List[Dict[Text, Any]]:text_date = tracker.get_slot("date") or "今天"int_date = text_date_to_int(text_date)if int_date is not None:delta = timedelta(days=int_date)current_date = datetime.now()target_date = current_date + deltadispatcher.utter_message(text=target_date.strftime("%Y-%m-%d"))else:dispatcher.utter_message(text="系统暂不支持'{}'的日期查询".format(text_date))return []class ActionQueryWeekday(Action):def name(self) -> Text:return "action_query_weekday"def run(self,dispatcher: CollectingDispatcher,tracker: Tracker,domain: Dict[Text, Any],) -> List[Dict[Text, Any]]:text_date = tracker.get_slot("date") or "今天"int_date = text_date_to_int(text_date)if int_date is not None:delta = timedelta(days=int_date)current_date = datetime.now()target_date = current_date + deltadispatcher.utter_message(text=weekday_to_text(target_date.weekday()))else:dispatcher.utter_message(text="系统暂不支持'{}'的星期查询".format(text_date))return []

测试

  • rasa run actions 运行动作服务器
rasa run actions
2022-11-28 09:50:58 INFO     rasa_sdk.endpoint  - Starting action endpoint server...
2022-11-28 09:50:58 INFO     rasa_sdk.executor  - Registered function for 'action_query_time'.
2022-11-28 09:50:58 INFO     rasa_sdk.executor  - Registered function for 'action_query_date'.
2022-11-28 09:50:58 INFO     rasa_sdk.executor  - Registered function for 'action_query_weekday'.
2022-11-28 09:50:58 INFO     rasa_sdk.endpoint  - Action endpoint is up and running on http://0.0.0.0:5055
  • rasa train
  • rasa shell
2022-11-28 21:16:49 INFO     root  - Rasa server is up and running.
Bot loaded. Type a message and press enter (use '/stop' to exit): 
Your input ->  你好呀                                                                               
Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
Loading model cost 1.346 seconds.
Prefix dict has been built successfully.
你好,我是 Silly,我可以帮你查询时间、日期和星期几。你可以对我说「现在几点了?」、「今天几号?」或者「明天星期几?」。
Your input ->  bye                                                                                  
你好,我是 Silly,我可以帮你查询时间、日期和星期几。你可以对我说「现在几点了?」、「今天几号?」或者「明天星期几?」。
Your input ->  拜拜                                                                                 
再见!
Your input ->  现在几点                                                                             
21:18:11
Your input ->  今天是几号                                                                           
2022-11-28
Your input ->  明天是几号                                                                           
2022-11-29
Your input ->  后天是几号                                                                           
系统暂不支持'后天'的日期查询
Your input ->  昨天是几号                                                                           
2022-11-27
Your input ->  今天星期几                                                                           
星期一
Your input ->  明天周几                                                                             
星期二
Your input ->  现在几点了?                                                                         
2022-11-29

修改:
nlu里添加 - [后天](date)的日期
actions.py 添加 if text_date == "后天": return 2

重新训练,测试

Your input ->  后天几号                                                                                                               
2022-11-30
Your input ->  后天星期几                                                                                                             
星期三

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

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

相关文章

python爬虫模拟登录人人网

模拟登录:爬取基于某些用户的用户信息。 需求1:对人人网进行模拟登录。 点击登录按钮之后会发起一个post请求post请求中会携带登录之前录入的相关的登录信息(用户名,密码,验证码…)验证码:每次…

在centos7环境下建立MariaDB多实例

环境全部基于vmware player 12 os: centos7 mariadb: mariadb-10.1.12-linux-x86_64.tar.gz 主要根据MariaDB给出的帮助文档,以及网上的这篇帖子进行操作 中间碰到了无数问题,在google的帮助下都一一解决了 耗费好几个小时,我真是个鶸 su roo…

python爬虫——代理IP

代理:破解封IP这种反爬机制。 什么是代理: 代理服务器。 代理的作用: 突破自身IP访问的限制。隐藏自身真实IP 代理相关的网站: - 快代理 西祠代理www.goubanjia.comhttps://ip.jiangxianli.com/?page1 代理ip的类型&#…

centos7 通过kvm+vnc 实现远程桌面虚拟化和创建windows、Linux虚拟机

感谢朋友支持本博客。欢迎共同探讨交流,因为能力和时间有限。错误之处在所难免,欢迎指正!假设转载。请保留作者信息。博客地址:http://blog.csdn.net/qq_21398167 原博文地址:http://blog.csdn.net/qq_21398167/articl…

ES 安装、search、index、doc

文章目录1. 安装2. search3. index4. doc CRUDop_type获取 doc 元字段只获取 doc 源数据删除 docupdate doc1. 安装 https://www.elastic.co/cn/ 下载 https://www.elastic.co/cn/downloads/past-releases/elasticsearch-8-5-3 https://www.elastic.co/cn/downloads/past-rele…

UWP开发入门(十一)——Attached Property的简单应用

UWP中的Attached Property即附加属性&#xff0c;在实际开发中是很常见的&#xff0c;比如Grid.Row: <Grid Background"{ThemeResource ApplicationPageBackgroundThemeBrush}"><Grid.RowDefinitions><RowDefinition></RowDefinition><Ro…

一、bootstrap4基础(布局系统、栅格系统、显示与隐藏、对齐与排列、内容排版、代码与图文、表格样式、颜色和边框、工具类)

1.1 Bootstrap简单介绍 1.2 Bootstrap结构 1.3 Bootstrap安装和测试 1.4 布局系统 1.5 栅格系统 4.6 栅格等级 1.7 显示与隐藏 1.7 对齐与排列 1.8 内容排版 1.9 代码与图文 1.9.1 设置图片居中显示 1.9.1 设置图片响应式显示 1.9.2 设置图片缩略图显示&#xff0c;以及显示的位…

ES mget、bulk、mappings

文章目录1. mget 批量查询2. bulk 批量写入3. 条件删除4. 条件更新5. 映射 mappings6. 自动映射7. 显式映射1. mget 批量查询 批量查询 GET _mget {"docs": [{"_index": "test_index","_id": 1},{"_index": "kibana_…

ACM/ICPC 之 四道MST-Prim解法(POJ1258-POJ1751-POJ2349-POJ3026)

四道MST&#xff0c;适合Prim解法&#xff0c;也可以作为MST练习题。 题意包括在代码中。 POJ1258-Agri Net 水题 1 //Prim-没什么好说的2 //接受一个邻接矩阵&#xff0c;求MST3 //Time:0Ms Memory:220K4 #include<iostream>5 #include<cstring>6 #include<…

二、bootstrap4基础(flex布局)

1.1 Flex弹性布局&#xff08;一&#xff09; <div class"d-flex flex-column border border-danger justify-content-end mb-5" style"height: 200px;"><div class"p-2 border border-success">one</div><div class"…

《数据结构与算法之美》学习汇总

此篇文章是对自己学习这门课程的一个总结和课后的一些练习&#xff0c;做一个汇总&#xff0c;希望对大家有帮助。本人是半路程序员&#xff0c;2018年2月开始学习C的&#xff0c;下面的代码基本都是C11版本的&#xff0c;代码有错误的地方请不吝留言赐教。附有部分练习LeetCod…

android简单的夜间模式

现在android项目values下打 attrs.xml <?xml version"1.0" encoding"utf-8"?> <resources><attr name"bookimage" format"reference|color" /><attr name"tvcolor" format"reference|color&quo…

三、bootstrap4 组件(警告和提示框、徽章和面包屑、按钮按钮组、卡片、列表组、导航和选项卡、分页和进度条、巨幕和旋转图标、轮播图、折叠菜单、下拉菜单、导航条、滚动监听、轻量弹框、模态框、表单)

1.1 警告提示框 1.2 徽章和面包屑 1.3 按钮和按钮组 1.4 卡片 1.5 列表组 1.6 导航和选项卡 1.7 分页和进度条 1.8 巨幕和旋转图标 1.9 轮播图 1.10 折叠菜单 1.11 下拉菜单 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title&…

吴恩达-《深度学习DeepLearning》汇总目录

从2019年2月底开始学习《数据结构与算法之美》&#xff0c;王争老师的课程非常好&#xff0c;到2019年8月底已经学完一遍&#xff0c;后面还要多次复习巩固以及OJ刷题。生命不息&#xff0c;学习不止&#xff0c;又要开始新的篇章了–《机器学习》&#xff0c;有点小兴奋&#…

javascript常用内置对象总结(重要)

Javascript对象总结 JS中内置了17个对象&#xff0c;常用的是Array对象、Date对象、正则表达式对象、string对象、Global对象 Array对象中常用方法&#xff1a; Concat&#xff08;&#xff09;&#xff1a;表示把几个数组合并成一个数组。 Join&#xff08;&#xff09;&#…

十三、axios框架学习

一、axios的基本使用 1.1 安装axios 执行命令&#xff1a;npm install axios --save 1.2 发送get请求演示 1.3 发送并发请求 有时候, 我们可能需求同时发送两个请求 使用axios.all, 可以放入多个请求的数组.axios.all([]) 返回的结果是一个数组&#xff0c;使用 axios.sp…

LeetCode解题汇总目录

此篇为学习完《数据结构与算法之美》后&#xff0c;在LeetCode刷题的汇总目录&#xff0c;方便大家查找&#xff08;CtrlFind&#xff09;&#xff0c;一起刷题&#xff0c;一起PK交流&#xff01;如果本文对你有帮助&#xff0c;可以给我点赞加油&#xff01; Updated on 2022…

java——IO流整理(一)

一、基础 1.字节、字符 位&#xff08;bit&#xff09;   &#xff1a;二进制中的一个1或0称为1位字节&#xff08;byte&#xff09; &#xff1a;8个二进制位称为一个字节字符     &#xff1a;一个自然符号称为字符。英文符号&#xff08;1个字节&#xff09;、中文符…

Node.js学习笔记

Node介绍 为什么要学习Node.js 企业需求 具有服务端开发经验更改front-endback-end全栈开发工程师基本的网站开发能力 服务端前端运维部署 多人社区 Node.js是什么 Node.js是JavaScript 运行时通俗易懂的讲&#xff0c;Node.js是JavaScript的运行平台Node.js既不是语言&am…

《统计学习方法》学习笔记目录

此篇为 李航老师著的《统计学习方法》的学习笔记汇总&#xff0c;准备学习并敲一敲代码&#xff0c;还请大家不吝赐教&#xff01;updated on 2020.4.26 一些相关的实践&#xff1a;请查阅机器学习 1. 统计学习及监督学习概论 2. 感知机&#xff08;Perceptron&#xff09; …