一、工具的本质与价值
工具(Tools)是LangChain的核心扩展机制,就像给智能系统装上瑞士军刀。通过自定义工具,我们可以:
- 连接任意外部API(天气查询、股票数据)
- 调用本地函数(文件处理、数据分析)
- 集成业务系统(CRM、ERP)
- 处理特殊数据类型(3D模型、传感器数据)
二、环境准备
pip install langchain-openai python-dotenv requests Pillow
创建自定义工具的三种方法
1. 使用@tool
装饰器(推荐)
from langchain.tools import tool
@tool
def search(query: str) -> str:
"""调用搜索引擎API查询信息(描述需清晰,代理会根据描述选择工具)"""
return f"关于{query}的搜索结果..."
特点:代码最简洁,适合单参数工具。
2. 继承BaseTool
类
from langchain.tools import BaseTool
from pydantic import BaseModel, Field
class SearchInput(BaseModel):
query: str = Field(description="搜索关键词")
class CustomSearchTool(BaseTool):
name = "custom_search"
description = "调用搜索引擎API查询信息"
args_schema = SearchInput
def _run(self, query: str) -> str:
return f"关于{query}的搜索结果..."
特点:支持复杂参数校验(通过Pydantic模型),适合多参数或需要严格输入格式的场景。
3. 通过Tool.from_function
动态创建
from langchain.tools import Tool
def search_function(query: str):
return f"关于{query}的搜索结果..."
search_tool = Tool.from_function(
func=search_function,
name="search",
description="调用搜索引擎API查询信息"
)
特点:灵活性高,适合将现有函数快速封装为工具。
多参数工具的实现技巧
若工具需要多个参数,可通过以下方式处理:
1. 参数合并为字符串
@tool
def generate_text(input: str) -> str:
"""输入格式:'主题,长度',例如'科技,100'"""
theme, length = input.split(",")
return f"生成与{theme}相关的{length}字文本..."
2. 使用结构化参数(JSON)
from langchain.tools import StructuredTool
def multi_arg_function(theme: str, length: int):
return f"生成与{theme}相关的{length}字文本..."
tool = StructuredTool.from_function(
func=multi_arg_function,
name="multi_arg_tool",
description="生成指定主题和长度的文本"
)
注意:结构化工具需要LLM支持函数调用(如GPT-4)。
三、基础工具开发
1. 创建第一个工具
from langchain.tools import tool
import requests
@tool
def get_weather(city: str) -> str:
"""获取指定城市的实时天气数据"""
base_url = "http://wthrcdn.etouch.cn/weather_mini"
response = requests.get(f"{base_url}?city={city}")
return response.json()["data"]["forecast"][0]
print(get_weather.invoke("北京"))
# 输出:{'date': '周二', 'high': '高温 35℃', ...}
2. 工具参数验证
from pydantic import BaseModel, Field
class StockQuery(BaseModel):
symbol: str = Field(..., description="股票代码,例如:AAPL")
days: int = Field(5, ge=1, le=30, description="查询天数")
@tool(args_schema=StockQuery)
def get_stock_data(symbol: str, days: int) -> dict:
"""获取股票历史数据"""
# 模拟数据返回
return {
"symbol": symbol,
"history": [100 + i*0.5 for i in range(days)]
}
print(get_stock_data.invoke({"symbol": "GOOGL", "days": 3}))
四、高级工具开发
1. 图像处理工具
from PIL import Image
import numpy as np
@tool
def image_color_analyzer(image_path: str) -> dict:
"""分析图片主色调"""
img = Image.open(image_path)
img_array = np.array(img)
# 简化版颜色分析算法
dominant_color = np.mean(img_array, axis=(0,1))
return {
"dominant_rgb": dominant_color.tolist(),
"color_palette": np.linspace(0, 255, 5).tolist()
}
print(image_color_analyzer.invoke("product.jpg"))
2. 异步API工具
import aiohttp
@tool
async def async_web_search(query: str) -> list:
"""异步网络搜索"""
async with aiohttp.ClientSession() as session:
async with session.get(
"https://api.example.com/search",
params={"q": query}
) as response:
results = await response.json()
return results["items"][:3]
# 使用示例
import asyncio
print(asyncio.run(async_web_search.invoke("LangChain最新特性")))
五、工具集成实战
1. 工具组合使用
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_openai import ChatOpenAI
tools = [get_weather, get_stock_data, image_color_analyzer]
model = ChatOpenAI(model="gpt-4")
agent = create_tool_calling_agent(model, tools)
agent_executor = AgentExecutor(agent=agent, tools=tools)
response = agent_executor.invoke({
"input": "先获取上海天气,然后分析logo.png的主色调"
})
print(response["output"])
2. 自动工具选择
from langchain import hub
prompt = hub.pull("hwchase17/openai-tools-agent")
agent = create_tool_calling_agent(model, tools, prompt)
question = """
当前情况:
1. 用户上传了产品图片design.jpg
2. 需要对比上海和纽约的天气差异
3. 查询微软股票最近5天表现
请逐步处理这些任务
"""
result = agent_executor.invoke({"input": question})
print(result["output"])
六、生产级优化技巧
1. 错误处理增强
from langchain.tools import ToolException
@tool
def safe_file_reader(file_path: str) -> str:
"""安全读取文本文件"""
try:
with open(file_path, "r") as f:
return f.read()
except Exception as e:
raise ToolException(f"文件读取失败: {str(e)}")
# 全局错误处理
def handle_tool_error(error: ToolException) -> str:
return f"工具调用异常:建议检查输入参数。原始错误:{error.args[0]}"
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
handle_parsing_errors=handle_tool_error
)
2. 性能优化
from functools import lru_cache
@tool
@lru_cache(maxsize=100)
def cached_api_call(endpoint: str) -> dict:
"""带缓存的API调用"""
response = requests.get(endpoint)
return response.json()
# 带超时的工具
@tool
def timeout_sensitive_task() -> str:
"""需要快速响应的任务"""
try:
result = requests.get("https://api.example.com/quick", timeout=3)
return result.text
except requests.Timeout:
return "请求超时"
七、企业级应用案例
1. 客户服务自动化
class CustomerServiceTools:
@tool
def query_order_status(order_id: str) -> dict:
"""订单状态查询"""
return db.query(f"SELECT * FROM orders WHERE id={order_id}")
@tool
def generate_service_report(start_date: str, end_date: str) -> str:
"""生成客户服务报告"""
data = db.query(f"BETWEEN {start_date} AND {end_date}")
return generate_pdf_report(data)
tools = [CustomerServiceTools.query_order_status,
CustomerServiceTools.generate_service_report]
agent = create_tool_calling_agent(model, tools)
2. 智能数据分析
@tool
def sql_query_runner(query: str) -> dict:
"""安全执行SQL查询"""
allowed_keywords = ["SELECT", "WHERE", "JOIN"]
if any(kw in query.upper() for kw in ["DROP", "DELETE"]):
raise ToolException("危险操作被阻止")
return pd.read_sql(query, con=db).to_dict()
@tool
def visualize_data(data: dict, chart_type: str) -> str:
"""生成数据可视化图表"""
df = pd.DataFrame(data)
plt.figure()
df.plot(kind=chart_type)
return save_plot_to_tempfile()
tools = [sql_query_runner, visualize_data]
八、调试与监控
1. 工具调用跟踪
from langchain.callbacks import FileCallbackHandler
handler = FileCallbackHandler("tool_logs.json")
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
callbacks=[handler]
)
# 日志文件示例
"""
{
"timestamp": "2024-03-20 14:30:00",
"tool_name": "get_weather",
"parameters": {"city": "上海"},
"duration": 0.75,
"success": true
}
"""
2. 性能监控仪表板
from prometheus_client import start_http_server, Counter
TOOL_CALL_COUNTER = Counter(
'tool_calls_total',
'Total tool calls',
['tool_name', 'status']
)
@tool
def monitored_tool():
try:
# 工具逻辑
TOOL_CALL_COUNTER.labels(tool_name="monitored_tool", status="success").inc()
except:
TOOL_CALL_COUNTER.labels(tool_name="monitored_tool", status="error").inc()
# 启动监控服务器
start_http_server(8000)
九、扩展方向
- 多语言支持:使用langchain-community的多语言工具包
- 权限控制:基于RBAC的工具访问管理
- 版本管理:实现工具灰度发布机制
- 自动文档生成:从工具定义生成API文档
# 自动文档生成示例
from langchain.tools import format_tool_to_openai_function
print(format_tool_to_openai_function(get_weather))
# 输出OpenAI兼容的函数定义
通过本文的实践,我们不仅掌握了自定义工具的开发技巧,还学习了企业级应用的最佳实践。关键要点总结:
- 使用Pydantic确保输入安全
- 异步工具提升并发性能
- 完善的错误处理机制
- 生产环境监控方案
附
官方 tools 文档
工具 | 🦜️🔗 LangChain
工具是为模型调用而设计的实用程序:它们的输入旨在由模型生成,输出则旨在传回模型。
工具包是一组旨在一起使用的工具。
搜索
下表展示了各种执行在线搜索的工具:
工具/工具包 | 免费/付费 | 返回数据 |
---|---|---|
必应搜索 | 付费 | 网址、摘要、标题 |
勇气搜索 | 免费 | 网址、摘要、标题 |
鸭鸭搜索 | 免费 | 网址、摘要、标题 |
Exa 搜索 | 每月 1000 次免费搜索 | 网址、作者、标题、发布日期 |
谷歌搜索 | 付费 | 网址、摘要、标题 |
谷歌 Serper | 免费 | 网址、摘要、标题、搜索排名、网站链接 |
Jina 搜索 | 免费提供 100 万个响应令牌 | 网址、摘要、标题、页面内容 |
Mojeek 搜索 | 付费 | 网址、摘要、标题 |
搜索 API | 注册即可获得 100 次免费搜索 | 网址、摘要、标题、搜索排名、网站链接、作者 |
SearxNG 搜索 | 免费 | 网址、摘要、标题、类别 |
SerpAPI | 每月 100 次免费搜索 | 答案 |
Tavily 搜索 | 每月 1000 次免费搜索 | 网址、内容、标题、图片、答案 |
You.com 搜索 | 免费 60 天 | 网址、标题、页面内容 |
代码解释器
下表展示了可用作代码解释器的工具:
工具/工具包 | 支持的语言 | 沙盒生命周期 | 支持文件上传 | 返回类型 | 支持自托管 |
---|---|---|---|---|---|
Azure 容器应用动态会话 | Python | 1 小时 | ✅ | 文本、图片 | ❌ |
Bearly 代码解释器 | Python | 执行时重置 | ✅ | 文本 | ❌ |
Riza 代码解释器 | Python、JavaScript、PHP、Ruby | 执行时重置 | ✅ | 文本 | ✅ |
生产力工具
下表展示了可用于自动化生产力工具中任务的工具:
工具/工具包 | 定价 |
---|---|
GitHub 工具包 | 免费 |
GitLab 工具包 | 个人项目免费 |
Gmail 工具包 | 免费,每用户每秒限制 250 个配额单位 |
Infobip 工具 | 免费试用,之后按需定价 |
Jira 工具包 | 免费,有速率限制 |
Office365 工具包 | 免费提供 Office365,包含速率限制 |
Slack 工具包 | 免费 |
Twilio 工具 | 免费试用,之后按使用量付费 |
网页浏览工具
下表展示了可用于自动化网页浏览器中任务的工具:
工具/工具包 | 定价 | 是否支持与浏览器交互 |
---|---|---|
MultiOn 工具包 | 每天 40 次免费请求 | ✅ |
PlayWright 浏览器工具包 | 免费 | ✅ |
Requests 工具包 | 免费 | ❌ |
数据库工具
下表展示了可用于自动化数据库中任务的工具:
工具/工具包 | 允许的操作 |
---|---|
Cassandra 数据库工具包 | SELECT 和模式内省 |
SQL 数据库工具包 | 任何 SQL 操作 |
Spark SQL 工具包 | 任何 SQL 操作 |
名称 | 描述 |
---|---|
AI 网络工具包 | AI 网络是一个为大规模应用设计的第 1 层区块链… |
Alpha Vantage | Alpha Vantage 提供实时和历史金融数据… |
Amadeus 工具包 | 本笔记本将指导你如何将 LangChain 连接到 Amadeus 工具包… |
Apify Actor | 概述 |
ArXiv | 本笔记本介绍了如何使用 arxiv 工具与代理… |
AskNews | AskNews 为任何大型语言模型提供最新的全球新闻(或历史新闻)… |
AWS Lambda | 亚马逊 AWS Lambda 是由亚马逊提供的无服务器计算服务… |
Azure AI 服务工具包 | 本工具包用于与 Azure AI 服务 API 交互以实现… |
Azure 认知服务工具包 | 本工具包用于与 Azure 认知服务 API 交互… |
Azure 容器应用动态会话 | Azure 容器应用动态会话提供了一个安全且可扩展的… |
Shell (bash) | 给代理提供 shell 访问权限非常强大(但在沙盒环境之外风险较高)… |
Bearly 代码解释器 | Bearly 代码解释器允许远程执行代码。这使得… |
必应搜索 | 必应搜索是一项 Azure 服务,提供安全、无广告、基于位置的搜索体验… |
勇气搜索 | 本笔记本介绍了如何使用勇气搜索工具。 |
Cassandra 数据库工具包 | Apache Cassandra® 是一个广泛使用的数据库,用于存储事务性数据… |
CDP | CDP Agentkit 工具包含使大型语言模型代理能够… |
ChatGPT 插件 | OpenAI 已弃用插件。 |
ClickUp 工具包 | ClickUp 是一个一体化的生产力平台,为小型和… |
Cogniswitch 工具包 | CogniSwitch 用于构建可投入生产的应用程序,这些应用程序可以与… |
Connery 工具包和工具 | 使用 Connery 工具包和工具,你可以将 Connery Action… |
Dall-E 图像生成器 | OpenAI Dall-E 是由 OpenAI 使用深度学习技术开发的文本到图像模型… |
Dappier | Dappier 将任何大型语言模型或你的代理式人工智能连接到实时、权利清晰的数据… |
Databricks Unity Catalog (UC) | 本笔记本展示了如何将 UC 函数用作 LangChain 工具,与… |
DataForSEO | DataForSeo 提供全面的搜索引擎优化和数字营销数据解决方案… |
Dataherald | 本笔记本介绍了如何使用 dataherald 组件。 |
鸭鸭搜索 | 本指南介绍了如何使用鸭鸭搜索组件。 |
Discord | 本笔记本提供了使用 Discord 的快速入门概述。 |
E2B 数据分析 | E2B 的云环境是大型语言模型运行时的绝佳沙盒。 |
Eden AI | 本 Jupyter 笔记本演示了如何使用 Eden AI 工具与代理… |
ElevenLabs 文本转语音 | 本笔记本展示了如何与 ElevenLabs API 交互以实现… |
Exa 搜索 | Exa 是一个专门为大型语言模型设计的搜索引擎。搜索文档… |
文件系统 | LangChain 提供了与本地文件系统交互的工具… |
金融数据集工具包 | 金融数据集股票市场 API 提供了 REST 端点,可以进行… |
FMP 数据 | 通过自然语言查询访问金融市场数据。 |
GitHub 工具包 | GitHub 工具包含使大型语言模型代理能够与 GitHub 交互的工具… |
GitLab 工具包 | GitLab 工具包含使大型语言模型代理能够与 GitLab 交互的工具… |
Gmail 工具包 | 本指南将帮助你入门 Gmail 工具包。本工具包… |
Golden Query | Golden 提供了一套自然语言 API,用于查询和丰富… |
谷歌图书 | 概述 |
谷歌云文本转语音 | 谷歌云文本转语音使开发人员能够合成自然的语音… |
谷歌云端硬盘 | 本笔记本介绍了如何将 LangChain 连接到谷歌云端硬盘… |
谷歌财经 | 本笔记本介绍了如何使用谷歌财经工具获取信息… |
谷歌 Imagen | Imagen 在 Vertex AI 上提供了谷歌最先进的图像生成技术… |
谷歌招聘 | 本笔记本介绍了如何使用谷歌招聘工具获取当前职位信息… |
谷歌镜头 | 本笔记本介绍了如何使用谷歌镜头工具获取信息… |
谷歌地点 | 本笔记本介绍了如何使用谷歌地点 API。 |
谷歌学术 | 本笔记本介绍了如何使用谷歌学术工具。 |
谷歌搜索 | 本笔记本介绍了如何使用谷歌搜索组件。 |
谷歌 Serper | 本笔记本介绍了如何使用谷歌 Serper 组件进行搜索… |
谷歌趋势 | 本笔记本介绍了如何使用谷歌趋势工具获取趋势数据… |
Gradio | 在 Hugging Face Spaces 上有成千上万个 Gradio 应用。本库… |
GraphQL | GraphQL 是一种用于 API 的查询语言,也是一种用于执行这些查询的运行时… |
HuggingFace Hub 工具 | 支持文本输入/输出的 Huggingface 工具可以… |
人类作为工具 | 人类是通用智能,因此可以作为工具帮助人工智能… |
IFTTT WebHooks | 本笔记本展示了如何使用 IFTTT Webhooks。 |
Infobip | 本笔记本展示了如何使用 Infobip API 包装器发送 SMS 消息… |
Ionic 购物工具 | Ionic 是一个为人工智能助手提供的即插即用电子商务市场。通过… |
Jenkins | 与 Jenkins 交互的工具。 |
Jina 搜索 | 本笔记本提供了使用 Jina 搜索工具的快速入门概述。 |
Jira 工具包 | 本笔记本介绍了如何使用 Jira 工具包。 |
JSON 工具包 | 本笔记本展示了一个代理如何与大型 JSON/字典对象交互… |
Lemon Agent | Lemon Agent 帮助你在分钟内构建强大的人工智能助手,并自动… |
Linkup搜索工具 | Linkup 提供了一个 API,用于将大型语言模型连接到网络,Linkup Premium 提供了更多功能… |
Memorize | 通过无监督学习微调大型语言模型本身以记忆信息… |
Mojeek 搜索 | 以下笔记本将解释如何使用 Mojeek 搜索工具获取结果… |
MultiOn 工具包 | MultiON 构建了一个可以与广泛工具交互的人工智能代理… |
NASA 工具包 | 本笔记本展示了如何使用代理与 NASA 工具包交互… |
Nuclia 理解 | Nuclia 自动索引你来自任何内部源的非结构化数据… |
NVIDIA Riva:ASR 和 TTS | NVIDIA Riva |
Office365 工具包 | Microsoft 365 是一系列生产力软件和协作工具… |
OpenAPI 工具包 | 我们可以构建代理来消费任意 API,这里指的是符合… |
自然语言 API 工具包 | 自然语言 API 工具包(NLAToolkits)允许 LangChain 代理与… |
OpenWeatherMap | 本笔记本介绍了如何使用 OpenWeatherMap 组件获取天气数据… |
Oracle AI 向量搜索:生成摘要 | Oracle AI 向量搜索专为人工智能设计… |
Pandas 数据框 | 本笔记本展示了如何使用代理与 Pandas 数据框交互… |
Passio NutritionAI | 为了更好地理解 NutritionAI 如何为你的代理提供超级食品营养信息… |
PaymanAI | PaymanAI 提供发送和接收支付(法定货币和加密货币)的功能… |
Permit | Permit 是一个访问控制平台,提供细粒度、实时的权限管理… |
PlayWright 浏览器工具包 | Playwright 是由微软开发的开源自动化工具… |
Polygon IO 工具包和工具 | 本笔记本展示了如何使用代理与 Polygon IO 交互… |
PowerBI 工具包 | 本笔记本展示了一个代理如何与 Power BI 数据集交互… |
Prolog | 使用 Prolog 规则生成答案的 LangChain 工具。 |
PubMed | PubMed® 包含超过 3500 万篇生物医学文献的引用… |
Python REPL | 有时,对于复杂的计算,与其让大型语言模型生成代码,不如使用… |
Reddit 搜索 | 通过本笔记本,我们了解了 Reddit 搜索工具的工作原理。 |
Requests 工具包 | 我们可以使用 Requests 工具包构建生成 HTTP 请求的代理… |
Riza 代码解释器 | Riza 代码解释器是一个基于 WASM 的隔离环境,用于运行代码… |
Robocorp 工具包 | 本笔记本涵盖了如何入门 Robocorp Action Server… |
Salesforce | 与 Salesforce 交互的工具。 |
SceneXplain | SceneXplain 是一个可通过 SceneXplain API 访问的图像字幕服务… |
ScrapeGraph | 本笔记本提供了使用 ScrapeGraph 的快速入门概述。 |
搜索 API | 本笔记本展示了使用 SearchApi 搜索网络的示例… |
SearxNG 搜索 | 本笔记本介绍了如何使用自托管的 SearxNG 搜索 API 工具… |
Semantic Scholar API 工具 | 本笔记本演示了如何使用 semantic scholar 工具与代理… |
SerpAPI | 本笔记本介绍了如何使用 SerpAPI 组件进行搜索… |
Slack 工具包 | 本指南将帮助你入门 Slack 工具包。详细信息请参考… |
Spark SQL 工具包 | 本笔记本展示了如何使用代理与 Spark SQL 交互。示例包括… |
SQL 数据库工具包 | 本指南将帮助你入门 SQL 数据库工具包。详细信息请参考… |
StackExchange | Stack Exchange 是一个问答(Q&A)网站网络,涵盖各种主题… |
Steam 工具包 | Steam(维基百科)是一个视频游戏数字分发服务和社交平台… |
Stripe | 本笔记本提供了使用 Stripe 的快速入门概述。 |
Tavily 搜索 | Tavily 的搜索 API 是一个专门为人工智能代理构建的搜索引擎… |
Tilores | 本笔记本涵盖了如何入门 Tilores 工具。 |
Twilio | 本笔记本介绍了如何使用 Twilio API 包装器发送消息… |
Upstage | 本笔记本涵盖了如何入门 Upstage 真实性检查工具… |
Wikidata | Wikidata 是一个免费且开放的知识库,可以被阅读和编辑… |
Wikipedia | Wikipedia 是一个多语言的免费在线百科全书,由全球志愿者编写和维护… |
Wolfram Alpha | 本笔记本介绍了如何使用 Wolfram Alpha 组件。 |
Yahoo 财经新闻 | 本笔记本介绍了如何使用 yahoofinancenews 工具与代理… |
You.com 搜索 | You.com API 是一套为开发者设计的工具,旨在帮助他们构建… |
YouTube | YouTube 搜索包搜索 YouTube 视频,避免使用其前端界面… |
Zapier 自然语言操作 | 已弃用:该 API 将于 2023-11-17 停止服务。 |
ZenGuard AI | 本工具让你能够快速在你的 Langchain 驱动的应用中设置 ZenGuard AI。 |