目录
- [三、Skill ------ 让模型掌握处理复杂流程的能力](#三、Skill —— 让模型掌握处理复杂流程的能力)
- [1. Agent 有了 Tool,为什么还需要 Skill?](#1. Agent 有了 Tool,为什么还需要 Skill?)
- [2. 如何写好一个完整的技能](#2. 如何写好一个完整的技能)
- ["验证"是 Skill 中最容易被忽略的关键环节](#"验证"是 Skill 中最容易被忽略的关键环节)
- 一个股票分析技能案例
- [3. 模型从获取技能到使用的过程](#3. 模型从获取技能到使用的过程)
- [Agent 如何加载 Skill 清单并发给模型](#Agent 如何加载 Skill 清单并发给模型)
- 模型获取完整技能文档
- 效果演示
- [4. 小结](#4. 小结)
- 附:参考资料
三、Skill ------ 让模型掌握处理复杂流程的能力
1. Agent 有了 Tool,为什么还需要 Skill?
在学习 Agent 的过程中,一直接触 Tool 和 Skill 两个概念,心中便冒出个疑问:既然 Tool 已经让模型具备了调用外部能力,为什么还要多一个 Skill?这两个功能岂不重复了?
先看看 Claude 和 Openclaw 对 Skill 是怎么定义的:
Claude:技能是包含指令、脚本和资源的文件夹,Claude 可以动态加载这些文件夹来改进专业任务的性能。技能教会 Claude 如何以可重复的方式完成特定任务。
Openclaw:Skills 是 Markdown 指令文件,用于教智能体如何以及何时使用工具。
深入学习 Skill 后,笔者认为 Skill 是可以编排一系列复杂作业流程的功能,模型学习技能便掌握一项任务处理能力。与在工具中实现作业流程相比,技能中某个作业异常时,模型会自主选择其他方式完成该作业,并继续流程中的其他作业;而工具的某个节点故障则会导致整个作业运行失败,且无法在故障处恢复。工具保持为基础功能单元,不必实现得太复杂而影响整体。
2. 如何写好一个完整的技能
一个完整的 Skill 至少包含四要素:目标、工具、行动、验证
- 目标:明确这个 Skill 要交付的最终结果。如果是数据,定义格式和类型;如果是表格,描述样式和结构;如果没有显式输出,则说明以什么形式向用户反馈。目标是 Skill 的产出标准。
- 工具:列出执行流程中需要调用哪些底层 Tool,包括每个 Tool 的调用参数、运行环境等。工具是 Skill 执行所需的基础能力。
- 行动:定义流程以什么方式运行:是在当前会话中顺序执行,还是交给子 Agent 独立处理。如果使用子 Agent,还需指定上下文继承策略(继承当前窗口还是空白启动)以及工作目录等。行动决定了 Skill 的执行模式。
- 验证:在每个步骤执行后,核对产出的结果是否在预期范围内、是否符合质量标准。验证不是目标的重复,而是把目标中设定的标准转化为可执行的检查点。
"验证"是 Skill 中最容易被忽略的关键环节
"验证"是最容易被忽略的环节。定义 Skill 时,关注点很容易只聚焦在"要做什么"(目标)和"怎么做"(工具+行动),而缺少对"结果对不对"的考虑。没有验证的 Skill,工作流程就无法形成反馈闭环。
验证具体要检查什么取决于目标的类型,这里举一些例子:
- 计算结果:数值是否在合理范围内?比如价格、百分比不可以小于 0
- 长度限制:字符串是否允许特殊符号、是否超出边界?比如用户名不能包含"@#$"等符号、不超过 20 字符
- 格式校验:邮箱、电话、日期是否符合格式要求
- 业务规则:输出是否满足业务场景中的隐含约束
最重要的一点,验证并不是一次就能完善的。在 Skill 的实际使用过程中发现的问题,可以持续补充到验证规则里,避免模型重复犯同样的错误。一个 Skill 越用越可靠,正是验证规则不断累积的结果。
一个股票分析技能案例
以股票分析技能 SKILL.md 文档作为参考案例:
---
name: stock_analyze
description: 当用户提供股票代码或公司名称要求分析预测股价时可使用,此技能会获取最近几年(默认近6年)股票价格预测未来股价走势并生成趋势图
trigger: 用户提及分析[股票]、[基金]、[预测]、[趋势]、[行情]等关键字且提供[股票代码]、[公司名称]时
---
# 股票分析
## 获取公司股票历史价格
调用 `get_stock_daily` 工具获取股票数据:
...(省略)
## 获取公司资讯和行业、产业相关资讯
(可选)使用 `web_search` 工具搜索公司新闻、宏观政策、行业资讯,作为分析背景。
...(省略)
## 分析预测未来股价走势
运行分析脚本,输入为数据获取工具返回的 CSV 文件路径:
python stock_analyze/script/analyze_stock_chinese.py <数据文件.csv> [股票名称] [--days 20] [--factors 'JSON']
...(省略)
## 生成股价趋势图
分析脚本自动生成 PNG 图表(价格/RSI/成交量三子图),保存到当前目录,文件名格式为 `<代码>_price_chart_<时间戳>.png`。
## 结果校验
- 图表文字清晰,中文没有出现乱码
- 图表数值曲线连续性正常没有出现中断
...(省略)
3. 模型从获取技能到使用的过程
模型 API 有专门的参数用于传递 Tools 清单,Skills 则没有,因此 Agent 在启动初始化时就会把技能清单搜集起来,追加到 SYSTEM_PROMPT 发送给模型。上下文窗口空间是有限的,如果每个技能都完全塞入上下文,会浪费大量 Token,因此一开始只把技能的名称和功能描述加入 SYSTEM_PROMPT,当用户的消息触发某个技能关键词时,模型才调用工具加载技能。Agent 会把技能的完整文档 SKILL.md 作为工具调用结果返回给模型,再由模型学习其内容,发送其他调用请求,或生成最终答案回复用户。大致流程如下:
Agent 如何加载 Skill 清单并发给模型
Skill 一般都会存放在固定的路径,例如程序根目录的 skills 文件夹下。Agent 启动时扫描文件夹下的子目录,读取 SKILL.md 文档。
python
SKILLS: dict[str, dict] = dict()
def init_skill(path: str):
p = Path(path)
if p.is_dir():
for f in p.iterdir():
if f.is_dir():
try:
raw_text = Path(f / 'SKILL.md').read_text(encoding='utf-8')
name, description = __skill_format_parser(raw_text)
if name is not None:
SKILLS[name] = {
"name": name,
"description": description,
"content": raw_text
}
except FileNotFoundError:
print(f"SKILL.md 不存在, 技能加载失败 '{f}'")
与工具在调用模型 API 时有专门参数传递工具清单不同,Skill 清单需要在初次发起模型 API 调用时,作为 SYSTEM_PROMPT 的一部分一并发送给模型。
python
def build_system_prompt() -> str:
system_prompt = (f"Agent程序运行在 Windows 环境。"
f"要求对话简洁,禁止使用"好的"之类无用词语。")
skills_prompt = "\n".join([f"名称:{v['name']},描述:{v['description']}" for k, v in SKILLS.items()])
return (f"{system_prompt}\n"
f"系统可用Skill:{skills_prompt}。"
f"使用skill_handler工具加载相应的Skill信息。")
模型获取完整技能文档
模型获取完整 SKILL.md 文档的过程,本质上是一次工具调用。可以在 Agent 中定义一个用于获取技能完整文档的函数,并将其作为工具添加到 API 的 Tools 参数中。
python
def get_skill_detail(name: str) -> str:
content = SKILLS.get(name) # 先从初始加载的技能清单获取全文
if SKILLS.get(name) is None:
content = load_skill(name) # 初始未加载则重新加载一次
return content
效果演示
下面启动 Agent 脚本,演示一下 SKILL 的效果:
markdown
# 股票名称仅为演示作用,并非投资推荐
User > 分析电科芯片这只股票行情怎样,现在是否适合买入,价格多少,未来预计波动幅度多大
markdown
AI > 分析完成(数据截至2026-08-03,近6年1441条日线,图表已生成:`600877.SH_price_chart_20260804_094602.png`)。
**电科芯片(600877.SH)行情概况**
- 现价约 **12.1元**;近6年区间 5.62~25.91元,当前处于区间中部偏下,股价从历史高位回落较多。
- 预测方法为蒙特卡洛模拟(机器学习模型未通过回测门槛)。
**未来20个交易日预测(至8月底)**
- 中位数预测价:约 **12.1~12.2元**,基本横盘。
- 90%置信区间:**9.44 ~ 15.53元**,波动幅度约 **±25%**(相对现价)。
- 上涨概率:**48.9%**,略低于五成。
**是否适合买入**
当前信号偏中性:预测中位数走平、上涨概率不足50%,90%区间下沿(9.4元附近)有约两成以上回撤空间,属于高波动品种。若以稳健为主,建议观望或等回调至11元下方再考虑分批介入;若属高风险偏好、看好半导体/军工芯片题材,可小仓位试探,严格设止损(如跌破9.5元离场)。
注:以上为基于历史数据的统计预测,非投资建议,请结合公司基本面与行业政策自行决策。
脚本生成的图表:
4. 小结
上文没有详细说明 Skill 目录的结构,一是为避免篇幅太长,二是因为这部分不是学习的难点,翻一下参考资料便清楚,这里只做个简单补充。Skill 目录层次结构参考:
text
skills/
└── stock-analysis/
├── SKILL.md
├── scripts/
│ └── analyze_stock_chinese.py
├── templates/
│ └── report-template.md
├── assets/ # 如有
└── ... # 其他不一一列举
重点还是应该放在 Agent 如何加载 Skill、模型如何获取 Skill 信息、如何编写 SKILL.md 上,这些才是本篇学习总结最重要的内容。
- Agent 初始启动时扫描 skills 目录,读取所有 SKILL.md 文档,将技能名称和功能描述合并到 SYSTEM_PROMPT 发送给模型
- 模型以调用工具的方式获取 skill 文档,Agent 收到请求后,将文档全文作为工具调用结果返回给模型,模型再学习并使用技能中的知识
- 编写技能的重点在 SKILL.md 文档,至少应包含四点:目标、工具、行动、验证;额外的脚本、模板按一定的目录层次结构保存在 skill 目录中,并在文档里标记引用路径和使用方法。
附:参考资料
- Claude Support (https://support.claude.com/en/articles/12512176-what-are-skills)
- Openclaw Skill (https://docs.openclaw.ai/tools/skills)
- Agent Skills 开放标准 (https://agentskills.io/specification)
- Claude code 设计指南 book1