大模型调用外部工具获取实时天气的实现方法
作为前端开发者,我们经常接触 AI 应用,但大模型(LLM)受限于训练数据,无法获取实时信息(如天气、股价)的问题一直很棘手。而大模型调用工具的方案,能让 AI 像人类一样主动调用外部接口,打破数据时效性的壁垒。本文用最简洁的代码,带你从零实现大模型 + 天气 API的实时查询功能
一、大模型如何"使用工具"?
大模型调用工具的本质很简单,就3步:
- 告诉大模型有什么工具(比如天气查询函数的名称、参数);
- 大模型接收用户提问(如"北京天气怎么样"),判断需要调用工具,自动生成参数;
- 执行工具调用(调用天气 API),将结果回传给大模型,最终整理成自然语言回答。
核心依赖:
requests:发送 HTTP 请求调用天气 API;openai:大模型 SDK(兼容 DeepSeek、GPT 等主流模型,接口通用);- 心知天气 API:免费开放使用,适合快速测试。
二、实战步骤:从环境到运行全流程
1. 环境准备:安装依赖
先安装所需 Python 库,建议用虚拟环境避免权限问题:
bash
# 安装核心依赖
pip install requests openai
2. 第一步:编写天气查询工具函数
先实现一个独立的天气查询函数,这里使用了免费的心知天气 API,负责和心知天气 API 交互,使该函数接收城市名,返回结构化天气描述。
python
import requests
# python 类型约定
# js 弱类型语言
# -> str 返回值的类型
def get_weather(location: str) -> str:
url = "https://api.seniverse.com/v3/weather/now.json"
params = {
"key":"your_api_key",# 替换为你自己的心知天气 API key
"location":location,
"language":"zh-Hans"
}
try:
resp = requests.get(url,params=params,timeout=10)
data = resp.json()
print(data)
if "results" in data:
r = data["results"][0]
city = r["location"]["name"]
# 当前对象天气
now = r["now"]
text = now["text"]
temp = now["temperature"]
# python 擅长机器学习 和字符处理
return f"{city}当前天气:{text}, 气温{temp}度"
else:
return "查询失败"
except Exception as e:
return f"异常: {e}"
get_weather("抚州") # 输出:抚州当前天气:阴,气温8度
- 调用 get_weather("抚州") 传入城市名;
- 函数通过 requests 库向天气 API 发送带密钥、城市名的请求;
- API 返回 JSON 格式的天气数据,函数解析出城市名、天气状况、气温;
- 用友好的格式返回结果,遇到错误时给出明确提示。
3. 第二步:让大模型认识工具
大模型看不懂 Python 函数,我们需要用 JSON 格式定义一份"工具使用说明书",明确告诉大模型:这个工具能做什么、需要传什么参数。这是工具调用成功的核心前提。
ini
from openai import OpenAI
import json
# 初始化大模型客户端(DeepSeek 为例,兼容 OpenAI 接口)
client = OpenAI(
api_key="your_API_KEY", # 替换为你的DeepSeek API key
base_url="https://api.deepseek.com/v1"# 调用模型接口地址(不同模型地址不同)
)
# 工具定义:告诉大模型可用的工具
tools = [
{
"type": "function",
"function": {
"name": "get_weather", # 必须和 Python 函数名一致
"description": "获取指定城市的当前实时天气", # 让大模型知道什么时候用这个工具
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称,如'北京'、'上海'" # 明确参数格式
}
},
"required": ["location"] # 必传参数
}
}
}
]
大模型本身看不懂 Python 写的 get_weather 函数(不知道它能干嘛、要传什么参数),这段代码就是给大模型写的「工具使用说明书」:
- 先连接到大模型(比如 DeepSeek);
- 定义工具的身份信息(名称)、功能描述(能干嘛)、参数要求(要传什么);
- 大模型看完这份说明书,就能在用户问 "北京天气怎么样" 时,自动判断要调用 get_weather 函数,且知道要传 location="北京" 参数。
4. 第三步:实现大模型与工具的联动
编写核心交互逻辑,完成"用户提问 → 大模型调用工具 → 返回结果"的闭环:
ini
# 用户提问
messages = [{"role": "user", "content": "北京天气怎么样"}]
# 1. 大模型判断是否需要调用工具
response = client.chat.completions.create(
model="deepseek-reasoner", # 推理型模型,擅长工具调用
messages=messages,
tools=tools,
tool_choice="auto", # 自动判断是否调用工具
temperature=0.3 # 降低随机性,保证参数准确
)
response_message = response.choices[0].message
messages.append(response_message) # 记录大模型响应
# 2. 如果需要调用工具,执行并获取结果
if response_message.tool_calls:
for tool_call in response_message.tool_calls:
# 解析工具调用参数
function_name = tool_call.function.name
function_args = json.loads(tool_call.function.arguments)
# 调用天气工具
if function_name == "get_weather":
tool_response = get_weather(function_args["location"])
else:
tool_response = "未知工具"
# 将工具结果回传给大模型
messages.append({
"role": "tool",
"name": function_name,
"tool_call_id": tool_call.id,
"content": tool_response
})
# 3. 大模型整理结果,生成最终回答
final_response = client.chat.completions.create(
model="deepseek-reasoner",
messages=messages,
temperature=0.3
)
print("大模型回答:")
print(final_response.choices[0].message.content)
这段代码的核心价值是实现大模型调用工具的自动化闭环:
- 无需人工判断 "要不要调用工具"------大模型自己分析用户需求;
- 无需人工提取参数 "该传什么值"------大模型自动从用户提问中提取(比如从 "北京天气怎么样" 提取 location="北京");
- 无需人工整理结果 "怎么回复用户"------大模型把工具返回的原始数据,整理成自然、友好的回答。
整个流程就像:你(用户)问助理(大模型)"北京天气怎么样",助理(大模型)自动打开天气 APP(调用 get_weather 工具),查完后把结果整理成口语化的回答告诉你 ------ 全程不用你动手,助理全搞定!
5. 运行结果示例
执行代码后,输出如下(实时数据会动态变化):
arduino
API 返回数据: {'results': [{'location': {'id': 'WX4FBXXFKE4F', 'name': '北京', ...}, 'now': {'text': '晴', 'temperature': '3'}, ...}]}
大模型回答:
根据查询结果,北京当前天气情况如下:
- 天气状况:晴
- 气温:3°C
今天北京天气晴朗,但气温较低,建议您:
- 外出时注意保暖,穿上厚外套
- 由于天气干燥,多补充水分
- 早晚温差可能较大,注意适时增减衣物
如果您需要了解其他地区的天气情况,随时告诉我!
三、关键知识点拆解
1. 为什么用 OpenAI SDK?
OpenAI 的 chat.completions 接口是行业事实标准,DeepSeek、通义千问等模型都兼容。就像前端用 Axios 适配不同后端接口一样,换模型只需改 base_url 和 api_key,核心代码不变。
2. 工具定义的3个核心要素
name:必须和 Python 函数名一致(大模型靠这个找到工具);description:越详细越好(比如写"获取实时天气"比只写"查天气"更准确,帮助大模型判断是否调用);parameters:明确参数类型和要求(避免大模型传入无效值,比如城市名传成拼音)。
3. 大模型的"会话记忆"
messages 数组负责维护对话上下文,就像前端的状态管理:
role="user":用户输入;role="assistant":大模型响应;role="tool":工具调用结果;role="system":可选,用于设置大模型的行为(如"回答简洁,带出行建议")。
4. 为什么大模型需要工具?
大模型的知识来自训练数据,无法获取实时信息(比如 2025 年的天气数据如果不在训练集中,就无法直接回答)。工具相当于给大模型开了个"外挂",让它能对接互联网 API、数据库等外部资源。
四、拓展方向
-
1.智能客服系统:调用公司的订单查询、物流跟踪接口,让AI自动回复用户的订单状态问题;
-
2.实时数据看板:集成股票、新闻、汇率等API,在前端页面中实现"自然语言提问 → 数据可视化展示"的交互;
-
3.个人助理应用:调用日历、备忘录、外卖等接口,实现"语音提问 → AI帮你订外卖/查日程"的全流程服务。
五、总结
本文通过一个实时天气查询实战,完整的展示了大模型如何借助工具调用与外部系统交互。整个流程不过百行代码,却打通了 LLM 与现实世界的连接通道------这正是构建实用 AI 应用的核心范式。
大模型工具调用的核心价值,不在于复杂的代码,而在于构建了"AI与现实世界交互"的桥梁。过去,大模型只能基于训练数据回答问题;如今,通过工具调用,它能主动获取实时数据、执行具体任务,这正是AI从"理论"走向"实用"的关键一步。 。