如何在Amazon Lex创建天气更新机器人?嵌入Python代码报错求助
搞定Amazon Lex天气机器人:创建流程+代码嵌入排错
我来一步步帮你解决这两个问题——先手把手教你创建Lex天气机器人,再搞定你代码嵌入时的报错问题。
一、从零创建Amazon Lex天气机器人
1. 前期准备
首先你得有OpenWeatherMap的API密钥(你已经能跑本地代码,这步应该没问题),然后登录AWS控制台找到Amazon Lex服务,选个顺手的区域(比如us-east-1)就行。
2. 创建基础机器人
点击「Create bot」,选「Custom bot」自定义机器人,填好机器人名字、语言(比如中文/英语),设置会话超时(比如5分钟),点「Create」就搞定基础框架了。
3. 配置天气查询意图
接下来要创建核心的GetWeatherIntent意图——这是机器人识别用户“查天气”请求的关键:
- 给意图起个清晰的名字,比如
GetWeatherIntent; - 添加槽位(也就是需要用户提供的信息):新增一个
City槽位,类型选Lex内置的AMAZON.City(它能自动识别城市名,省得你自己写正则),设置为必填,提示语可以写“请问你想查哪个城市的天气呀?”。
4. 设置 fulfillment(业务逻辑对接)
在「Fulfillment」模块,选「Lambda function」——因为我们要靠Python代码调用天气API,先暂时保存这个意图,接下来去做Lambda函数。
二、解决代码嵌入Lex的报错问题
你的本地代码能跑,但放到Lex里报错,核心原因是Lex和Lambda的交互有固定格式要求,不能直接用控制台的input()和print()。得把代码改成适配Lex请求响应的结构才行,我给你改好了:
修正后的Lambda代码
import requests def lambda_handler(event, context): # 从Lex的请求里提取用户输入的城市 city = event['currentIntent']['slots']['City'] # 替换成你自己的OpenWeatherMap API密钥 api_address = 'http://api.openweathermap.org/data/2.5/weather?appid=__你的API密钥__&q=' url = api_address + city try: json_data = requests.get(url).json() # 提取天气核心信息 weather_main = json_data['weather'][0]['main'] weather_desc = json_data['weather'][0]['description'] # 按Lex要求的格式返回响应 return { "dialogAction": { "type": "Close", "fulfillmentState": "Fulfilled", "message": { "contentType": "PlainText", "content": f"{city}当前天气是{weather_main},具体情况:{weather_desc}" } } } except Exception as e: # 处理API调用失败、城市不存在等异常 return { "dialogAction": { "type": "Close", "fulfillmentState": "Failed", "message": { "contentType": "PlainText", "content": "抱歉,暂时没法获取这个城市的天气信息,你再试试呀~" } } }
关键修改点说明
- 去掉了
input()和print():Lex会把用户的输入(也就是城市槽位)通过event参数传给Lambda,我们直接从event里取就行,不用读控制台输入; - 必须返回Lex指定格式的JSON:Lambda的返回值必须包含
dialogAction,告诉Lex是结束会话还是继续追问用户; - 加了异常处理:万一API调用失败(比如城市名写错、网络问题),能给用户返回友好提示,也避免Lex收到无效数据报错。
关联Lambda到Lex意图
- 去AWS Lambda控制台创建一个Python 3.x的函数,把上面的代码粘进去,替换你的API密钥;
- 给Lambda加权限,允许Lex调用它——可以在Lambda的「配置」→「权限」里加信任策略,或者在Lex配置Fulfillment时自动生成权限;
- 回到Lex的
GetWeatherIntent,在Fulfillment里选你刚创建的Lambda函数,保存后点击「Build」构建机器人。
测试机器人
在Lex控制台的测试窗口输入“上海的天气怎么样?”,Lex会自动识别城市,调用Lambda获取天气,然后返回结果。如果还是报错,去CloudWatch看Lambda的日志,能查到具体问题(比如API密钥错了、网络连不上OpenWeatherMap)。
内容的提问来源于stack exchange,提问作者Pankaj Pandey
相关产品推荐
相关产品推荐

