目录
摘要
一.什么是Tools?
1.含义
2.示意图
二.自定义工具:从函数到 Tool
1.定义普通函数
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 函数。例如,一个计算平方根的简单函数:
def square_root(x: float) -> float: return x ** 0.52.使用@tool装饰器改造
接着,我们导入langchain.tools模块中的@tool装饰器,并为函数添加详细的说明文档(Docstring)。这一步至关重要,因为大模型正是通过这些说明来理解工具的用途和参数含义。
关键动作:
- 使用@tool修饰
- 添加函数的说明文档
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装饰器将其封装。代码中包含了详细的异常处理,以确保工具的健壮性。
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 就能自动调用该工具并返回结果。
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,询问某城市的天气即可
# 3.调用Agent,发送消息 for token, metadata in agent.stream( {"messages": [HumanMessage(content="深圳的天气怎么样?")]}, stream_mode="messages" ): print(token.content, end="", flush=True)5.运行结果与验证
先询问一下“深圳”的天气
好的,我来查询一下深圳的天气情况。深圳市 当前天气:晴,气温:27℃,南风2级,相对湿度:82%。(10 分钟前发布)深圳现在的天气情况如下: 🌤 **天气状况:** 晴 🌡 **气温:** 27℃ 🌬 **风力:** 南风2级 💧 **相对湿度:** 82% 总体来看,深圳目前天气晴朗,气温舒适,适合外出活动,不过由于湿度较大,体感可能会有些闷热,建议注意适当补水哦!此时经过对比发现,大模型返回的结果,和我们自己用ApiFox调免费接口的结果一致,可见此时Tools生效了。
再换个城市试试
好的,我来查询廊坊的天气情况。廊坊市 当前天气:晴,气温:28℃,西南风3级,相对湿度:60%。(11 分钟前发布)廊坊当前的天气情况如下: - 🌤 **天气状况**:晴 - 🌡 **气温**:28℃ - 🌬 **风力**:西南风3级 - 💧 **相对湿度**:60% 总体来说,廊坊现在是晴朗的好天气,气温舒适宜人,适合外出活动。不过相对湿度60%稍微有点闷,可以适当补充水分哦!可见此时廊坊的天气情况,大模型也能根据该天气API做出回答,可见此时Tools也生效了。
四.总结与展望
通过本文的实战,我们成功构建了一个功能完备的天气查询 Tool。这不仅解决了大模型无法获取实时信息的局限,也展示了如何通过代码扩展模型的能力。
后续优化方向:
- 自定义数据源:你可以将 Tool 的后端逻辑替换为自己的 Web API 或数据库查询(Mapper),让大模型成为你私有数据的智能入口。
- 优化提示词(Prompt Engineering):通过编写更精准的系统提示词,可以引导大模型以更美观、更符合业务需求的格式返回工具调用结果。
- 集成更多工具:将多个工具组合起来,你的 Agent 就能完成更复杂的任务,例如“帮我查一下明天北京的天气,如果下雨就帮我订一把伞”。
掌握 Tool 的开发与集成,是构建强大、实用的 AI 应用的关键一步。希望本文能为你提供清晰的指引和启发。
以上就是本篇文章的全部内容,喜欢的话可以留个免费的关注呦~~~