【带你 langchain 双排系列教程】7. LangChain自定义工具调用实战指南

一、工具的本质与价值

工具(Tools)是LangChain的核心扩展机制,就像给智能系统装上瑞士军刀。通过自定义工具,我们可以:

  1. 连接任意外部API(天气查询、股票数据)
  2. 调用本地函数(文件处理、数据分析)
  3. 集成业务系统(CRM、ERP)
  4. 处理特殊数据类型(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)

九、扩展方向

  1. 多语言支持:使用langchain-community的多语言工具包
  2. 权限控制:基于RBAC的工具访问管理
  3. 版本管理:实现工具灰度发布机制
  4. 自动文档生成:从工具定义生成API文档
# 自动文档生成示例
from langchain.tools import format_tool_to_openai_function

print(format_tool_to_openai_function(get_weather))
# 输出OpenAI兼容的函数定义

通过本文的实践,我们不仅掌握了自定义工具的开发技巧,还学习了企业级应用的最佳实践。关键要点总结:

  1. 使用Pydantic确保输入安全
  2. 异步工具提升并发性能
  3. 完善的错误处理机制
  4. 生产环境监控方案

官方 tools 文档
工具 | 🦜️🔗 LangChain
工具是为模型调用而设计的实用程序:它们的输入旨在由模型生成,输出则旨在传回模型。

工具包是一组旨在一起使用的工具。

搜索

下表展示了各种执行在线搜索的工具:

工具/工具包免费/付费返回数据
必应搜索付费网址、摘要、标题
勇气搜索免费网址、摘要、标题
鸭鸭搜索免费网址、摘要、标题
Exa 搜索每月 1000 次免费搜索网址、作者、标题、发布日期
谷歌搜索付费网址、摘要、标题
谷歌 Serper免费网址、摘要、标题、搜索排名、网站链接
Jina 搜索免费提供 100 万个响应令牌网址、摘要、标题、页面内容
Mojeek 搜索付费网址、摘要、标题
搜索 API注册即可获得 100 次免费搜索网址、摘要、标题、搜索排名、网站链接、作者
SearxNG 搜索免费网址、摘要、标题、类别
SerpAPI每月 100 次免费搜索答案
Tavily 搜索每月 1000 次免费搜索网址、内容、标题、图片、答案
You.com 搜索免费 60 天网址、标题、页面内容

代码解释器

下表展示了可用作代码解释器的工具:

