使用 Amazon Alexa 加载 json 个文件
Load json file with Amazon Alexa
我正在创建一个应用程序,用于使用 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 的文件被复制到那里。然后它按预期工作。
可能值得考虑的几点:
- 你能增加 memory allocation and/or increase the lambda timeout 吗?增加内存分配还为 lambda 函数提供更多 CPU 功能,这可以加快读取 JSON 文件的速度。
- 仅在需要满足请求时才读入 JSON 文件,例如除非您使用该信息在 LaunchRequest 响应中提供一些上下文,否则通过不加载它来节省时间,并且只为特定的 IntentRequests 加载它。
- 使用会话属性,但仅限于特定于该会话的数据(例如,用户选择的出发机场和目的地机场)。这将再次帮助您避免加载大型 JSON 文件,除非严格要求。也就是说,avoid storing the whole JSON data structure in the session attributes.
- 鉴于它是一个相对较大的对象,您能否将加载时间减少 using a different decoder or library?
不要将其加载到会话属性中。即使它没有超过最大属性大小,它也会在每个后续请求中来回发送。非常昂贵的做事方式。
你没有提到文件有多大。将一个非常大的文件从文本解析为对象在计算上是昂贵的。您不想每次通话或任何通话都这样做。您应该将其正确存储在数据库中,并且 运行 一个 API 调用数据库。
最后,如果您在 AWS Lambda 中 运行 这样做,特别是如果您使用的是 Alexa Hosted,请查看您的 CloudWatch 日志以查看实际错误是什么。
我正在创建一个应用程序,用于使用 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 的文件被复制到那里。然后它按预期工作。
可能值得考虑的几点:
- 你能增加 memory allocation and/or increase the lambda timeout 吗?增加内存分配还为 lambda 函数提供更多 CPU 功能,这可以加快读取 JSON 文件的速度。
- 仅在需要满足请求时才读入 JSON 文件,例如除非您使用该信息在 LaunchRequest 响应中提供一些上下文,否则通过不加载它来节省时间,并且只为特定的 IntentRequests 加载它。
- 使用会话属性,但仅限于特定于该会话的数据(例如,用户选择的出发机场和目的地机场)。这将再次帮助您避免加载大型 JSON 文件,除非严格要求。也就是说,avoid storing the whole JSON data structure in the session attributes.
- 鉴于它是一个相对较大的对象,您能否将加载时间减少 using a different decoder or library?
不要将其加载到会话属性中。即使它没有超过最大属性大小,它也会在每个后续请求中来回发送。非常昂贵的做事方式。
你没有提到文件有多大。将一个非常大的文件从文本解析为对象在计算上是昂贵的。您不想每次通话或任何通话都这样做。您应该将其正确存储在数据库中,并且 运行 一个 API 调用数据库。
最后,如果您在 AWS Lambda 中 运行 这样做,特别是如果您使用的是 Alexa Hosted,请查看您的 CloudWatch 日志以查看实际错误是什么。