LangChain 集成与编写高德天气预报查询插件
高德地图API提供了天气预报查询功能,开发者需通过行政区域查询接口获取城市编码,再调用天气接口获取数据。本文介绍了如何基于LangChain框架实现一个天气预报查询工具:首先配置高德API密钥,通过城市名查询行政编码,再获取该城市的天气信息。该工具采用BaseTool子类实现,输入城市名即可返回包含温度、天气状况、风力等详细信息的JSON格式数据。示例代码展示了查询广州天气的实现过程,包含完整的错
01. 高德城市与天气预报接口
高德 Web 服务 API 向开发者提供了大量的 HTTP 接口,涵盖了:地理/逆地理编码、路径规划、行政区域查询、IP定位、天气查询、坐标转换、轨迹纠偏等接口,并且向开发者提供了足量的调用额度,用于开发/调试各类地图类型的应用(商用需付费)。
- 高德 Web 服务 API 链接:概述-Web服务 API | 高德地图API
- 高德开放平台控制台:首页 | 高德控制台
在 LLMOps 项目中,我们会集成一个 根据城市查询天气预报的自定义工具,所以可以考虑使用高德提供的服务,在使用之前,必须实名认证高德开放平台,并且创建 应用,获取好对应的 秘钥,并将其配置到环境变量中,例如
# 高德工具
GAODE_API_KEY=00b0****e6e7
在高德提供的服务中,天气预报 查询接口必须传递 城市编码 才可以获取对应城市的信息(天气预报),接口如下
https://restapi.amap.com/v3/weather/weatherInfo?city=<城市编码>&key=<用户key>
例如 110101 代表北京,所以需要一个额外的接口来根据传入的 城市名 获取到相应的 城市编码(行政区域查询),接口如下
https://restapi.amap.com/v3/config/district?keywords=<城市名>&subdistrict=0&key=<用户的key>
所以要完成一个输入 城市名 查询天气预报的函数/工具,必须先调用 行政区域查询 将城市转换为城市编码,然后在利用城市编码调用 天气预报 接口,从而完成整个流程,如下

02. 天气预报查询工具实现
由于该接口并没有已经实现好的任何代码,所以可以考虑使用 BaseTool子类 的形式来实现,即工具接收一个参数 city 表示需要查询天气预报的城市名,然后调用 行政区域查询 接口获取该城市对应的 行政编码,接下来将 行政编码 传递给 天气预报 接口,获取最终天气信息。
示例代码如下
import json
import os
from typing import Type, Any
import dotenv
import requests
from langchain_core.pydantic_v1 import Field, BaseModel
from langchain_core.tools import BaseTool
dotenv.load_dotenv()
class GaodeWeatherArgsSchema(BaseModel):
city: str = Field(description="需要查询天气预报的目标城市,例如:广州")
class GaodeWeatherTool(BaseTool):
"""根据传入的城市名查询天气"""
name = "gaode_weather"
description = "当你想询问天气或与天气相关的问题时的工具。"
args_schema: Type[BaseModel] = GaodeWeatherArgsSchema
def _run(self, *args: Any, **kwargs: Any) -> str:
"""运行工具获取对应城市的天气预报"""
try:
# 1.获取高德API秘钥,如果没有则抛出错误
gaode_api_key = os.getenv("GAODE_API_KEY")
if not gaode_api_key:
return f"高德开放平台API秘钥未配置"
# 2.提取传递的城市名字并查询行政编码
city = kwargs.get("city", "")
session = requests.session()
api_domain = "https://restapi.amap.com/v3"
city_response = session.request(
method="GET",
url=f"{api_domain}/config/district?keywords={city}&subdistrict=0&extensions=all&key={gaode_api_key}",
headers={"Content-Type": "application/json; charset=utf-8"},
)
city_response.raise_for_status()
city_data = city_response.json()
# 3.提取行政编码调用天气预报查询接口
if city_data.get("info") == "OK":
if len(city_data.get("districts")) > 0:
ad_code = city_data["districts"][0]["adcode"]
weather_response = session.request(
method="GET",
url=f"{api_domain}/weather/weatherInfo?city={ad_code}&extensions=all&key={gaode_api_key}&output=json",
headers={"Content-Type": "application/json; charset=utf-8"},
)
weather_response.raise_for_status()
weather_data = weather_response.json()
if weather_data.get("info") == "OK":
return json.dumps(weather_data)
session.close()
return f"获取{kwargs.get('city')}天气预报信息失败"
# 4.整合天气预报信息并返回
except Exception as e:
return f"获取{kwargs.get('city')}天气预报信息失败"
gaode_weather = GaodeWeatherTool()
print(gaode_weather.invoke({"city": "广州"}))
输出内容:
{"status": "1", "count": "1", "info": "OK", "infocode": "10000", "forecasts": [{"city": "广州市", "adcode": "440100", "province": "广东", "reporttime": "2024-08-12 15:30:27", "casts": [{"date": "2024-08-12", "week": "1", "dayweather": "中雨", "nightweather": "中雨", "daytemp": "34", "nighttemp": "25", "daywind": "北", "nightwind": "北", "daypower": "1-3", "nightpower": "1-3", "daytemp_float": "34.0", "nighttemp_float": "25.0"}, {"date": "2024-08-13", "week": "2", "dayweather": "中雨", "nightweather": "中雨", "daytemp": "33", "nighttemp": "25", "daywind": "北", "nightwind": "北", "daypower": "1-3", "nightpower": "1-3", "daytemp_float": "33.0", "nighttemp_float": "25.0"}, {"date": "2024-08-14", "week": "3", "dayweather": "中雨", "nightweather": "中雨-大雨", "daytemp": "33", "nighttemp": "25", "daywind": "北", "nightwind": "北", "daypower": "1-3", "nightpower": "1-3", "daytemp_float": "33.0", "nighttemp_float": "25.0"}, {"date": "2024-08-15", "week": "4", "dayweather": "中雨-大雨", "nightweather": "中雨-大雨", "daytemp": "33", "nighttemp": "25", "daywind": "北", "nightwind": "北", "daypower": "1-3", "nightpower": "1-3", "daytemp_float": "33.0", "nighttemp_float": "25.0"}]}]}
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)