工具/工具包支持的语言沙盒生命周期支持文件上传返回类型支持自托管
Azure 容器应用动态会话Python1 小时文本、图片
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 VantageAlpha Vantage 提供实时和历史金融数据…
Amadeus 工具包本笔记本将指导你如何将 LangChain 连接到 Amadeus 工具包…
Apify Actor概述
ArXiv本笔记本介绍了如何使用 arxiv 工具与代理…
AskNewsAskNews 为任何大型语言模型提供最新的全球新闻(或历史新闻)…
AWS Lambda亚马逊 AWS Lambda 是由亚马逊提供的无服务器计算服务…
Azure AI 服务工具包本工具包用于与 Azure AI 服务 API 交互以实现…
Azure 认知服务工具包本工具包用于与 Azure 认知服务 API 交互…
Azure 容器应用动态会话Azure 容器应用动态会话提供了一个安全且可扩展的…
Shell (bash)给代理提供 shell 访问权限非常强大(但在沙盒环境之外风险较高)…
Bearly 代码解释器Bearly 代码解释器允许远程执行代码。这使得…
必应搜索必应搜索是一项 Azure 服务,提供安全、无广告、基于位置的搜索体验…
勇气搜索本笔记本介绍了如何使用勇气搜索工具。
Cassandra 数据库工具包Apache Cassandra® 是一个广泛使用的数据库,用于存储事务性数据…
CDPCDP Agentkit 工具包含使大型语言模型代理能够…
ChatGPT 插件OpenAI 已弃用插件。
ClickUp 工具包ClickUp 是一个一体化的生产力平台,为小型和…
Cogniswitch 工具包CogniSwitch 用于构建可投入生产的应用程序,这些应用程序可以与…
Connery 工具包和工具使用 Connery 工具包和工具,你可以将 Connery Action…
Dall-E 图像生成器OpenAI Dall-E 是由 OpenAI 使用深度学习技术开发的文本到图像模型…
DappierDappier 将任何大型语言模型或你的代理式人工智能连接到实时、权利清晰的数据…
Databricks Unity Catalog (UC)本笔记本展示了如何将 UC 函数用作 LangChain 工具,与…
DataForSEODataForSeo 提供全面的搜索引擎优化和数字营销数据解决方案…
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 QueryGolden 提供了一套自然语言 API,用于查询和丰富…
谷歌图书概述
谷歌云文本转语音谷歌云文本转语音使开发人员能够合成自然的语音…
谷歌云端硬盘本笔记本介绍了如何将 LangChain 连接到谷歌云端硬盘…
谷歌财经本笔记本介绍了如何使用谷歌财经工具获取信息…
谷歌 ImagenImagen 在 Vertex AI 上提供了谷歌最先进的图像生成技术…
谷歌招聘本笔记本介绍了如何使用谷歌招聘工具获取当前职位信息…
谷歌镜头本笔记本介绍了如何使用谷歌镜头工具获取信息…
谷歌地点本笔记本介绍了如何使用谷歌地点 API。
谷歌学术本笔记本介绍了如何使用谷歌学术工具。
谷歌搜索本笔记本介绍了如何使用谷歌搜索组件。
谷歌 Serper本笔记本介绍了如何使用谷歌 Serper 组件进行搜索…
谷歌趋势本笔记本介绍了如何使用谷歌趋势工具获取趋势数据…
Gradio在 Hugging Face Spaces 上有成千上万个 Gradio 应用。本库…
GraphQLGraphQL 是一种用于 API 的查询语言,也是一种用于执行这些查询的运行时…
HuggingFace Hub 工具支持文本输入/输出的 Huggingface 工具可以…
人类作为工具人类是通用智能,因此可以作为工具帮助人工智能…
IFTTT WebHooks本笔记本展示了如何使用 IFTTT Webhooks。
Infobip本笔记本展示了如何使用 Infobip API 包装器发送 SMS 消息…
Ionic 购物工具Ionic 是一个为人工智能助手提供的即插即用电子商务市场。通过…
Jenkins与 Jenkins 交互的工具。
Jina 搜索本笔记本提供了使用 Jina 搜索工具的快速入门概述。
Jira 工具包本笔记本介绍了如何使用 Jira 工具包。
JSON 工具包本笔记本展示了一个代理如何与大型 JSON/字典对象交互…
Lemon AgentLemon Agent 帮助你在分钟内构建强大的人工智能助手,并自动…
Linkup搜索工具Linkup 提供了一个 API,用于将大型语言模型连接到网络,Linkup Premium 提供了更多功能…
Memorize通过无监督学习微调大型语言模型本身以记忆信息…
Mojeek 搜索以下笔记本将解释如何使用 Mojeek 搜索工具获取结果…
MultiOn 工具包MultiON 构建了一个可以与广泛工具交互的人工智能代理…
NASA 工具包本笔记本展示了如何使用代理与 NASA 工具包交互…
Nuclia 理解Nuclia 自动索引你来自任何内部源的非结构化数据…
NVIDIA Riva:ASR 和 TTSNVIDIA Riva
Office365 工具包Microsoft 365 是一系列生产力软件和协作工具…
OpenAPI 工具包我们可以构建代理来消费任意 API,这里指的是符合…
自然语言 API 工具包自然语言 API 工具包(NLAToolkits)允许 LangChain 代理与…
OpenWeatherMap本笔记本介绍了如何使用 OpenWeatherMap 组件获取天气数据…
Oracle AI 向量搜索:生成摘要Oracle AI 向量搜索专为人工智能设计…
Pandas 数据框本笔记本展示了如何使用代理与 Pandas 数据框交互…
Passio NutritionAI为了更好地理解 NutritionAI 如何为你的代理提供超级食品营养信息…
PaymanAIPaymanAI 提供发送和接收支付(法定货币和加密货币)的功能…
PermitPermit 是一个访问控制平台,提供细粒度、实时的权限管理…
PlayWright 浏览器工具包Playwright 是由微软开发的开源自动化工具…
Polygon IO 工具包和工具本笔记本展示了如何使用代理与 Polygon IO 交互…
PowerBI 工具包本笔记本展示了一个代理如何与 Power BI 数据集交互…
Prolog使用 Prolog 规则生成答案的 LangChain 工具。
PubMedPubMed® 包含超过 3500 万篇生物医学文献的引用…
Python REPL有时,对于复杂的计算,与其让大型语言模型生成代码,不如使用…
Reddit 搜索通过本笔记本,我们了解了 Reddit 搜索工具的工作原理。
Requests 工具包我们可以使用 Requests 工具包构建生成 HTTP 请求的代理…
Riza 代码解释器Riza 代码解释器是一个基于 WASM 的隔离环境,用于运行代码…
Robocorp 工具包本笔记本涵盖了如何入门 Robocorp Action Server…
Salesforce与 Salesforce 交互的工具。
SceneXplainSceneXplain 是一个可通过 SceneXplain API 访问的图像字幕服务…
ScrapeGraph本笔记本提供了使用 ScrapeGraph 的快速入门概述。
搜索 API本笔记本展示了使用 SearchApi 搜索网络的示例…
SearxNG 搜索本笔记本介绍了如何使用自托管的 SearxNG 搜索 API 工具…
Semantic Scholar API 工具本笔记本演示了如何使用 semantic scholar 工具与代理…
SerpAPI本笔记本介绍了如何使用 SerpAPI 组件进行搜索…
Slack 工具包本指南将帮助你入门 Slack 工具包。详细信息请参考…
Spark SQL 工具包本笔记本展示了如何使用代理与 Spark SQL 交互。示例包括…
SQL 数据库工具包本指南将帮助你入门 SQL 数据库工具包。详细信息请参考…
StackExchangeStack Exchange 是一个问答(Q&A)网站网络,涵盖各种主题…
Steam 工具包Steam(维基百科)是一个视频游戏数字分发服务和社交平台…
Stripe本笔记本提供了使用 Stripe 的快速入门概述。
Tavily 搜索Tavily 的搜索 API 是一个专门为人工智能代理构建的搜索引擎…
Tilores本笔记本涵盖了如何入门 Tilores 工具。
Twilio本笔记本介绍了如何使用 Twilio API 包装器发送消息…
Upstage本笔记本涵盖了如何入门 Upstage 真实性检查工具…
WikidataWikidata 是一个免费且开放的知识库,可以被阅读和编辑…
WikipediaWikipedia 是一个多语言的免费在线百科全书,由全球志愿者编写和维护…
Wolfram Alpha本笔记本介绍了如何使用 Wolfram Alpha 组件。
Yahoo 财经新闻本笔记本介绍了如何使用 yahoofinancenews 工具与代理…
You.com 搜索You.com API 是一套为开发者设计的工具,旨在帮助他们构建…
YouTubeYouTube 搜索包搜索 YouTube 视频,避免使用其前端界面…
Zapier 自然语言操作已弃用:该 API 将于 2023-11-17 停止服务。
ZenGuard AI本工具让你能够快速在你的 Langchain 驱动的应用中设置 ZenGuard AI。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值