Понимание слотов и получение их значений в Alexa Skills Kit

#python #alexa-skills-kit #alexa-slot

#python #alexa-skills-kit #alexa-слот

Вопрос:

Я пытаюсь правильно понять, как слоты работают программно. Прежде чем что-либо кодировать, я пытаюсь хорошо понять это, просмотрев примеры для alexa sdk для python.

В частности, я пытался понять основы слотов в примере ColorPicker (я правильно понял hello_world и сам кое-что написал, добавив. Работал нормально).

Мне трудно понять, как получить доступ к этим значениям слотов (потому что я вижу, что это делается двумя разными способами).

 def whats_my_color_handler(handler_input):
    """Check if a favorite color has already been recorded in
    session attributes. If yes, provide the color to the user.
    If not, ask for favorite color.
    """
    # type: (HandlerInput) -> Response
    if color_slot_key in handler_input.attributes_manager.session_attributes:
        fav_color = handler_input.attributes_manager.session_attributes[
            color_slot_key]
        speech = "Your favorite color is {}. Goodbye!!".format(fav_color)
        handler_input.response_builder.set_should_end_session(True)
    else:
        speech = "I don't think I know your favorite color. "   help_text
        handler_input.response_builder.ask(help_text)

    handler_input.response_builder.speak(speech)
    return handler_input.response_builder.response
 

Что я понимаю в этой функции, так это то, что color_slot_key это имя переменной в слоте в Alexa (де интерфейс, разработчик Alexa). Но тогда handler_input.attributes_manager.session_attributes , насколько я понимаю, это слоты в целом, и доступ к нему по его ключу handler_input.attributes_manager.session_attributes['color_slot_key'] получит значение слота с этим ключом.

Если я правильно понял это, для меня это имеет смысл. Если есть цвет, alexa произносит его. Если нет, то это не так.

Теперь:

 @sb.request_handler(can_handle_func=is_intent_name("MyColorIsIntent"))
def my_color_handler(handler_input):
    """Check if color is provided in slot values. If provided, then
    set your favorite color from slot value into session attributes.
    If not, then it asks user to provide the color.
    """
    # type: (HandlerInput) -> Response
    slots = handler_input.request_envelope.request.intent.slots

    if color_slot in slots:
        fav_color = slots[color_slot].value
        handler_input.attributes_manager.session_attributes[
            color_slot_key] = fav_color
        speech = ("Now I know that your favorite color is {}. "
                  "You can ask me your favorite color by saying, "
                  "what's my favorite color ?".format(fav_color))
        reprompt = ("You can ask me your favorite color by saying, "
                    "what's my favorite color ?")
    else:
        speech = "I'm not sure what your favorite color is, please try again"
        reprompt = ("I'm not sure what your favorite color is. "
                    "You can tell me your favorite color by saying, "
                    "my favorite color is red")

    handler_input.response_builder.speak(speech).ask(reprompt)
    return handler_input.response_builder.response
 

Я не понимаю, почему в этой функции значение цвета доступно:

handler_input.request_envelope.request.intent.slots[color].value

И не чем-то вроде первой функции (что-то вроде этого):

handler_input.attributes_manager.session_attributes[color_slot_key]

Я предполагаю, что первый просто проверяет, есть ли он или нет в атрибутах сеанса (что я не совсем понимаю, что это такое), а другой имеет какое-то отношение к запросам Alexa. Но почему формат отличается?

Ответ №1:

Ты смешиваешь две разные вещи. Атрибуты сеанса не имеют ничего общего со значениями слотов. Вы извлекаете слоты с помощью:

 handler_input.request_envelope.request.intent.slots
 

и пример, для удобства, сохраняет полученный цвет в атрибуте сеанса, чтобы он сохранялся в течение всего сеанса обучения.
Думайте об атрибутах сеанса как о постоянных атрибутах (ключ значение), которые переживают сеанс навыка (они могут быть любыми, какими вы хотите).

Пример использования атрибутов сеанса в палитре цветов объясняется здесь:

https://developer.amazon.com/de/docs/custom-skills/manage-skill-session-and-session-attributes.html#save-data-during-the-session

(у вас даже есть вкладка для выбора python)

На вкладке «Тест» проверьте навык и посмотрите на входящий и исходящий json. Все станет ясно!