从上一篇,我们介绍了python结合LLM和deepseek模型,来处理一些问题,但是,无法回答实时性的问题,现在我们来解决这个问题
首先,我们需要借助一个外部的工具,比如查询天气,查询股票,我们需要使用它们的API,来获取实时性信息。
· 我们在终端输入以下命令,安装两个包!pip install requests 用于发送网络请求 !pip install openai
- pip是python的一个指令,install是其子命令,openai,requests,是python自带的库,我们可以直接调用它们来使用各种各样的功能。
- 使用方法:
from openai import OpenAI,import requests。
先看不使用大模型,来处理我们的输入,获取实时天气信息
import json:将python对象解析成json格式的数据,或者将json数据转换成python对象,我们先导入这个json包,因为我们的数据都是json格式的。- 这里我们定义的一个和获取天气的函数 get_weather(),我们设置这个函数的返回值是字符串类型,
->str
代码解析:
resp=requests.get(url,params=params,timeout=10),这里的requests.get方法,里面的params=params,有些人会看糊涂,第一个params是get方法里自带的参数,是固定的,而第二个params是我们要传给这个参数的名称,只不过我们设置的变量名称刚好和参数名称重合了。- data=resp.json,将数据转换成json格式。
data["results"][0]获取json数据的值,有人又要问了,哪里来的results,我既没有声明它,也没有定义它,为什么要这么写呢?这是因为,json数据的格式就是这样的,请看下图:-
- 在这个json数据里,results是一个数组,然后还有location是对象,等等,所以我们要获取json的数据,我们就要根据json数据对应的格式来写对应的语法和名称。
-
- 下面的
r["location"]["name"],r["now"],都是同理。
- 下面的
def get_weather(location :str)->str: # location :str,添加类型的约定 ->str返回值的类型
url="https://api.seniverse.com/v3/weather/now.json"
params={
"key":"你的deepseek APIKEY",
"location":location,
"language":"zh-Hans"
}
try:
resp=requests.get(url,params=params,timeout=10) #timeout=10,时间设置,发送一个请求,来传里面的参数
data=resp.json()
print(data)
if "results" in data:
r=data["results"][0]
city=r["location"]["name"]
now=r["now"]
temperature=now["temperature"]
sky=now["text"]
nwetime=r["last_update"]
return f"在{city},当前天气的温度是:{temperature}度,天空:{sky},时间:{nwetime}"
else:
return "查询失败"
except Exception as e:
return f"异常:{e}" # 输出异常
获取结果和运行过程
天气查询函数运行过程分析
函数定义
def get_weather(location: str) -> str:
步骤说明
- 函数声明:定义一个名为
get_weather的函数 - 参数类型提示:
location: str表示参数应为字符串类型 - 返回值类型提示:
-> str表示函数返回字符串类型
步骤1:准备API请求参数
url = "https://api.seniverse.com/v3/weather/now.json"
params = {
"key": "Sqbro5KQgkxInEtk6",
"location": location,
"language": "zh-Hans"
}
执行过程:
- 设置API端点:心知天气API的实时天气接口
- 构建参数字典:
key:API密钥(用于身份验证)location:查询的城市名称(来自函数参数)language:返回语言设置为简体中文
步骤2:发送HTTP请求
try:
resp = requests.get(url, params=params, timeout=10)
执行过程:
- 进入异常处理块:使用
try捕获可能出现的错误 - 发送GET请求:
- 使用
requests.get()方法 - 自动将参数拼接到URL中
- 设置10秒超时,防止请求卡死
- 使用
- 实际请求的URL示例: api.seniverse.com/v3/weather/…
步骤3:处理API响应
data = resp.json()
print(data)
执行过程:
- 解析JSON响应:将API返回的JSON数据转换为Python字典
- 打印原始数据:用于调试和查看完整响应结构
- 响应数据结构示例:
{
"results": [{
"location": {"name": "北京"},
"now": {
"temperature": "15",
"text": "晴"
},
"last_update": "2024-01-20T10:00:00+08:00"
}]
}
步骤4:数据提取与验证
if "results" in data:
r = data["results"][0]
city = r["location"]["name"]
now = r["now"]
temperature = now["temperature"]
sky = now["text"]
nwetime = r["last_update"]
执行过程:
- 检查数据有效性:确认响应中包含
results字段 - 提取第一项结果:通常只有一个城市的数据
- 逐层解析数据:
- 城市名称:
data["results"][0]["location"]["name"] - 当前天气:
data["results"][0]["now"] - 温度信息:从now对象中提取
- 天气状况:从now对象中提取
- 更新时间:获取最后更新时间
- 城市名称:
步骤5:格式化返回结果
return f"在{city},当前天气的温度是:{temperature}度,天空:{sky},时间:{nwetime}"
执行结果示例:
"在北京,当前天气的温度是:15度,天空:晴,时间:2024-01-20T10:00:00+08:00"
步骤6:错误处理
else:
return "查询失败"
except Exception as e:
return f"异常:{e}"
异常处理场景:
- API返回错误:当
results字段不存在时返回"查询失败" - 网络异常:请求超时、连接失败等
- 数据解析错误:JSON格式不正确
- 其他未知错误:返回具体的异常信息
完整执行流程图
graph TD
A[输入城市名称] --> B[准备API参数]
B --> C[发送HTTP请求]
C --> D{请求成功?}
D -->|是| E[解析JSON数据]
D -->|否| F[返回异常信息]
E --> G{有results字段?}
G -->|是| H[提取天气数据]
G -->|否| I[返回查询失败]
H --> J[格式化结果字符串]
I --> K[返回结果]
J --> K
F --> K
函数调用示例