最近在折腾项目的时候碰到了这个知识点,查了不少资料,索性整理出来分享给大家。
目录
一、前言
在使用Langchain 进行智能体开发中,会涉及到一个挺重要的组件调用,就是工具(Tool),工具作为AI应用与大模型的中间层,承载着挺重要的角色,能够说搞清楚了Tool在其中的作用,对AI智能体调用的完整过程就有了一个深刻全面的搞懂,本篇将详细介绍下Langchain 中的工具使用。
二、Tools 工具介绍
2.1 Tools 是什么
LangChain 工具(Tool)是赋予大模型调用外部能力的标准化接口。
大模型本身只能生成文本,无法主动联网、查数据库、执行代码。工具就是把这些外部能力封装成 LLM 能搞懂、能调用的函数,让模型从“只会说”变成“能动手做”。
2.1.1 Tool 组成结构
一个工具通常包含三部分:
- 名称(name):唯一标识
- 描述(description):LLM 据此判断何时调用,最关键
- 功能(function):实际执行的代码逻辑
SQLDatabaseToolkit 把列表、查结构、执行查询等工具打包在一起。
2.1.2 Tool 的重要性
要构建更强大的AI工程应用,只有生成文本这样的“ 纸上谈兵 ”能力自然是不够的。
工具是赋予大语言模型 与外部世界交互能力 的关键组件,从而能让智能体执行搜索、计算、数据库查询、邮件发送或调用第三方API等,进而构建功能强大的AI应用。借助工具,大模型才能从“ 认识世界 ”走向“ 改变世界 ”。
从图中能够看到,工具是构建智能体的核心要素之一,具有挺重要的地位
2.2 Tools 有什么作用
Tool的核心作用是扩展大模型的能力边界,具体包括:
1. 突破知识时效性:通过搜索工具获取实时信息,弥补训练数据截止的局限。
2. 突破能力限制:通过计算器、代码执行工具完成精确计算和复杂逻辑。
3. 连接私有数据:通过数据库、文件系统工具访问企业或个人私有数据。
4. 对接外部系统:通过 API 工具调用第三方服务,完成真实业务操作。
5. 让 Agent 自主决策:工具是 Agent 的“手脚”,Agent 根据任务自主选择并调用合适的工具。
2.3 Tool 的特点
Tool 主要有如下特点:
1. 描述驱动:LLM 完全依赖工具的 description 来决定是否调用、如何调用,描述写得越清楚,调用越准确。
2. 标准化接口:所有工具都遵循统一调用方式(如 .invoke()),便于组合和替换。
3. 可自定义:用 @tool 装饰器就能把普通 Python 函数变成工具,扩展成本低。
4. 可组合:多个工具可同时给出给 Agent,由 Agent 按需调度。
5. 安全可控:工具的执行逻辑由开发者定义,能够对输入输出做校验和限制。
2.4 Tool 使用场景
场景
典型工具
解决的坑
实时信息查询
DuckDuckGo、SerpAPI
获取最新新闻、股价、天气
知识问答
WikipediaQueryRun
补充百科类知识
数据分析/计算
PythonREPLTool
精确计算、数据处理
数据库交互
SQLDatabaseToolkit
自然语言查数据库
文件操作
FileManagementToolkit
读写、管理本地文件
业务系统对接
OpenAPIToolkit
按规范调用 REST API
多工具协作
Agent + 多工具
复杂任务自动拆解执行
一句话总结:
LangChain 工具是让大模型“能做事”的桥梁,通过标准化封装和描述驱动机制,使 LLM 能自主调用外部能力,适用于一切要模型与真实世界交互的场景。
三、工具的调用方式
在LangChain中,工具(Tools)实际上是指明确定义了输入和输出的 可调用函数 。因此, 工具调用(Tool Calling) 也被称为 函数调用(Function Calling) 。具体来说主要有2种调用方式,下面分别介绍。
3.1 工具的两种调用
3.1.1 直接调用
直接调用这种方式,适合测试时使用,下面是一个基础的工具调用案例代码
from langchain_core.tools import Tool, tool
@tool
def get_weather(city: str) -> str:
"""
获取指定城市的天气信息
参数:
city: 城市名称,如"北京"、"上海"
返回:
天气信息字符串
"""
# 你的实现
return city + "晴天,温度 15°C"
# 使用 .invoke() 方法
result = get_weather.invoke({"city": "北京"})
print(result)
运行一下效果如下
3.1.2 绑定到模型(主流)调用
这种方式,让AI来调用,开发中使用最多的方式
from dotenv import load_dotenv
import os
from langchain_openrouter import ChatOpenRouter
# 1、加载配置文件
load_dotenv(override=True)
OPENROUTER_API_KEY = os.getenv ("OPENROUTER_API_KEY")
OPENROUTER_API_BASE = os.getenv ("OPENROUTER_API_BASE")
# 2、模型初始化
model = ChatOpenRouter(
model="deepseek/deepseek-v3.2",
api_key=OPENROUTER_API_KEY,
base_url=OPENROUTER_API_BASE,
)
from langchain_core.tools import tool
# 定义工具
@tool
def get_weather(city: str) -> str:
"""获取指定城市的天气"""
# 你的实现
return "晴天,温度 15°C"
# 绑定工具
model_with_tools = model.bind_tools([get_weather])
# AI 可以决定是否调用工具
response = model_with_tools.invoke("北京天气如何?")
# response = model_with_tools.invoke("2 + 3 = ?")
# 检查 AI 是否要调用工具
if response.tool_calls:
print("AI 想调用工具:", response.tool_calls)
else:
print("AI 直接回答:", response.content)
调用一下,看到下面的效果,在真实的业务场景下,可能会在tool的方法内部对接外部厂商的API ,以获取天气为例,就可以拿到真实的天气信息数据
3.1.3 工具调用完整流程
大模型能根据对话上下文决定何时调用工具以及传递哪些参数。
上面编写的LangChain应用正好对应图中的AI助手或应用
经典流程如下:
3.2 从Message流转看工具的调用
接下来深入了解一下工具内部在代码中是怎么调用的,前提:代码中配置模型初始化
from dotenv import load_dotenv
from langchain.messages import HumanMessage, ToolMessage
import os
from langchain_openrouter import ChatOpenRouter
# 1、加载配置文件
load_dotenv(override=True)
OPENROUTER_API_KEY = os.getenv ("OPENROUTER_API_KEY")
OPENROUTER_API_BASE = os.getenv ("OPENROUTER_API_BASE")
# 2、模型初始化
model = ChatOpenRouter(
model="deepseek/deepseek-v3.2",
api_key=OPENROUTER_API_KEY,
base_url=OPENROUTER_API_BASE,
)
1、不使用@tool修饰
通过定义普通的方法形式使用,完整代码如下
```
from dotenv import load_dotenv
from langchain.messages import HumanMessage, ToolMessage
import os
from langchain_openrouter import ChatOpenRouter
1、加载配置文件
load_dotenv(override=True)OPENROUTER_API_KEY = os.getenv ("OPENROUTER_API_KEY")
OPENROUTER_API_BASE = os.getenv ("OPENROUTER_API_BASE")
2、模型初始化
model = ChatOpenRouter( model="deepseek/deepseek-v3.2", api_key=OPENROUTER_API_KEY, base_url=OPENROUTER_API_BASE, )from langchain_core.tools import tool
def get_weather(city: str):
"""获取天气的工具"""
return f"{city}天气晴朗"
模型与工具绑定
model_with_tools = model.bind_tools([get_weather])messages = [
HumanMessage("今天北京天气如何")
]
模型生成调用工具请求
response = model_with_tools.invoke(messages)添加AIMessage
messages.append(response) tool_calls = response.tool_callsfor tool_call in tool_calls:
if tool_call["name"] == "get_weather":
# 拼接出ToolMessage实例
tool_response = ToolMessage(
content=get_weather(**tool_call["args"]),
tool_call_id=tool_call["id"],
name=tool_call["name"]
)
messages.append(tool_response)
print("=====================> messages messages messages messages
本次分享就到这里。技术这东西越研究越有意思,后续有新的收获我也会继续更新。
评论 (0)
暂无评论