目录
[二.自定义工具:从函数到 Tool](#二.自定义工具:从函数到 Tool)
[2.使用 @tool 装饰器改造](#2.使用 @tool 装饰器改造)
摘要
本文将深入浅出地介绍如何利用 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。这不仅解决了大模型无法获取实时信息的局限,也展示了如何通过代码扩展模型的能力。
后续优化方向:
- 自定义数据源:你可以将 Tool 的后端逻辑替换为自己的 Web API 或数据库查询(Mapper),让大模型成为你私有数据的智能入口。
- 优化提示词(Prompt Engineering):通过编写更精准的系统提示词,可以引导大模型以更美观、更符合业务需求的格式返回工具调用结果。
- 集成更多工具:将多个工具组合起来,你的 Agent 就能完成更复杂的任务,例如"帮我查一下明天北京的天气,如果下雨就帮我订一把伞"。
掌握 Tool 的开发与集成,是构建强大、实用的 AI 应用的关键一步。希望本文能为你提供清晰的指引和启发。
以上就是本篇文章的全部内容,喜欢的话可以留个免费的关注呦~~~