Rasa聊天机器人控制Python Turtle

news2024/11/25 7:12:32

背景

为了展示Rasa聊天机器人的使用效果以及如何将Rasa应用到业务系统中(这里将Python Turtle模块作为业务系统),用户将语音或者文本输入至Rasa,经过处理后调用Python Turtle的功能。

turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。

前进功能实现

效果

4月26日 00_00_00-00_00_30.gif

Rasa聊天机器人控制Python Turtle

配置意图、训练数据、标记实体

image.png
image.png

nlu.yml

- intent: forward
  examples: |
    - 前进
    - 前进一下
    - 向前进
    - 向前进一下
    - 前进[50](distance)
    - 前进[30](distance)像素
    - 前进[200](distance)像素
    - 向前走[25.5](distance)
    - 往前移动[39.0](distance)像素
    - 往前挪[39.0](distance)像素
    - [1号](turtle_no)乌龟前进
    - 向前进[二号](turtle_no)乌龟
    - [11号](turtle_no)乌龟前进[200](distance)像素
    - [五号](turtle_no)乌龟向前走[25.5](distance)
    - [9号](turtle_no)乌龟往前移动[39.0](distance)像素
    - 往前挪[39.0](distance)像素[六号](turtle_no)小乌龟
    - 乌龟[1](turtle_no)前进
    - 向前进乌龟[二](turtle_no)
    - 乌龟[11](turtle_no)前进[200](distance)像素
    - 乌龟[五](turtle_no)向前走[25.5](distance)
    - 乌龟[9](turtle_no)往前移动[39.0](distance)像素
    - 往前挪[39.0](distance)像素小乌龟[六](turtle_no)
  • 定义’forward’意图、增加示例数据、标记实体

domain.yml

intents:
- forward

entities:
- distance
- turtle_no

slots:
  s_turtle_no:
    type: text
    mappings:
    - type: from_entity
      entity: turtle_no
  s_distance:
    type: float
    influence_conversation: false
    mappings:
    - type: from_entity
      entity: distance
      
responses:
...省略...

forms:
...省略...
  • 在intents中增加意图’forward’
  • 在entities中增加实体’distance’ ‘turtle_no’
  • 在slots中增加slot(插槽)‘s_turtle_no’ ‘s_distance’,并设置类型、mapping

配置回复和动作

domain.yml

intents:
...省略...
entities:
...省略...
slots:
...省略...
responses:
  utter_forwrad_success:
  - text: 前进完成
  utter_forwrad_fail:
  - text: 前进失败,{turtleno}号小乌龟不存在
forms:
...省略...
actions:
- action_forward
  • 在responses中配置文本回复
  • 在actions中配置动作即函数
  • 可以在action_forward函数中直接将文本’前进完成’输出,也可以配置到responses下,然后在action_forward函数中输出utter_forwrad_success或者utter_forwrad_fail,这样有利于复用

编写对话脚本

stories.yml

- story: turtle forward
  steps:
  - intent: forward
  - action: action_forward
  • 将意图(通过用户输入推断出意图)和动作(由bot执行一个函数)连接起来构成单轮对话

action.py函数定义

image.png

