我正在建造一个聊天机器人在一家酒店预订餐桌。我已经编写了一个自定义操作来验证和修改提取的用户输入。如果标记值为False,我想重置我的插槽并再次询问问题。这是我的actions.py文件:
from typing import Any, Text, Dict, List, Union
from rasa_sdk import Action, Tracker
from rasa_sdk.events import SlotSet, UserUtteranceReverted, EventType, AllSlotsReset
from rasa_sdk.executor import CollectingDispatcher
from word2number import w2n
from .functions import util
class ValidateRestaurantForm(Action):
    def name(self) -> Text:
        return "user_details_form"
    def run(self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict) -> List[EventType]:
        required_slots = ["number_table", "table_type", "reserve_time"]
        for slot_name in required_slots:
            if tracker.slots.get(slot_name) is None:    
                # The slot is not filled yet. Request the user to fill this slot next.
                return [SlotSet("requested_slot", slot_name)]
        # All slots are filled.
        return [SlotSet("requested_slot", None)]
class ActionSubmit(Action):
    def name(self) -> Text:
        return "action_submit"
    def run(
        self,
        dispatcher,
        tracker: Tracker,
        domain: "DomainDict",
    ) -> List[Dict[Text, Any]]:
        number_table = tracker.get_slot("number_table")
        number_table = w2n.word_to_num(number_table)
        table_type = tracker.get_slot("table_type")
        reserve_time = tracker.get_slot("reserve_time")
        flag, reserve_time_modified = util(reserve_time)
                
        if flag == False:
            dispatcher.utter_message(response="utter_deny_reserve_time")
            dispatcher.utter_message(response="utter_ask_reserve_time")
            return [SlotSet("reserve_time", None)] <-------Resetting the slot and ask 
                                                           reservation time again
        
        else:
            dispatcher.utter_message(response="utter_submit",
                                    number_table=number_table,
                                    table_type=tracker.get_slot("table_type"),
                                    reserve_time=reserve_time_modified)
        return [AllSlotsReset()]我在Rasa论坛上找不到任何答案。请提出一些想法来解决这个问题。我是Rasa的初学者。提前谢谢。
发布于 2021-05-06 14:39:00
这看起来像是可以通过编写stories that implement branching logic来完成的事情。
您可以将标志设为一个插槽,并由ActionSubmit设置它的值。然后,您可以编写一个故事,如果在调用ActionSubmit之后并且标志槽为false,则激活表单。
更新2021-05-08
ActionSubmit的这一部分
flag, reserve_time_modified = util(reserve_time)
可以是名为is_valid_reserve_time的单独操作,该操作以设置flag和reserve_time_modified插槽的调用结束。
然后,您可以编写一个根据flag插槽的值进行分支的故事。
或者,您可以使用表单来收集所有必需的预订信息,并在填写时验证用户提供给reserve_time的值。文档中有一个用户提供给表单的validating an input示例,如果输入无效,则要求用户重新填写。
https://stackoverflow.com/questions/67408968
复制相似问题