Agent开发为什么使用Skills不用Tools
非常好的问题!今天就让我详细解释它们的区别,并展示如何正确使用 Skills。
·
非常好的问题!今天就让我详细解释它们的区别,并展示如何正确使用 Skills。
🔍 Tools vs Skills 的核心区别
Tools (工具)
from langchain.tools import tool
@tool("search_flights")
def search_flights(origin: str, destination: str, date: str) -> str:
"""单一功能的原子操作"""
return "航班搜索结果"
# 使用方式
agent = Agent(
tools=[search_flights, book_flight] # 直接函数
)
Skills (技能包)
from crewai_tools import BaseTool
class FlightSearchSkill(BaseTool):
"""组合多个相关操作的能力包"""
name: str = "航班搜索技能"
description: str = "完整的航班搜索和预订能力"
def _run(self, query: str) -> str:
# 内部可以调用多个工具
results = self._search()
filtered = self._filter(results)
return self._format(filtered)
🎯 当前代码的问题
您说得对!当前代码没有使用 Skills,而是直接使用了简单的 Tools。让我重构为正确的 Skills 架构:完美!现在代码已经升级为真正的 Skills 架构。让我详细说明关键改进:
🎯 Skills vs Tools 的实际对比
之前 (简单 Tools)
@tool("search_flights")
def search_flights(origin, dest, date):
return "简单的搜索结果"
# Agent 只能调用单一功能
agent.tools = [search_flights, book_flight]
现在 (Skills 能力包)
class FlightSearchSkill(BaseTool):
def _run(self, origin, dest, date):
# 复合能力!
data = self._fetch_flights() # 内部方法1
analyzed = self._analyze_flights() # 内部方法2
recs = self._generate_recommendations() # 内部方法3
return integrated_result
# Agent 获得完整能力包
agent.tools = [flight_search_skill, flight_booking_skill]
🔥 Skills 架构的核心优势
1. 封装复杂逻辑
# Skill 内部可以有多个私有方法
class HotelComparisonSkill(BaseTool):
def _run(self, city, requirements):
hotels = self._fetch_hotels(city) # 步骤1: 获取数据
scored = self._score_hotels(hotels) # 步骤2: 评分算法
return self._format_results(scored) # 步骤3: 格式化
- Agent 只需调用一次 Skill
- 内部自动执行多步骤流程
- 逻辑内聚,易于维护
2. 类型安全 (Pydantic 验证)
class FlightSearchInput(BaseModel):
origin: str = Field(..., description="出发地城市")
destination: str = Field(..., description="目的地城市")
date: str = Field(..., description="出发日期 YYYY-MM-DD")
class FlightSearchSkill(BaseTool):
args_schema: Type[BaseModel] = FlightSearchInput # 强类型约束
- 自动参数验证
- 防止 Agent 传递错误参数
- 提供清晰的接口文档
3. 状态管理
class BookingSkill(BaseTool):
def __init__(self):
super().__init__()
self.booking_history = [] # Skill 可以有状态!
def _run(self, flight_id):
result = self._create_booking(flight_id)
self.booking_history.append(result) # 记录历史
return result
4. 可组合性
# 一个 Skill 可以内部调用其他 Skills
class AdvancedTravelSkill(BaseTool):
def __init__(self):
self.flight_skill = FlightSearchSkill()
self.hotel_skill = HotelComparisonSkill()
def _run(self, query):
flights = self.flight_skill._run(...)
hotels = self.hotel_skill._run(...)
return self._combine(flights, hotels)
📊 Skills 在您的系统中的表现
机票专家的 Skills
flight_expert.tools = [
FlightSearchSkill(), # 能力1: 搜索+分析+推荐
FlightBookingSkill() # 能力2: 预订+支付+确认
]
每个 Skill 内部包含:
- ✅ 数据获取逻辑 (
_fetch_*) - ✅ 业务分析逻辑 (
_analyze_*) - ✅ 推荐生成逻辑 (
_generate_*) - ✅ 格式化输出逻辑
酒店专家的 Skills
hotel_expert.tools = [
HotelComparisonSkill(), # 跨平台比价 + 需求匹配评分
LocationMapSkill() # 地理分析 + 交通评估 + 周边设施
]
🚀 Skills 架构的高级特性
特性 1: 内置错误处理
class RobustSkill(BaseTool):
def _run(self, query):
try:
return self._main_logic(query)
except APIError:
return self._fallback_logic(query) # 降级方案
except Exception as e:
return {"error": str(e), "status": "failed"}
特性 2: 性能优化 (缓存)
class CachedSearchSkill(BaseTool):
def __init__(self):
super().__init__()
self._cache = {}
def _run(self, query):
cache_key = hashlib.md5(query.encode()).hexdigest()
if cache_key in self._cache:
return self._cache[cache_key] # 命中缓存
result = self._expensive_operation(query)
self._cache[cache_key] = result
return result
特性 3: 监控和日志
class MonitoredSkill(BaseTool):
def _run(self, query):
start_time = time.time()
result = self._main_logic(query)
duration = time.time() - start_time
self._log_metrics({
"skill": self.name,
"duration": duration,
"success": True
})
return result
🎓 Skills vs Tools 选择指南
| 场景 | 推荐方式 | 原因 |
|---|---|---|
| 简单查询 (如天气) | Tool | 单一操作,无需封装 |
| 复杂业务流程 (如航班搜索) | Skill | 多步骤,需要内部逻辑 |
| 需要状态管理 | Skill | Skill 支持实例变量 |
| 需要类型验证 | Skill | Pydantic 集成 |
| 外部 API 调用 | Tool | 轻量简单 |
| 内部算法实现 | Skill | 封装复杂逻辑 |
更多推荐



所有评论(0)