非常好的问题!今天就让我详细解释它们的区别,并展示如何正确使用 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 封装复杂逻辑
Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