Лямбда-функция, чтобы направить Лекса к новому намерению - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь использовать лямбда-функцию для отправки 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 ]

0 голосов
/ 31 августа 2018

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

  • предоставить доступ для вызова лямбда-функций к вызывающей лямбда-функции функция, т.е. лямбда-функция намерения-A
  • получить имя лямбда-функции бэкэнда intent-B
  • вызовите эту лямбда-функцию со всеми входами, используя boto3
  • ответ будет в ключе 'Payload' объекта ответа
  • получить ответ, используя метод 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']

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

0 голосов
/ 29 августа 2018

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

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

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

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

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

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

...