问题描述
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
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