基于LangChain的天气查询插件开发与实践

基于LangChain的天气查询插件开发与实践

一、插件设计背景

在智能对话系统中,天气查询是高频需求。本文将演示如何开发一个支持自然语言解析异步API调用的天气插件,实现以下功能:

  • 支持城市名称/行政编码双重输入
  • 自动识别用户关注的天气要素
  • 基于高德地图API获取实时天气数据

二、准备工作

1. 环境依赖

pip install langchain langchain-ollama aiohttp python-dotenv

2. 高德API配置

  1. 注册高德开放平台获取API Key
  2. 创建.env文件:
GAODE_API_KEY=your_api_key_here

三、核心代码实现

1. 天气工具类设计

class WeatherTool(BaseTool):
    name: str = "get_current_weather"
    description: str = (
        "获取指定地点的当前天气信息。"
        "参数应为包含'location'键的字典,"
        "location可以是城市名称或行政编码"
    )
    api_key: str = GAODE_API_KEY
    session: aiohttp.ClientSession = None

关键特性:

  • 异步支持:使用aiohttp实现非阻塞IO
  • 会话复用:通过create()方法共享HTTP会话
  • 错误处理:自定义GeoAPIError异常体系

2. 核心功能模块

(1)地理编码解析
async def _get_city_code(self, location: str) -> str:
    """自动识别城市名称/编码"""
    params = {"key": self.api_key, "address": location}
    async with self.session.get(GEOCODE_URL, params=params) as response:
        data = await response.json()
        return geocodes[0]["adcode"]  # 返回行政编码
(2)天气数据获取
async def _arun(self, location: str) -> str:
    """异步执行主逻辑"""
    city_code = location if location.isdigit() else await self._get_city_code(location)
    params = {"city": city_code, "key": self.api_key}
    async with self.session.get(WEATHER_URL, params=params) as response:
        return self._format_weather_data(await response.json())
(3)数据格式化
@staticmethod
def _format_weather_data(data: Dict) -> str:
    """人性化输出设计"""
    return (
        f"📍地区:{weather.get('province')} {weather.get('city')}\n"
        f"🌤天气:{weather.get('weather')}\n"
        f"🌡温度:{weather.get('temperature')}℃"
    )

3. 智能解析模块

tool_prompt = ChatPromptTemplate.from_messages([
    SystemMessage(content=(
        "请从用户输入中识别:"
        "1. 地理位置(支持中文名称/行政编码)"
        "2. 用户关心的天气要素"
        "请用JSON返回{location}"
    )),
    HumanMessage(content=message)
])

四、插件集成与测试

1. 完整调用链

async def get_weather_info(message: str) -> List[ToolMessage]:
    weather_tool = await WeatherTool.create()
    try:
        tool_llm = ChatOllama(  # 使用本地部署的Qwen模型
            model="qwen2.5:32b",
            base_url="http://192.168.1.237:11434"
        ).bind_tools([weather_tool])
        
        chain = tool_prompt | tool_llm  # 组合提示模板和模型
        response = await chain.ainvoke({"input": message})
        
        # 处理工具调用结果
        return [await _handle_tool_call(call, weather_tool) for call in response.tool_calls]
    finally:
        await weather_tool.close()

2. 测试用例与结果

测试输入处理逻辑输出示例
“北京海淀区天气怎么样?”解析为城市名称🌡温度:18℃
🌤天气:多云
“110101的天气”直接使用行政编码📍地区:北京市 东城区
“上海浦东风力”提取关注要素💨风力:3级

五、扩展与优化建议

1. 功能增强方向

# 建议扩展点示例
def _format_weather_data(data: Dict) -> str:
    # 添加空气质量数据
    if (forecasts := data.get("forecasts")):
        return f"🌬空气质量:{forecasts[0]['aqi']}"
    
    # 支持多日预报
    if len(lives) > 1:
        return "\n".join([format_day(day) for day in lives])

2. 部署建议

  1. 使用uvicorn部署为HTTP服务:
# main.py
from fastapi import FastAPI
app = FastAPI()

@app.post("/weather")
async def get_weather(message: str):
    return await get_weather_info(message)
  1. 配置Nginx反向代理提升安全性

六、总结

本文通过实际代码演示了:

  1. 基于LangChain工具链的插件开发规范
  2. 异步API调用的最佳实践
  3. 自然语言到结构化参数的解析方法
  4. 异常处理与用户体验优化

该插件可无缝集成到各类对话系统中,通过扩展_format_weather_data方法,可轻松支持空气质量、生活指数等更多天气相关功能。

### 基于 Langchain-Chatchat 开发指南 #### 一、环境准备 为了顺利开展基于Langchain-Chatchat的开发工作,需先准备好相应的运行环境。由于该项目支持通过Docker镜像进行一键部署[^2],推荐采用此方式来简化安装流程。 #### 二、获取源码配置 访问GitHub仓库下载最新版本的Langchain-Chatchat项目代码[^1]。按照官方文档指示完成必要的初始化设置,包括但不限于API密钥配置以及数据集加载等操作。 #### 三、理解核心组件架构 Langchain-Chatchat主要由以下几个部分组成: - **知识图谱模块**:负责管理和查询结构化后的领域特定信息。 - **对话管理器**:处理用户的输入请求并调用合适的响应策略。 - **自然语言处理引擎**:解析用户提问中的意图和实体识别。 这些组成部分共同协作实现了强大的本地知识库问答功能。 #### 四、实践案例分析 对于希望深入了解实际应用场景下的实现细节而言,可以参考如下Python脚本作为入门级练习: ```python from langchain_chatchat import KnowledgeBase, ChatBot # 初始化知识库实例 kb = KnowledgeBase('path/to/your/knowledgebase') # 创建聊天机器人对象 bot = ChatBot(kb) while True: user_input = input("请输入您的问题:") response = bot.get_response(user_input) print(f"回答:{response}") ``` 上述代码展示了如何利用`KnowledgeBase`类加载自定义的知识文件,并借助`ChatBot`接口实现简单的交互逻辑。 #### 五、优化性能建议 随着项目的深入发展,可能会遇到一些效率瓶颈或者资源占用过高的情况。此时可以从调整参数配置入手尝试解决问题;另外也可以考虑引入缓存机制提高热点话题的回答速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值