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 文件格式让跨平台复用成为可能
延伸阅读建议
- 如果你刚接触 Agent 开发:先读《AI Agent 怎么用?智能体工作原理与搭建指南》
- 如果你想了解 MCP 的 Skills 实现:参考《MCP Skills 令牌优化:从15万到2000的按需加载策略》
- 如果你想深入 Agent 框架:阅读《怎么用 LangGraph?Agent 开发框架完全指南》
- 如果你关心 Agent 之间的协作:《什么是多智能体协作?AI Agent 如何组队干活》