带你用最直观的方式解读 :Agent 如何调用 Skills
Agent 调用 Skill 的过程就像。
·
让我用最直观的方式解读 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 的过程就像人类使用工具包:
- 看说明书 (读取
description) - 选择工具 (根据任务匹配)
- 准备材料 (填充
args_schema) - 执行操作 (调用
_run) - 检查结果 (分析
Observation) - 决定下一步 (继续或结束)
这个循环会持续到任务完成! 🎯
更多推荐



所有评论(0)