除了调用LangChain内置工具外,也可以自定义工具
实例1: 自定义多个工具
from langchain.agents import initialize_agent, AgentType
from langchain_community.agent_toolkits.load_tools import load_tools
from langchain_core.tools import tool, StructuredTool
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field
# 初始化 LLM
llm = ChatOpenAI(
temperature=1,
model='deepseek-r1',
api_key='sk-****',
base_url='https://dashscope.aliyuncs.com/compatible-mode/v1'
)
# 定义工具输入模型
class MySearchInput(BaseModel):
query: str = Field(description='你搜索的关键词')
# 定义搜索工具
@tool('my_search_tool', args_schema=MySearchInput, return_direct=True)
def my_search(query: str) -> str:
"""
用来搜索本地电脑上的数据
:param query:
:return:
"""
return '我是一个搜索工具'
# 定义排序工具输入模型
class MySortToolInput(BaseModel):
sort_num: list[int] = Field(description='待排序的数字列表')
# 定义排序工具
def sort_num(sort_num: list[int]) -> list[int]:
"""
把所有的数字重新排序
:param sort_num:
:return:
"""
return sorted(sort_num)
# 将排序工具转换为 StructuredTool
sort_tool = StructuredTool.from_function(
func=sort_num,
name='sort_num',
description='排序列表中的数字',
args_schema=MySortToolInput,
return_direct=True
)
# 加载工具
tools = load_tools(['arxiv'], llm)
# 将自定义工具添加到工具列表中
tools.append(my_search)
tools.append(sort_tool)
# 初始化代理
agent = initialize_agent(
tools,
llm,
agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
handle_parsing_errors=True, # 如果解析报错,继续
verbose=True,
)
# 调用代理
resp = agent.invoke({'input': '介绍一下2006.13145这篇论文的创新点,并且给[12,56,2,90,11,66]排序'})
resp2 = agent.invoke({'input':'请搜索当前文件夹中名称为 Tavity搜索.py 的文件'})
print(resp)
print(resp2)
以上,定义了一个my_search的搜索工具(具体没有实现,只是打印一句话) 和一个排序工具sort_num,同时使用了LangChain的内置工具 arxiv(该工具用于范文学术论文和文献)
运行结果:
实例2: 自定义一个工具
from langchain import hub
from langchain.agents import create_structured_chat_agent, AgentExecutor
from langchain_core.tools import StructuredTool
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field
# 初始化 LLM
llm = ChatOpenAI(
temperature=1,
model='deepseek-r1',
api_key='sk-*****',
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
# 定义工具输入模型
class AddlenToolInput(BaseModel):
a: str = Field(description='第一个字符串')
b: str = Field(description='第二个字符串')
# 定义工具函数
def add_str_len(a: str, b: str) -> int:
"""
计算字符串的长度并求和
:param a: 第一个字符串
:param b: 第二个字符串
:return: 两个字符串的长度之和
"""
return len(a) + len(b)
# 将工具转换为 StructuredTool
add_len_tool = StructuredTool.from_function(
func=add_str_len,
name='my_add',
description='计算2个字符串的长度之和',
args_schema=AddlenToolInput,
return_direct=False
)
# 加载工具
tools = [add_len_tool]
# 加载预定义的提示
prompt = hub.pull('hwchase17/structured-chat-agent')
# 创建代理
agent = create_structured_chat_agent(llm, tools, prompt)
# 初始化代理执行器
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)
# 调用代理
resp = agent_executor.invoke({'input': '`你好中国人`的字符串长度加上`abcde`字符串的长度是多少? langsmith是什么?'})
print(resp)
以上定义了一个计算字符串长度并求和的工具add_str_len
运行结果: