RASA FormAction ActionExecutionRejection不会重新提示缺少插槽

问题描述 投票:0回答:1

我正在尝试在这里实现FormAction,并且我已经覆盖了validate方法。

这是相同的代码:

def validate(self, dispatcher, tracker, domain):
      logger.info("Validate of single entity called")
      document_number = tracker.get_slot("document_number")
      # Run regex on latest_message
      extracted = re.findall(regexp, tracker.latest_message['text'])
      document_array = []
      for e in extracted:
          document_array.append(e[0])
      # generate set for needed things and
      document_set = set(document_array)
      document_array = list(document_set)
      logger.info(document_set)
      if len(document_set) > 0:
          if document_number and len(document_number):
              document_array = list(set(document_array + document_number))
          return [SlotSet("document_number", document_array)]
      else:
          if document_number and len(document_number):
              document_array = list(set(document_array + document_number))
              return [SlotSet("document_number", document_array)]
          else:
              # Here it doesn't have previously set slot
              # So Raise an error
              raise ActionExecutionRejection(self.name(), 
                                             "Please provide document number")

因此,理想情况下,根据文档,当ActionExecutionRejection发生时,它应该发出一个名为utter_ask_ {slotname}的模板,但它不会触发该操作。

这是我的domain.yml模板

templates:
  utter_greet:
    - text: "Hi, hope you are having a good day! How can I help?"
  utter_ask_document_number:
    - text: "Please provide document number"
  utter_help:
    - text: "To find the document, please say the ID of a single document or multiple documents"
  utter_goodbye:
    - text: "Talk to you later!"
  utter_thanks:
    - text: "My pleasure."
rasa-nlu rasa-core
1个回答
2
投票

默认情况下,ActionExecutionRejection不会使用名称为utter_ask_{slotname}的模板,而是保留表单逻辑以允许其他策略(例如FallbackPolicy)执行操作。 utter_ask_{slotname}是第一次尝试获得所需插槽的快乐路径的默认设置。这种操作拒绝的默认实现是为了处理某些不愉快的路径,例如,如果用户通过拒绝决定他们想要退出流,或者通过聊天等绕道而行。

如果要使用话语实现模板以重新请求所需的插槽,可以使用dispatcher.utter_template(<desired template name>, tracker)替换ActionExecutionRejection。但是,这将使您无法在没有验证的情况下退出表单操作 - 我不知道您的意图是什么,但也许您还希望根据意图合并一些逻辑(即,如果它类似于“拒绝” ,让ActionExecutionRejection发生以便它可以退出,它是一个“输入数据”类型的意图,确保它再次询问)。

© www.soinside.com 2019 - 2024. All rights reserved.