【问题标题】:Load json file with Amazon Alexa使用 Amazon Alexa 加载 json 文件
【发布时间】:2021-03-29 15:18:50
【问题描述】:

我正在创建一个应用程序,用于使用 Amazon Alexa 搜索航班连接。我正在尝试将包含机场信息的 json 文件加载到变量中,以便稍后从中搜索数据。我试图将它加载到一个全局变量中,但没有奏效。然后我尝试将它加载到 session_attributes 中,但这也失败了。 json 文件包含 12668 个条目。我究竟做错了什么?什么是这样做的好方法?将 json 加载到变量中是否需要花费太多时间,Alexa 会因此退出?

json 文件位于 Alexa 开发者控制台的 lambda 文件夹中,包含代码的文件也位于该文件夹中。

Alexa 回复“请求技能的响应有问题”

"error": {
            "type": "INVALID_RESPONSE",
            "message": "An exception occurred while dispatching the request to the skill."
        }

这是我的基本代码:

airportdata = []


def init():
    airportdata = load_airport_data()
    

def load_airport_data():
    with open('airportdata.json', encoding="utf8") as json_file: 
        return json.load(json_file)


class LaunchRequestHandler(AbstractRequestHandler):
    def can_handle(self, handler_input):
        return ask_utils.is_request_type("LaunchRequest")(handler_input)

    def handle(self, handler_input):
        # init()
        
        session_attr = handler_input.attributes_manager.session_attributes

        session_attr['airportdata'] = load_airport_data()

        speak_output = "Welcome to the App. From where will you departure?"
        
        return (
            handler_input.response_builder
                .speak(speak_output)
                .ask(speak_output)
                .response
        )

编辑:原来使用的路径不正确。它应该是“/var/task/airportdata.json”,而不仅仅是 json 文件的名称。 lambda 的文件被复制到那里。然后它按预期工作。

【问题讨论】:

  • 你试过说“Alexa,加载 JSON 文件”吗?
  • @jakub 不,我只运行了技能调用命令。然后出现错误。

标签: python json alexa


【解决方案1】:

不要将其加载到会话属性中。即使它没有超过最大属性大小,它也会在每个后续请求中来回发送。非常昂贵的做事方式。

你没有提到文件有多大。将一个非常大的文件从文本解析为对象在计算上​​是昂贵的。您不想在每次通话或任何通话时都这样做。您应该将其正确存储在数据库中并运行对数据库的 API 调用。

最后,如果您在 AWS Lambda 中运行此程序,尤其是在您使用 Alexa Hosted 时,请查看您的 CloudWatch 日志以了解实际错误是什么。

【讨论】:

  • 感谢您的回答。该文件的大小约为半兆字节。遗憾的是,我无法访问 cloudwatch 和数据库,因为我只有一个 Alexa 开发者帐户。我需要一个普通的 aws 帐户吗?
  • 如果您只有一个普通的 Alexa 开发人员帐户,那么您的 Cloudwatch 访问权限是通过代码编辑器顶部的图标来获得您在开发人员控制台中的技能。开发人员控制台提供对 S3 存储桶、Cloudwatch 日志和 DynamoDb 表的访问权限,这些表是通过该选项卡顶部的链接为您的 Alexa 托管技能预置的。
  • 谢谢!结果发现默认的 cloudwatch 不正确,我不得不将其更改为 US-East,在那里我可以看到日志。然后我发现了问题,路径不正确。应该是 /var/task/airportdata.json
【解决方案2】:

可能值得考虑的几点:

  • 可以增加memory allocation and/or increase the lambda timeout吗?增加内存分配还可以为 lambda 函数提供更多 CPU 能力,这可以加快 JSON 文件的读取速度。
  • 仅在需要满足请求时才读取 JSON 文件,例如除非您使用这些信息在 LaunchRequest 响应中提供一些上下文,否则不要加载它来节省时间,并且只为特定的 IntentRequest 加载它。
  • 使用会话属性,但仅适用于特定于该会话的数据(例如,用户选择的出发地和目的地机场)。除非严格要求,否则这将再次帮助您避免加载大型 JSON 文件。也就是说,avoid storing the whole JSON data structure in the session attributes
  • 鉴于它是一个相对较大的对象,您能否将加载时间减少using a different decoder or library

【讨论】:

  • 感谢您的回答。该文件大小为半兆字节。我会尝试在每次调用时从 json 中读取数据,并希望它不会超时。我还可以尝试通过删除一些可能不需要的条目来减小 json 的大小。
猜你喜欢
  • 2017-08-28
  • 2016-12-04
  • 1970-01-01
  • 2020-11-03
  • 2016-10-27
  • 2013-03-23
  • 1970-01-01
  • 2016-09-19
  • 2019-09-01
相关资源
最近更新 更多