1. LangChain工具调用机制深度解析
在构建智能体(Agent)系统时,工具调用能力直接决定了Agent的实用性和扩展性。LangChain提供了一套完整的工具调用解决方案,其核心设计理念是将外部能力封装为标准化接口,使LLM能够像调用内置函数一样使用外部工具。这套机制主要由三个关键组件构成:
- 工具(Tools):原子级功能单元,每个工具对应一个特定功能
- 工具包装器(Tool wrappers):提供统一的调用接口和元数据描述
- 工具链(Tool chains):实现多工具协同工作的编排逻辑
这种架构设计使得开发者可以灵活地组合各种能力,而无需关心底层实现细节。下面我将结合多年AI工程实践经验,详细拆解每个组件的技术实现和最佳实践。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 工具定义与实现详解
2.1 基础工具创建
在LangChain中创建工具主要有两种方式:函数装饰器和类继承。我们先看最常用的装饰器方式:
python复制from langchain.tools import tool
import requests
@tool
def get_weather(location: str, unit: str = "celsius") -> str:
"""获取指定位置的当前天气情况
Args:
location (str): 城市名称,支持中文或英文
unit (str): 温度单位,可选 celsius 或 fahrenheit
Returns:
str: 格式化后的天气信息字符串
"""
# 实际项目中这里会调用天气API
api_key = "your_api_key"
params = {"q": location, "units": unit, "appid": api_key}
response = requests.get("https://api.openweathermap.org/data/2.5/weather", params=params)
data = response.json()
return f"{location}当前天气:{data['weather'][0]['description']},温度{data['main']['temp']}°{unit.upper()}"
关键设计要点:
- 类型注解:明确标注输入输出类型,帮助LLM理解参数格式
- 文档字符串:详细描述工具功能、参数和返回值,这是LLM决定是否使用该工具的重要依据
- 错误处理:实际项目中需要添加try-catch块处理API调用异常
2.2 高级工具类实现
对于复杂工具,推荐使用类继承方式:
python复制from langchain.tools import BaseTool
from pydantic import Field
class WeatherTool(BaseTool):
name = "weather_query"
description = """
获取全球任意城市的实时天气信息。
输入应为包含城市名称和温度单位的JSON字符串。
示例输入:{"location": "北京", "unit": "celsius"}
"""
api_key: str = Field(..., description="OpenWeatherMap API密钥")
def _run(self, input_str: str) -> str:
import json
try:
params = json.loads(input_str
