# 9.1 技能系统概述

## Skill vs Tool：一个关键的区分

在第 4 章中，我们学会了让 Agent 调用工具——搜索网页、执行代码、读写文件。这些工具就像工匠的锤子、锯子、尺子。但一个优秀的工匠之所以能造出精美的家具，不仅仅是因为他有工具，更因为他有**木工技能**——知道什么时候用什么工具、按什么顺序操作、遇到问题如何处理。

![技能结构图](../svg/chapter_skill_01_structure.svg)

让我们用一个具体例子来感受这个区别：

```python
# ❌ 只有工具，没有技能 —— Agent 需要被手把手指导
user: "帮我分析一下这个 CSV 文件的销售数据"
agent: "好的，我可以用 read_csv 工具读取文件。"
       # 读取后只是把原始数据展示出来
       # 不知道要做什么分析
       # 不知道怎么处理缺失值
       # 不知道用什么图表

# ✅ 有工具 + 有技能 —— Agent 像数据分析师一样工作
user: "帮我分析一下这个 CSV 文件的销售数据"
agent: # 自动执行完整的分析流程：
       # 1. 读取 CSV 并检查数据质量
       # 2. 处理缺失值和异常值
       # 3. 计算关键指标（总销售额、增长率、Top 产品）
       # 4. 选择合适的图表（趋势用折线图、占比用饼图）
       # 5. 生成结构化的分析报告
```

## 技能的三个核心特征

### 特征一：技能是可复用的

工具调用是"一次性"的——每次你都需要告诉 Agent 该怎么做。而技能是"一次学会、反复使用"的：

```python
# 工具调用：每次都要详细指导
messages = [
    {"role": "system", "content": """你要做以下事情：
    1. 先用 read_csv 读取文件
    2. 检查是否有空值，用中位数填充
    3. 计算各列的均值和标准差
    4. 用 plot_chart 生成折线图
    5. 用 write_report 生成 Markdown 报告
    ...(详细的 20 行指令）"""},
]

# 技能调用：简单一句话
messages = [
    {"role": "system", "content": "你具备数据分析技能。"},
    {"role": "user", "content": "分析 sales.csv 的销售趋势"},
]
# Agent 自动执行完整的分析流程
```

### 特征二：技能包含领域知识

工具本身是"通用的"，不包含业务知识。而技能将领域知识编码进去：

```python
# 工具只知道"怎么做"
def execute_sql(query: str) -> str:
    """执行 SQL 查询"""
    return db.execute(query)

# 技能还知道"做什么"和"为什么"
DATA_ANALYSIS_SKILL = """
你是一个专业的数据分析师。在分析数据时：

数据质量检查：
- 缺失值超过 30% 的列应该考虑删除
- 数值型异常值用 IQR 方法检测（1.5倍四分位距）
- 日期列检查连续性

分析方法选择：
- 时间序列数据 → 趋势分析 + 季节性分解
- 分类数据 → 频率分布 + 交叉分析
- 数值数据 → 描述统计 + 相关性分析

可视化最佳实践：
- 趋势 → 折线图
- 比较 → 柱状图
- 占比 → 饼图/环形图
- 分布 → 直方图/箱线图
- 关系 → 散点图
"""
```

### 特征三：技能可以被发现和组合

在多 Agent 系统中，每个 Agent 拥有不同的技能。当一个 Agent 接到一个复杂任务时，它可以发现并调用其他 Agent 的技能：

![技能组合与任务分配](../svg/chapter_skill_01_composition.svg)

## 技能的三层架构

我们将技能系统分为三个层次：

![技能三层架构](../svg/chapter_skill_01_three_layers.svg)

### 第一层：基础工具层

这是第 4 章已经介绍的内容——单个可调用的工具函数。

### 第二层：技能定义层

将工具、知识和流程封装为可复用的技能单元。有三种主要的封装方式：

| 封装方式 | 原理 | 代表 | 适用场景 |
|---------|------|------|---------|
| **Prompt-based** | 用精心设计的系统提示注入领域知识和行为指南 | Anthropic Skills、Claude Code | 知识密集型任务 |
| **Code-based** | 将技能实现为可执行的代码模块 | Voyager 技能库、Semantic Kernel Plugin | 需要精确控制的任务 |
| **Workflow-based** | 将技能编排为状态图或工作流 | LangGraph Subgraph、CrewAI Task | 多步骤流程型任务 |

### 第三层：技能管理层

管理技能的注册、发现、选择和版本控制。这在多 Agent 系统中尤其重要——每个 Agent 需要声明自己有什么技能，其他 Agent 需要能发现和调用这些技能。

## 技能系统的发展脉络

![技能系统发展脉络](../svg/chapter_skill_01_timeline.svg)

## 本节小结

| 概念 | 工具（Tool） | 技能（Skill） |
|------|------------|-------------|
| **粒度** | 单个操作 | 一类问题的完整解决方案 |
| **包含** | 函数 + 参数描述 | 工具 + 知识 + 流程 + 经验 |
| **复用性** | 通用（任何场景都能用） | 领域化（特定类型任务） |
| **类比** | 锤子、锯子 | 木工技能、数据分析技能 |
| **定义方式** | 函数定义 + JSON Schema | Prompt / 代码 / 工作流 |

> 💡 **核心观点**：**Tool 是 Skill 的组成部分**。一个技能通常包含多个工具的组合使用、专业的领域知识、标准化的处理流程，以及从经验中积累的最佳实践。随着 Agent 的应用场景越来越复杂，技能系统正在成为 Agent 架构中不可或缺的一层。

---

*下一节：[9.2 技能的定义与封装](./02_skill_definition.md)*
