RASA FormAction ActionExecutionRejection не выводит повторный запрос на отсутствие слота

Я пытаюсь реализовать здесь FormAction и переопределил метод проверки.

Вот код того же:

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."

person dkbhadeshiya    schedule 04.03.2019    source источник


Ответы (1)


ActionExecutionRejection по умолчанию не произносит шаблон с именем utter_ask_{slotname}, а оставляет логику формы, чтобы другие политики (например, FallbackPolicy) могли выполнять действия. utter_ask_{slotname} - это значение по умолчанию для счастливого пути, на котором он пытается впервые получить требуемый слот. Эта реализация отклонения действия по умолчанию предназначена для обработки определенных несчастливых путей, например, если пользователь решает, что хочет выйти из потока, отказавшись, или сделать объезд, поговорив и т. Д.

Если вы хотите реализовать шаблон для повторного запроса необходимого слота с помощью высказывания, вы можете заменить ActionExecutionRejection на dispatcher.utter_template(<desired template name>, tracker). Однако при этом у вас не будет возможности выйти из действия формы без проверки - я не знаю, каковы ваши намерения, но, возможно, вы также захотите включить некоторую логику, основанную на намерении (то есть, если это что-то вроде «запретить» , позвольте ActionExecutionRejection произойти, чтобы он мог выйти, если это намерение типа «ввод данных», убедитесь, что он запрашивает снова).

person Ella Rohm-Ensing    schedule 25.03.2019
comment
Можно ли реализовать какой-то счетчик, чтобы только после трех неудачных попыток проверить ввод генерировалось ActionExecutionRejection? - person asmaier; 24.05.2019
comment
На данный момент не готово, но вы можете проверить трекер, чтобы узнать, сколько раз этот слот сбрасывался на None. - person Ella Rohm-Ensing; 28.05.2019