SKILL 拆解

SKILL拆解: 小黑怪诞正文配图

2026-07-245 min readSKILL工程化

c2

小黑怪诞正文配图 是最近一个很火的技能,能为文章配上精致的图。本篇文章我们就分析这个。

小黑怪诞正文配图

SKILL 拆解

前言

内容较多,比较抽象,为了让大家印象更加深刻,直接用开发者听的懂的方式先说清楚,如果理解了再往下看。

映射关系

注意这里只是举例,类比,不要钻牛角尖。

SKILL.md 模块映射代码位置代码实现作用/逻辑
name函数名 (def <name>)标识函数的唯一标识符,便于 Agent/LLM 调用或框架路由。
description函数文档注词 (Docstring)提供给 LLM 或开发者的使用场景描述,作为 Tool Calling 的 Prompt 依据。
技能参考工具注入 / 依赖初始化声明该函数执行时需要的外部工具(如数据库、API、中间件等)。
工作流函数体核心代码 (Function Body)将自然语言描述的步骤转化为顺序/条件执行的具体业务逻辑。
输出口径返回值/格式化输出 (return)对最终产生的数据结构做 Response 约束与清洗输出。

好了,如果到这里你大家有自己的想法了。我们再看下面就会很简单了。我们带着要写一个好的函数的目的,去看下面内容,就比较容易了。

一、从 SKILL.md 文件中能学到什么

1.1 在 Frontmatter 中写清楚 description

description 不是普通的功能介绍,而是 Skill 的触发条件。

系统需要根据用户当前的请求,判断是否应该加载这个 Skill。因此,description 不能只写一句抽象描述:

yaml
1description: 用于生成文章配图。

这种描述存在两个问题:

  • 能力边界太宽;
  • 用户换一种说法后,可能无法正确触发。

参考 Skill 的 description 同时描述了任务对象、使用场景和常见触发词:

yaml
1--- 2name: ian-xiaohei-illustrations 3description: > 4 生成 Ian 风格的中文正文配图。 5 用于用户要求为中文文章、帖子、博客、Notion 文档、 6 工作流文档、方法论、流程、结构、状态、隐喻或观点生成 7 “怪诞”“小黑”“手绘”“正文配图”“文章插图” 8 “配图建议”“shot list”“去标题”“改图”等任务。 9---

这里值得学习的不是具体内容,而是 description 的组织方式。

一个可用的 description 应该包含:

text
1任务对象 2+ 核心能力 3+ 使用场景 4+ 用户可能使用的触发词 5+ 必要的能力边界

例如,用户可能不会准确地说“生成正文配图”,而是会说:

  • 给文章加两张图;
  • 分析哪些地方需要配图;
  • 生成一个 shot list;
  • 把这段流程画出来;
  • 去掉图片里的标题;
  • 修改刚才生成的图。

这些表达在业务上属于同一个 Skill,但在关键词层面并不相同。

因此,description 需要覆盖真实的用户表达,而不是只写一个标准功能名称。

从开发角度看,可以把 description 理解成路由匹配规则:

text
1用户输入 23description 语义匹配 45决定是否加载 Skill

description 写得越模糊,路由就越不稳定。

但触发词也不能无限堆积。应该优先覆盖:

  • 高频动作;
  • 核心任务对象;
  • 常见别名;
  • 典型修改操作;
  • 容易与其他 Skill 混淆的表达。

1.2 SKILL.md 的目录结构必须清晰

SKILL.md 是执行入口,不应该写成一篇没有边界的长文。

常见问题是不断增加标题:

markdown
1## 注意事项 2 3## 特殊说明 4 5## 额外要求 6 7## 重要原则 8 9## 一些建议 10 11## 其他情况

这些标题看起来是在分类,实际上没有稳定的职责边界。随着规则增加,同一条约束可能同时出现在多个章节中,后续很难维护。

参考 Skill 使用了比较克制的主体结构:

markdown
1# Skill 名称 2 3## 核心定位 4 5## 先读这些参考 6 7## 工作流 8 9### 1. 消化正文 10 11### 2. 先出配图策略 12 13### 3. 单张生成 14 15### 4. 检查与迭代 16 17### 5. 保存交付 18 19## 输出口径

