大模型调用外部工具获取实时天气的实现方法

大模型调用外部工具获取实时天气的实现方法

作为前端开发者,我们经常接触 AI 应用,但大模型(LLM)受限于训练数据,无法获取实时信息(如天气、股价)的问题一直很棘手。而大模型调用工具的方案,能让 AI 像人类一样主动调用外部接口,打破数据时效性的壁垒。本文用最简洁的代码,带你从零实现大模型 + 天气 API的实时查询功能

一、大模型如何"使用工具"?

大模型调用工具的本质很简单,就3步:

  1. 告诉大模型有什么工具(比如天气查询函数的名称、参数);
  2. 大模型接收用户提问(如"北京天气怎么样"),判断需要调用工具,自动生成参数;
  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_urlapi_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从"理论"走向"实用"的关键一步。 。

相关推荐
智泊AI3 小时前
怎么判断是自己prompt写的不够好?还是基座模型能力不够?
llm
文档伴侣7 小时前
个人知识管理新选择:探秘访答本地私有知识库
aigc·openai·ai开发·访答
踏浪无痕8 小时前
大语言模型是怎么训练出来的?一篇入门指南
机器学习·llm
斯文~11 小时前
【AI论文速递】SymAgent:知识图谱复杂推理的agent框架
人工智能·深度学习·llm·nlp·知识图谱
north_eagle1 天前
LightRAG:简单快速的检索增强生成
llm
CoderJia程序员甲1 天前
GitHub 热榜项目 - 日榜(2025-11-22)
ai·开源·llm·github·ai教程
烟袅1 天前
用 llm + SQLite 实现自然语言到 SQL 的智能转换:一个实战案例
sqlite·llm·agent
烟袅1 天前
从零开始:前端如何通过 `fetch` 调用 大模型(详解)
前端·javascript·llm
菠菠萝宝1 天前
【Java手搓RAGFlow】-9- RAG对话实现
java·开发语言·人工智能·llm·jenkins·openai