Как реализовать релевантную справку во время многооборотного диалога? Амазонка Алекса Python 3.6

Я пытаюсь реализовать AMAZON.HelpIntent для своего навыка Alexa.

Это предполагаемое поведение:

Пользователь: Алекса, скажите Калькулятору объема рассчитать объем коробки.

Alexa: Какова длина коробки?

Пользователь: Справка

Alexa: длина блока определяется его длиной. Попробуйте сказать, что длина равна двум или что длина равна двум метрам.

Быстрый ответ пользователя

Пользователь: длина — два метра.

Alexa: Какова ширина поля?

Разговор продолжается до тех пор, пока не будут заполнены ячейки намерения.

Чтобы добиться такого поведения, мне нужно знать, какое намерение у моего пользователя. Эта строка кода позволяет мне это сделать.

session.attributes['last_intent'] = 'BoxVolumeIntent'

Я могу проверить внутри своего AMAZON.HelpIntent, если 'last_intent' == 'BoxVolumeIntent'

if session.attributes.get('last_intent') == 'BoxVolumeIntent':
    # Determine which part of the multi-turn dialog I am in and return
    # relevant help to the user here. Then pass the value back to the 
    # correct intent to be processed. This is what I don't know how to 
    # do.

Атрибуты session.attributes определены в flask-ask Джоном Уилером.

Доступ к нему можно получить в Python с помощью следующей строки:

from flask_ask import session

Сегодня утром я спросил Джона в электронном письме, знает ли он, как решить мою проблему, и он ответил, что некоторое время не работал над flask-ask и не знает, что такое многооборотный диалог.

Как я могу правильно реализовать AMAZON.HelpIntent для своего навыка?

BoxVolumeIntent

@ask.intent("BoxVolumeIntent", convert={'length': int, 'width': int, 'height': int, 'unit': str},
            default={'unit': 'meters'})
def calculate_box_volume(length, width, height, unit):
    """
    Description:
        A function to calculate the volume of a box.
    Args:
        :param1 (int) length: The length of the box.
        :param2 (int) width:  The width of the box.
        :param3 (int) height: The height of the box.
        :param4 (str) unit: The unit of measurement. If unit is undefined its value defaults to 'meters'.
    :return: A statement to be spoken by the Alexa device and a card sent to the Amazon Alexa phone app.
    """
    # Determine which intent was the last one called.
    session.attributes['last_intent'] = 'BoxVolumeIntent'
    
    # Taken from Issue 72. Solves the problem of returning a Dialog.Directive
    dialog_state = get_dialog_state()
    if dialog_state != "COMPLETED":
        return delegate(speech=None)

    box_volume = length * width * height
    msg = "The volume of the box is {} cubic {}".format(box_volume, unit)
    return statement(msg).simple_card("Volume Calculator", msg)

Я включил BoxVolumeIntent из моего бэкенда Python 3. Обратите внимание, что у меня нет строк, чтобы Alexa спрашивала пользователя о длине, ширине и высоте. Все это обрабатывается в БЕТА-версии Skill Builder, которую можно найти в консоли разработчика Amazon. Я не могу сказать, на каком этапе намерения находится мой пользователь.

Потому что, как я уже упоминал в комментарии ниже, пользователь может начать с любого из шагов. Например: Ширина коробки равна пяти. Обычно это шаг 2, а не шаг 1 многоэтапного намерения.


person Bradley Marques    schedule 04.01.2018    source источник
comment
Что именно у вас не работает? Потому что вы описали решение, как это сделать. Да, вы можете использовать session.attributes для сохранения состояния. Вы можете сохранить столько состояний (используя разные клавиши), сколько захотите.   -  person ck3g    schedule 09.01.2018
comment
Я не уверен, как сказать, где я нахожусь в многооборотном диалоговом окне. Я могу сказать, какое намерение было вызвано последним, но для намерений, которые требуют нескольких входных данных, мне нужно знать, на каком этапе находится мой пользователь, чтобы я мог оказать им соответствующую помощь.   -  person Bradley Marques    schedule 10.01.2018


Ответы (1)


Я нашел этот вопрос чем-то похожим на этот вопрос.

Вы можете session.attributes по разным причинам сохранить свои ценности.

В вашем случае вы можете ввести session.attributes['current_step'] = <number> и использовать его для определения текущего шага этого многоэтапного намерения.

if session.attributes.get('last_intent') == 'BoxVolumeIntent':
  if session.attributes.get('current_step') == 1:
    # Do stuff for the first step
    # Optional: increase the current step value
person ck3g    schedule 11.01.2018
comment
Я хотел бы получить дополнительную информацию. Где бы я изначально установил значение current_step равным единице. Поскольку с учетом того, как устроен мой код, я не могу сказать, какой шаг был вызван первым. Таков путь многооборотных диалогов. Пользователь может начать намерение, сказав: Ширина поля равна пяти. Обычно это второй шаг, а не первый. Я полагаю, что мне придется установить его где-нибудь в BoxVolumeIntent. - person Bradley Marques; 13.01.2018
comment
Вы можете установить начальное значение в обработчике LaunchRequest. developer.amazon.com/docs/ пользовательские навыки/ - person ck3g; 14.01.2018
comment
Если ваши шаги не имеют определенного порядка. Затем вам нужно использовать разные намерения для получения разных ответов. - person ck3g; 14.01.2018