如何利用LangChain1.0快速进行天气查询
1. 系统概述
本系统是一个基于LangChain框架构建的智能天气查询工具,利用通义千问大语言模型和知心天气API实现自然语言天气查询功能。用户可以通过自然语言提问来获取指定城市的天气信息。
2. 系统架构
2.1 主要组件
-
Agent代理模块 (
main.py)- 使用
ChatTongyi模型作为核心推理引擎 - 集成自定义天气查询工具
query_weather - 处理自然语言输入并生成相应响应
- 使用
-
天气工具模块 (
func_tool/wechat.py)- 实现了与知心天气API的交互逻辑
- 包含三个主要函数:
fetch_weather_sync: 同步获取天气数据format_weather: 格式化天气信息query_weather: LangChain工具接口函数
2.2 工作流程
- 用户提出自然语言查询(如"明天汕尾的天气怎么样,下雨吗")
- Agent解析用户意图并调用
query_weather工具 query_weather调用fetch_weather_sync从知心天气API获取数据- 获取的数据通过
format_weather格式化为易读文本 - Agent将格式化的结果返回给用户
3. 核心模块详解
3.1 Agent代理模块 (main.py)
from dotenv import load_dotenv
import os
# 加载.env文件中的环境变量
load_dotenv(override=True)
from func_tool.wechat import query_weather
from langchain.agents import create_agent
from langchain_community.chat_models import ChatTongyi
model = ChatTongyi(model="qwen-turbo", api_key=os.getenv("DASHSCOPE_API_KEY"))
agent = create_agent(
model=model,
tools=[query_weather]
)
question1 = "明天汕尾的天气怎么样,下雨吗"
# 运行agent
response1 = agent.invoke(
{"messages": [{"role": "user", "content": question1}]}
)
print(response1['messages'][-1].content)
3.2 天气工具模块 (func_tool/wechat.py)
import json
import httpx
from typing import Any
from langchain.tools import tool
import os
# 知心天气 API 配置
OPENWEATHER_API_BASE = "https://api.seniverse.com/v3/weather/now.json"
API_KEY = os.getenv("SENIVERSE_API_KEY") # 请替换为你自己的 知心天气 API Key
USER_AGENT = "weather-app/1.0"
def fetch_weather_sync(city: str) -> dict[str, Any] | None:
"""
从 知心天气 API 获取天气信息(同步版本)。
:param city: 城市名称(需使用英文,如 beijing)
:return: 天气数据字典;若出错返回包含 error 信息的字典
"""
params = {
"location": city,
"key": API_KEY,
"language": "zh-Hans",
"unit": "c"
}
try:
response = httpx.get(OPENWEATHER_API_BASE, params=params, timeout=30.0)
response.raise_for_status()
return response.json() # 返回字典类型
except httpx.HTTPStatusError as e:
return {"error": f"HTTP 错误: {e.response.status_code}"}
except Exception as e:
return {"error": f"请求失败: {str(e)}"}
def format_weather(data: dict[str, Any] | str) -> str:
"""
将天气数据格式化为易读文本。
:param data: 天气数据(可以是字典或 JSON 字符串)
:return: 格式化后的天气信息字符串
"""
# 如果传入的是字符串,则先转换为字典
if isinstance(data, str):
try:
data = json.loads(data)
except Exception as e:
return f"无法解析天气数据: {e}"
# 如果数据中包含错误信息,直接返回错误提示
if "status_code" in data:
return f"⚠️ {data['error']}"
# 提取数据时做容错处理
result = data.get("results", [{}])[0] # 若results为空则返回空字典
# 解析location信息(带多层防护)
location = result.get("location", {})
city = location.get("name", "未知")
country = location.get("country", "未知")
# 解析now对象(类型转换增强)
now = result.get("now", {})
temp = now.get("temperature", "N/A") # 保持字符串类型,如需数值可做转换
description = now.get("text", "未知")
# 处理旧版接口字段(新版无对应字段)
humidity = "N/A" # 新版数据结构无湿度字段
wind_speed = "N/A" # 新版数据结构无风速字段
return (
f"🌍 {city}, {country}\n"
f"🌡 温度: {temp}°C\n"
f"💧 湿度: {humidity}%\n"
f"🌬 风速: {wind_speed} m/s\n"
f"🌤 天气: {description}\n"
)
@tool
def query_weather(city: str) -> str:
"""
输入指定城市的英文名称,返回今日天气查询结果。
:param city: 城市名称(需使用英文)
:return: 格式化后的天气信息
"""
data = fetch_weather_sync(city)
return format_weather(data)
4. 关键特性
- 自然语言处理:支持中文天气查询
- 错误处理机制:完善的异常捕获和处理
- 模块化设计:各功能模块解耦,易于扩展
- 环境配置管理:通过
.env文件管理API密钥
5. 依赖库
langchain:AI代理框架langchain_community:社区模型支持httpx:HTTP客户端python-dotenv:环境变量加载dashscope:DashScope API支持
6. 环境配置
需要在.env文件中设置以下环境变量:
DASHSCOPE_API_KEY=your_dashscope_api_key
SENIVERSE_API_KEY=your_seniverse_api_key
7. 使用方法
-
安装依赖包:
pip install -r requirements.txt -
配置环境变量:
创建.env文件并填入相应的API密钥 -
运行程序:
python main.py

176

被折叠的 条评论
为什么被折叠?



