首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Rasa NLU中重置特定插槽并再次询问问题

在Rasa NLU中重置特定插槽并再次询问问题
EN

Stack Overflow用户
提问于 2021-05-06 05:28:54
回答 1查看 542关注 0票数 0

我正在建造一个聊天机器人在一家酒店预订餐桌。我已经编写了一个自定义操作来验证和修改提取的用户输入。如果标记值为False,我想重置我的插槽并再次询问问题。这是我的actions.py文件:

代码语言:javascript
运行
复制
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的初学者。提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 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的单独操作,该操作以设置flagreserve_time_modified插槽的调用结束。

然后,您可以编写一个根据flag插槽的值进行分支的故事。

或者,您可以使用表单来收集所有必需的预订信息,并在填写时验证用户提供给reserve_time的值。文档中有一个用户提供给表单的validating an input示例,如果输入无效,则要求用户重新填写。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67408968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档