当前位置: 首页 > backend >正文

LangChain实战(十二):自定义Tools扩展Agent能力

本文是《LangChain实战课》系列的第十二篇,将深入探讨如何通过自定义Tools来扩展LangChain Agent的能力。你将学习如何创建自己的Tool函数,让Agent能够调用外部API、查询数据库或执行任何自定义逻辑,从而极大扩展AI应用的能力边界。

前言

在前一篇文章中,我们学习了如何使用LangChain的Agents和内置工具来让LLM自主使用工具。然而,内置工具的功能是有限的,真正的强大之处在于能够根据特定需求创建自定义工具。今天,我们将学习如何编写自定义Tools,让Agent能够与外部世界进行交互,执行各种 specialized 的任务。

自定义Tool的基本结构

在LangChain中,一个自定义Tool通常包括以下要素:

  • name: 工具的名称,Agent通过名称来识别工具

  • description: 工具的描述,用于帮助LLM理解工具的功能和何时使用它

  • args_schema (可选): 定义输入参数的格式,有助于LLM生成正确的参数

  • _run 方法: 同步执行工具的主要逻辑

  • _arun 方法 (可选): 异步执行工具的主要逻辑

创建第一个自定义Tool

让我们从一个简单的例子开始,创建一个查询天气的自定义Tool。

from langchain.tools import BaseTool
from typing import Type
from pydantic import BaseModel, Field
import requests# 定义输入参数的模型
class WeatherCheckInput(BaseModel):location: str = Field(description="需要查询天气的城市名称")class WeatherTool(BaseTool):name = "weather_check"description = "查询指定城市的当前天气情况,包括温度、湿度和天气状况"args_schema: Type[BaseModel] = WeatherCheckInputdef _run(self, location: str):# 这里我们使用一个模拟的天气数据,实际应用中你可以调用天气API# 例如OpenWeatherMap、WeatherAPI等weather_data = {"beijing": "北京: 晴天, 22°C, 湿度45%","shanghai": "上海: 多云, 25°C, 湿度60%","guangzhou": "广州: 阵雨, 28°C, 湿度75%","shenzhen": "深圳: 晴天, 27°C, 湿度65%"}# 获取天气信息,如果城市不存在则返回错误信息weather_info = weather_data.get(location.lower())if weather_info:return weather_infoelse:return f"抱歉,找不到城市 {location} 的天气信息"async def _arun(self, location: str):# 异步实现,这里我们直接调用同步方法return self._run(location)# 使用自定义Tool
weather_tool = WeatherTool()
print(weather_tool.run("beijing"))

集成外部API:创建一个真实的天气查询Tool

现在让我们创建一个真正调用外部API的天气查询Tool。我们将使用OpenWeatherMap API(你需要注册获取API密钥)。

import os
from langchain.tools import BaseTool
from typing import Type
from pydantic import BaseModel, Field
import requests# 设置OpenWeatherMap API密钥
os.environ["OPENWEATHER_API_KEY"] = "your_api_key_here"class RealWeatherCheckInput(BaseModel):location: str = Field(description="需要查询天气的城市名称")class RealWeatherTool(BaseTool):name = "real_weather_check"description = "查询指定城市的真实天气情况,包括温度、湿度、天气状况和风速"args_schema: Type[BaseModel] = RealWeatherCheckInputdef _run(self, location: str):api_key = os.getenv("OPENWEATHER_API_KEY")if not api_key:return "请设置OPENWEATHER_API_KEY环境变量"# 调用OpenWeatherMap APIbase_url = "http://api.openweathermap.org/data/2.5/weather"params = {"q": location,"appid": api_key,"units": "metric",  # 使用摄氏度"lang": "zh_cn"     # 中文描述}try:response = requests.get(base_url, params=params)data = response.json()if response.status_code == 200:# 解析天气数据weather = data
http://www.xdnf.cn/news/19797.html

相关文章:

  • Python+DRVT 从外部调用 Revit:批量创建门
  • Streamable HTTP
  • sv中forever如何结束
  • AI 在金融、医疗、教育、制造业等领域有着广泛的应用,以下是这些领域的一些落地案例
  • STM32HAL 快速入门(十七):UART 硬件结构 —— 从寄存器到数据收发流程
  • 告别剪辑烦恼!3个超实用技巧,让你的视频瞬间高级起来
  • 【音视频】视频秒播优化实践
  • UnityWebRequest 数据获取和提交
  • wpf 只能输入int类型的文本框
  • WebSocket客户端库:websocket-fruge365
  • Ubuntu下把 SD 卡格式化为 FAT32
  • Hostol Magento电商服务器套餐:基于阿里云,预配置高性能环境,一键开店
  • 如何用java给局域网的电脑发送开机数据包
  • B样条曲线,已知曲线上的某个点到起点的距离,确定这个点的参数u的值的方法
  • 新手向:破解VMware迁移难题
  • MP4视频太大如何压缩?分享6种简单便捷的压缩小技巧
  • websocket用于控制在当前页只允许一个用户进行操作,其他用户等待
  • 硬件(一)51单片机
  • 阿里开源首个图像生成基础模型——Qwen-Image本地部署教程,中文渲染能力刷新SOTA
  • HTTP 协议核心组件与安全扩展深度解析
  • 机器学习与深度学习的 Python 基础之 NumPy(2)
  • uniapp+vue3 微信小程序全屏广告组件功能
  • AI IDE+AI 辅助编程,真能让程序员 “告别 996” 吗?
  • 【LeetCode_283】移动零
  • 技术小白如何快速的了解opentenbase?--把握四大特色
  • XE 旧版本 JSON 处理
  • 使用 Uni-app 打包 外链地址APK 及 iOS 注意事项
  • K8S-基础架构
  • 离开职场2个月,后知后觉的反思。
  • 素材合集!直播间带货音乐BGM合集,抖音直播间常用热门音乐合集,根据中文分类,方便查找