提升大模型能力:从零构建一个高精度天气查询Tool

目录

摘要

一.什么是Tools?

1.含义

2.示意图

[二.自定义工具:从函数到 Tool](#二.自定义工具:从函数到 Tool)

1.定义普通函数

[2.使用 @tool 装饰器改造](#2.使用 @tool 装饰器改造)

三.实战:构建天气查询工具

1.准备工作

2.编写Tool代码

3.创建agent时,带上该Tool

4.调用agent,询问某城市的天气即可

5.运行结果与验证

四.总结与展望


摘要

本文将深入浅出地介绍如何利用 LangChain 框架,将一个简单的 Python 函数改造成大模型可用的"Tool",并实战接入免费天气 API。通过本文,你将掌握扩展大模型能力的核心方法,解决大模型无法实时获取外部数据的痛点。

一.什么是Tools?

1.含义

在大模型(LLM)的应用开发中,Tools(工具) 是赋予大模型"手脚"和"感官"的关键组件。大模型本身虽然知识渊博,但其知识是静态的(截止到训练数据的时间),且无法主动与外部世界交互(如查询实时天气、操作数据库)。

Tools 的核心价值在于,它允许我们将外部 API、Python 函数或数据库查询封装成标准格式,让大模型根据用户需求自主选择并调用这些工具,从而获取实时信息或执行特定操作。这极大地拓展了大模型的能力边界,使其从一个"聊天机器人"进化为一个能够"办事"的智能代理(Agent)。

一个完整的Agent至少要包含两个关键的部分:

  • 模型:是Agent的大脑,负责推理、分析,规划任务步骤

  • 工具:是Agent的手脚,负责执行任务,与外界交互

2.示意图

二.自定义工具:从函数到 Tool

将一个普通函数改造成 LangChain 可识别的 Tool,核心步骤非常简单,主要分为两步:定义函数逻辑添加装饰器与描述

1.定义普通函数

首先,我们编写一个实现具体功能的 Python 函数。例如,一个计算平方根的简单函数:

python 复制代码
def square_root(x: float) -> float:
    return x ** 0.5

2.使用 @tool 装饰器改造

接着,我们导入 langchain.tools 模块中的 @tool 装饰器,并为函数添加详细的说明文档(Docstring)。这一步至关重要,因为大模型正是通过这些说明来理解工具的用途和参数含义。

关键动作:

  • 使用@tool修饰
  • 添加函数的说明文档
python 复制代码
from langchain.tools import tool

@tool
def square_root(x: float) -> float:
    """计算指定数字的平方根。
    
    Args:
        x (float): 需要计算平方根的数字。
        
    Returns:
        float: 输入数字的平方根。
    """
    return x ** 0.5

三.实战:构建天气查询工具

接下来,我们将通过一个完整的实战案例,演示如何构建一个能够查询实时天气的 Tool。

1.准备工作

  • 目标:获取指定城市的实时天气信息。
  • API 选择 :本文选用 https://uapis.cn/api/v1/misc/weather 这个API,查询天气详情

2.编写Tool代码

我们将使用 requests 库调用 API,并利用 @tool 装饰器将其封装。代码中包含了详细的异常处理,以确保工具的健壮性。

python 复制代码
from langchain.tools import tool
import requests

@tool
def getWeather(location: str) -> str:
    """
    该方法用于获取指定地区(location)的天气情况。
    
    Args:
        location (str): 省份名或市名。
        
    Returns:
        str: 包含天气状况、气温、风力、湿度等信息的自然语言描述。
    """
    url = "https://uapis.cn/api/v1/misc/weather"

    try:
        # 发送GET请求,将城市名作为参数传递,并设置超时时间为5秒
        response = requests.get(url, params={"city": location}, timeout=5)
        # 检查HTTP状态码,如果请求失败则抛出异常
        response.raise_for_status()

        # 解析返回的JSON数据
        data = response.json()

        # 根据实际返回的JSON格式提取各项数据
        city_name = data.get("city", location)
        weather = data.get("weather", "未知")
        temperature = data.get("temperature", "未知")
        wind_direction = data.get("wind_direction", "")
        wind_power = data.get("wind_power", "")
        humidity = data.get("humidity", "")
        report_time = data.get("report_time", "")

        # 拼接返回的自然语言字符串
        result = (
            f"{city_name} 当前天气:{weather},气温:{temperature}℃,"
            f"{wind_direction}{wind_power},相对湿度:{humidity}%。"
            f"({report_time})"
        )
        return result

    except requests.exceptions.Timeout:
        return f"请求超时,无法获取 {location} 的天气信息。"
    except requests.exceptions.RequestException as e:
        return f"查询失败:{e}"
    except Exception as e:
        return f"解析天气数据时发生错误:{e}"

3.创建agent时,带上该Tool

在创建 Agent 时,我们将 getWeather 工具传入。这样,当用户提问天气相关问题时,Agent 就能自动调用该工具并返回结果。

python 复制代码
from langchain.messages import HumanMessage, AIMessage
from langchain.agents import create_agent
from dotenv import load_dotenv

# 1. 加载项目根目录下的 .env 文件,这样就可以让Langchain自动获取.env文件中的apikey了
load_dotenv()
# 2. 创建Agent
agent = create_agent(
    model="deepseek-chat",
    tools=[getWeather] # 关键的一步:创建agent时,可以指定已创建的Tools
)

4.调用agent,询问某城市的天气即可

python 复制代码
# 3.调用Agent,发送消息
for token, metadata in agent.stream(
    {"messages": [HumanMessage(content="深圳的天气怎么样?")]},
    stream_mode="messages"
):
    print(token.content, end="", flush=True)

5.运行结果与验证

先询问一下"深圳"的天气

python 复制代码
好的,我来查询一下深圳的天气情况。深圳市 当前天气:晴,气温:27℃,南风2级,相对湿度:82%。(10 分钟前发布)深圳现在的天气情况如下:


🌤 **天气状况:** 晴

🌡 **气温:** 27℃

🌬 **风力:** 南风2级

💧 **相对湿度:** 82%


总体来看,深圳目前天气晴朗,气温舒适,适合外出活动,不过由于湿度较大,体感可能会有些闷热,建议注意适当补水哦!

此时经过对比发现,大模型返回的结果,和我们自己用ApiFox调免费接口的结果一致,可见此时Tools生效了。

再换个城市试试

python 复制代码
好的,我来查询廊坊的天气情况。廊坊市 当前天气:晴,气温:28℃,西南风3级,相对湿度:60%。(11 分钟前发布)廊坊当前的天气情况如下:


- 🌤 **天气状况**:晴

- 🌡 **气温**:28℃

- 🌬 **风力**:西南风3级

- 💧 **相对湿度**:60%


总体来说,廊坊现在是晴朗的好天气,气温舒适宜人,适合外出活动。不过相对湿度60%稍微有点闷,可以适当补充水分哦!

可见此时廊坊的天气情况,大模型也能根据该天气API做出回答,可见此时Tools也生效了。

四.总结与展望

通过本文的实战,我们成功构建了一个功能完备的天气查询 Tool。这不仅解决了大模型无法获取实时信息的局限,也展示了如何通过代码扩展模型的能力。

后续优化方向

  1. 自定义数据源:你可以将 Tool 的后端逻辑替换为自己的 Web API 或数据库查询(Mapper),让大模型成为你私有数据的智能入口。
  2. 优化提示词(Prompt Engineering):通过编写更精准的系统提示词,可以引导大模型以更美观、更符合业务需求的格式返回工具调用结果。
  3. 集成更多工具:将多个工具组合起来,你的 Agent 就能完成更复杂的任务,例如"帮我查一下明天北京的天气,如果下雨就帮我订一把伞"。

掌握 Tool 的开发与集成,是构建强大、实用的 AI 应用的关键一步。希望本文能为你提供清晰的指引和启发。

以上就是本篇文章的全部内容,喜欢的话可以留个免费的关注呦~~~

相关推荐
不爱洗脚的小滕8 小时前
【RAG】召回(Retrieval)与重排(Rerank)核心技术要点汇总
langchain·aigc·ai编程·rag
abigale0310 小时前
LangChain 实践4 7-1 项目初始化 + 基础Model I/O
langchain·fastapi·uvicorn·提示词模板·输出解析器·model i/o
_Programmer14 小时前
Langgraph踩坑记录
langchain
wuhen_n16 小时前
LangChain JS 入门:快速搭建前端 AI 开发环境
前端·langchain·ai编程
兆。16 小时前
LangChain框架深度解析:与FastGPT的优势对比
人工智能·langchain
Coder小相17 小时前
LangChain 1.0 第五篇 - Tool与MCP让Agent拥有行动力
人工智能·langchain·ai编程
兮山与18 小时前
LangChain2.0
langchain
AI周红伟20 小时前
长鑫科技存储之王:存储三强对比:三星、SK海力士 vs 长鑫科技
数据库·人工智能·科技·react.js·架构·langchain
java_cj20 小时前
LangChain初入门 - 简化LLM开发难度的利器
开发语言·python·langchain