让我用最直观的方式解读 Agent 如何调用 Skills

🎯 核心流程图

用户输入
   ↓
Main Agent (接待员)
   ↓
委托任务 → Flight Expert (机票专家)
              ↓
         🧠 Agent 思考循环
              ↓
         ┌─────────────────────┐
         │ Thought (思考阶段)   │
         │ "我需要搜索航班"     │
         └─────────────────────┘
              ↓
         ┌─────────────────────┐
         │ Action (行动决策)    │
         │ 选择: FlightSearchSkill │
         │ 参数: {origin: "北京", │
         │       destination: "上海"} │
         └─────────────────────┘
              ↓
         🛠️ Skill 执行
              ↓
         ┌─────────────────────┐
         │ Observation (观察结果)│
         │ "找到3个航班选项..."  │
         └─────────────────────┘
              ↓
         继续思考 or 返回结果

📝 实际执行示例

场景: 用户说 “帮我找北京到上海的航班”

第 1 步: Agent 接收任务
# Main Agent 将任务委托给 Flight Expert
task = Task(
    description="搜索北京到上海的航班",
    agent=flight_expert
)
第 2 步: Flight Expert 开始思考
🧠 Agent 内部对话:

Thought: 用户需要航班信息。我有两个技能:
  - FlightSearchSkill (航班搜索)
  - FlightBookingSkill (航班预订)
  
  现在应该先搜索,所以选择 FlightSearchSkill
第 3 步: Agent 决定调用 Skill
# Agent 自动生成调用指令 (通过 LLM 推理)
action = {
    "tool": "FlightSearchSkill",
    "tool_input": {
        "origin": "北京",
        "destination": "上海",
        "date": "2026-02-15"
    }
}
第 4 步: Skill 执行
# CrewAI 框架自动调用
flight_search_skill = FlightSearchSkill()
result = flight_search_skill._run(
    origin="北京",
    destination="上海", 
    date="2026-02-15"
)

# Skill 内部执行:
# 1. _fetch_flights() → 获取数据
# 2. _analyze_flights() → 分析价格趋势
# 3. _generate_recommendations() → 生成推荐
# 返回: JSON 格式的完整结果
第 5 步: Agent 观察结果
📊 Observation: 

收到 FlightSearchSkill 的返回:
{
  "flights": [
    {"flight_id": "CA1234", "price": 2580, ...},
    {"flight_id": "MU5678", "price": 2180, ...}
  ],
  "recommendations": [
    "最低价: ¥2,180",
    "建议选择早班航班"
  ]
}
第 6 步: Agent 继续思考
🧠 Thought: 已获得搜索结果。现在需要:
  - 分析哪个航班最适合用户
  - 准备给出推荐建议
  
  不需要再调用其他 Skill,可以总结了
第 7 步: 返回最终结果
# Agent 输出
final_output = """
为您找到2个直飞航班:

推荐选项:
1. 东方航空 MU5678 - ¥2,180 (性价比最高)
   出发: 14:20 | 抵达: 18:50
   
2. 国际航空 CA1234 - ¥2,580
   出发: 08:30 | 抵达: 12:45 (早班可预留更多时间)

建议: 如果时间灵活,选择 MU5678 可节省 ¥400
"""

🔍 技术细节解析

1. Skill 的接口定义

class FlightSearchSkill(BaseTool):
    name: str = "航班搜索专家技能"  # Agent 通过名字识别
    
    description: str = """
    全面的航班搜索能力,包括多航司比价、时间优化...
    """  # Agent 通过描述理解何时使用
    
    args_schema: Type[BaseModel] = FlightSearchInput  # Agent 知道需要什么参数
    
    def _run(self, origin: str, destination: str, date: str) -> str:
        # 真正的执行逻辑
        ...

2. Agent 如何选择 Skill?

Agent 内部有一个 工具选择器:

# 伪代码展示内部逻辑
class Agent:
    def __init__(self, tools):
        self.tools = tools  # [FlightSearchSkill, FlightBookingSkill]
        
    def choose_tool(self, task_description):
        # LLM 分析任务描述
        prompt = f"""
        任务: {task_description}
        
        可用工具:
        1. {self.tools[0].name}: {self.tools[0].description}
        2. {self.tools[1].name}: {self.tools[1].description}
        
        问题: 应该使用哪个工具? 需要什么参数?
        """
        
        # LLM 返回决策
        decision = llm.generate(prompt)
        # 例如: {"tool": "FlightSearchSkill", "args": {...}}
        
        return decision

3. 为什么 Skill 比 Tool 更智能?

Tool (简单函数)

@tool
def search_flights(origin, dest, date):
    return "结果"

# Agent 只知道:
# - 函数名: search_flights
# - 参数: 3个字符串
# - 不知道内部做了什么

Skill (能力包)

class FlightSearchSkill(BaseTool):
    description = """
    这个技能会:
    1. 搜索多个航空公司
    2. 对比价格和时间
    3. 分析性价比
    4. 生成推荐建议
    
    适用场景: 用户询问航班信息时
    """
    
# Agent 知道:
# ✅ 这个 Skill 能做什么 (多步骤)
# ✅ 什么时候该用它 (场景描述)
# ✅ 期望什么样的输出 (结构化建议)

4. 多次调用 Skill 的场景

# 场景: 用户要求先搜索再预订

# 第1轮思考
Thought: "需要搜索航班"
Action: FlightSearchSkill(origin="北京", dest="上海")
Observation: "找到航班 CA1234"

# 第2轮思考
Thought: "用户确认预订 CA1234"
Action: FlightBookingSkill(flight_id="CA1234")
Observation: "预订成功,订单号 BK202601..."

# 第3轮思考  
Thought: "任务完成,可以返回给用户了"
Final Answer: "您的航班已预订..."

🎓 关键概念对比

维度 Tool Skill
定义方式 @tool 装饰器 继承 BaseTool
能力范围 单一原子操作 复合多步骤流程
Agent 理解 函数名 + 参数 名称 + 详细描述 + 场景说明
类型安全 弱类型 (依赖注释) 强类型 (Pydantic 验证)
内部逻辑 一个函数体 多个私有方法协同
状态管理 ❌ 无状态 ✅ 可以有实例变量
错误处理 需要手动 try-catch 可以内置降级策略

🔥 实战建议

何时用 Skill?

# ✅ 推荐: 需要多步骤处理
class ComplexBookingSkill(BaseTool):
    def _run(self, params):
        # 步骤1: 检查库存
        # 步骤2: 计算价格
        # 步骤3: 验证用户资格
        # 步骤4: 生成订单
        ...

何时用 Tool?

# ✅ 推荐: 简单直接的操作
@tool
def get_weather(city: str):
    return f"{city} 今天晴天"

总结: Agent 调用 Skill 的过程就像人类使用工具包:

  1. 看说明书 (读取 description)
  2. 选择工具 (根据任务匹配)
  3. 准备材料 (填充 args_schema)
  4. 执行操作 (调用 _run)
  5. 检查结果 (分析 Observation)
  6. 决定下一步 (继续或结束)

这个循环会持续到任务完成! 🎯

Logo

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

更多推荐