从开发角度,可以把它进一步抽象为:

markdown
1# 技能名称 2 3## 核心定位 4 5## 技能参考 6 7## 工作流 8 9### 1. 作业步骤 10 11### 2. 作业步骤 12 13### 3. 检查作业 14 15### 4. 保存交付 16 17## 输出口径

每一级标题都有明确职责。

一级标题:技能名称

一级标题只用于说明当前 Skill 是什么。

一个 SKILL.md 只保留一个一级标题,不要使用多个一级标题拆分内容。

markdown
1# 中文文章正文配图

二级标题:Skill 的固定组成部分

二级标题用于划分 Skill 的核心模块:

markdown
1## 核心定位 2 3## 技能参考 4 5## 工作流 6 7## 输出口径

不要为每条规则单独创建二级标题。

二级标题太多通常意味着职责没有归类,或者主文件承担了过多细节。

三级标题:工作流步骤

三级标题主要用于描述工作流中的具体步骤:

markdown
1## 工作流 2 3### 1. 读取输入 4 5### 2. 生成方案 6 7### 3. 执行任务 8 9### 4. 检查结果 10 11### 5. 保存交付

这种写法有几个好处:

  • 执行顺序明确;
  • 可以快速定位任务失败在哪一步;
  • 后续可以在中间插入新步骤;
  • 每个步骤都可以定义输入和输出;
  • 更容易转换为脚本或者 Agent 工作流。

标题层级本质上是在表达程序结构。

如果把整个 Skill 看成一个函数,那么二级标题对应主要模块,三级标题对应顺序执行的步骤。

1.3 提示词和参考规则不要全部放进 SKILL.md

参考 Skill 没有把风格、角色、构图、提示词和检查规则全部写在入口文件中,而是拆分到了 references 目录:

text
1references/ 2├── style-dna.md 3├── xiaohei-ip.md 4├── composition-patterns.md 5├── prompt-template.md 6└── qa-checklist.md

每个文件只承担一种职责:

文件职责
style-dna.md描述视觉风格和颜色规则
xiaohei-ip.md描述角色形象和行为约束
composition-patterns.md描述构图模式和隐喻生成方法
prompt-template.md描述单次生成使用的提示词模板
qa-checklist.md描述检查项和失败后的修复方式

这种结构符合单一职责原则。

如果所有规则都写进 SKILL.md,后续通常会出现几个问题:

  • 主文件越来越长;
  • 相同规则重复出现;
  • 修改风格时可能影响工作流;
  • 修改检查规则时需要在多个位置同步;
  • 每次执行都加载大量无关上下文;
  • 很难判断某条规则属于哪个环节。

更合理的方式是让 SKILL.md 负责编排,让 references 负责提供领域知识。

text
1SKILL.md 2负责:什么时候读、先读什么、读完后做什么 3 4references 5负责:具体规则、模板、标准和检查项

这和代码中的模块化设计非常接近:

text
1入口文件负责调用 2业务模块负责实现 3配置文件负责规则 4测试模块负责验证

需要注意的是,拆文件并不是越多越好。

判断是否需要拆分,可以看三个条件:

  1. 这组内容是否具有独立职责;
  2. 这组内容是否会独立变化;
  3. 这组内容是否只在部分流程中使用。

如果三个条件都不成立,就没有必要为了目录好看而拆文件。

二、工作流应该如何组织

Skill 的核心不是参考资料,而是工作流。

参考 Skill 的工作流包含三类步骤:

text
1作业流程 2检查作业 3保存交付

这三部分缺一不可。

2.1 作业流程:描述任务如何执行

作业流程负责把用户请求转换成最终产物。

参考 Skill 没有直接从正文跳到图片,而是经过多个步骤:

text
1读取正文 23提取认知锚点 45决定哪些内容需要配图 67生成配图策略 89调用图片生成工具

从开发角度看,这里最重要的是每个步骤都有相对明确的输入和输出。

例如:

