def predict_action_probabilities(self, tracker: DialogueStateTracker, domain: Domain) -> List[float]: """Predicts the next action if NLU confidence is low. """ if (USER_INTENT_AFFIRM not in domain.intents or USER_INTENT_DENY not in domain.intents): raise InvalidDomain('The intents {} and {} must be present in the ' 'domain file to use this policy.'.format( USER_INTENT_AFFIRM, USER_INTENT_AFFIRM)) nlu_data = tracker.latest_message.parse_data nlu_confidence = nlu_data["intent"].get("confidence", 1.0) last_intent_name = nlu_data['intent'].get('name', None) should_fallback = self.should_fallback(nlu_confidence, tracker.latest_action_name) user_rephrased = has_user_rephrased(tracker) if self._is_user_input_expected(tracker): result = confidence_scores_for(ACTION_LISTEN_NAME, FALLBACK_SCORE, domain) elif _has_user_denied(last_intent_name, tracker): logger.debug("User '{}' denied suggested intents.".format( tracker.sender_id)) result = self._results_for_user_denied(tracker, domain) elif user_rephrased and should_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, FALLBACK_SCORE, domain) elif has_user_affirmed(last_intent_name, tracker) or user_rephrased: logger.debug("User '{}' affirmed intent by affirmation or " "rephrasing.".format(tracker.sender_id)) result = confidence_scores_for(ACTION_REVERT_FALLBACK_EVENTS_NAME, FALLBACK_SCORE, domain) elif tracker.last_executed_action_has( ACTION_DEFAULT_ASK_AFFIRMATION_NAME): if not should_fallback: logger.debug("User '{}' rephrased intent '{}' instead " "of affirming.".format(tracker.sender_id, last_intent_name)) result = confidence_scores_for( ACTION_REVERT_FALLBACK_EVENTS_NAME, FALLBACK_SCORE, domain) else: result = confidence_scores_for(self.fallback_action_name, FALLBACK_SCORE, domain) elif should_fallback: logger.debug("User '{}' has to affirm intent '{}'.".format( tracker.sender_id, last_intent_name)) result = confidence_scores_for(ACTION_DEFAULT_ASK_AFFIRMATION_NAME, FALLBACK_SCORE, domain) else: result = self.fallback_scores(domain, self.core_threshold) return result
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 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 _has_user_denied(last_intent: Text, tracker: DialogueStateTracker) -> bool: return (tracker.last_executed_action_has( ACTION_DEFAULT_ASK_AFFIRMATION_NAME) and last_intent == USER_INTENT_DENY)