30 秒快速回答

Agent Skills 是一套让 AI Agent 按需加载专业能力的模块化系统。你可以把它理解为 Agent 的「技能包」——一个 Skill 就是一个独立封装的能力单元(比如「搜索网页」「解析 PDF」「发送邮件」),Agent 在运行时根据任务动态挂载需要的 Skill,而不是一次性加载所有能力。这样做的好处是:降低 token 消耗、提升响应速度、让 Agent 的能力边界清晰可控。

核心价值:把 Agent 从「臃肿的全能选手」变成「按需装配的专家」,用一套标准接口让任何人(甚至非程序员)为 Agent 添加新能力。


1. 为什么需要 Agent Skills?

1.1 没有 Skills 时的痛点

传统 Agent 开发面临三个现实问题:

痛点 具体表现 影响
上下文爆炸 system prompt 里塞了几十个工具描述,动辄上万 token 首轮对话就把上下文窗口吃掉一大截,响应变慢、成本飙升
能力耦合 所有函数/工具写死在 Agent 代码里 加一个「查天气」功能要改核心代码,维护成本高
专业度不足 通用 Agent 面对专业场景时 prompt 过长 医疗问诊 Agent 的 prompt 可能 5000 字,但其中 80% 在解释基础知识

1.2 Skills 解决了什么

Skills 的核心思路是 「能力外置 + 按需加载 + 标准化接口」

传统模式:
  Agent { 工具A + 工具B + 工具C + ... + 工具Z }  ← 全量加载

Skills 模式:
  Agent { 当前任务需要的 Skill① + Skill③ }        ← 按需加载
  └── Skill 目录:Skill①(搜索) Skill②(画图) Skill③(数据分析) ...

效果对比(基于实际项目数据):

指标 无 Skills 有 Skills 改善
单次调用 token 消耗 ~15,000 ~2,000-3,000 降低 80%+
工具描述占用 prompt 比例 40%-60% 5%-15% 大幅压缩
添加新能力所需改动 修改核心代码 编写一个 Skill 文件 零侵入
非开发者能否扩展 是(按模板写 Skill) 降低门槛

2. Agent Skills 的架构设计

2.1 核心组件

一套完整的 Agent Skills 系统包含三个层次:

┌─────────────────────────────────────┐
│          Agent 运行时引擎            │
│  ┌──────────┐  ┌─────────────────┐  │
│  │ Skill 路由器│  │ 上下文管理器    │  │
│  │ (技能匹配)  │  │ (注入/卸载技能) │  │
│  └──────────┘  └─────────────────┘  │
├─────────────────────────────────────┤
│          Skill Registry (注册表)      │
│  ┌──────────┐  ┌──────────┐       │
│  │Skill A    │  │Skill B    │  ...  │
│  │- name     │  │- name     │       │
│  │- desc     │  │- desc     │       │
│  │- triggers │  │- triggers │       │
│  │- prompt   │  │- prompt   │       │
│  │- tools[]  │  │- tools[]  │       │
│  └──────────┘  └──────────┘       │
├─────────────────────────────────────┤
│        Skill 文件(磁盘/数据库)      │
│  skills/                            │
│    ├── web_search.skill.md          │
│    ├── pdf_parser.skill.md          │
│    ├── data_analysis.skill.md       │
│    └── ...                          │
└─────────────────────────────────────┘

2.2 一个 Skill 文件长什么样

# Skill: web_search
## 描述
执行网络搜索并返回结构化结果。支持通用搜索和新闻搜索。

## 触发条件
- 用户要求搜索某个信息
- 用户查询实时数据
- 用户问"最新""今天""最近"等时效性问题

## 指令 (注入到 Agent context)
你拥有网络搜索能力。当用户需要实时信息时:
1. 先分析用户意图,提取核心关键词
2. 调用 `web_search` 工具执行搜索
3. 从搜索结果中提取相关信息,组织成简洁回答
4. 必须标注信息来源(链接或来源名称)

## 可用工具
- web_search(query: str, max_results: int = 5): 执行网络搜索
- web_fetch(url: str): 抓取指定 URL 的正文内容

## 示例
用户:"今天深圳天气怎么样?"
→ 触发本 Skill → 调用 web_search("深圳天气 2026-08-10") → 返回结构化结果

2.3 技能路由决策流程

用户输入
    │
    ▼
┌──────────────┐    匹配触发条件     ┌─────────────┐
│  Skill 路由器  │ ─────────────────→ │  匹配的 Skills │
└──────────────┘                    └─────────────┘
    │                                      │
    │ 无匹配                               ▼
    ▼                              ┌─────────────┐
使用默认能力                       │ 注入 Skill 指令 │
                              │ + 注册工具到会话 │
                              └─────────────┘

3. 实战:用 Dify 搭建带 Skills 的 Agent

Dify 是目前最成熟的 Agent Skills 平台之一,它的「工具 + 知识库 + 工作流」三层架构天然支持 Skills 模式。