text
1步骤:消化正文 2 3输入: 4- 用户提供的正文 5- Markdown 文件 6- 页面链接 7- 内容截图 8 9处理: 10- 提取核心观点 11- 识别认知转折 12- 判断哪些内容适合用图表达 13 14输出: 15- 候选认知锚点

下一步不再直接面对整篇原始正文,而是消费上一步产生的结构化结果。

这种方式比“一次性完成所有任务”更稳定,因为每一步只处理一个问题。

编写工作流时,应该尽量回答:

  • 当前步骤读取什么;
  • 当前步骤要做什么判断;
  • 当前步骤产生什么结果;
  • 下一步依赖当前步骤的什么输出;
  • 哪些情况下需要进入不同分支。

如果一个步骤只有“认真分析”“深入思考”“确保高质量”这样的描述,它通常还不能执行。

2.2 检查作业:结果必须能够被检查

很多 Skill 只有执行流程,没有检查流程。

任务执行完成后,只要求模型“确保结果符合要求”。这种检查没有明确标准,也不会触发修复动作。

参考 Skill 将检查规则放在独立的 qa-checklist.md 中,检查内容包括:

  • 图片比例是否正确;
  • 背景是否符合要求;
  • 角色是否承担核心动作;
  • 画面是否过于复杂;
  • 是否只表达一个核心结构;
  • 中文标注是否过多;
  • 是否错误使用颜色;
  • 是否过于接近 PPT;
  • 是否复刻历史案例。

这些检查项具备一个共同特点:能够观察。

例如:

text
1无效检查: 2- 图片是否足够高级 3- 图片是否很有创意 4- 图片是否符合审美 5 6有效检查: 7- 主体是否超过画面约 60% 8- 中文标注是否超过规定数量 9- 左上角是否出现类型标题 10- 角色是否参与核心动作 11- 是否出现复杂背景、渐变或阴影

可观察的检查项,才有可能形成稳定的判断。

除此之外,检查作业还需要定义失败后的处理方式:

text
1太复杂 2→ 删除次要节点,只保留一个核心动作 3 4太像 PPT 5→ 删除标题、边框、网格和多余箭头 6 7角色只是装饰 8→ 重新设计动作,让角色参与核心流程 9 10文字错误过多 11→ 减少标注数量并重新生成

因此,完整的检查流程应该是:

text
1执行完成 23按照检查清单验证 45发现失败项 67执行对应修复动作 89再次检查 1011通过后进入交付

这和软件开发中的测试流程非常接近:

text
1实现 2→ 测试 3→ 发现失败 4→ 修复 5→ 回归测试

没有检查能力的 Skill,只能生成结果;具备检查和修复能力的 Skill,才有机会稳定交付结果。

2.3 保存交付:执行结果必须有记录

任务通过检查以后,还需要进入保存交付阶段。

参考 Skill 规定了具体保存目录:

text
1assets/<article-slug>-illustrations/

并规定了文件命名方式:

text
101-topic-name.png 202-topic-name.png

同时明确:

  • 不要把多张图片拼成一张;
  • 保留原始生成文件;
  • 默认不要覆盖已有文件;
  • 最终返回生成数量、用途和保存位置。

从开发角度看,这一步解决的是结果可追踪问题。

如果 Skill 只在对话中说“已经完成”,但没有明确保存路径、文件名称和执行记录,那么用户很难判断:

  • 最终产物在哪里;
  • 哪个文件对应哪个任务;
  • 是否覆盖了旧文件;
  • 哪些结果已经完成;
  • 下次执行应该从哪里继续。

因此,保存交付至少应记录:

text
1产物是什么 2保存在哪里 3使用什么命名 4是否覆盖旧产物 5本次完成了哪些内容 6是否存在失败或可选结果

对于涉及文件、外部系统或多步骤任务的 Skill,还应该考虑幂等性。

同一个请求重复执行时,应该明确:

  • 复用已有结果;
  • 创建新版本;
  • 跳过已经完成的步骤;
  • 还是覆盖原有产物。

如果没有这类规则,Skill 每执行一次,就可能产生一批重复文件或重复记录。

三、输出口径是 Skill 的返回协议

## 输出口径 描述的不是内容风格,而是 Skill 完成任务后应该向用户返回什么。

