1. LangChain自定义工具开发概述
在构建基于LangChain的智能应用时,自定义工具(Agent Tools)的开发是扩展AI能力边界的关键技术。作为一位长期使用LangChain进行项目开发的工程师,我发现工具开发的质量直接影响着Agent的决策能力和任务完成度。LangChain主要提供两种工具实现方式:基于装饰器的快速开发和基于类的结构化开发,两者各有其适用场景和技术特点。
实际项目中,我经常需要根据工具复杂度、复用需求和团队协作规范来选择实现方式。简单的一次性工具用装饰器可以快速验证想法,而需要复杂参数校验、状态管理或继承扩展的工具则更适合用类实现。下面我将结合具体代码示例,详细解析两种实现方式的技术细节和最佳实践。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 装饰器实现方式详解
2.1 基础装饰器使用
@tool装饰器是LangChain提供的最快捷的工具封装方式,只需在普通函数上添加装饰器即可将其转化为Agent可调用的工具。以下是一个完整的天气查询工具示例:
python复制from langchain.tools import tool
import requests
@tool
def get_weather(city: str) -> str:
"""查询指定城市的实时天气情况
Args:
city (str): 需要查询的城市名称,如"北京"
Returns:
str: 天气信息字符串
"""
# 实际项目中这里应该调用天气API
return f"{city}当前天气:晴,温度25℃,湿度60%"
关键点说明:
- 函数文档字符串(docstring)会被自动转换为工具描述,Agent据此理解工具用途
- 参数类型提示(type hints)帮助LangChain进行参数类型校验
- 返回字符串应当包含完整结果信息,因为Agent无法访问工具内部状态
注意:装饰器方式默认使用函数名作为工具名,如需自定义可在装饰器参数指定:
@tool("weather_check")
2.2 高级参数配置
装饰器支持通过args_schema参数实现更复杂的参数验证。下面是一个支持多参数的高级搜索工具示例:
python复制from pydantic import BaseModel, Field
from typing import Optional
class SearchParams(BaseModel):
query: str = Field(..., description="搜索关键词")
num_results: int = Field(5, description="返回结果数量")
region: Optional[str] = Field(None, description="地区限定")
@tool(args_schema=SearchParams)
def web_search(params: SearchParams) -> str:
"""在互联网上搜索信息
Args:
params (SearchParams): 包含所有搜索参数
Returns:
str: 格式化后的搜索结果
"""
# 模拟搜索过程
results = [f"结果{i}: {params.query}" for i in range(params.num_results)]
if params.region:
results.insert(0, f"[地区限定: {params.region}]
