除了调用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

运行结果:

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