参考 Skill 要求最终说明:

  • 生成了几张图;
  • 每张图有什么用途;
  • 文件保存在哪里;
  • 哪些结果最稳定;
  • 哪些结果属于可选方案。

这相当于一个函数的返回值定义。

如果工作流只定义了内部执行过程,却没有规定最终返回内容,就容易出现两种结果:

  • 返回大量执行细节,用户找不到最终产物;
  • 只返回“已经完成”,用户不知道具体完成了什么。

一个清晰的输出口径通常包括:

text
1执行结果 2产物数量 3产物用途 4保存位置 5异常情况 6后续可选动作

输出口径应该短而稳定,不需要重复解释整个工作流。

例如:

markdown
1## 输出口径 2 3任务完成后,返回: 4 5- 本次生成的文件数量; 6- 每个文件对应的用途; 7- 文件保存路径; 8- 未通过检查或需要人工确认的内容。 9 10不要重复输出完整提示词,不要长篇解释内部执行过程。

这样无论 Skill 内部执行了多少步骤,最终都会通过统一格式交付结果。

四、references 设计

references 就相当于我们在开发过程中,能使用的工具。所以函数写的好不好,references 里面写的质量也很重要。看了下面几个文件。我们应该都能总结出来的优点是。

4.1 明确输入输出和标准

  1. 要什么
  2. 不要什么
  3. 判断标准是什么

style-dna.md xiaohei-ip.md

4.2 职责清晰

如果你是开发者,应该都了解领域驱动,领域驱动其实换句话说就是单一职责。责任划分清楚分配到人。方便替换。(有点不对劲,感觉怪怪的)

style-dna.md xiaohei-ip.md

4.3 标准化

我们在 SKILL.md 里面看到有这么一行

将抽象的东西,有转换成标准的通用的生图提示词。

4.4 质量可被执行

qa-checklist.md qa-checklist.md:让质量要求可以执行

4.4.1 必过项 & 失败项

text
1例如: 2 3是否为 16:9; 4是否为白色背景; 5主体是否超过约 60%; 6中文标注是否过多; 7左上角是否出现标题; 8是否存在复杂背景; 9是否使用了过多节点和箭头。

这些检查项能够得到相对明确的结果。相比之下,“是否专业”“是否高级”很难直接执行。

可以学习的是:

QA 尽量检查可观察结果,不检查抽象感受。

4.4.2 修复标准

它没有在发现失败后直接统一“重新生成”,而是区分:

text
1太普通 2→ 增加隐喻,让角色参与核心动作 3 4太复杂 5→ 删除节点和标注 6 7太可爱 8→ 调整角色气质 9 10太像 PPT 11→ 删除标题、网格、边框和多余箭头 12 13文字错误 14→ 局部编辑,严重时减少文字后重生成

4.5 可以直接提炼的 references 设计原则

以后设计 references,可以使用下面这套判断:

text
1全局必须一致的规则 2→ 独立规范文件 3 4核心对象的属性和行为 5→ 独立领域模型文件 6 7需要根据场景选择的方案 8→ 独立策略文件 9 10提交给外部工具的请求 11→ 独立模板文件 12 13结果是否合格 14→ 独立 QA 文件
文件类型应回答的问题
规范最终结果必须满足什么
领域模型核心对象是什么、能做什么、不能做什么
策略不同场景应该选择哪种处理方式
模板如何把任务参数转换成工具输入
QA如何检查、失败后如何修复

五、总结

前言部分比较清晰,如果你有开发经验,看到 SKILL.md 与函数结构的映射关系,基本一眼就能明白。

正文读起来会稍显枯燥,因为大部分内容都在分析具体规则和实现细节。这些细节有些可以复用,有些只适用于当前的配图场景。我们不需要照搬所有内容,重点是理解它的设计思路。

从整体来看,这个 Skill 的职责划分、目录结构、工作流和交付标准都很清晰,值得单独用一篇文章进行拆解。

这只是单个 Skill 的分析。后面会继续提高难度,开始研究工具组,以及多个 Skill 之间如何分工、传递上下文和协同完成任务。