3.1 在 Dify 中创建自定义 Skill

以创建一个「股票数据分析」Skill 为例:

Step 1:定义工具(API 工具)

# Dify 自定义工具配置
名称: stock_analysis
接口: GET https://api.example.com/stock/{symbol}
参数:
  - symbol: 股票代码(如 AAPL、000001.SZ)
返回: {
  "price": 185.30,
  "change": "+2.5%",
  "volume": 12345678,
  "pe_ratio": 28.5
}

Step 2:编写 Skill 指令(填入 Dify Agent 的「系统提示词」)

## 角色:股票数据分析师
当用户询问股票相关问题时,按以下流程处理:
1. 识别股票代码(中文名→代码映射)
2. 调用 stock_analysis 工具获取数据
3. 从以下维度解读数据:
   - 价格走势:对比近期趋势
   - 估值水平:PE/PB 在行业中位数的位置
   - 成交量:是否异常放量/缩量
4. 给出客观分析,避免直接建议买卖

Step 3:在 Dify 工作流中编排

将上述 Skill 作为工作流的一个节点,配合「条件判断」节点实现技能路由:

  • 如果用户输入包含股票代码/名称 → 触发 stock_analysis Skill
  • 如果用户输入是通用对话 → 走默认 LLM 路径

3.2 LangGraph 中的 Skills 实现

对于更灵活的场景,LangGraph 提供了代码级的 Skills 控制:

from langgraph.graph import StateGraph, END
from typing import TypedDict, List

class AgentState(TypedDict):
    messages: List[str]
    active_skills: List[str]  # 当前激活的 Skill 列表

# 技能注册表
skill_registry = {
    "web_search": {
        "description": "网络搜索能力",
        "trigger_keywords": ["搜索", "查找", "最新", "今天"],
        "prompt": "你拥有网络搜索能力...",
        "tools": [web_search_tool]
    },
    "code_gen": {
        "description": "代码生成能力",
        "trigger_keywords": ["写代码", "编程", "函数", ""],
        "prompt": "你是代码专家,请生成可运行的代码...",
        "tools": [python_executor]
    }
}

def skill_router(state: AgentState) -> dict:
    """根据用户最后一条消息匹配技能"""
    last_msg = state["messages"][-1].lower()
    matched = []
    for skill_name, skill_def in skill_registry.items():
        if any(kw in last_msg for kw in skill_def["trigger_keywords"]):
            matched.append(skill_name)
    return {"active_skills": matched}

def inject_skills(state: AgentState) -> dict:
    """将匹配到的技能注入上下文"""
    context_additions = []
    for skill_name in state["active_skills"]:
        skill = skill_registry[skill_name]
        context_additions.append(skill["prompt"])
    return {"messages": state["messages"] + context_additions}

# 构建图
workflow = StateGraph(AgentState)
workflow.add_node("router", skill_router)
workflow.add_node("inject", inject_skills)
workflow.add_node("llm", call_llm)
workflow.set_entry_point("router")
workflow.add_edge("router", "inject")
workflow.add_edge("inject", "llm")
workflow.add_edge("llm", END)

4. Skills 设计最佳实践

4.1 粒度控制

粒度 示例 适用场景 注意
太细 一个 Skill 只管「读取 CSV 文件」 组合灵活但路由复杂 容易出现碎片化
合理 「数据分析」Skill(含读取、清洗、可视化) 大多数场景 推荐
太粗 一个「全功能 Skill」包含所有能力 退化回无 Skills 模式 失去模块化价值

原则:一个 Skill 对应一个用户可感知的独立任务场景

4.2 触发条件设计

触发条件不要过于宽松或严格:

## 好的触发条件
trigger_keywords: ["分析数据", "做图表", "数据可视化", "统计", "报表"]
# → 精准覆盖数据场景,不会误触

## 差的触发条件
trigger_keywords: ["数据"]  
# → "我今天数据线坏了" 也会误触发

## 差的触发条件(过于严格)
trigger_keywords: ["请使用 pandas 对 CSV 文件进行描述性统计分析并生成箱线图"]
# → 几乎没有用户会这么说话

4.3 Skills 平台对比

平台 Skills 支持方式 上手难度 灵活度 适合谁
Dify 工作流节点 + 工具插件 产品经理、非开发者
LangGraph 代码级状态图控制 中高 极高 开发者、需要深度定制
Coze 插件市场 + Bot 配置 低-中 快速搭建、非技术用户
MCP Skills 标准化协议 + 注册机制 需要跨平台复用 Skill
OpenAI GPTs Actions + 指令 最低 个人使用、轻量场景

5. 总结

Agent Skills 的本质是把 Agent 的能力外置化、模块化、标准化

  • 外置化:Skill 不耦合在 Agent 核心代码中,独立维护
  • 模块化:每个 Skill 有清晰的边界、触发条件和工具集
  • 标准化:统一的 Skill 文件格式让跨平台复用成为可能

延伸阅读建议