def predict_prob_by_thought_vector(self, thought_vector, response_tokens_ids, condition_id, temperature=1.0):
        """
        :param thought_vector:          shape == (batch_size, hidden_layer_dim), float32
        :param response_tokens_ids:     shape == (batch_size, seq_len), int32
        :param condition_id:            shape == (batch_size, 1), int32
        :param temperature:             float32
        :return:
            tokens_probs:               shape == (batch_size, seq_len, vocab_size), float32
        """
        # remove last token, but keep first token to match seq2seq decoder input's shape
        response_tokens_ids = response_tokens_ids[:, :-1]
        # output shape == (batch_size, seq_len - 1)

        init_dec_hs = \
            np.zeros((thought_vector.shape[0], self._decoder_depth, self._params.hidden_layer_dim), dtype=K.floatx())
        # shape == (batch_size, decoder_depth, hidden_layer_dim)

        temperature = np.full_like(condition_id, temperature, dtype=np.float32)
        # shape == (batch_size, 1)

        tokens_probs, _ = self._models['decoder'].predict(
            [thought_vector, response_tokens_ids, condition_id, init_dec_hs, temperature])
        # shape == (batch_size, seq_len - 1, vocab_size)
        return tokens_probs

        :param thought_vector:          shape == (batch_size, hidden_layer_dim), float32
        :param response_tokens_ids:     shape == (batch_size, seq_len), int32
        :param condition_id:            shape == (batch_size, 1), int32
        :param temperature:             float32
        :return:
            tokens_probs:               shape == (batch_size, seq_len, vocab_size), float32
        
cakechat/dialog_model/model.py