Лямбда-функция, чтобы направить Лекса к новому намерению

Я пытаюсь использовать лямбда-функцию для отправки lex с новым намерением на основе значения входящего слота:

Как это

 public override LexResponse Process(LexEvent lexEvent, ILambdaContext context)
    {
        var slots = lexEvent.CurrentIntent.Slots;
        var sessionAttributes = lexEvent.SessionAttributes ?? new Dictionary<string, string>();
        DesiredVehicleYesNo type;
        if (slots.ContainsKey("DesiredVehicleYesNo"))
        {
            Enum.TryParse(slots["DesiredVehicleYesNo"], out type);
        }
        else
        {
            type = DesiredVehicleYesNo.Null;
        }

        switch (type)
        {
            case DesiredVehicleYesNo.YES:
                Dictionary<string, string> s = new Dictionary<string, string>();
                s.Add("DesiredVehicle", null);
                //return ConfirmIntent(sessionAttributes, "DesiredVehicleYes", s, new LexResponse.LexMessage() { Content = "That's great! Let's get started.", ContentType = MESSAGE_CONTENT_TYPE });
                //return ElicitSlot(sessionAttributes,"DesiredVehicleYes",null,"DesiredVehicle", new LexResponse.LexMessage() { Content = "That's great! Let's get started.", ContentType = MESSAGE_CONTENT_TYPE });

            case DesiredVehicleYesNo.NO:
                return ConfirmIntent(sessionAttributes, "DesiredVehicleNo", new Dictionary<string,string>(), new LexResponse.LexMessage() { Content = "Well, that's ok, I can help you choose", ContentType = MESSAGE_CONTENT_TYPE });

        }

Я просто не уверен, какой тип возврата я должен использовать для этого? ConfirmIntent, ElicitSlot, ElicitIntent? Также мне нужно вернуть слоты обратно, я хочу, чтобы новое намерение использовало собственные подсказки для заполнения слотов, связанных с этим намерением.

Спасибо

2 ответа

Решение

Вы должны использовать ConfirmIntent и поставлять intentName а также slots намерения вы хотите переключиться на.

Документы формата Lex Response

ConfirmIntent. Сообщает Amazon Lex о том, что пользователь должен дать ответ "да" или "нет" для подтверждения или отклонения текущего намерения.
Вы должны включить поля intentName и slots. Поле slots должно содержать запись для каждого из слотов, настроенных для указанного намерения. Если значение слота неизвестно, вы должны установить его на ноль. Вы должны включить поле сообщения, если поле expressionPrompt намерения имеет значение null. Если вы укажете и поле сообщения, и поле translationPrompt, в ответе будет содержаться содержимое поля translationPrompt. Поле responseCard является необязательным.

Таким образом, вы можете предоставить свое собственное сообщение, но убедитесь, что оно написано как вопрос Да / Нет. Так как ConfirmIntent будет ожидать ответа Да / Нет от пользователя.

Этот подход всегда вызывает намерение, которое вы указали в intentName, Таким образом, вам придется обрабатывать ответ пользователя там.
Если пользователь говорит "да", то confirmationStatus будет держать значение Confirmed,
Если пользователь говорит "нет", то confirmationStatus будет держать значение Denied,

Удостоверьтесь, что слоты, которые вы передаете, верны для этого нового намерения. Вы можете передать их предварительно заполненными, чтобы использовать то, что пользователь уже дал вам; или установить на null чтобы позволить новому намерению попросить пользователя снова заполнить эти слоты.

Ты можешь использовать ConfirmIntent как предположил Джей, однако, если вы не хотите ничего подсказывать пользователю, есть хакерский способ добиться этого:

  • предоставить доступ для вызова лямбда-функций к вызывающей лямбда-функции, т.е. к лямбда-функции intent-A
  • получить имя лямбда-функции бэкэнда из intent-B
  • вызвать эту лямбда-функцию со всеми входами, используя boto3
  • ответ будет в ключе "полезной нагрузки" объекта ответа
  • получить ответ с помощью метода read()
  • получить фактический результат в ['dialogAction']['message']['content']
  • возврат с использованием метода close() по умолчанию

Вот пример кода для того же:

import boto3

client = boto3.client('lambda')
data = {'messageVersion': '1.0', 'invocationSource': 'FulfillmentCodeHook', 'userId': '###', 
        'sessionAttributes': {}, 'requestAttributes': None, 
        'bot': {'name': '###', 'alias': '$LATEST', 'version': '$LATEST'}, 
        'outputDialogMode': 'Text', 
        'currentIntent': {'name': '###', 'slots': {'###': '###'}, 
        'slotDetails': {'###': {'resolutions': [], 'originalValue': '###'}}, 
        'confirmationStatus': 'None'}, 
        'inputTranscript': '###'}
response = client.invoke(
    FunctionName='{intent-B lambda function}',
    InvocationType='RequestResponse',
    Payload=json.dumps(data)
)
output = json.loads(response['Payload'].read())['dialogAction']['message']['content']

Надеюсь, поможет.

Другие вопросы по тегам