[AI应用基础学习-5] LangChain-Tools

Tools概述

Tools 用于扩展大语言模型(LLM)的能力,使其能够与外部系统、API 或自定义函数交互,从而完成仅靠文本生成无法实现的任务(如搜索、计算、数据库查询等)。

Tools 本质上是封装了特定功能的可调用模块,是Agent、Chain或LLM可以用来与世界互动的接口。

Tool 通常包含如下几个要素:

  • name:工具的名称
  • description :工具的功能描述
  • 该工具输入的 JSON模式
  • 要调用的函数
  • return_direct :是否应将工具结果直接返回给用户(仅对Agent相关)

步骤1:将name、description 和 JSON模式作为上下文提供给LLM

步骤2:LLM会根据提示词推断出 需要调用哪些工具 ,并提供具体的调用参数信息

步骤3:用户需要根据返回的工具调用信息,自行触发相关工具的回调

image-20260105140109-q07n95a

自定义工具

两种自定义方式

  • 第1种:使用@tool​装饰器(自定义工具的最简单方式) 装饰器默认使用函数名称作为工具名称,但可以通过参数name_or_callable​来覆盖此设置。 同时,装饰器将使用函数的文档字符串​作为工具的描述 ,因此函数必须提供文档字符串。
  • 第2种:使用StructuredTool.from_function​类方法。这类似于@tool装饰器,但允许更多配置和同步/异步实现的规范。

几个常用属性

  • name:在提供给LLM或Agent的工具集中必须是唯一的。(必须)
  • description:描述工具的功能。LLM或Agent将使用此描述作 为上下文,使用它确定工具的使用
  • args_schema:可用于提供更多信息(例如,few-shot示例) 或验证预期参数。
  • return_direct:仅对Agent相关。当为True时,在调用给定工具后,Agent将 停止并将结果直接返回给用户。

方式1:@tool 装饰器

from langchain_core.tools import tool


@tool
def add_numbers(num1:int, num2:int) -> int:
    """两数相加"""
    return num1 + num2
print(add_numbers.name)
print(add_numbers.args)
print(add_numbers.description)
print(add_numbers.return_direct)

res = add_numbers.invoke({"num1":1,"num2":2})
print(res)

image-20260105142123-znxkejm

from langchain_core.tools import tool

#修改属性
@tool(name_or_callable="add_two_numbers",description="two numbers add",return_direct=True)
def add_numbers(num1:int, num2:int) -> int:
    """两数相加"""
    return num1 + num2
print(add_numbers.name)
print(add_numbers.args)
print(add_numbers.description)
print(add_numbers.return_direct)

res = add_numbers.invoke({"num1":1,"num2":2})
print(res)

方式2:StructuredTool的from_function()

StructuredTool.from_function​类方法提供了比@tool装饰器更多的可配置性,而无需太多额外的代码

from langchain_core.tools import StructuredTool


def search_function(query:str):
    return "Langchain"

search1 = StructuredTool.from_function(
    func= search_function,
    name= "Search",
    description= "搜索答案"
)
print(search1.name)
print(search1.args)
print(search1.description)

search1.invoke("hello")

工具调用举例

大模型分析调用工具

通过大模型分析用户需求,判断是否需要调用指定工具。

import os

from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
from langchain_core.utils.function_calling import convert_to_openai_function
from langchain_community.tools import MoveFileTool


load_dotenv() #自动加载.env文件
#创建大模型实例
llm=ChatOpenAI(
    model= "qwen-plus",
    base_url= os.getenv("OPENAI_API_URL"),
    api_key= os.getenv("OPENAI_API_KEY1"),
    temperature=0
    )
#定义工具
tools = [MoveFileTool()]
#将工具转为OpenAI函数,传入模型调用
functions = [convert_to_openai_function(t) for t in tools]
#提供大模型调用的消息列表
messages = [HumanMessage(content="将文件a移动到桌面")]
response = llm.invoke(
    input= messages,
    functions=functions,
)
print(response)

image-20260105145146-4az72f9

image-20260105145225-2p46xfs

posted @ 2026-01-08 09:39  Rodericklog  阅读(0)  评论(0)    收藏  举报