工业级Skill开发:5步避坑指南
我踩过的坑是90%新手的必经之路——把Skill等同于"把所有要求堆进去的大段提示词"。但工业级Skill本质是可测试、可维护、可扩展的模块化Agent组件,它有严格的开发流程和工程规范,而不是一次性的prompt。
先纠正一个核心误区
错误认知:Skill = 超长提示词,把所有规则、流程、文档都塞进去
正确认知:Skill是一个有明确触发边界、分层执行逻辑、可量化评估标准的独立功能单元。它的核心是"什么时候做" > "怎么做",且必须通过工程化手段保证稳定性。
工业级Skill开发全流程(5+1步)
Step 0:先写Evals(评估先行,最重要的一步)
没有Evals的Skill就是半成品,改Skill就是盲改。Evals不是上线前的"测试一下",而是开发的起点,它定义了Skill的成功标准。
一个合格的Eval集必须覆盖3类用例(优先级:负例 > 边界 > 正例)
|
用例类型 |
测试目标 |
示例(PR审核Skill) |
|
正例(Positive) |
验证应该触发的场景能正确触发 |
"帮我盯着这个PR的CI"、"这个PR能不能合" |
|
负例(Negative) |
验证不该触发的场景绝对不触发(头号失败模式) |
"帮我格式化代码"、"写一个PR模板" |
|
边界用例(Edge) |
验证模糊场景下的路由正确性 |
"这个PR只改了一行日志,需要审吗" |
结合你提供的三层评估体系,完整的Eval测试维度
这正是Perplexity等顶尖公司的Skill评估标准,也是大厂MR必查项:
- Skill加载精度测试(最基础也最致命)
-
- 测什么:路由的精确率(precision)、召回率(recall)和禁止触发(forbidden)场景
- 怎么测:批量跑100+条真实用户查询,统计
load_skill()的调用正确率 - 验收标准:负例误触发率必须为0,正例召回率≥95%
- 渐进式加载测试(解决你1200行MD的问题)
-
- 测什么:Skill加载后是否只读取必要的附属文件,有没有冗余读取
- 怎么测:监控Agent的文件读取行为,验证只有满足条件时才加载对应references
- 验收标准:核心场景不读取非必要文件,异常场景能正确触发对应文档加载
- 端到端任务完成度测试
-
- 测什么:Skill最终能不能帮用户把事情做成
- 怎么测:全Agent循环执行 + LLM Judge按预设评分标准(rubric)自动打分
- 验收标准:核心场景成功率≥90%,无严重错误
额外要求
- 必须在所有支持的编排模型(GPT-4o、Claude 3.5 Sonnet等)上分别跑Eval,不同模型的路由行为差异极大
- 每次修改Skill都必须回归完整Eval集,防止一个改动搞坏已有的10个Skill
Step 1:写Description(最难的一行,决定80%的质量)
Description是路由触发器,不是文档。它的唯一目标是:在正确的时间加载Skill,且绝不误触发。
黄金法则
糟糕的description描述Skill做什么,好的description说用户什么时候会需要这个Skill。
正反示例对比(PR监控Skill)
错误写法(描述做什么):
这个Skill用于监控PR的CI状态,审核代码变更,检查是否符合合并条件,帮助工程师合并PR。
正确写法(描述触发时机):
Load when the user asks to babysit a PR, watch CI, make sure a PR lands, or check if a PR is ready to merge.
快速检查清单(必须全部满足)
- 严格以
Load when…开头 - 控制在50词以内,越短越精准
- 全部使用真实用户查询中的原话,不要自己发明说法
- 绝不总结工作流程,绝不提Skill内部实现
Step 2:写Body(执行逻辑:少教步骤,多讲规则)
跟LLM讲工作流程和跟人讲完全不同:模型已经知道99%的通用工具用法,你只需要告诉它那1%的特殊规则。
核心原则
- 跳过模型已经懂的部分
不要写:git log → git checkout main → git checkout -b clean-branch → git cherry-pick <commit>
要写:Cherry-pick the target commit onto a clean main branch. Resolve conflicts preserving the original intent. If it cannot land cleanly, explain the blocking issues. - 聚焦Gotchas和反例(最高信噪比的内容)
这是Skill的核心价值所在。每次Agent搞砸了,就把对应的坑加进去:
⚠️ Gotchas:
- Do not merge PRs with "WIP" in the title, even if CI passes
- Always tag the author if there are unresolved comments
- Skip unit test checks for documentation-only changes
- 用高层级指令代替细粒度步骤
太死板的指令比灵活的指令更脆弱。LLM擅长处理异常情况,给它目标和边界,而不是每一步该怎么走。 - 所有重内容和条件逻辑必须移出Skill.md
这正是1200行MD被打回的核心原因。把超过100字的文档、API说明、错误处理指南全部放到references/目录,条件触发才加载。
Step 3:用标准层级结构组织文件
工业级Skill必须是模块化的,而不是一个单文件。通用目录结构如下:
your-skill/
├── SKILL.md # 核心文件:description + 执行逻辑 + 依赖声明
├── scripts/ # 确定性逻辑(Python/Shell脚本),模型直接调用
├── references/ # 重型文档,条件触发读取
│ ├── api-docs.md
│ └── error-handling.md
├── assets/ # 输出模板,模型直接复制填充
│ └── pr-report-template.md
└── config.json # 首次运行配置,问一次永久保存
各目录设计意图
scripts/:把重复的、确定性的逻辑写成代码,避免模型每次重新发明轮子,大幅提高一致性和效率references/:实现渐进式加载,只有当需要时才读取对应文件,减少上下文浪费(比如只有API报错时才读error-handling.md)assets/:统一输出格式,减少模型在格式上的精力消耗config.json:避免重复询问用户相同的问题
复杂Skill的拆分
如果一个Skill超过300行,或者包含多个独立子功能,必须拆成一组小Skill,用depends:声明加载关系。比如"PR全流程Skill"可以拆成:
- pr-monitor.skill(监控CI)
- pr-review.skill(代码审核)
- pr-merge.skill(合并PR)
Step 4:基于Evals的迭代
- 切独立分支开发,不要在主分支上直接改
- 先在无Skill的状态下跑核心用户场景(hero query),建立基准线
- 每次修改只改一个点,改完立即跑完整Eval集
- 重点关注溢出效应:description的一个小词改动,可能会导致其他Skill的路由异常
- 提交MR时必须附带:
-
- 完整的Eval集运行结果
- 本次改动影响的用例列表
- 新增的Gotchas和反例
Step 5:灰度发布与监控
- 先给10%的内部用户灰度
- 实时监控三个核心指标:
-
- 路由准确率(误触发率)
- 任务完成率
- 平均响应时间
- 收集用户反馈,持续更新Eval集和Skill本身
- 全量发布后,保留一周的回滚能力
写好Skill的5条核心原则
- 评估先行:没有Evals就不要写Skill,Evals是Skill的一部分
- 边界优先:先定义"什么时候不做",再定义"做什么"
- 最小上下文:只给模型当前需要的信息,其他全部延迟加载
- 容错设计:假设模型会犯错,用Gotchas和Evals提前堵住坑
- 持续迭代:Skill不是写完就完事了,它会随着用户需求和模型升级不断进化
新手最容易犯的6个错误
- 把Skill写成大段提示词,所有内容都塞到SKILL.md里
- 先写Skill再写Evals,凭感觉改description
- description写得太泛,导致大量误触发
- 事无巨细地写步骤,限制了模型处理异常的能力
- 只在一个模型上测试,忽略了模型差异
- 不维护Evals,导致Skill越改越烂
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐




所有评论(0)