从零开始:用Python打造你的第一个天气查询Agent(附完整代码)

张开发
2026/4/5 5:46:02 15 分钟阅读

分享文章

从零开始:用Python打造你的第一个天气查询Agent(附完整代码)
1. 为什么你需要一个天气查询Agent每天早上起床第一件事是什么我猜很多人都会掏出手机看一眼天气预报。但每次都要打开天气APP输入城市名称这个操作是不是有点繁琐想象一下如果有个智能小助手你只需要对它说查下北京明天天气它就能立刻告诉你详细预报是不是方便多了这就是我们要用Python打造的天气查询Agent。它本质上是一个能理解自然语言、自动获取数据并返回人类可读结果的程序。我去年给家里老人做了一个现在他们每天起床第一件事就是对着电脑问天气再也不用眯着眼睛在手机上戳来戳去了。这类Agent的核心价值在于自动化和自然交互。相比传统天气APP它有三大优势无需手动操作不用点开APP不用输入城市名支持模糊查询说后天、大后天都能自动识别可扩展性强后续可以轻松添加穿衣建议、空气质量等额外功能2. 准备工作3分钟搭建开发环境2.1 安装Python和VS Code工欲善其事必先利其器。我们先来配置开发环境整个过程比安装手机APP还简单。首先去Python官网下载最新稳定版目前是3.11安装时一定要勾选Add Python to PATH这个选项这是很多新手容易忽略的关键步骤。我见过不少初学者因为漏选这个导致后面运行程序时各种command not found错误。代码编辑器推荐VS Code它轻量免费而且对Python支持极好。安装完成后记得在扩展市场搜索并安装Python插件这个插件提供了代码提示、调试等实用功能。有个小技巧安装后按CtrlShiftP调出命令面板输入Python: Select Interpreter选择刚安装的Python解释器。2.2 获取天气API密钥我们需要一个可靠的数据源这里选择和风天气API它的免费版完全够用。注册过程很简单访问和风天气开发者平台用邮箱注册账号在控制台创建新应用记下生成的API Key看起来像一串随机字符特别注意免费版每天有1000次调用限制正常使用完全足够。但开发时建议在代码里加个临时变量存储API Key而不是直接写死在代码中避免不小心提交到GitHub导致密钥泄露——这是我踩过的坑。3. 核心模块开发让Agent学会思考3.1 自然语言理解模块这个模块相当于Agent的大脑负责把用户说的人话转换成程序能理解的参数。我们使用OpenAI的API来实现这个功能它的神奇之处在于能理解各种表达方式。新建agent_understand.py文件核心代码如下import openai import json def parse_weather_query(user_input): prompt f 请从以下用户输入中提取天气查询参数 1. 城市如未明确则默认为北京 2. 日期今天0明天1后天2...最多7天后 示例 输入上海后天天气怎么样 → {{city:上海,day:2}} 输入明天会下雨吗 → {{city:北京,day:1}} 实际输入{user_input} 只需返回JSON不要解释 response openai.ChatCompletion.create( modelgpt-3.5-turbo, messages[{role:user,content:prompt}], temperature0 ) return json.loads(response.choices[0].message.content)这个函数的工作原理很有趣我们给AI一个明确的指令模板专业术语叫Prompt告诉它应该提取哪些信息以及返回格式。temperature0这个参数很重要它让AI的输出更加确定避免随机性导致的结果不稳定。3.2 天气数据获取模块有了查询参数接下来就要获取真实天气数据。新建agent_tool.py文件import requests class WeatherAPI: def __init__(self, api_key): self.api_key api_key self.base_url https://devapi.qweather.com/v7/weather/ def get_city_id(self, city_name): geo_url fhttps://geoapi.qweather.com/v2/city/lookup?location{city_name}key{self.api_key} response requests.get(geo_url) data response.json() return data[location][0][id] if data[code] 200 else None def get_forecast(self, city_name, days_ahead): city_id self.get_city_id(city_name) if not city_id: return None url f{self.base_url}7d?location{city_id}key{self.api_key} response requests.get(url) data response.json() if data[code] ! 200: return None return { city: city_name, date: data[daily][days_ahead][fxDate], weather: data[daily][days_ahead][textDay], temp_min: data[daily][days_ahead][tempMin], temp_max: data[daily][days_ahead][tempMax], wind: f{data[daily][days_ahead][windDirDay]}{data[daily][days_ahead][windScaleDay]}级 }这里有几个值得注意的技术点我们使用了面向对象的写法把API操作封装成WeatherAPI类这样更易于维护和风天气API需要先用城市名获取城市ID再用ID查询天气错误处理很重要每个API调用都要检查返回状态码4. 整合与优化打造完整Agent4.1 主程序逻辑现在我们把各个模块组装起来创建weather_agent.pyfrom agent_understand import parse_weather_query from agent_tool import WeatherAPI import os class WeatherAgent: def __init__(self): self.api WeatherAPI(os.getenv(QWEATHER_KEY)) def generate_response(self, weather_data): suggestion 建议 if 雨 in weather_data[weather]: suggestion 记得带伞 elif int(weather_data[temp_min]) 10: suggestion 天气寒冷注意保暖 else: suggestion 天气适宜适合外出 return f {weather_data[city]} {weather_data[date]} 天气预报 · 天气状况{weather_data[weather]} · 温度范围{weather_data[temp_min]}~{weather_data[temp_max]}℃ · 风力风向{weather_data[wind]} {suggestion} def run(self): print(天气查询助手已启动输入退出结束) while True: query input(\n你想查询什么天气) if query.lower() 退出: break try: params parse_weather_query(query) weather self.api.get_forecast(params[city], params[day]) print(self.generate_response(weather)) except Exception as e: print(f出错了{str(e)}) if __name__ __main__: agent WeatherAgent() agent.run()这个主程序做了几件重要的事情初始化天气API客户端处理用户输入循环调用理解模块解析查询获取天气数据并生成友好回复根据天气状况提供个性化建议4.2 错误处理与日志在实际使用中各种意外情况都可能发生。我们需要增强程序的健壮性import logging from datetime import datetime logging.basicConfig( filenameweather_agent.log, levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s ) class WeatherAgent: def __init__(self): try: self.api WeatherAPI(os.getenv(QWEATHER_KEY)) logging.info(Agent初始化成功) except Exception as e: logging.error(f初始化失败{str(e)}) raise # ...其他方法保持不变... def run(self): logging.info(Agent启动) try: # 主循环逻辑 except KeyboardInterrupt: logging.info(用户中断程序) except Exception as e: logging.error(f运行时错误{str(e)})添加日志功能后当程序出现问题时我们可以查看日志文件快速定位原因。这在长期运行的系统中尤为重要。5. 进阶功能扩展5.1 添加语音交互让Agent支持语音输入输出其实很简单只需安装两个库import pyttsx3 import speech_recognition as sr class VoiceInterface: def __init__(self): self.engine pyttsx3.init() self.recognizer sr.Recognizer() def listen(self): with sr.Microphone() as source: print(请说出你的查询...) audio self.recognizer.listen(source) try: return self.recognizer.recognize_google(audio, languagezh-CN) except Exception as e: print(f识别失败{str(e)}) return None def speak(self, text): self.engine.say(text) self.engine.runAndWait()然后在主程序中集成这个语音接口def run(self): voice VoiceInterface() while True: query voice.listen() or input(语音识别失败请手动输入) # 后续处理逻辑... voice.speak(response)5.2 实现记忆功能让Agent记住用户偏好可以提升体验。我们可以用简单的JSON文件存储数据import json class UserPreferences: def __init__(self): self.file_path preferences.json self.data self._load_data() def _load_data): try: with open(self.file_path) as f: return json.load(f) except: return {default_city: 北京} def save(self): with open(self.file_path, w) as f: json.dump(self.data, f) def get_default_city(self): return self.data.get(default_city) def set_default_city(self, city): self.data[default_city] city self.save()然后在查询逻辑中加入默认城市支持params parse_weather_query(query) if not params.get(city): params[city] self.preferences.get_default_city()6. 部署与实用技巧6.1 打包成可执行文件想让别人也能用你的Agent用PyInstaller打包pip install pyinstaller pyinstaller --onefile --windowed weather_agent.py这会在dist目录生成一个独立的exe文件发给别人直接就能运行。6.2 设置开机自启在Windows上可以创建快捷方式放到启动文件夹在Linux/macOS上可以创建systemd服务或cron任务。这里以Windows为例右键创建快捷方式按WinR输入shell:startup打开启动文件夹把快捷方式拖进去6.3 性能优化技巧经过实测我发现几个提升响应速度的方法缓存城市ID查询结果避免重复请求使用异步IO处理网络请求对常用城市预加载天气数据import asyncio import aiohttp class AsyncWeatherAPI(WeatherAPI): async def async_get_forecast(self, city_name, days_ahead): async with aiohttp.ClientSession() as session: # 异步实现各个API调用 pass这个天气查询Agent项目虽然不大但涵盖了现代AI应用的典型架构自然语言理解、外部API集成、业务逻辑处理、用户友好输出。当你成功运行起来那一刻看着它准确回答各种天气查询时那种成就感是难以言喻的。

更多文章