RASA FormAction ActionExecutionRejection повторно не запрашивает отсутствующий слот - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь реализовать 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."

1 Ответ

0 голосов
/ 25 марта 2019

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

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

...