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])

posted @ 2026-03-10 15:20  风陵南  阅读(88)  评论(0)    收藏  举报