除了調用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
運行結果: