🌦️ Python天气查询实战:基于 OpenWeather API + LangChain Tool Calling 的完整实现


📌 一、项目简介

在实际开发中,经常需要对接外部 API 来获取实时数据,例如:

  • 天气查询
  • 搜索引擎结果
  • 数据分析接口
  • 自动化工具系统

本文实现一个完整的天气查询工具系统,核心能力包括:

✔ 调用 OpenWeather API
✔ 获取实时天气数据
✔ JSON 数据解析
✔ 转换为自然语言输出
✔ 支持 LangChain Tool Calling 机制


🧠 二、核心概念说明

在开始代码之前,需要先明确一个关键点:


⚙️ Tool Calling vs Function Calling

很多人会混用这两个概念,其实它们有层级关系:

🔹 1. Function Calling(模型能力)

这是大模型本身支持的一种能力:

👉 让模型以 JSON 结构输出“函数调用请求”

例如:

{
  "name": "get_weather",
  "arguments": {
    "city": "Beijing"
  }
}

✔ 本质:模型能力(底层能力)


🔹 2. Tool Calling(LangChain封装)

LangChain 在 Function Calling 基础上做了工程封装:

  • 工具注册(@tool)
  • 参数解析
  • 自动调用函数
  • 结果回填模型
  • Agent调度能力

✔ 本质:工程框架能力


🔥 一句话总结:

Function Calling 是模型能力
Tool Calling 是 LangChain 对它的工程封装


🧩 三、系统整体流程

用户输入城市
   ↓
LLM 判断是否需要工具
   ↓
生成 Tool Call 请求
   ↓
执行 get_weather 函数
   ↓
调用 OpenWeather API
   ↓
返回 JSON 数据
   ↓
转换为自然语言
   ↓
输出天气结果

🧰 四、环境准备

1️⃣ 安装依赖

pip install langchain langchain-core httpx python-dotenv loguru

2️⃣ 获取 API Key

注册 OpenWeather:

👉 https://home.openweathermap.org/api_keys

并写入 .env

OPENWEATHER_API_KEY=你的APIKEY

🌍 五、天气工具实现(核心代码)

📌 1. Tool定义(get_weather)

from langchain_core.tools import tool
import json
import os
import httpx
from dotenv import load_dotenv

load_dotenv(override=True)

openweather_api_key = os.getenv("OPENWEATHER_API_KEY")


@tool
def get_weather(loc: str):
    """
    查询即时天气函数
    """

    url = "https://api.openweathermap.org/data/2.5/weather"

    params = {
        "q": loc,
        "appid": openweather_api_key,
        "units": "metric",
        "lang": "zh_cn"
    }

    response = httpx.get(url, params=params)
    data = response.json()

    return json.dumps(data)

📌 功能说明

该函数完成:

  • 输入城市名称
  • 请求 OpenWeather API
  • 返回 JSON 天气数据

🤖 六、Tool Calling 调用机制

📌 绑定工具

llm_with_tools = llm.bind_tools([get_weather])

📌 工具解析链

from langchain_core.output_parsers import JsonOutputKeyToolsParser

parser = JsonOutputKeyToolsParser(
    key_name=get_weather.name,
    first_tool_only=True
)

get_weather_chain = llm_with_tools | parser | get_weather

📌 作用说明

这一层做了三件事:

  1. LLM 判断是否调用工具
  2. 解析 tool_call
  3. 执行 Python 函数

🧾 七、自然语言输出转换

📌 Prompt模板

from langchain_core.prompts import PromptTemplate

output_prompt = PromptTemplate.from_template(
"""
你将收到 JSON 格式天气数据:

{weather_json}

请将其转换为自然语言描述,例如:

北京天气:多云,气温 28℃,体感较热,湿度 75%,风力较弱。
"""
)

📌 输出解析器

from langchain_core.output_parsers import StrOutputParser

output_parser = StrOutputParser()

📌 最终链路

output_chain = output_prompt | llm | output_parser

full_chain = get_weather_chain | (lambda x: {"weather_json": x}) | output_chain

🚀 八、运行效果(流式输出)

for chunk in full_chain.stream("请问上海今天的天气如何?"):
    print(chunk, end="", flush=True)

📌 示例输出

上海天气:多云,气温 27℃,体感略热,湿度 60%,风力较弱,整体适合外出。

🔥 九、项目亮点总结

1️⃣ 标准 API 调用流程

  • httpx 请求
  • JSON解析
  • 数据结构化处理

2️⃣ Tool Calling 机制理解

你现在实现的是:

👉 LLM → 生成函数调用 → 自动执行 Python 工具


3️⃣ LangChain 工程封装能力

相比原生 Function Calling:

能力 Function Calling Tool Calling
函数调用
自动执行
工具管理
Agent支持

4️⃣ 支持流式输出

提升用户体验,适合:

  • Chatbot
  • 实时问答系统

📈 十、适用场景

本项目适用于:

  • Python API开发学习
  • LangChain工具开发
  • Agent系统入门
  • 自动化数据处理
  • AI工具系统构建

🧠 十一、总结

本文实现了一个完整的天气查询工具系统:

  • 基于 OpenWeather API
  • 使用 Python HTTP 请求
  • 使用 LangChain Tool Calling
  • 实现自然语言输出转换

🎯 一句话总结

Tool Calling 是让大模型具备“调用外部工具能力”的工程化实现,是构建 AI Agent 的基础能力之一。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