Python版AI天气预报助手开发指南(含完整代码)
一、背景
在当今数字化时代,人工智能(AI)
正以前所未有的速度渗透到各个领域,从智能家居到自动驾驶,从医疗诊断到金融预测,AI 的影响力无处不在。作为一名对技术充满热情的探索者,我深知 AI 的潜力和价值,也意识到掌握 AI 技术对于个人和职业发展的重要性。因此,我决定深入实践 AI,通过实际项目的开发和应用,从最基础的API接入
融入AI科技,提升自己的技术能力和对 AI 的理解。
在这个过程中,我选择了构建一个 AI 实现的天气助手
作为我的实践项目。结合传统冰冷的天气参数和暖心的大预言模型 AI 技术,打造一个能够自动解析城市编码、获取天气数据,并生成自然语言天气报告的智能系统,为用户提供更加贴心、便捷的天气服务。
二、技术选型
作为《穷鬼的回忆录》一书的作者,选型主要考虑的是免费!
免费!
免费!
然后再考虑支持目前大热的deepseek
模型,所以最后选择了和风天气和无问芯穹的deepseek模型作为核心技术支撑,其中和风天气用于查询天气参数信息,无问芯穹用于根据查询的天气结果参数提供专业的报告。
- 和风天气:作为国内领先的气象数据服务提供商,
和风天气
拥有丰富而精准的气象数据资源。我们利用其提供的API接口,可以轻松实现城市编码的查询以及获取城市当前的天气参数信息。通过调用和风天气的城市查询API,输入城市名称(支持中英文)或行政区划编码,即可快速获取对应的城市编码。这为后续的天气数据获取奠定了基础。在获取天气数据时,和风天气的实时天气API能够提供详细的气象信息,包括温度、湿度、风速、风向、降水概率等,且支持公制和英制两种单位制,满足不同用户的需求。 - 无问芯穹的deepseek模型:在生成天气报告方面,我们选择了
无问芯穹
的deepseek
模型。该模型具备强大的自然语言处理能力,能够将结构化的天气数据转化为生动、自然的中文天气报告。通过精心设计的提示(Prompt
),我们引导deepseek
模型解析和风天气接口返回的数据,并生成包含穿衣建议和出行提示的个性化天气报告。这种结合AI技术的报告生成方式,不仅提升了用户体验,还为用户提供了更具实用性和参考价值的气象信息。
三、AI实践
1. 核心功能设计
- 实时天气查询(温度/湿度/风速/天气状况),输入城市名称即可,简称或完整名称
- 自然语言交互式应答,提供温馨的天气报告
- 流式结果输出,减少时间等待,提升交互体验
2. 环境准备
(1)因和风天气和无问芯穹接口调用都需要使用API密钥
,因此需要分别去其官网注册账户并创建应用KEY:
这两个网站都可以免费注册申请应用密钥,正常测试使用没啥问题的。
获取和风天气 API 密钥
(申请链接) 和无问芯穹 API 密钥
(申请链接),并将其存储在当前目录下的 .env
文件中。
(2)安装Python
环境依赖
pip install openai python-dotenv requests
其中:
- openai:提供与OpenAI API交互的官方SDK(也适用于无问芯穹的deepseek模型接口调用),支持调用GPT、DALL·E等模型实现文本生成、图像创作等AI功能。
- python-dotenv:用于从
.env
文件加载环境变量,简化敏感配置(如API密钥)的管理和隔离。 - requests:简洁高效的HTTP请求库,支持API调用、数据爬取及服务端通信,具备自动内容解码和连接池管理。
3. 关键代码实现
3.1 系统架构与依赖
(1)依赖库
import os
import json
import requests
from openai import OpenAI
from dotenv import load_dotenv
from requests.exceptions import RequestException
openai
和dotenv
用于与无问芯穹 API 进行交互及环境变量管理,为 AI 部分提供支持。requests
主要用于和风天气 API 的 HTTP 请求,获取天气数据。json
用于解析和处理 JSON 格式的响应数据,确保数据的正确性和可读性。
(2)环境变量初始化:
load_dotenv()
client = OpenAI(
base_url="https://cloud.infini-ai.com/maas/v1",
api_key=os.getenv("INFINI_AI_KEY")
)
使用dotenv
加载.env
配置文件,其中包含无问芯穹 API 的密钥INFINI_AI_KEY
,将敏感信息与代码分离,符合安全规范。
(3)环境变量文件: .env
文件
INFINI_AI_KEY=sk-**
WEATHER_API_KEY=**
3.2 核心函数
(1)城市编码解析:
def get_city_code(city: Union[str, int]) -> str:
"""
智能解析城市编码(支持中英文城市名/行政区划编码)
"""
api_key = os.getenv("WEATHER_API_KEY")
# 判断是否为纯数字编码
if isinstance(city, int) or city.isdigit():
return str(city)
# 调用和风天气城市查询 API
geoapi_url = "https://geoapi.qweather.com/v2/city/lookup"
params = {
"location": city,
"key": api_key,
"range": "cn",
"lang": "zh",
"number": 1
}
try:
response = requests.get(geoapi_url, params=params, timeout=10)
response.raise_for_status()
data = response.json()
if data['code'] == '200' and data['location']:
cid = data['location'][0]['id']
return cid
raise ValueError(