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)
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
def has_user_rephrased(tracker: DialogueStateTracker) -> bool: return tracker.last_executed_action_has(ACTION_DEFAULT_ASK_REPHRASE_NAME)
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)
def _have_options_been_suggested(self, tracker: DialogueStateTracker) -> bool: return tracker.last_executed_action_has(self.disambiguation_action)