class ActionForward(Action):

    def name(self) -> Text:
        return "action_forward"

    def run(self, dispatcher: CollectingDispatcher,
            tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:

        slots = {"s_turtle_no":None,"s_distance":None}
        if len(g_TurtleDict) == 0:
            t = Util.create_new_turtle()
            g_TurtleDict[0] = t
        '''
        1. s_distance s_turtle_no 都没有指定 
        2. s_turtle_no 指定了
        3. s_distance 指定了
        4. s_distance s_turtle_no 都指定了
        '''
        isSuccess = True
        turtle_no = "" # 去掉xx号后的xx
        sturtle_no = tracker.get_slot('s_turtle_no')
        sdistance = tracker.get_slot('s_distance')
        if sturtle_no == None and sdistance == None:
            for t in g_TurtleDict.values():
                t.forward(MOVE_STEP)
            # mainloop()
        elif sturtle_no != None and sdistance == None:
            turtle_no = Util.get_real_turtle_no(sturtle_no)
            if turtle_no in g_TurtleDict.keys():
                g_TurtleDict[turtle_no].forward(MOVE_STEP)
                # mainloop()
            else:
                isSuccess = False
                dispatcher.utter_message(response="utter_forwrad_fail",turtleno=turtle_no)
        elif sturtle_no == None and sdistance != None:
            for t in g_TurtleDict.values():
                t.forward(float(sdistance))
            # mainloop()
        else:
            turtle_no = Util.get_real_turtle_no(sturtle_no)
            if turtle_no in g_TurtleDict.keys():
                g_TurtleDict[turtle_no].forward(float(sdistance))
                # mainloop()
            else:
                isSuccess = False
                dispatcher.utter_message(response="utter_forwrad_fail",turtleno=turtle_no)

        if isSuccess == True:
            dispatcher.utter_message(response="utter_forwrad_success")
        return [SlotSet(slot,value) for slot,value in slots.items()]
  • 获取slot:s_turtle_nos_distance的值,明确用户指定哪个小乌龟前进以及前进像素数
  • 调用turtle库forward函数执行前进动作

运行turtle demo功能实现

效果

4月26日 (1) 00_00_00-00_00_30.gif

配置意图、训练数据、标记实体

nlu.yml

- intent: show_turtledemo
  examples: |
    - 展示小乌龟的demo
    - demo
    - turtle demo
    - turtledemo
    - show demos
    - run demos
    - 展示小乌龟的能力
- intent: select_turtledemo
  examples: |
    - bytedesign
    - chaos
    - clock
  • 定义’show_turtledemo’意图、增加示例数据
  • 定义’select_turtledemo’意图、增加示例数据,该意图用于回复Button格式数据,详见下节

domain.yml

intents:
- select_turtledemo
- show_turtledemo

entities:
...省略...
slots:
...省略...
responses:
...省略...
forms:
...省略...
actions:
...省略...

配置form

domain.yml

intents:
...省略...

entities:
- demo_type
slots:
  s_demo_type:
    type: text
    influence_conversation: true
    mappings:
    - type: from_entity
      entity: demo_type
      conditions:
      - active_loop: turtle_demo_form
responses:
...省略...

forms:
  turtle_demo_form:
    required_slots:
    - s_demo_type
    
actions:
...省略...
  • 首先在domain.yml中forms中配置form名称:turtle_demo_form,需要的slot:s_demo_type
  • 在entities中配置实体demo_type,用于标识想运行的demo
  • 在s_demo_type中配置slots_demo_type,用户输入包含实体demo_type后,将s_demo_type赋值,并且只有在turtle_demo_form激活时才为s_demo_type赋值

配置form要求的slot回复和动作

domain.yml

intents:
...省略...
entities:
...省略...
slots:
...省略...
responses:
utter_ask_turtle_demo_form_s_demo_type:
  - buttons:
    - title: bytedesign
      payload: /select_turtledemo{{"demo_type":"bytedesign"}}
    - title: chaos
      payload: /select_turtledemo{{"demo_type":"chaos"}}
    - title: clock
      payload: /select_turtledemo{{"demo_type":"clock"}}
    - title: colormixer
      payload: /select_turtledemo{{"demo_type":"colormixer"}}
    - title: flyobjs
      payload: /select_turtledemo{{"demo_type":"flyobjs"}}
    - title: forest
      payload: /select_turtledemo{{"demo_type":"forest"}}
    - title: fractalcurves
      payload: /select_turtledemo{{"demo_type":"fractalcurves"}}
    - title: lindenmayer
      payload: /select_turtledemo{{"demo_type":"lindenmayer"}}
    - title: minimal_hanoi
      payload: /select_turtledemo{{"demo_type":"minimal_hanoi"}}
    - title: nim
      payload: /select_turtledemo{{"demo_type":"nim"}}
    - title: paint
      payload: /select_turtledemo{{"demo_type":"paint"}}
    - title: peach
      payload: /select_turtledemo{{"demo_type":"peach"}}
    - title: penrose
      payload: /select_turtledemo{{"demo_type":"penrose"}}
    - title: planet_and_moon
      payload: /select_turtledemo{{"demo_type":"planet_and_moon"}}
    - title: rosette
      payload: /select_turtledemo{{"demo_type":"rosette"}}
    - title: round_dance
      payload: /select_turtledemo{{"demo_type":"round_dance"}}
    - title: sorting_animate
      payload: /select_turtledemo{{"demo_type":"sorting_animate"}}
    - title: trees
      payload: /select_turtledemo{{"demo_type":"trees"}}
    - title: two_canvases
      payload: /select_turtledemo{{"demo_type":"two_canvases"}}
    - title: yinyang
      payload: /select_turtledemo{{"demo_type":"yinyang"}}
    text: 请选择想要运行的demo

forms:
...省略...
actions:
- action_run_demo
  • 在responses中配置回复utter_ask_turtle_demo_form_s_demo_type,规则如下utter_ask_表示要求用户输入文本,turtle_demo_form表示form名称,s_demo_type标识form需要的slot名称
  • buttons表示回复的格式是button,title为按钮显示文本,payload为上一节定义的意图select_turtledemo,用户点击对应按钮后,会将实体demo_type赋值
  • 在actions中配置action_run_demo,该在函数中调用对应turtle demo

编写对话脚本

stories.yml

- story: turtle demo 
  steps:
  - intent: show_turtledemo       //用户输入问题推断意图为运行turtle demo
  - action: turtle_demo_form      //激活turtle_demo_form
  - active_loop: turtle_demo_form //循环运行form
  - slot_was_set:                 //只有s_demo_type slot被填充后才能跳出循环
    - requested_slot: s_demo_type
  - active_loop: null
  - slot_was_set:
    - requested_slot: null
  - action: action_run_demo       //然后运行函数action_run_demo
  • 详见注释

action.py函数定义

...省略...
from .turtledemos.rosette import *
from .turtledemos.round_dance import *
from .turtledemos.sorting_animate import *
from .turtledemos.tree import *
from .turtledemos.two_canvases import *
from .turtledemos.yinyang import *

class ActionRunDemo(Action):

    def name(self) -> Text:
        return "action_run_demo"

    def run(self, dispatcher: CollectingDispatcher,
            tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
        slots = {
            "s_demo_type":None
        }
        screen = turtle.Screen()
        screen.setup (width=1280, height=720, startx=0, starty=0)
        demo_type = tracker.get_slot('s_demo_type')
        eval(demo_type)()
        mainloop()

        dispatcher.utter_message(text="demo运行完成")
        return [SlotSet(slot,value) for slot,value in slots.items()]
  • 根据slot: s_demo_type值调用对应demo

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

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

相关文章

Docker常用命令笔记

docker常用命令 1 基础命令 sudo docker version #查看docker的版本信息 sudo docker info #查看docker系统信息,包括镜像和容器的数量 2 镜像命令 1.sudo docker images #查看本地主机的所有主机镜像 #解释 **REPOSITORY **#镜像的仓库源TAG **** …

微信小程序python+nodejs+php+springboot+vue 校园餐饮点单配送系统商家 配送员

管理员的主要功能有: 1.管理员输入账户登陆后台 2.个人中心:管理员修改密码和账户信息 3.学生管理:对注册的学生信息进行添加,修改,删除,查询 4.商家管理:对注册的商家信息进行添加,…

【在线研讨会】智慧汽车时代来临 -车规功能安全软硬件一次到位

随着科技的不断发展,智慧汽车的时代已经到来,在实现智慧汽车的过程中,车辆的功能安全、软硬件设计等方面都面临着严峻的挑战。为了确保智慧汽车的安全性和可靠性,在硬件设计方面,需要考虑到各种可能出现的故障和安全风…

日撸 Java 三百行day39

文章目录 说明day39 关键路径1.关键路径2. 代码分析 说明 闵老师的文章链接: 日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护:https://github.com/fulisha-ok/sampledata day39 关键路…

PMP课堂模拟题目及解析(第1期)

1.在一个大型施工项目的规划阶段,出现了潜在的经济衰退迹象。之前关于经济衰退的风险被指定为低概率和高影响,预计持续 6-12 个月。项目开始后不久 发生了经济衰退,并按预期影响项目。六个月后,经济衰退影响的持续时间将更改为 24…

网络通信与密码相关概念流程

文章目录 前言一、明文通信二、密文通信1.对称加密2.非对称加密 三、安全信任机制1.CA(Certificate Authority) 证书授权中心2.数字证书 总结 前言 随着科技的发展,人们的通信都转化成电子通信,由于信息需要通过一个公有的网络进行传输,信息…

Spring IOC 源码解读

将回答以下问题: BeanFactory 和 ApplicationContext 之间的关系和区别。一个 Bean 是如何被注入到 IOC 容器里,中间经历了什么过程(Bean 的生命周期)。 先入为主 假设你已经有如下经验: 什么是 IOC。 don‘t call…

verilog手撕代码2——各种加法器介绍——真值表、表达式、电路图

文章目录 前言一、半加器二、全加器三、串行/行波进位加法器(Ripple-Carry Adder/RCA)四、超前进位加法器(Lookahead Carry Adder/LCA)五、进位保存加法器(Carry Save Adder/CSA) 前言 2023.4.25 一、半加…

Terraform

文章目录 简介安装简单使用案例 概念原理状态管理Backend 远程状态存储机制 配置语法Argument 参数Block 块terraform块required_providersbackend provider块: 与基础设施交互resource块: 定义基础架构data块: 数据源 表达式(Experssion)和函数(Functions)变量variable 输入变…

【Celery】任务Failure或一直超时Pending

编写背景 task进入队列后,部分任务出现Failure或者一直Pending,且业务代码没有报错。 运行环境 celery配置 from celery import Celery broker redis://:127.0.0.1:6379/1 backend redis://:127.0.0.1:6379/2 app Celery(brokerbroker,backendbackend,includ…

【文心一言】广告文案、演讲稿与请假条自动生成

前言 作为一名大学生而言,平时参加或者举办一些学校组织的活动的时候,总是避免不了需要准备一些演讲稿、广告宣传文案等内容,甚至于在疫情十分严重的这几年内,如何跟老师“委婉的”请假,也成为了我日常头疼的事情。但在…

React之redux的模板

文章目录 以下为模板代码安装(添加 Redux Toolkit 和 React-Redux 依赖包到你的项目中)以下为项目目录在store/index.js里面的模板创建模块(模块化思想),这里就是模板,所有模块通用(src/features/userSlice.js)在main.jsx引入模板(只需要看下面画横线的四行)在组件内使用 以下是…

【网课平台】Day16.项目优化:压测、加缓存优化与分布式锁

文章目录 一、压力测试1、优化需求2、性能指标3、安装Jmeter4、压力测试5、优化日志 二、缓存优化1、给接口加Redis缓存2、缓存穿透3、解决缓存穿透4、缓存雪崩5、缓存击穿 三、分布式锁1、本地锁的问题2、IDEA一个项目启动多个实例3、分布式锁4、Redis NX实现分布式锁5、Redis…

多项式加法(用 C 语言实现)

目录 一、多项式的初始化 二、多项式的创建 三、多项式的加法 四、多项式的输出 五、清除链表 六、主函数 用链表实现多项式时,每个链表节点存储多项式中的一个非零项,包括系数(coef)和指数(exp)两个…

Java8新特性函数式编程 - Lambda、Stream流、Optional

1.Lambda表达式 1.1 概述 ​ Lambda是JDK8中一个语法糖。他可以对某些匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象。而是更关注我们对数据进行了什么操作。 1.2 核心原则 可推导可省略 1.3 基本格式 (参数列表)->{代码}例一…

python毕业设计之django+vue公司企业物流信息管理系统

基于 开发语言:Python 框架:django Python版本:python3.7.7 数据库:mysql 数据库工具:Navicat 开发软件:PyCharm 语言设计并实现了速运公司物流信息管理系统。该系统基于B/S即所谓浏览器/服务器模式&…

智慧物流信息系统开发需具备哪些功能?

智慧物流软件开发公司在制作管理系统的时候,需要具备的功能有哪些呢? 一、采集跟踪功能。 (1)、信息采集:信息采集跟踪系统是智能物流系统的重要组成部分。物流信息采集系统主要由RFID射频识别系统和Savan…

【Hadoop-HDFS】HDFS中Fsimage与Edits详解

【Hadoop-HDFS】HDFS中Fsimage与Edits详解 1)概述2)NameNode元数据解析3)Fsimage3.1.Fsimage 的作用3.2.FSimage 的文件信息查看 4)Edits4.1.Edits 的作用4.2.Edits 的文件信息查看 5)元数据信息目录的配置 1&#xff…

【2023.04.28】Windows配置MongoDB服务

【2023.04.28】Windows配置MongoDB服务 1、背景2、操作2.1 配置环境变量2.2 配置本地Windows MongoDB服务 环境:Windows11,Mongo 6.0.5【该版本没有mongo.exe】 1、背景 某一天想使用电脑以前安装的 MongoDB,发现用 Navicat 连接不了&#…

4个很多人都不知道的现代JavaScript技巧

JavaScript在不断的进化和升级,越来越多的新特性让我们的代码变得更加简洁。因此,今天这篇文章,我将跟大家分享 4 个不常用的 JavaScript 运算符。让我们一起研究它们。 1.可选的链接运算符 这个功能非常好用,它可以防止我的代码…