Ejemplo n.º 1
0
    def _results_for_user_denied(self, tracker: DialogueStateTracker,
                                 domain: Domain) -> List[float]:
        has_denied_before = tracker.last_executed_action_has(
            ACTION_DEFAULT_ASK_REPHRASE_NAME, skip=1)

        if has_denied_before:
            return confidence_scores_for(self.fallback_nlu_action_name, 1.0,
                                         domain)
        else:
            return confidence_scores_for(ACTION_DEFAULT_ASK_REPHRASE_NAME, 1.0,
                                         domain)
Ejemplo n.º 2
0
    def predict_action_probabilities(
        self,
        tracker: DialogueStateTracker,
        domain: Domain,
        interpreter: NaturalLanguageInterpreter,
        **kwargs: Any,
    ) -> List[float]:
        """Predicts the next action if NLU confidence is low."""

        nlu_data = tracker.latest_message.parse_data
        last_intent_name = nlu_data["intent"].get(INTENT_NAME_KEY, None)
        should_nlu_fallback = self.should_nlu_fallback(
            nlu_data, tracker.latest_action.get(ACTION_NAME))
        user_rephrased = has_user_rephrased(tracker)

        if self._is_user_input_expected(tracker):
            result = confidence_scores_for(ACTION_LISTEN_NAME, 1.0, domain)
        elif self._has_user_denied(last_intent_name, tracker):
            logger.debug(
                f"User '{tracker.sender_id}' denied suggested intents.")
            result = self._results_for_user_denied(tracker, domain)
        elif user_rephrased and should_nlu_fallback:
            logger.debug("Ambiguous rephrasing of user '{}' "
                         "for intent '{}'".format(tracker.sender_id,
                                                  last_intent_name))
            result = confidence_scores_for(ACTION_DEFAULT_ASK_AFFIRMATION_NAME,
                                           1.0, domain)
        elif user_rephrased:
            logger.debug(f"User '{tracker.sender_id}' rephrased intent")
            result = confidence_scores_for(ACTION_REVERT_FALLBACK_EVENTS_NAME,
                                           1.0, domain)
        elif tracker.last_executed_action_has(
                ACTION_DEFAULT_ASK_AFFIRMATION_NAME):
            if not should_nlu_fallback:
                logger.debug("User '{}' affirmed intent '{}'"
                             "".format(tracker.sender_id, last_intent_name))
                result = confidence_scores_for(
                    ACTION_REVERT_FALLBACK_EVENTS_NAME, 1.0, domain)
            else:
                result = confidence_scores_for(self.fallback_nlu_action_name,
                                               1.0, domain)
        elif should_nlu_fallback:
            logger.debug("User '{}' has to affirm intent '{}'.".format(
                tracker.sender_id, last_intent_name))
            result = confidence_scores_for(ACTION_DEFAULT_ASK_AFFIRMATION_NAME,
                                           1.0, domain)
        else:
            logger.debug("NLU confidence threshold met, confidence of "
                         "fallback action set to core threshold ({}).".format(
                             self.core_threshold))
            result = self.fallback_scores(domain, self.core_threshold)

        return result
Ejemplo n.º 3
0
def has_user_rephrased(tracker: DialogueStateTracker) -> bool:
    return tracker.last_executed_action_has(ACTION_DEFAULT_ASK_REPHRASE_NAME)
Ejemplo n.º 4
0
 def _has_user_denied(self, last_intent: Text,
                      tracker: DialogueStateTracker) -> bool:
     return (tracker.last_executed_action_has(
         ACTION_DEFAULT_ASK_AFFIRMATION_NAME)
             and last_intent == self.deny_suggestion_intent_name)
Ejemplo n.º 5
0
 def _have_options_been_suggested(self,
                                  tracker: DialogueStateTracker) -> bool:
     return tracker.last_executed_action_has(self.disambiguation_action)