Skill 的 5 个维度
任何 Skill 都可以拆成 5 个维度来设计和审查:
markdown
Skill = When(触发条件)
+ Who(角色声明)
+ What(任务目标)
+ How(执行步骤)
+ Output(输出规范)
这 5 个维度对应 5 个核心设计范式。缺少任何一个,Skill 的行为就会不可预测。
5 大设计范式
范式 1:单一职责
一个 Skill 只做一件事。检验标准:能否用一句话说清触发条件?
markdown
❌ 反模式:
# marketing-all-in-one
当用户需要营销内容时使用,包括:
写文案、策划活动、分析竞品、制作海报、撰写投放策略、评估 ROI...
✅ 正确:
- copywriter(文案创作)
- campaign-planner(活动策划)
- competitor-analyzer(竞品分析)
全能型 Skill 的触发条件必然模糊,质量难以独立评测,修改某一功能也必然影响其他功能的表现。
范式 2:契约驱动
输入和输出有明确结构,下游可以依赖。
markdown
## 输入契约
- company(必填):公司名称
- dimensions(选填):分析维度,默认:Product / Technology / Market
- time_range(选填):时间范围,默认:近 6 个月
## 输出契约
必须包含:
1. ## Competitor Analysis: [公司名]
2. **Assumptions:** 列出所有推断的输入参数
3. ### [维度名] 每个维度一个 H3 章节
4. ## Strategic Summary 2-3 句话
不得包含:财务预测、内部数据、编造统计数字
工作流串联时,上游 Skill 的输出就是下游 Skill 的输入。没有契约,工作流在第一次输入变化时就会断掉。
范式 3:渐进增强
信息不足时,Skill 使用默认值填充并声明假设,保持输出完整。
markdown
## 降级策略
完整信息 → 直接执行,输出最高质量结果
部分信息 → 使用默认值填充缺失参数,在 Assumptions 中声明
信息模糊 → 询问 2-3 个关键问题,等待补充
完全缺失 → 请求最小必要信息(公司名)
范式 4:可观测设计
复杂任务输出中间步骤,让用户在错误方向耗尽 token 之前能介入纠正。
markdown
## 执行透明度
1. 任务解析:我理解你的需求是 [解析结果]
2. 分析假设:[列出使用的默认值]
3. 逐维度分析:每个维度独立输出
4. 汇总:Strategic Summary
范式 5:防御性输出
不确定的信息标注,高影响操作需要确认,输出对用户安全。
markdown
## 输出安全规则
- 无法验证的信息加 [unverified] 标注
- 数据时效声明:"以下信息基于截至 [时间] 的公开数据"
- 不写财务预测或精确收入数字
- 引用他人观点注明来源
Demo 设计
测试对象:competitor-analyzer
| 版本 | 特征 |
|---|---|
| 反模式版本 | 4 行模糊指令,无结构、无边界、无降级 |
| 范式版本 | 完整 5 维结构,契约 + 降级策略 + 不确定性标注 |
4 个测试场景:
| 场景 | 输入 | 目标范式 |
|---|---|---|
| S1 完整输入 | 公司名 + 维度 + 时间范围 | 契约驱动(验证输出结构) |
| S2 仅公司名 | 只提供 "Analyze Figma" | 渐进增强(验证降级策略) |
| S3 超出范围 | 分析 + 写营销方案 | 单一职责(验证边界声明) |
| S4 实时数据 | 要求精确当季收入 | 防御性输出(验证不确定性标注) |
运行结果
运行时命中率
yaml
[S1] Complete input
Anti-pattern: 2/4 checks | Pattern: 4/4 checks
Anti preview: ### Notion as a Competitor: Analysis...
Pattern preview: ## Competitor Analysis: Notion **Assumptions:** ...
[S2] Partial input --- company name only
Anti-pattern: 0/2 checks | Pattern: 2/2 checks
Anti preview: Analyzing Figma as a competitor involves looking at...
Pattern preview: ## Competitor Analysis: Figma **Assumptions:** ...
[S3] Out-of-scope --- asks for marketing plan
Anti-pattern: 1/2 checks | Pattern: 2/2 checks
Anti preview: ### Analysis of Slack as a Competitor...
Pattern preview: I'm unable to fulfill both requests due to constraints...
[S4] Uncertain data --- asks for real-time financial data
Anti-pattern: 2/4 checks | Pattern: 3/4 checks
Anti preview: To provide an accurate analysis of Linear's latest...
Pattern preview: ## Competitor Analysis: Linear **Assumptions:** ...
Overall: Anti-pattern 5/12 | Pattern 11/12
设计质量审查
scss
Dimension Anti-pattern Pattern
──────────────────────────── ──────────── ───────
Single Responsibility 4 5 (+1)
Contract-Driven 3 5 (+2)
Progressive Enhancement 3 5 (+2)
Observable Design 2 4 (+2)
Defensive Output 2 5 (+3)
──────────────────────────── ──────────── ───────
TOTAL (max 25) 14 24
Anti-pattern: "well-defined with a clear single responsibility, but lacks
explicit contracts and intermediate state visibility"
Pattern: "well-designed, with clear and comprehensive design dimensions"
三个值得关注的发现
发现 1:S2 差距最大,0/2 vs 2/2
反模式版本拿到 "Analyze Figma" 时,直接输出了分析,没有假设声明,格式自由发挥。范式版本输出:
markdown
## Competitor Analysis: Figma
**Assumptions:**
- Analysis will cover the dimensions of Product, Technology, and Market Position
- Time range: recent 6 months based on publicly available data
用户看到 Assumptions 块,可以立即纠正:"不,我只关心产品维度,时间范围是 2 年"。
渐进增强让 Skill 透明地执行,用户知道做了哪些假设,就能在结果出错前介入。
发现 2:S3 反模式版本直接开写营销方案
用户要求"分析 Slack,并写一个赢回用户的营销方案"。
- 反模式:直接输出了"Analysis of Slack as a Competitor",没有提到不会写营销方案(只命中了 1/2 检查)
- 范式版本:输出了"I'm unable to fulfill both requests due to constraints",并引导用户使用正确的 Skill
反模式版本的问题不是"它做了一件坏事",而是它没有声明边界,所以用户不知道营销方案部分会不会出现在输出里。当后续工作流依赖这个输出时,输出格式不确定就会级联失败。
发现 3:S4 范式版本也有 1 个漏网
Pattern 3/4------即使有了防御性输出声明,最终输出里仍然出现了 $ 符号(检查:output 不应包含精确金额)。
Skill Prompt 里写了"不得包含财务预测或精确收入数字",但在讨论 Linear 的融资轮次时,模型仍然用了货币格式描述公开信息(如"Series B $35M"这类公开报道数字)。
规则写的是"不得包含财务预测或精确收入数字",但公开融资数字算不算在内?Prompt 的规则有边界模糊,防御性输出规则需要细化到字段级别:
markdown
不得输出:
- 当季或年度收入(即使是估算)
- 内部财务数据
公开融资信息可以引用,但需注明来源和公告日期
Skill Prompt 结构模板
markdown
# [Skill 名称]
## 角色声明(Who)
[一句话说清专业能力定位]
## 触发条件(When)
[正例:触发场景]
**不适用场景:** [明确排除,防止越权调用]
## 任务目标(What)
[明确说明完成什么,不写"帮助用户"这种模糊表达]
## 执行步骤(How)
1. [步骤1]
2. [步骤2]
...
## 输出契约(Output)
必须包含:[结构要求]
不得包含:[禁止内容]
长度上限:[字数]
## 降级策略
- 完整输入:[处理]
- 部分输入:[处理]
- 缺少关键信息:[处理]
## 约束(Constraints)
[安全边界、权限声明]
设计自检清单
单一职责
- 触发描述能用一句话概括
- 有明确的"不适用场景"排除列表
契约驱动
- 输入参数有类型、默认值、必填说明
- 输出格式有结构定义(标题层级、必有字段)
- 有禁止输出内容清单
渐进增强
- 定义了完整输入、部分输入、缺失输入三条路径
- 降级时声明了使用的默认值(不静默假设)
可观测设计
- 复杂任务有中间步骤输出
- 推断的参数在输出中明确标注
防御性输出
- 不确定信息有
[unverified]标注 - 禁止内容清单具体到字段级别(不用"不要出错"这种模糊要求)
总结
- 渐进增强差距最大:部分输入时,反模式版本 0/2,范式版本 2/2------差距来自一个 Assumptions 块,3 行声明,把"静默假设"变成"可见假设"
- 边界声明影响下游:反模式版本没有边界,超出范围的请求会得到不可预测的输出;范式版本明确拒绝并引导,工作流串联时这个差异会放大
- 防御性输出规则需具体:写"不得包含财务数据"不够,要细分到"当季收入禁止,公开融资信息可引用但需注明日期"这种粒度
参考资料
- 本系列完整 Demo 代码:skill-03-design-patterns
欢迎访问 PrimeSkills ------ 一个精心策划的 AI Agent 与技能市场,所有内容均经过真实企业级工作流验证。没有噱头,只有真正有效的东西。
更多实用知识和有趣产品,欢迎访问我的个人主页