高德天气预报查询插件 - 知识总结
一、这是什么?
高德天气预报查询插件 是一个基于 LangChain 框架开发的自定义工具(Tool),用于在 LLM 应用中集成高德地图开放平台的天气查询 API。
它继承自 langchain_core.tools.BaseTool,实现了一个可以被 Agent 调用的标准工具接口,让 AI 助手能够实时查询天气预报信息。
二、有什么用?
应用场景
智能天气助手
- 用户问"今天上海天气怎么样?"时,AI 可以实时获取天气信息并回答
旅行规划助手
- 根据目的地天气情况,提供出行建议(带伞、穿厚衣服等)
日程安排系统
- 结合天气信息提醒用户户外活动的可行性
多轮对话增强
- 让 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 处理并生成回答 │
└──────────────────────────────────────────────────────────────────────┘
"根据天气预报显示,深圳明天..."
│
▼
┌─────────────────────────────────────────────┐
│ 返回给用户 │
└─────────────────────────────────────────────┘