读一篇 AI 创作教程/案例,把它背后的"做法"还原成一张工序表,存成
workflow.json,再渲染成网页。
输入:任意一篇创作案例——公众号 / 小红书 / 推文 / 博客(正文 + 配图)、视频教程(带转写)。
输出:一个网页 outputs/case-{N}/case-{N}-<slug>.html。
wf-patch.py 改,绝不 write_file / edit_file 直接写它。Read→read_file · Write→write_file · Edit→edit_file · Bash→bash_commandbash_command 是 cmd.exe:一条命令一次调用,别用 ; 串(要串用 &&);mkdir 没有 -p 参数(带了会建出名为 -p 的目录),需要的目录工具会自动创建procedure-dsl/,读 spec 文件时补前缀(如 spec/README.md)goal 工具:focus 只认纯数字序号;报错只改成纯数字重试一次,别反复换写法第一阶段 · 搭骨架
通读原文 → 判断有几个工序、每工序几步 → 建干骨架
产物:workflow.json(只有结构 + type 标签;value / anchor / directive 全空)
第二阶段 · 填内容 + 归类
2.0 填 value/directive(@quote 拽原文)→ 连 anchor → verify-io 校验
2.1 归类:对照 2.1 内嵌的三张词表 → 填 effect / action / type / substance / form / intent
第三阶段 · 检查 + 渲染
lint-case.py 检查 → render-case.py 渲染 → 产出 HTML
这一阶段只做一件事:把原文抽象成干骨架——有几个工序、每工序几步、每步用什么工具、IO 的粗略 type 标签。
value / directive / anchor / action / effect / substance / form / intent 全部留到第二阶段,这里不碰。
Cyber 引擎:调 plan_procedures 工具把计划交上去,通过后自动生成 workflow.json 干骨架。
其他引擎:把计划写进 understanding.md,再用 wf-patch.py --create --patch 建骨架。
{
"source": {
"platform": "",
"author": "",
"date": "",
"url": "",
"title": "",
"excerpt": ""
},
"procedures": [
{
"id": "p1",
"name": "",
"purpose": "",
"category": "产物创造|资产建设|自动化|分析|学习",
"platform": "",
"author": "",
"declarations": {
"inputs": [{ "type": "", "name": "" }],
"resources": [],
"returns": { "type": "" }
},
"type_registry": {},
"steps": [
{
"id": "s1",
"kind": "step",
"via": "",
"inputs": [{ "type": "粗略标签" }],
"outputs": [{ "id": "s1o1", "type": "粗略标签" }]
}
]
}
]
}
| 字段 | 怎么填 | 别这样 |
|---|---|---|
id |
s1、s2;控制块子步用点号 s5.1 |
— |
kind |
普通步 step;控制块父 block / 子 nested |
— |
via |
工具标准名(nano_banana_pro、human);没点名用括号占位 (AI 生图工具);控制块写 - |
写一整句描述(那是 directive 的活,第二阶段填) |
IO type |
起个描述性标签即可,第二阶段再对词表 | 第一阶段就查词表、注册 type_registry |
输出 id |
工序内唯一,如 s2o1;第一阶段就要给好,供第二阶段 anchor 引用 |
等到第二阶段再给 |
命名约定:type 名用中文;工具品牌名用英文标准写法(seedream_4_5,不要写成 ByteDance-Seedream-4.5)。
判断单位是"一条完整的 输入→最终产物 链",不是原文段落结构。
以原文里每一张成品图(或明确写出的最终产物)为起点扫描,满足以下三条就算一条独立工序:
🔒 章节覆盖交叉核对:原文常按
01 | 02 | 03 |分章。逐章确认每个章节都落进了某个工序或步骤。"按成品图扫"最容易漏掉没有独立成品图的方法论章节——这种章节本身就是一条工序,不能跳过。Phase 3lint-case.py --source会把漏抽的章节抓出来。
步骤 = 对已有数据执行某个操作,产生一份之前不存在的新产物。
❌ 这些不是步骤,直接写进使用它的步骤的 inputs:
| 容易误识别为步骤的情况 | 正确处理 |
|---|---|
| 引入外部资源(用户手头已有的参考图、客户提供的产品图) | 写进使用它的步骤的 inputs;整个工序复用则写进 declarations.inputs |
| 直接给出的提示词(原文起点就是一段提示词,没有展示它是怎么写出来的) | 同上——写进使用它的步骤的 inputs 或 declarations.inputs;不拆成 via=human 的预处理步骤 |
| Prompt 多层展开(提示词有主题/人物/环境/风格等多层) | 这是"写提示词"这一步的 outputs[0].value 的内容;整段提示词是一步的一个输出 |
| 纯展示 / 预览(只展示了产物,没对它做任何变换) | 跳过,不拆成步骤 |
✅ 这些是步骤(产出了新产物):AI 工具生成图/视频、human 写提示词(参考图是 input 不是前置步)、后期工具调色排版。
「写提示词」步骤的判断口诀:原文有没有在教"怎么写/构造这段提示词"?有 → 才算一步;没有(原文直接给出提示词让你用)→ 提示词是输入,不是步骤产物。
判断口诀:把这"步"去掉,把它的内容挪进下一步的 inputs——如果什么都没丢,它不是步骤,它是输入。
plan_procedures 的内容)["提示词","参考图"] 两个输入,都要列上);对一批数据逐个重复的步骤加 loop(被遍历数据的短标签),骨架会自动展开成循环块+子步。0N 章节归哪个工序,每个章节都要被认领(包括没有独立成品图的方法论章节)。颗粒度示例:一步要写成"用豆包对〔题材思路〕生成〔剧本大纲+台词〕",而不是"写剧本"这种一个词。
计划通过后骨架即锁定——锁的是工序划分和步骤序列;在已有步骤里补输入/输出是允许且常见的(wf-patch 路径不存在默认 upsert)。发现工序/步骤划分本身不对时,修改计划重新调 plan_procedures 整体重生成,不要在骨架上手工增删步骤。
真实教程经常省略理所当然的中间产物。工艺上该有却没写出来的 IO,要主动补并标注推断原因:
{
"type": "参考图",
"anchor": "",
"inferred": true,
"inferred_reason": "原文只说'自己写动作',没提主角图;但写动作序列需要它当角色参考"
}
✅ 该补:工艺上必然需要的中间产物。
❌ 不用补:原文细节确实没写全(那是信息缺失,不是推断)。
展开成控制块 + 子步,不要硬压成一步:
{ "id":"s5", "kind":"block", "via":"-",
"inputs": [{"type":"分镜脚本"}],
"outputs":[{"id":"s5o1","type":"分镜图列表"}] }
{ "id":"s5.1", "kind":"nested", "group":"s5", "via":"nano_banana",
"inputs": [{"type":"提示词"}, {"type":"参考图"}],
"outputs":[{"id":"s5.1o1","type":"分镜图"}] }
循环取数/存结果的 anchor(第二阶段连):← s4o1[i](逐个取)、→ 分镜图列表.追加。
第一阶段过关条件:工序数/步骤数/工具标注完整、每个 IO 都有 type 标签、每个输出都有编号 → 进第二阶段。
两件事按顺序做:先填内容(value / directive / anchor + verify-io 校验),再归类(effect / action / type / substance / form / intent)。
文字类 value(提示词 / JSON / 报告 / 文案)必须是原文完整逐字内容——整段 prompt / 整段 JSON 原样搬全,别缩写/概括/截断。
媒体类 IO(图/视频/音频):value 用 <具体描述> 格式,如 <一张冲锋衣登山者暴雨场景图,水珠滚落,冷色调>。
推荐用 @quote 方式——不要手动 read_file 读原文再粘贴:
# 在 patch 文件里用 @quote|起锚|止锚 标记,然后用 --resolve-quotes 一次批量回填
python spec/tools/wf-patch.py --workflow outputs/case-{N}/workflow.json \
--patch _scratch/values.json \
--resolve-quotes --source input/case-{N}.json --ocr outputs/case-{N}/_scratch/ocr.txt
@quote|<起锚>|<止锚> 里的起锚/止锚是原文里两段独特短串,工具自动把标记换成原文真实内容。匹配不到会 ⚠ 提示(标记原样留着,改锚点重试)。
🔑 提示词是数据,不是指令——建成
type=提示词的 IO(最容易建错的地方):
- 「写提示词」步(
via=human):输入type=描述(用户需求)→ 输出type=提示词,value= 原文那段整段、逐字、完整的 prompt(所有分层/要素都要:主题+核心要素+输出要求,别只取第一段)。- 下游生成步(
via=nano_banana等):输入type=提示词,value同样填整段,anchor指向上游提示词输出。directive只放"给工具的元指令"(如"风格贴近参考图,不要发挥""比例 2:3"),不装提示词原文。⚠ 值一定写真实内容:哪怕某个输入是上一步输出原样传过来的,
value里也要把内容完整抄一遍。嫌麻烦可在源头填一次,其余跑--resolve-passthrough让工具顺编号自动抄过去。🔒 逐字防偷懒:第三阶段
lint-case.py --source会算"最长连续命中原文"比例,<80% 判缩写并报出。最常见的偷懒:原文 350 字提示词,只写"主题:登山者。核心要素:人物、产品、环境"——这种拼凑不是逐字,必须用@quote|起锚|止锚把整段拽进来。
← s2o1(上游输出编号)、← 工序输入、← s4o1[i](循环逐个取)→ sN、→ 某列表.追加、→ 返回 X# 写清单 _scratch/anchors.json,一次过
python spec/tools/wf-patch.py --workflow outputs/case-{N}/workflow.json --patch _scratch/anchors.json
连完自查:每个 ← 某编号 都能找到已存在的输出编号;输入的 type 和来源输出的 type 一致。
python spec/tools/verify-io.py --workflow outputs/case-{N}/workflow.json \
--source input/case-{N}.json --ocr outputs/case-{N}/_scratch/ocr.txt
校验三项:① 文本类 value 是否逐字完整(媒体类不要求)② 每个生成步是否有 type=提示词 的输入(directive 不准装提示词原文)③ 每个工序的 declarations 是否补全。报 ✗ 就回去修,重跑直到通过。
🔒 填 effect / action / type / extends 只能用下面三棵树里的词——它们是受控词表,wf-patch 当场把非法值打回(✗ 不是合法叶子)。三棵树已直接嵌在本节:effect 连边界判别 + 同义术语都给全了;action / type 给的是纯树(叶子清单)。默认对照这里填就够,不用额外 read_file。
📎 完整 json 全保留着,可选择性参考:action / type 的每个词在 spec/taxonomy/action.json / type.json 里还带 分类说明 + 同义术语——拿不准"某个词该归哪类、和邻近词怎么分"时,去 read_file 对应那一个 json 深读(effect 的说明已在下方全给,一般不用再查)。
substance / form 没有词表,不用查,直接提炼。
每步"处在什么工艺环节"对到下面 9 个标准叶子之一(工艺规约 / 预准备 / 预处理 / 主体生成 / 装配 / 后期 / 配套伴生 / 检验 / 交付)。必须命中;对不上说明第一阶段这步抽错了,回去改。❌ 别自己造词;别把"动作"当"作用"("反推"是动作不是作用)。
树形 制作 → 准备/加工/收尾阶段 → 叶子;每个叶子带边界判别 + 同义术语,拿不准照这个判:
制作:节点在整套 AIGC 内容生产工序链中所处的'工序阶段位置 + 作用'。本树回答的核心问题是:'这一步在整个制作流程的多个工序中,属于哪个阶段、起什么作用?'——只刻画该步骤的抽象工序角色(前置 / 主体 / 装配 / 修饰 / 验收等),不涉及该步骤具体使用了什么领域技法、产出了什么具体形态的资产。所有'提示词 / 控制图 / 调色 / 光影 / 多视图 / 字幕'这类领域技法 / 输出形态名词都不应作为叶子节点,它们应作为对应阶段叶子的同义术语被规范化。 【L1 唯一性】本树只覆盖'制作'——把蓝图实际造出来的所有工序。前置的选题决策、蓝图设计不在本树范围内。 【L2 切分维度】按工序在产线上的'阶段位置'切分,作为'目录'帮助快速定位:准备阶段(在主体生产之前的准备性活动)/ 加工阶段(生产主体并对主体做加工与组合)/ 收尾阶段(主体已成型之后的整饰、伴生、验收、交付)。L2 本身只承担目录定位,不作为 roles[] 取值。 【L3 切分维度】每个 L2 内按'抽象工序阶段'切分。L3 节点直接作为 roles[] 字段的规范取值——名称必须是抽象工序角色(如'预处理 / 主体生成 / 装配 / 后期'),不允许携带领域技法词(如'调色 / 光影 / 提示词 / 多视图')。领域技法 / 具体输出形态名词全部下放到 L3 的'同义术语'段做规范化。
目录定位:主体生产之前的所有准备性活动——尚未产出本批主干件,只是为主干件的产出建立长效规则、备齐原料、把原料加工成工具能用的输入。判别口诀:把这一步抽掉,影响的是'下一步缺规则 / 缺原料 / 缺可用输入',不是'下一步缺主干件'。
目录定位:本批主干件的成型与组合活动——从输入产出本批主干件、把多件主干件组合成复合件。判别口诀:本阶段是产线的核心环节,本批作品的实体形态在这里被造出来或被结构性组合。注:对单件主干做内容层局部修整(增 / 删 / 替换 / 重述 等动作)由动作树的'修改'L1 承担,不作为本树独立的阶段角色——它可以在主体生成与装配之间反复发生 0~N 次,但不构成独立的阶段位置。
目录定位:本批主体已成型 / 已装配之后的整饰、伴生、验收、交付活动——产物不再被结构性改造,只对其呈现层做整饰、为其配套伴生信息、对其做最终审查、把其推向终态对外交付。判别口诀:把这一步抽掉,影响的不是'是否有主体 / 是否成型',而是'主体是否已'整饰到位 + 配套到位 + 验收到位 + 推到终态'。
对到下面这棵树的某节点(填叶子名或 根/…/叶 全路径,如 解构 或 提取/化学提取/解构)。❌ 别自己造动词。拿不准某词归哪类,查 spec/taxonomy/action.json 的 分类说明。
⚠ 反推 vs 解构:从文字/教程里提炼框架、步骤、要点 → 解构(信息在原文里显式可见);从图片推回生成它所用的 prompt、或推断其隐含结构(depth map / 风格参数等)→ 反推(信息在原图里不可直接看到)。"梳理教程结构""分析原文框架""提取风格要素"几乎都是 解构,不是 反推。
获取
搜索
检索
下载
查询
调取
录入
上传
拍摄
录音
键入
引用
选取
提取
物理提取
裁切
抠取
抽帧
化学提取
识别
反推
解构
生成
元素生成
关系生成
数组生成
结构生成
修改
增
添加
叠加
删
抹除
剪除
变
重述
风格化
转换
替换
调整
增强
存储
暂存
缓存
沉淀
入库
归档
存档
type_registry 里登记:"主角图": {"extends": "参考图", "desc": "本案例的女主肖像"}。自查:每个类型要么是标准叶子、要么在 type_registry 里有挂靠 + 说明。不允许写个自造词却不登记(lint-case.py 会抓出来)。
程序控制类型
指令
提示词
负向提示词
描述
参数
生成参数
规格参数
模型权重
评估
评分
评语
流程
工作流
批处理
数据复用类型
原子
数字人
版式
序列
模板
内容类型
素材
化学变化
参考图
参考视频
参考音频
对标内容
分镜图
转场
蒙版
控制图
运动轨迹
滤镜
构图布局
物理变化
截图
视频片段
转场片段
关键帧
音效
特效
半成品
序列
大纲
脚本
分镜脚本
剪辑脚本
配音文案
原子
底图
样图
分镜视频
组合
图层组合
拼图
准成品
歌词
配音
BGM
字幕
标题
正文
成品
成品图
视频成品
合成图
知识类型
知识库
这两个字段只描述最终产物画面内容的视觉维度,与步骤处理的是什么类型的数据无关。从核心要回答这个方法,未来可以用在哪些内容领域。
实质(substance):画面里有什么——这步的方法或产物所针对的视觉内容主体。如:美女、草原等。
风格、视觉风格、氛围 描述的是"长什么样",不是"有什么",属于形式而非实质提示词、描述、框架 是步骤处理的信息类型,不是画面主体形式(form):画面长什么样——视觉风格与审美调性。填风格词,如 超现实主义、古风、氛围感。
JSON、表格、列表 是技术格式,不是视觉风格没有特别涉及的直接设 null——不要为了填而填。多个主体/风格都重要时用顿号并列:小孩、围巾。
起手先判断作者意图:这篇讲的是可复用的通用方法,还是记录一次操作的具体案例?
人物,专讲产品的填 产品,专讲风景的填 风景;方法确实没有题材限制时,填比 图片 更具体的大类,如 实拍图、、信息排版图 等。形式:方法有明确风格倾向则填,否则 null。人物、场景),形式填案例的具体视觉风格(如 超现实主义)。判断依据:文章有无"这个方法可以用于……""换个题材也能套""任何图片都能跑"这类泛化表述?有 → 通用方法;没有 → 具体案例。判断不清时偏具体案例方向。
常见错误速查
| 错误填法 | 为什么错 | 正确填法 |
|---|---|---|
substance=风格 |
风格描述"长什么样",是形式不是实质 | form=超现实主义,substance=实际主体或 null |
substance=提示词 / 描述 / 框架 |
这是数据类型,不是画面主体 | substance=null |
form=JSON结构 |
技术格式不是视觉风格 | form=null |
null 的设置方式:--set 'p1.s1.form=__null__'
每步一句话概括,≤25 字,跨步骤一起看(为了让每行各有侧重)。
写法:
→、: 这种符号串)。{类别:值} 标出来。能用的类别只有 5 个:{effect:}、{via:}、{act:}、{in-type:}、{out-type:}。类型必须带 in-/out- 前缀。例子:
{via:human} {act:解构} {in-type:教程原文},得到 {out-type:提示词框架}{in-type:参考图} 和上一张 {in-type:分镜图} 为参考,{via:manus} {act:元素生成} 当前 {out-type:分镜图}{via:manus} {act:反推} {in-type:参考图},得到 {out-type:提示词}(从图推回 prompt 才是反推){act:反推}: {in-type:视频} → {out-type:提示词}(写成了公式)🔒 词表已内嵌在上方,直接对照填即可,不需要额外 read_file 任何 taxonomy json。
python spec/tools/wf-patch.py --workflow outputs/case-N/workflow.json \
--set 'p1.s1.effect=主体生成' \
--set 'p1.s1.action=生成/元素生成' \
--set 'p1.s1.inputs[0].type=参考图' \
--set 'p1.s1.substance=图片' \
--set 'p1.s1.form=__null__' \
--set 'p1.s1.intent=用 {via:豆包} {act:元素生成} {in-type:提示词},得到 {out-type:生成图}' \
--set 'p1.type_registry.主角图.extends=参考图' \
--set 'p1.type_registry.主角图.desc=本案例的女主肖像'
第二阶段过关条件:每步的作用/动作都命中标准词、每个类型要么命中词表要么登记了挂靠、每步的 substance/form 都已处理(填值或显式设 null)、每步都有 intent → 进第三阶段。
# lint 带 --source 才会跑「章节覆盖」+「value 逐字」两条强制
python spec/tools/lint-case.py --workflow outputs/case-N/workflow.json --case-id N \
--source input/case-N.json --ocr outputs/case-N/_scratch/ocr.txt
python spec/tools/render-case.py --workflow outputs/case-N/workflow.json \
--source-input input/case-N-raw.json --page-title "Case N · 主题" --case-id N \
--out outputs/case-N/case-N-<slug>.html
| 检查 | 规则 | 反面例子 |
|---|---|---|
| 输出编号唯一 | 每个输出都有编号,工序内不重复 | 两个输出都叫 s2o1 |
| 数据流连得上 | 每个 ← 某编号 都能找到已存在的输出编号 |
引用了 ← s2o9 但根本没有这个编号 |
| 类型对得上 | 输入的 type 和来源输出的 type 一致 | 输入写 分镜图 但来源输出是 参考图 |
| "值"写真内容 | 文字写全文;图片视频用 <整段描述>;不写 ← sN 引用 |
值 = ← s1o1 |
| 作用/动作命中词表 | 作用是 9 个标准词之一;动作是动作词表里的路径 | 作用写成"开端"(词表里没有) |
| 类型命中词表或挂靠 | 类型是词表里的词,或自造但在 type_registry 里写了"算作"哪个标准词 |
类型写"小品"却没说挂靠 视频成品 |
| 自造类型登记齐全 | lint-case.py 提示"类型完整性 N 个问题"说明有自造类型没登记 → 补 |
type='主角图' 但没在 type_registry 登记 |
| 章节全覆盖 | 原文每个 0N 章节都对应到某工序/步骤;lint 报漏抽 → 回 Phase 1 补工序 |
原文"02 结构化框架"整章没抽 |
| 文本 value 逐字 | 文本类 value 是原文一整段连续文本;lint 报"疑似缩写" → 回 Phase 2 用 @quote 重填 |
350 字提示词被写成"主题:…。核心要素:人物、产品" |
| 目的列规范 | ≤25 字一句话;5 个合法标记类别;别写成公式 | {act:反推}: {in-type:视频} → {out-type:提示词} |