关于作者
- 深耕领域:大语言模型开发 / RAG 知识库 / AI Agent 落地 / 模型微调
- 技术栈:Python | RAG (LangChain / Dify + Milvus) | FastAPI + Docker
- 工程能力:专注模型工程化部署、知识库构建与优化,擅长全流程解决方案
「让 AI 交互更智能,让技术落地更高效」
欢迎技术探讨与项目合作,解锁大模型与智能交互的无限可能!
一、工具系统概述
1.1 工具系统核心概念
工具系统提供统一 Tool 抽象,支持所有主流模型的 Tool Calling,深度集成 LangGraph,构建可执行 agent 环境的关键能力层。工具系统是智能体与外部世界交互的桥梁,使模型能够执行各种操作,扩展其能力边界。
核心组件:
- 内置工具:搜索、计算、代码执行等100+工具
- 自定义工具:@tool装饰器 / BaseTool / ToolNode
- 工具包:Toolkit(如GitHub、Slack集成)
1.2 工具调用流程
1.3 工具系统架构
| 层级 | 组件 | 功能 | 实现方式 |
|---|---|---|---|
| 抽象层 | BaseTool | 工具基类 | 继承实现 |
| 实现层 | 具体工具 | 工具逻辑 | @tool装饰器、自定义类 |
| 集成层 | Toolkit | 工具集合 | 组合多个工具 |
| 执行层 | ToolNode | 工具执行 | LangGraph节点 |
1.4 工具调用的优势
| 优势 | 具体体现 | 应用场景 |
|---|---|---|
| 扩展能力 | 调用外部API和服务 | 集成第三方系统 |
| 实时数据 | 联网搜索获取最新信息 | 新闻、天气、股价 |
| 复杂计算 | 执行代码和数学运算 | 数据分析、科学计算 |
| 系统交互 | 操作文件和数据库 | 数据处理、持久化 |
| 任务自动化 | 多步骤任务执行 | 工作流自动化 |
二、内置工具使用
2.1 常用内置工具
LangChain 提供了丰富的内置工具,涵盖多种常见场景:
| 工具类型 | 功能描述 | 示例 |
|---|---|---|
| 搜索工具 | 联网搜索信息 | GoogleSearchTool |
| 计算工具 | 执行数学计算 | CalculatorTool |
| 代码执行 | 执行Python代码 | PythonREPLTool |
| 文件操作 | 读写文件 | FileSystemTool |
| 数据库 | 操作数据库 | SQLDatabaseTool |
2.2 内置工具使用示例
from langchain.tools import PythonREPLTool
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# 1. 初始化工具
python_repl = PythonREPLTool()
# 2. 初始化模型
model = ChatOpenAI(model="gpt-4o-mini")
# 3. 创建包含工具信息的prompt
prompt = ChatPromptTemplate.from_template(
"你是一个助手,可以使用Python执行计算。\n"
"用户问题: {question}\n"
"如果需要计算,请使用Python工具。"
)
# 4. 创建链
chain = prompt | model
# 5. 执行
result = chain.invoke({"question": "计算1+2+3+...+100的和"})
print(result.content)
三、自定义工具开发
3.1 使用 @tool 装饰器
@tool 装饰器是创建自定义工具的最简单方式:
from langchain_core.tools import tool
@tool
def multiply(a: int, b: int) -> int:
"""Multiplies a and b."""
return a * b
@tool
def divide(a: int, b: int) -> float:
"""Divides a by b."""
if b == 0:
raise ValueError("除数不能为零")
return a / b
# 调用工具
result = multiply.invoke({"a": 2, "b": 3})
print(result) # 输出: 6
# 批处理
results = multiply.batch([{"a": 2, "b": 3}, {"a": 4, "b": 5}])
print(results) # 输出: [6, 20]
3.2 继承 BaseTool 类
对于更复杂的工具,可以继承 BaseTool 类:
from langchain_core.tools import BaseTool
from typing import Optional, Type, TypeVar, Any
T = TypeVar('T')
class CustomTool(BaseTool):
name: str = "custom_tool"
description: str = "执行自定义操作"
def _run(
self,
input_text: str,
**kwargs: Any
) -> str:
"""执行工具的核心逻辑"""
# 实现工具逻辑
return f"处理结果: {input_text.upper()}"
# 使用自定义工具
tool = CustomTool()
result = tool.invoke({"input_text": "hello world"})
print(result) # 输出: 处理结果: HELLO WORLD
3.3 使用 ToolNode
对于需要集成到 LangGraph 中的工具,可以使用 ToolNode:
from langgraph.prebuilt import ToolNode
# 1. 创建工具列表
tools = [multiply, divide]
# 2. 创建工具节点
tool_node = ToolNode(tools)
# 3. 在 LangGraph 中使用
# (将在后续博客中详细介绍)
四、工具包集成
4.1 工具包概述
工具包(Toolkit)是一组相关工具的集合,方便开发者快速集成特定领域的功能:
- GitHubToolkit:GitHub 操作
- SlackToolkit:Slack 消息发送
- GmailToolkit:邮件发送和接收
- GoogleCalendarToolkit:日历管理
4.2 工具包使用示例
以 GitHubToolkit 为例:
from langchain_community.agent_toolkits.github.toolkit import GitHubToolkit
from langchain_community.agent_toolkits.github.utilities import GitHubAPIWrapper
# 1. 初始化 GitHub API 包装器
github = GitHubAPIWrapper(
github_repository="langchain-ai/langchain",
github_token="your-github-token"
)
# 2. 创建工具包
toolkit = GitHubToolkit.from_github_api_wrapper(github)
# 3. 获取工具列表
tools = toolkit.get_tools()
print([tool.name for tool in tools])
# 4. 使用工具
issues_tool = next(tool for tool in tools if tool.name == "github-search-issues")
result = issues_tool.invoke({"query": "bug"})
print(result)
五、工具调用最佳实践
5.1 工具设计原则
- 明确的描述:工具描述应该清晰说明工具的功能和参数
- 错误处理:工具应该妥善处理异常情况
- 参数验证:对输入参数进行验证
- 返回格式:返回结构化的结果,便于模型理解
5.2 工具安全性
- 权限控制:限制工具的访问权限
- 输入验证:验证用户输入,防止恶意代码
- 输出限制:限制工具输出的大小和内容
- 审计日志:记录工具的使用情况
5.3 工具性能优化
- 缓存:对频繁调用的结果进行缓存
- 异步:使用异步执行提高性能
- 批处理:对多个相似请求进行批处理
- 超时设置:为工具设置合理的超时时间
六、实战案例
6.1 构建一个天气查询工具
from langchain_core.tools import tool
import requests
@tool
def get_weather(city: str) -> str:
"""获取指定城市的天气信息"""
# 这里使用模拟数据,实际应用中可以调用真实的天气API
weather_data = {
"北京": "晴,15-25°C",
"上海": "多云,18-28°C",
"广州": "阴,22-30°C"
}
if city in weather_data:
return f"{city}的天气: {weather_data[city]}"
else:
return f"抱歉,暂无法获取{city}的天气信息"
# 测试工具
result = get_weather.invoke({"city": "北京"})
print(result) # 输出: 北京的天气: 晴,15-25°C
6.2 构建一个智能体使用工具
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
# 1. 初始化模型
model = ChatOpenAI(model="gpt-4o-mini")
# 2. 准备工具
tools = [get_weather, multiply]
# 3. 创建智能体
agent = create_agent(model, tools)
# 4. 执行任务
result = agent.invoke({
"messages": [
{"role": "user", "content": "北京的天气怎么样?"}
]
})
print(result["messages"][-1]["content"])
# 5. 执行需要计算的任务
result = agent.invoke({
"messages": [
{"role": "user", "content": "345乘以678等于多少?"}
]
})
print(result["messages"][-1]["content"])
七、应用场景分析
7.1 适合使用工具的场景
- 信息获取:需要实时信息或外部数据
- 计算密集:需要复杂计算或数据分析
- 系统交互:需要操作文件、数据库或API
- 代码执行:需要运行代码或脚本
- 多步骤任务:需要多个工具协作完成
7.2 工具系统的局限性
- API依赖:依赖外部服务的可用性
- 速率限制:可能受到API调用频率限制
- 安全性:需要谨慎处理用户输入
- 复杂性:工具过多会增加模型的决策难度
八、总结
LangChain 1.0 的工具系统通过统一的抽象和丰富的内置工具,为开发者提供了构建复杂智能体应用的强大能力。通过本文的介绍,开发者可以掌握工具的创建和使用方法,实现与外部系统的无缝集成,构建具备实际业务能力的AI应用。
在后续的博客中,我们将介绍如何利用这些工具构建完整的智能体应用,以及如何通过 LangGraph 实现更复杂的工作流。
1万+



被折叠的 条评论
为什么被折叠?



