[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:用户需要根据返回的工具调用信息,自行触发相关工具的回调

自定义工具
两种自定义方式
- 第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)

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)


本文来自博客园,作者:Rodericklog,转载请注明原文链接:https://www.cnblogs.com/rodericklog/articles/19455093

浙公网安备 33010602011771号