LangChain Tools组件
LangChain Tools组件
Tools用于扩展大语言模型(LLMs)的能力,使其能够与外部系统、API或自定义函数交互,从而完成仅靠文本生成无法实现的任务(如搜索、计算、数据库查询等)
特点:
- 增强LLM的功能:让LLM突破纯文本生成的限制,执行实际操作(如调用搜索引擎、查询数据库、运行代码等)
- 支持智能决策:在Agent工作流中,LLM根据用户输入动态选择最合适的Tool完成任务
- 模块化设计:每个Tool专注一个功能,便于复用和组合(例如:搜索工具+计算工具+天气查询工具)
LangChain拥有大量第三方工具,访问工具集成查看LangChain提供的可用工具列表:https://docs.langchain.com/oss/python/integrations/tools
Tool的要素
Tool本质上是封装了特定功能的可调用模块,是Agent、Chain或LLM可以用来与世界互动的接口
Tool通常包含如下几个要素:
name:工具的名称description:工具的功能描述- 该工具输入的
JSON模式 - 要调用的函数
return_direcr:是否应将工具结果直接返回给用户(仅对Agent相关)
实操步骤
- 步骤1:将name、description和Json模式作为上下文提供给LLM
- 步骤2:LLM会根据提示词推断出需要调用哪些工具,并提供具体调用参数信息
- 步骤3:用户需要根据返回的工具调用信息自行触发相关工具的回调
如果工具具有精心选择的名称、描述和Json模式,则模型的性能将更好。
自定义工具
两种自定义工具的方式:
使用@tool装饰器(自定义工具最简单的方式)
装饰器默认使用函数名称作为工具名称,但可以通过参数name_or_callable来覆盖此设置。
同时,装饰器将使用函数的文档字符串作为工具的描述,因此函数必须提供文档字符串
- 使用
StructuredTool.from_function类方法
这类似于@tool装饰器,但允许更多配置和同步/异步实现的规范
常用属性
Tool有几个常用的属性:
| 属性 | 类型 | 描述 |
|---|---|---|
name |
str | 必选,在提供给LLM或Agent的工具集中必须是唯一的 |
description |
str | 可选但建议,描述工具的功能。LLM或Agent将使用此描述作为上下文,使用它确定工具的使用 |
args_schema |
Pydantic BaseModel | 可选,可用于提供更多信息(如few-show示例或验证预期参数) |
return_direct |
boolean | 仅对Agent相关,当为True时,在调用给定工具后,Agent将停止并将结果直接返回给用户 |
from langchain_core.tools import tool
@tool
def add_number(a: int, b: int) -> int:
"""计算两个整数的和"""
return a + b
print(f"name = {add_number.name}") # 默认是函数名称
print(f"args = {add_number.args}")
print(f"description = {add_number.description}") # 默认是函数的说明信息
print(f"return_direct = {add_number.return_direct}") # 默认是False
输出:
name = add_number
args = {'a': {'title': 'A', 'type': 'integer'}, 'b': {'title': 'B', 'type': 'integer'}}
description = 计算两个整数的和
return_direct = False
还可以通过装饰器直接设置属性
# 通过装饰器设置属性
@tool(name_or_callable="add_func", description="计算两数之和", return_direct=True)
def add_number(a: int, b: int) -> int:
return a + b
输出:
name = add_func
args = {'a': {'title': 'A', 'type': 'integer'}, 'b': {'title': 'B', 'type': 'integer'}}
description = 计算两数之和
return_direct = True
修改args参数:
当一些入参比较复杂时,需要给额外的提示词供大模型理解参数,可以通过args_schema属性修改args属性
此时需要使用pydantic库中的BaseModel以及Field类 实现一个自定义类继承BaseModel
from langchain_core.tools import tool
from pydantic import BaseModel, Field
class FieldInfo(BaseModel):
a: int = Field(description="第一个整型参数")
b: int = Field(description="第二个整型参数")
@tool(description="计算两数之和", args_schema=FieldInfo)
def add_number(a: int, b: int) -> int:
return a + b
print(f"name = {add_number.name}") # 默认是函数名称
print(f"args = {add_number.args}")
print(f"description = {add_number.description}") # 默认是函数的说明信息
print(f"return_direct = {add_number.return_direct}") # 默认是False
输出:
name = add_number
args = {'a': {'description': '第一个整型参数', 'title': 'A', 'type': 'integer'}, 'b': {'description': '第二个整型参数', 'title': 'B', 'type': 'integer'}}
description = 计算两数之和
return_direct = False
工具调用
当函数被装饰器@tool修饰时,就不再是一个普通函数,而是给大模型调用的函数,此时无法通过传统方式调用函数
如果需要调用可以使用invoke关键字,传入字典参数可完成调用
from langchain_core.tools import tool
@tool(name_or_callable="add_func", description="计算两数之和", return_direct=True)
def add_number(a: int, b: int) -> int:
return a + b
if __name__ == "__main__":
c = add_number.invoke({"a": 23, "b": 24})
print(c)
StructuredTool的from_function()的使用
from langchain_core.tools.structured import StructuredTool
# 声明函数
def search_google(query: str):
return f"{query}:查询结果"
# 定义工具
search_01 = StructuredTool.from_function(
func=search_google,
name="Search",
description="查询google搜索引擎,并将结果返回",
)
print(f"name = {search_01.name}")
print(f"args = {search_01.args}")
print(f"description = {search_01.description}")
print(f"return_direct = {search_01.return_direct}")
# 工具调用
print(search_01.invoke({"query": "天气"}))
输出:
name = Search
args = {'query': {'title': 'Query', 'type': 'string'}}
description = 查询google搜索引擎,并将结果返回
return_direct = False
天气:查询结果
大模型调用工具
from langchain.agents import create_agent
from langchain_community.chat_models import ChatTongyi
from langchain_community.tools import MoveFileTool
from langchain_core.tools import tool
from langchain_core.utils.function_calling import convert_to_openai_function
@tool(description="需要获取天气时调用,需要传入参数city")
def get_weather(city: str):
return f"{city} 天气晴朗 12~18度"
# 定义模型
chat_model = ChatTongyi(model="qwen3-max")
# 调用大模型
agent = create_agent(chat_model, tools=[get_weather])
res = agent.invoke({"messages": [
("human", "苏州天气如何")
]})
# 获取最新一条消息
print(res["messages"][-1])

浙公网安备 33010602011771号