1. 自定义工具与工具包开发实战
在AI应用开发中,我们经常需要让大模型具备调用外部功能的能力。LangChain提供的工具(Tool)机制,就是让开发者能够将任意Python函数封装成AI可调用的"手"。今天我就结合自己在多个项目中的实践经验,详细讲解如何高效地创建和使用自定义工具。
1.1 工具的核心价值与设计原则
工具本质上是一个可执行的函数单元,它让AI具备了以下能力:
- 访问外部数据(如数据库、API)
- 执行复杂计算(如统计分析)
- 操作系统资源(如文件读写)
- 与硬件设备交互(如物联网控制)
在设计工具时,我遵循三个核心原则:
- 原子性:每个工具只做一件事,保持功能单一
- 自描述:通过文档清晰说明功能和参数
- 可靠性:包含完善的错误处理和边界检查
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 工具定义实战:@tool装饰器详解
2.1 基础工具定义
让我们从最简单的@tool装饰器开始。这个装饰器能自动从函数定义和docstring中提取工具元信息:
python复制from langchain_core.tools import tool
@tool
def get_cost(flower_name: str) -> str:
"""根据鲜花名称查询进货成本(元)。当需要知道成本时调用。
Args:
flower_name: 鲜花名称,支持中文如'玫瑰'、'百合'
Returns:
字符串格式的成本价格,如'10'
"""
prices = {"玫瑰": 10, "百合": 8, "康乃馨": 6}
return str(prices.get(flower_name, "未知品种"))
关键点:工具返回值必须是字符串!这是为了让大模型能够理解处理结果。
2.2 工具元数据优化
docstring的质量直接影响工具的使用效果。我总结的最佳实践包括:
- 第一行简明描述核心功能
- 明确触发条件("当...时调用")
- 参数说明包含类型和示例
- 返回值格式明确说明
python复制@tool
def get_market_price(flower_name: str, region: str = "北京") -> str:
"""查询鲜花在指定区域的市场售价(元)。当需要了解市场行情时调用。
Args:
flower_name: 鲜花品种,如'玫瑰'
region: 查询区域,默认为'北京',支持'上海'、'广州'等
Returns:
字符串格式的价格,如'15.5'
"""
# 模拟不同区域价格
price_map = {
"北京": {"玫瑰": 15, "百合": 12},
"上海": {"玫瑰": 16, "百合": 13}
}
return str(price
