首页 > 解决方案 > 发生错误:服务器在处理 Lambda 响应时遇到错误

问题描述

我正在使用 AWS Lex 和 AWS Lambda 创建聊天机器人。请求和响应格式如下 事件被传递给 AWS Lambda

{
  "alternativeIntents": [
    {
      "intentName": "AMAZON.FallbackIntent",
      "nluIntentConfidence": null,
      "slots": {}
    }
  ],
  "botVersion": "$LATEST",
  "dialogState": "ConfirmIntent",
  "intentName": "OrderBeverage",
  "message": "you want to order 2 pints of beer",
  "messageFormat": "PlainText",
  "nluIntentConfidence": {
    "score": 0.92
  },
  "responseCard": null,
  "sentimentResponse": null,
  "sessionAttributes": {},
  "sessionId": "2021-05-10T09:13:06.841Z-bSWmdHVL",
  "slotToElicit": null,
  "slots": {
    "Drink": "beer",
    "Quantity": "2",
    "Unit": "pints"
  }
}

响应格式-

{
  "statusCode": 200,
  "dialogAction": {
    "type": "Close",
    "fulfillmentState": "Fulfilled",
    "message": {
      "contentType": "PlainText",
      "content": "Message to convey to the user. For example, Thanks, your pizza has been ordered."
    }
  }
}

AWS LAMBDA Python 实现-

    import json

def lambda_handler(event, context):
    # TODO implement
    slots= event["slots"];
    drink,qty,unit= slots["Drink"], slots["Quantity"], slots["Unit"]
    retStr= "your order of "+qty+" "+unit+ " of "+drink+ " is coming right up!";
    return {"dialogAction": {
    "type": "Close",
    "fulfillmentState": "Fulfilled",
    "message": {
      "contentType": "PlainText",
      "content": retStr
    },
  }
  }

格式与文档一致,但在处理 lambda 响应时仍然出错。问题是什么?

标签: amazon-web-servicesaws-lambdachatbotamazon-lex

解决方案


当 Lambda 函数执行失败并向 Amazon Lex 抛出错误时,会发生此错误。

我尝试使用共享的 python 代码和测试输入事件重新创建您的环境。

您在原始帖子中指定的输出格式是正确的。您的问题似乎在于输入测试事件。您使用的输入消息与 Lex 实际发送到您的 Lambda 函数的消息不同。

尝试向您的 Lambda 函数添​​加一些额外的调试以记录 Lex 传递给它的事件,然后将记录的事件用作新的测试事件。

确保您为 Lambda 函数启用了 CloudWatch 日志记录,以便您可以查看日志中的输入消息。

这是我的 Lambda 函数的外观:

import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

def dispatch(event):
    # TODO implement
    slots= event["slots"];
    drink,qty,unit= slots["Drink"], slots["Quantity"], slots["Unit"]
    retStr= "your order of "+qty+" "+unit+ " of "+drink+ " is coming right up!";
    return {"dialogAction": {
        "type": "Close",
        "fulfillmentState": "Fulfilled",
        "message": {
            "contentType": "PlainText",
            "content": retStr
        },
    }}

def lambda_handler(event, context):
    logger.debug('event={}'.format(event))
    response = dispatch(event)
    logger.debug(response)
    return response

现在,如果您通过 Lex 控制台进行测试,您将在 CloudWatch 日志中发现您的错误。:

[错误] KeyError:'slots' Traceback(最近一次调用最后):文件“/var/task/lambda_function.py”,第 33 行,在 lambda_handler 响应 = dispatch(event) 文件“/var/task/lambda_function.py” ,第 19 行,在 dispatch slots= event["slots"];

使用此错误跟踪和记录的事件,您应该看到它slots嵌套在currentIntent.

您将需要更新代码以从正确的位置提取插槽值。

相信这可以帮助你。


推荐阅读