Rasa自定义选择按钮buttons——选择性别




本文代码



问题描述

Rasa实现性别男或女的选择

在这里插入图片描述

创建项目:rasa init --no-prompt

nlu.md 添加

## intent:inform
- [男](gender)
- [女](gender)




方法一:domain.yml中定义buttons

payload指在计算机中指数据传输的实际信息

stories.md 改为

## happy_path
* greet
    - utter_greet
* inform{"gender": "男"}
    - utter_gender

domain.yml

intents:
  - greet
  - goodbye
  - affirm
  - deny
  - mood_great
  - mood_unhappy
  - bot_challenge
  - inform

entities:
  - gender

slots:
  gender:
    type: unfeaturized

responses:
  utter_greet:
    - text: "What's your gender?"
      buttons:
        - title: "男"
          payload: '/inform{"gender": "男"}'
        - title: "女"
          payload: '/inform{"gender": "女"}'
  utter_gender:
    - text: Your gender is {gender}

session_config:
  session_expiration_time: 60
  carry_over_slots_to_new_session: true

训练:rasa train

启动Rasa对话:rasa shell

在这里插入图片描述




方法二:自定义动作

自定义动作调用dispatcher.utter_message()提供buttons,buttons带payload

stories.md 改为

## happy_path
* greet
    - action_set_gender
* inform{"gender": "男"}
    - utter_gender

actions.py

from typing import Any, Text, Dict, List
from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher


class ActionSetGender(Action):
    def name(self) -> Text:
        return "action_set_gender"

    def run(self,
            dispatcher: CollectingDispatcher,
            tracker: Tracker,
            domain: Dict[Text, Any]) -> List:
        buttons = [
            {'title': '男', 'payload': '/inform{"gender": "男"}'},  # payload数据传输的实际信息
            {'title': '女', 'payload': '/inform{"gender": "女"}'}
        ]
        dispatcher.utter_message(template="utter_greet", buttons=buttons)
        return []

domain.yml

intents:
  - greet
  - goodbye
  - affirm
  - deny
  - mood_great
  - mood_unhappy
  - bot_challenge
  - inform

entities:
  - gender

slots:
  gender:
    type: unfeaturized

responses:
  utter_greet:
    - text: "What's your gender?"
  utter_gender:
    - text: Your gender is {gender}

actions:
  - action_set_gender

session_config:
  session_expiration_time: 60
  carry_over_slots_to_new_session: true

endpoints.yml

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

训练:rasa train

启动自定义动作服务:rasa run actions

启动Rasa对话:rasa shell

在这里插入图片描述




讨论

需要做逻辑判断的buttons,例如女性再判断是否怀孕,需要添加自定义动作FormAction

Created with Raphaël 2.2.0 开始 是否男性 结束 选择是否怀孕 yes no

在这里插入图片描述

nlu.md 添加

## intent:inform
- [男](gender)
- [女](gender)
- [是](pregnant)
- [否](pregnant)

stories.md 改为

## happy_path
* greet
    - gender_pregnant_form
    - form{"name": "gender_pregnant_form"}
    - form{"name": null}

actions.py

from typing import Any, Text, Dict, List
from rasa_sdk import Tracker
from rasa_sdk.forms import FormAction
from rasa_sdk.executor import CollectingDispatcher


class GenderPregnantForm(FormAction):
    def name(self) -> Text:
        return "gender_pregnant_form"

    @staticmethod
    def required_slots(tracker: Tracker) -> List[Text]:
        """处理需要的槽位"""
        gender = tracker.get_slot("gender")
        if gender == '女':
            return ["gender", "pregnant"]
        else:
            return ["gender"]

    def slot_mappings(self) -> Dict[Text, Any]:
        """映射所需槽位"""
        return {
            "gender": self.from_entity(entity="gender"),
            "pregnant": self.from_entity(entity="pregnant")
        }

    def submit(self,
               dispatcher: CollectingDispatcher,
               tracker: Tracker,
               domain: Dict[Text, Any]
               ) -> List[Dict]:
        gender = tracker.get_slot('gender')
        pregnant = tracker.get_slot('pregnant')
        if pregnant:
            dispatcher.utter_message(text='{} {}'.format(gender, pregnant))
        else:
            dispatcher.utter_message(text='{}'.format(gender))
        return []

config.yml 的policies添加FormPolicy

policies:
  - name: FormPolicy

domain.yml

intents:
  - greet
  - goodbye
  - affirm
  - deny
  - mood_great
  - mood_unhappy
  - bot_challenge
  - inform

entities:
  - gender
  - pregnant

slots:
  gender:
    type: unfeaturized
  pregnant:
    type: unfeaturized

responses:
  utter_ask_gender:
    - text: 请选择性别
      buttons:
        - title: "男"
          payload: '/inform{"gender": "男"}'
        - title: "女"
          payload: '/inform{"gender": "女"}'
  utter_ask_pregnant:
    - text: 是否怀孕
      buttons:
        - title: "是"
          payload: '/inform{"pregnant": "是"}'
        - title: "否"
          payload: '/inform{"pregnant": "否"}'

forms:
  - gender_pregnant_form

session_config:
  session_expiration_time: 60
  carry_over_slots_to_new_session: true




参考文献

  1. Rasa SDK
  2. Rasa入门——AI助手和聊天机器人
  3. Images and Buttons
  4. Handling conditional slot logic
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XerCis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值