除了调用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
运行结果: