You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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意图

  1. 去AWS Lambda控制台创建一个Python 3.x的函数,把上面的代码粘进去,替换你的API密钥;
  2. 给Lambda加权限,允许Lex调用它——可以在Lambda的「配置」→「权限」里加信任策略,或者在Lex配置Fulfillment时自动生成权限;
  3. 回到Lex的GetWeatherIntent,在Fulfillment里选你刚创建的Lambda函数,保存后点击「Build」构建机器人。

测试机器人

在Lex控制台的测试窗口输入“上海的天气怎么样?”,Lex会自动识别城市,调用Lambda获取天气,然后返回结果。如果还是报错,去CloudWatch看Lambda的日志,能查到具体问题(比如API密钥错了、网络连不上OpenWeatherMap)。


内容的提问来源于stack exchange,提问作者Pankaj Pandey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:42:51