一、问题的本质:为什么 Prompt 工程不够用了?
大模型有一个被长期忽视的结构性缺陷:每轮对话都是一次"失忆重启"。无论之前聊过多少轮,模型都必须从零开始重建上下文。这催生了 Prompt 工程:把团队规范、技术选型、架构约束写成一份"CLAUDE.md",每次会话启动时自动注入。
但这条路走到深处,会遇到三个天花板:
- 上下文通胀
项目越复杂,Prompt 越臃肿。所有领域知识一股脑塞进系统提示词,上下文窗口被撑满,关键信息反而被稀释。这就像把整本员工手册塞给新同事,让他一次性读完,真正重要的安全红线反而淹没在细节里。
- 零复用性
知识和项目深度耦合,换个场景就得重写。A 项目的实验管理流程,到了 B 项目无法直接复用,团队陷入"重复造轮子"的泥潭。
- 注意力稀释
模型注意力是有限的。当无关信息持续占用 token,真正需要聚焦的任务指令反而被"噪声"淹没。
Agent Skill 的出现,本质上是对上述问题的模块化回应。
二、Skill 的核心设计哲学:渐进性披露
Anthropic 给 Skill 下了一个精准定义:
"Agent Skills are a lightweight, open format for extending AI agent capabilities with specialized knowledge and workflows."
翻译成人话:Skill 是给 AI Agent 的「入职指南」,把特定领域的专业能力打包成可发现、可复用的模块,Agent 按需加载。
但 Skill 体系真正的设计精髓,不是"模块化"本身,而是渐进性披露(Progressive Disclosure),只在需要时才加载需要的知识。
这个机制分三个阶段运转:
阶段 | 加载内容 | 资源消耗 |
Discovery(发现) | 仅 | 常驻注入,极低成本 |
Activation(激活) | 完整 | 命中时加载,中等成本 |
Execution(执行) | 按路由表加载对应模块文件 + 参考文档 | 按需读取,精准投放 |
这就是"按需投放知识"的经济学:用最小的上下文成本,换取最大的知识覆盖范围。绝大部分请求只需要部分资源,上下文窗口永远留给"当下真正重要"的信息。
三、Skill 与 System Prompt 不是替代关系,是协同关系
很多团队容易混淆两者的定位。一句话区分:
System Prompt 是"这个项目的规矩",Skill 是"一种可复用的能力"。
维度 | System Prompt | Skill |
定位 | 项目级全局规则、编码规范 | 特定领域能力封装 |
加载策略 | 会话启动时全量加载 | 渐进式按需加载 |
生效范围 | 当前项目 | 可跨项目、跨会话 |
上下文成本 | 恒定占用,与任务无关也消耗 | 仅命中时加载,未命中零成本 |
组织结构 | 单文件,扁平 | 多文件模块化,支持脚本和资源 |
适用场景 | 编码风格、项目约定、通用约束 | 完整工作流、多步骤流程、领域专家知识 |
最佳实践是两者协同:System Prompt 定义全局编码规范(对所有 Skill 生效),Skill 封装特定领域工作流(激活时叠加内部规则)。
四、Skill 的物理结构:一个文件夹就是一个能力包
Skill 的核心是一个包含 SKILL.md 的文件夹,已被 Claude Code、Cursor、GitHub Copilot、Gemini CLI 等 40+ 主流 Agent 产品采纳,成为事实上的开放标准。
my-skill/ # Skill 名称,短横线分隔 ├── SKILL.md # 唯一入口,也是唯一"触发器" ├── scripts/ # 可执行脚本(突破 LLM 能力边界) ├── references/ # 参考文档(低频查阅知识) ├── assets/ # 模板、资源 └── ... # 任意额外文件SKILL.md 的两层结构
1. Frontmatter(元信息)决定 Skill 的"身份"和"权限"
最核心的两个字段:
- name:Skill 的唯一标识符,也是文件夹名。最长 64 字符,只能用小写字母、数字和连字符。
- description:这是 Skill 能否被正确触发的生命线。Agent 靠这段描述来判断"当前任务该不该调用这个 Skill"。必须同时回答 WHAT(做什么)和 WHEN(什么时候用)。
其他关键字段包括权限控制(allowed-tools、disable-model-invocation)、运行时环境(context、agent)、生命周期钩子(hooks)等。
2. 正文(指令)应该是"路由器",不是"仓库"
SKILL.md 正文的职责是分发任务到正确的模块,而非包含所有业务细节。控制在 500 行以内(约 2000-3000 token),是单个 Skill 激活后比较合理的上下文开销。
五、触发机制:description 是 Skill 的"门面"
Skill 的触发机制比内容本身更重要,再好的 Skill,如果无法被正确激活,就是废代码。
两种触发方式
- 自动触发(语义匹配):Agent 根据 description 判断"这个任务我有现成的专业流程可以用",然后主动加载。用户无感,像老员工听到需求自动翻出 SOP。
- 手动触发(斜杠命令):用户通过 /skill-name 显式调用。适合老用户精确控制。
description 的书写公式
Claude Code 推荐:功能定义 + 触发场景 + 核心能力
写好它需要四个原则:
- 同时回答 WHAT 和 WHEN
不能只说"处理文档",要明确"做什么、在什么场景下调用"。
- 枚举具体触发词
Agent 做语义匹配时,关键词越具体命中率越高。不仅要写术语,还要写口语化说法。比如:"创建实验"、"新建"、"做个实验"、"建个 AB",全都要写进去。
- 用第三人称
description 会被注入系统提示词,要写成客观描述。
✅Generates API documentation from source code
❌I can help you generate docs
- 划定排除边界(可选)
明确标注不适用场景,降低误触发概率。
六、知识分层:如何决定"这段知识该放哪?"
Skill 设计的核心挑战是知识分层。一条经验法则:文件超过 300 行,或某个 Step 的规则超过 100 行,就是拆分信号。
分层决策树如下:
这段知识是否每次激活 Skill 都需要? ├── 是 → 放 SKILL.md(入口文件,每次必读) └── 否 → 是否每次进入该模块时都需要? ├── 是 → 放模块主文件(如 creator.md) └── 否 → 是否仅在某个特定 Step 才需要? ├── 是 → 放对应 phase 文件(如 collect-phase.md) └── 否 → 是否只在特定条件下查阅? ├── 是 → 放参考文件(tools.md / safety.md) └── 否 → 考虑是否需要保留实战案例:trade-skill 的分层实践
trade-ab-skill/ ├── SKILL.md ← 意图路由表、全局安全红线(每次激活必读) ├── modules/creator/creator.md ← 创建流程 Step 编排、scenarioId 对照表 ├── modules/creator/collect-phase.md ← 参数填充的 11 项执行清单(仅 Step 2 读) ├── modules/creator/validate-phase.md ← 校验规则(仅 Step 3 读) ├── modules/creator/tools.md ← MCP 工具接口列表(调接口时按需查阅) └── modules/creator/safety.md ← 安全约束详细规则(validate 阶段按需加载)核心原则:越频繁用到的知识,离入口越近;越偶尔查阅的知识,越往深处放。
七、安全实践:模块级工具隔离
当 Skill 涉及多个模块、调用多个 MCP 接口时,必须实施模块级工具隔离,每个模块只能调用白名单中的接口,遵循权限最小化原则。
设计原则:
- 白名单制:每个模块的 tools.md 明确列出可用接口,白名单外一律禁止。
- 危险接口显式禁用:万能工具(如直接 HTTP 调用)全局禁止。
- 工具隔离:不同模块使用不同接口集合,防止误调用。
trade-skill 的隔离实践:
- 实验创建接口仅在 creator 白名单中
- modifier 只能用实验修改接口
- 审批/发布接口在所有模块中均禁止调用
- modifier 模块明确标注易混淆接口的禁止规则
八、脚本增强:让 Skill 突破 LLM 的能力边界
核心理念:确定性计算逻辑封装为脚本,由 Agent 调用执行,而非自行推导。
什么时候该写成脚本?如果这件事让 LLM 做有概率出错,但脚本能 100% 确定性完成,那就该封装。
场景 | LLM 的局限 | 脚本的优势 |
配置文件读写 | 可能写入格式错误的 JSON | 保证格式正确,原子写入 |
环境检测 | 无法可靠检测系统状态 | 直接查询,返回结构化结果 |
日志采集 | 不应直接处理网络请求 | 封装 HTTP 调用,异常自处理 |
复杂计算 | 算术不可靠 | 精确计算 |
脚本设计四原则:
- 自愈性:内部处理所有异常,始终正常退出,绝不阻断 Skill 主流程
- 结构化输出:统一输出 JSON,方便 Agent 解析和流转
- 幂等性:多次执行结果一致,预检脚本只追加缺失项,不覆盖已有配置
- 安全边界:只操作指定文件,不触碰其他系统资源
trade-skill 实战:
- MCP 预检脚本:Skill 启动前自动检测 MCP 依赖是否就绪
- 日志采集脚本:采集实验操作日志,Agent 只需调用脚本、读取返回的 JSON,不用自己"猜"环境状态
九、参数传递与状态持久化
Skill 不是静态指令,支持运行时参数传递和上下文预注入。
参数传递三原则:
- 显式:参数来源和去向清晰可追溯
- 可校验:每个阶段有门卡检查参数完整性
- 防丢失:关键参数在快照中持久化
trade-skill 的快照机制:
每个阶段将产出写入快照,下一阶段从快照读取。阶段门卡确保参数完整性。
用户偏好持久化:
成功操作后,将关键参数写入 user-prefs.json,下次执行时自动注入:
{ "defaultScenarioId": "<场景ID>", "defaultMetricTemplateId": "<模板ID>", "recentExperimentIds": ["<实验ID1>", "<实验ID2>"], "lastUsed": "2026-06-17", "usageCount": 2 }十、测试与迭代:Skill 也是软件,需要工程化测试
Claude Code 官方推荐三类核心测试:
1. 触发测试
准备 10 个左右的自然语言变体去触发 Skill,检查是否都能正确激活。同时验证不相关输入是否会误触发。
2. 功能走查
用自然语言驱动完整流程,检查每个阶段输出是否符合预期。重点验证:
- 路由是否准确分发
- 渐进加载是否按时序工作
- 红线规则是否被遵守
- 异常场景是否正确熔断
关键:别只跑 happy path。故意输入边界值、模拟工具不可用、尝试让 Agent 调用禁止接口,才是真正暴露问题的场景。
3. 性能对比
针对同一任务,分别用"无 Skill"和"有 Skill"两种方式各跑 5 次,对比 Token 用量和完成质量。
迭代方法论:与传统软件 bug 修复逻辑一致:发现问题 → 定位原因 → 修复文档 → 验证效果。
最高效的方式是观测驱动迭代,通过日志埋点收集每次执行的状态结果(成功/失败/取消)、耗时、调用的工具列表,用数据定位薄弱环节。
trade-skill 的日志采集机制采用了两阶段 traceId 配对追踪,保障了全链路可观测。
十一、从 0 到 1:用 skill-creator 创建你的第一个 Skill
skill-creator 本身也是一个 Skill,用来创建和打包 Skill。整个流程可以浓缩为:
下载 skill-creator ↓ 告诉 AI:初始化目录 ↓ 告诉 AI:编写 SKILL.md + references ↓ 告诉 AI:打包验证(自动校验 frontmatter、name、description、非法文件) ↓ 告诉 AI:git 提交并推送 ↓ 告诉 AI:迭代修改并推送从头到尾你没有手动执行过任何命令。只负责描述意图,AI 负责执行,这就是 Vibe Coding 的魅力。
十二、写在最后
Skill 体系的价值,不只是"把 Prompt 拆成文件"这么简单。它本质上是在解决一个更深层的问题:如何让 AI Agent 在复杂业务场景中,像资深工程师一样"知道什么时候该用什么能力"。
从 Prompt 工程到 Skill 工程,不是技术的升级,而是思维方式的升级,从"给模型喂更多知识"转向"让模型更聪明地选择知识"。
当你的团队开始规模化使用 AI Agent 时,Skill 体系就是那张"能力地图"。
学习资源推荐
如果你想更深入地学习大模型,以下是一些非常有价值的学习资源,这些资源将帮助你从不同角度学习大模型,提升你的实践能力。
一、全套AGI大模型学习路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!
因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示
因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取
三、AI大模型经典PDF籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。
因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取
四、AI大模型商业化落地方案
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。