Skip to content

高德天气预报查询插件 - 知识总结

一、这是什么?

高德天气预报查询插件 是一个基于 LangChain 框架开发的自定义工具(Tool),用于在 LLM 应用中集成高德地图开放平台的天气查询 API。

它继承自 langchain_core.tools.BaseTool,实现了一个可以被 Agent 调用的标准工具接口,让 AI 助手能够实时查询天气预报信息。


二、有什么用?

应用场景

  1. 智能天气助手

    • 用户问"今天上海天气怎么样?"时,AI 可以实时获取天气信息并回答
  2. 旅行规划助手

    • 根据目的地天气情况,提供出行建议(带伞、穿厚衣服等)
  3. 日程安排系统

    • 结合天气信息提醒用户户外活动的可行性
  4. 多轮对话增强

    • 让 LLM 超越训练数据限制,获取实时天气信息

核心功能

功能描述
城市查询支持输入城市名称查询
行政区划转换自动将城市名转换为 adcode
天气预报获取目标城市的天气预报数据
错误处理API 调用失败时返回友好提示

三、完整示例代码

python
import json
from typing import Any, Type
import requests
from pydantic import BaseModel, Field
from langchain_core.tools import BaseTool


# 1. 定义输入参数的 Schema
class GaodeWeatherArgsSchema(BaseModel):
    city: str = Field(description="需要查询天气预报的目标城市,例如:广州")


# 2. 定义自定义工具类
class GaodeWeatherTool(BaseTool):
    """根据传入的城市名查询天气"""

    name: str = "gaode_weather"
    description: str = "当你想查询天气或者与天气相关的问题时可以使用的工具"
    args_schema: Type[BaseModel] = GaodeWeatherArgsSchema

    def _run(self, *args: Any, **kwargs: Any) -> str:
        """根据传入的城市名称调用 API 获取天气预报信息"""

        # Step 1: 获取 API 密钥(建议从环境变量读取)
        gaode_api_key = os.getenv("GAODE_API_KEY")
        if not gaode_api_key:
            return "高德开放平台 API 未配置"

        # Step 2: 获取城市名称
        city = kwargs.get("city", "")
        api_domain = "https://restapi.amap.com/v3"
        session = requests.session()

        # Step 3: 查询行政区域编码(adcode)
        city_response = session.get(
            url=f"{api_domain}/config/district?key={gaode_api_key}&keywords={city}&subdistrict=0"
        )
        city_data = city_response.json()

        if city_data.get("info") == "OK":
            ad_code = city_data["districts"][0]["adcode"]

            # Step 4: 调用天气预报 API
            weather_response = session.get(
                url=f"{api_domain}/weather/weatherInfo?key={gaode_api_key}&city={ad_code}&extensions=all"
            )
            weather_data = weather_response.json()

            if weather_data.get("info") == "OK":
                # Step 5: 返回天气数据
                return json.dumps(weather_data, ensure_ascii=False)

        return f"获取{city}天气预报信息失败"


# 3. 创建工具实例
gaode_weather = GaodeWeatherTool()

# 4. 在 Agent 中使用
from langchain.agents import initialize_agent, AgentType
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(temperature=0)
tools = [gaode_weather]

agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.OPENAI_FUNCTIONS,
    verbose=True
)

# 使用 Agent 查询天气
result = agent.run("帮我查一下深圳明天的天气怎么样?")
print(result)

四、工作流程图

┌─────────────────────────────────────────────────────────────────────────┐
│                         高德天气查询工具工作流程                          │
└─────────────────────────────────────────────────────────────────────────┘

    用户输入                    LLM Agent                      工具执行
  ──────────                  ──────────                    ──────────

  "深圳天气"        ──────►    识别需求                     ───────►
    ↓                         判断需要工具                         ↓
                              选择 gaode_weather                ┌─────────────┐
                              调用 invoke({"city": "深圳"})      │ 1. 验证 API │
                                                                    └──────┬──────┘
    ┌──────────────────────────────────────────────────────────────────────┐
    │                          高德 API 调用流程                             │
    └──────────────────────────────────────────────────────────────────────┘

                              ┌─────────────────────────────────────────────┐
                              │         请求 1: 获取 adcode                  │
                              │  GET /v3/config/district                   │
                              │  ?keywords=深圳&subdistrict=0              │
                              └──────────────────┬──────────────────────────┘


                              ┌─────────────────────────────────────────────┐
                              │  响应: { "adcode": "440300", ... }          │
                              └──────────────────┬──────────────────────────┘


                              ┌─────────────────────────────────────────────┐
                              │         请求 2: 获取天气预报                 │
                              │  GET /v3/weather/weatherInfo               │
                              │  ?city=440300&extensions=all               │
                              └──────────────────┬──────────────────────────┘


                              ┌─────────────────────────────────────────────┐
                              │  响应: { forecasts: [{ ... }] }             │
                              └──────────────────┬──────────────────────────┘


                              ┌─────────────────────────────────────────────┐
                              │              返回 JSON 数据                  │
                              └─────────────────────────────────────────────┘

    ┌──────────────────────────────────────────────────────────────────────┐
    │                        LLM 处理并生成回答                              │
    └──────────────────────────────────────────────────────────────────────┘

                              "根据天气预报显示,深圳明天..."


                              ┌─────────────────────────────────────────────┐
                              │              返回给用户                       │
                              └─────────────────────────────────────────────┘