Просмотр исходного кода

feat(mode_workflow): 脚手架与 prompt/内容树资产同步

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
刘文武 5 дней назад
Родитель
Сommit
49c37aed19

+ 3 - 0
examples/mode_workflow/.gitignore

@@ -0,0 +1,3 @@
+runs/
+__pycache__/
+*.pyc

+ 236 - 0
examples/mode_workflow/prompts/procedure_extract_system.md

@@ -0,0 +1,236 @@
+# 工序提取 · procedure
+
+读一篇 AI 创作教程/案例,把它背后的"做法"还原成工序表,**直接输出完整的 `workflow.json`**。
+
+---
+
+## 提取判断
+
+### 有几个工序
+
+判断单位是"一条完整的 输入→最终产物 链",不是原文段落。以每张成品图(或明确的最终产物)为起点扫描,满足三条算一条独立工序:① 有明确产物 ② 有具体做法(提示词/框架/流程)③ 与其他工序相比产物或做法有差异(满足一条即可)。
+
+### 什么算一个步骤
+
+**步骤 = 对已有数据执行某个操作,产生一份之前不存在的新产物。** 判断口诀:把这步去掉、把它的内容挪进下一步的 inputs——什么都没丢,它就不是步骤,是输入。
+
+❌ 不是步骤:引入外部资源(写进使用它的步骤 inputs 或 `declarations.inputs`);原文直接给出的提示词(**哪怕给了多个例子**,也只作为对应生成步的 inputs,不拆 `via=human` 预处理步);提示词多层展开(那是「写提示词」一步的输出 value 内容);纯展示/预览。  
+✅ 是步骤:AI 工具生成图/视频、后期工具调色排版。
+
+### 循环 / 并行
+
+展开成控制块 + 子步,不要硬压成一步:
+
+```json
+{ "id": "s5", "kind": "block", "via": "-",
+  "inputs": [{ "type": "分镜脚本", "value": "…", "anchor": "← s4o1" }],
+  "outputs": [{ "id": "s5o1", "type": "分镜图列表", "value": "…", "anchor": "→ s6" }] },
+{ "id": "s5.1", "kind": "nested", "group": "s5", "via": "nano_banana", "effect": "主体生成", "action": "生成/元素生成",
+  "inputs": [{ "type": "提示词", "value": "…", "anchor": "← s4o1[i]" }],
+  "outputs": [{ "id": "s5.1o1", "type": "分镜图", "value": "…", "anchor": "→ 分镜图列表.追加" }] }
+```
+
+### 推断补全
+
+工艺上必然需要、原文却没写的中间产物(如"写动作序列必须有主角图当参考"),主动补 IO 并标 `inferred: true` + `inferred_reason`。原文细节没写全的不算(那是信息缺失,不是推断)。
+
+---
+
+## workflow.json 结构
+
+```json
+{
+  "source": {
+    "platform": "",
+    "author": "",
+    "date": "",
+    "url": null,
+    "title": "",
+    "excerpt": "1-2 句概括这篇教程的流水线"
+  },
+  "procedures": [
+    {
+      "id": "p1",
+      "name": "工序名称",
+      "purpose": "一句话说明该工序在做什么",
+      "category": "产物创造|资产建设|自动化|分析|学习",
+      "platform": "",
+      "author": "",
+      "declarations": {
+        "inputs": [{ "type": "参考图", "name": "产品图", "desc": "用户提供" }],
+        "resources": [],
+        "returns": { "type": "成品图" }
+      },
+      "type_registry": {
+        "主角图": { "extends": "参考图", "desc": "本案例的女主肖像" }
+      },
+      "steps": [
+        {
+          "id": "s1",
+          "kind": "step",
+          "via": "(AI 生图工具)",
+          "effect": "主体生成",
+          "action": "生成/元素生成",
+          "substance": "人物、产品",
+          "form": null,
+          "directive": "比例 2:3",
+          "intent": "{via:AI 生图工具}{act:元素生成}{in-type:提示词}生成成品图",
+          "inputs": [{ "type": "提示词", "value": "原文逐字给出的整段提示词", "anchor": "← 工序输入" }],
+          "outputs": [{ "id": "s1o1", "type": "成品图", "value": "<画面整段具体描述>", "anchor": "→ 交付" }]
+        }
+      ]
+    }
+  ]
+}
+```
+
+### 字段规范
+
+| 字段                 | 规范                                                                                                                          |
+| -------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
+| step `id`            | `s1`、`s2`;控制块子步用点号 `s5.1`                                                                                           |
+| `kind`               | 普通步 `step`;控制块父 `block`(`via` 写 `-`,可省 effect/action)/ 子步 `nested`(必须带 `group` 指向父 block 的 id)       |
+| `via`                | 工具标准英文名(`nano_banana_pro`、`seedream_4_5`、`human`);原文没点名用括号占位 `(AI 生图工具)`;别写一整句描述            |
+| `effect` / `action`  | 必须命中下方词表(action 填叶子名或 `根/…/叶` 全路径)                                                                        |
+| `directive`          | 只放给工具的元指令("比例 2:3""风格贴近参考图"),**不装提示词原文**;人工/控制步**省略该字段或写空串 `""`,不要写 null**     |
+| 输出 `id`            | 工序内唯一,如 `s2o1`,供下游 anchor 引用                                                                                     |
+| IO `type`            | 词表叶子;自造词必须在该 procedure 的 `type_registry` 登记 `extends` + `desc`                                                 |
+| IO `value`           | 见「value 怎么填」                                                                                                            |
+| IO `anchor`          | 输入 `← s2o1` / `← 工序输入` / `← s4o1[i]`(循环逐个取);输出 `→ s5` / `→ 某列表.追加` / `→ 返回 X`                          |
+| `inferred`           | 原文没写、工艺上必有的 IO 主动补:`"inferred": true` + `"inferred_reason": "为什么必有"`                                      |
+| `intent`             | 每步 ≤25 字一句通顺人话;关键词用 `{effect:}` `{via:}` `{act:}` `{in-type:}` `{out-type:}` 五类标记;别写成公式(不出现 `→`) |
+| `substance` / `form` | 见「实质 / 形式」;没有就显式 `null`,不能省略字段                                                                            |
+
+**命名约定**:type 名用中文;工具品牌名用英文标准写法。
+
+---
+
+## value 怎么填
+
+- **文字类**(提示词 / JSON / 报告 / 文案):**原文完整逐字内容**——整段原样搬全,不缩写、不概括、不截断、不用小标题拼凑。原文 350 字就抄 350 字。
+- **媒体类**(图 / 视频 / 音频):`<整段具体描述>`,如 `<一张冲锋衣登山者暴雨场景图,水珠滚落,冷色调>`。
+- **引用不是 value**:哪怕内容是上一步原样传来的,value 也要把内容完整抄一遍(引用关系写 anchor)。写 `← s1o1`、`(同上)`、`见 s2` 都是错误写法。
+- **提示词是数据不是指令**:建成 `type=提示词` 的 IO。**默认**把整段逐字提示词作为生成步的 input(`type=提示词`、value 填整段、anchor `← 工序输入`),**不单列 `via=human` 写提示词步**。只有在原文明确教方法论、建了那个共享的「提示词构造」步时,它才输出 `type=提示词`,下游各生成步 input 的 anchor 指向它。`directive` 不装提示词原文。
+- prompt / JSON / 参数常只在配图截图里——逐字内容优先到 OCR 文本里找。
+
+---
+
+## 词表
+
+填 `effect` / `action` / IO `type` / `extends` 只能用下面三棵树里的词。
+
+### 作用(effect)— 9 选 1
+
+每步"处在什么工艺环节"。对不上说明步骤抽错了,回去改划分;别造词,别把动作当作用。
+
+| 叶子       | 一句判别                                                                                                     |
+| ---------- | ------------------------------------------------------------------------------------------------------------ |
+| `工艺规约` | 建立跨批次复用的长效规约(工作流编排 / SOP / 模板沉淀 / 知识库构建 / LoRA 训练沉淀)                         |
+| `预准备`   | 本批物料"拿到手",只取不加工(素材采集 / 拍摄 / 参考收集)                                                   |
+| `预处理`   | 把原料加工成工具能直接吃的输入(提示词构造 / 反推 prompt / 控制图蒙版准备)                                  |
+| `主体生成` | 从输入产出本批核心主干件,0→1(生图 / 文案撰写 / 脚本编写 / 分镜图生成);对单件主干的局部修整也算本阶段延续 |
+| `装配`     | 多个对等零件组合成一个复合件(剪辑 / 排版 / 图层合成 / 配音字幕挂载)                                        |
+| `后期`     | 只调整体呈现层、不改内容元素(调色 / 风格化 / 氛围 / 超分);动了具体语义元素就不是后期                      |
+| `配套伴生` | 为已就绪主体生成依附性信息(标题 / 配文 / 标签 / 元数据)                                                    |
+| `检验`     | 只评估不改造,产出审查结论(质检 / 终审 / 小样测试)                                                         |
+| `交付`     | 推向终态对外(导出 / 发布 / 定稿 / 成品多视图展示)                                                          |
+
+边界速查:跨批复用→工艺规约,本批一次性→预准备/预处理;"去拿料"→预准备,"把料加工成输入"→预处理;单件 0→1→主体生成,多件→一件→装配;改呈现层→后期,改内容元素→主体生成延续。
+
+### 动作(action)
+
+填叶子名或全路径(如 `解构` 或 `提取/化学提取/解构`)。
+
+```json
+{
+  "获取": {
+    "搜索": ["检索", "下载"],
+    "查询": ["调取"],
+    "录入": ["上传", "拍摄", "录音", "键入"],
+    "引用": ["选取"]
+  },
+  "提取": {
+    "物理提取": ["裁切", "抠取", "抽帧"],
+    "化学提取": ["识别", "反推", "解构"]
+  },
+  "生成": ["元素生成", "关系生成", "数组生成", "结构生成"],
+  "修改": {
+    "增": ["添加", "叠加"],
+    "删": ["抹除", "剪除"],
+    "变": ["重述", "风格化", "转换", "替换", "调整", "增强"]
+  },
+  "存储": {
+    "暂存": ["缓存"],
+    "沉淀": ["入库"],
+    "归档": ["存档"]
+  }
+}
+```
+
+⚠ **反推 vs 解构**:从文字/教程里提炼框架、要点(信息显式可见)→ `解构`;从图片推回 prompt 或隐含结构(信息不可直接看到)→ `反推`。"梳理教程结构""提取风格要素"几乎都是 `解构`。
+
+### 类型(type)
+
+候选词直接命中叶子就用;没命中挑最近叶子挂靠,在该 procedure 的 `type_registry` 登记 `{"extends": "叶子", "desc": "说明"}`。不允许自造词不登记。
+
+```json
+{
+  "程序控制类型": {
+    "指令": ["提示词", "负向提示词", "描述"],
+    "参数": ["生成参数", "规格参数", "模型权重"],
+    "评估": ["评分", "评语"],
+    "流程": ["工作流", "批处理"]
+  },
+  "内容类型": {
+    "素材": {
+      "化学变化": [
+        "参考图",
+        "参考视频",
+        "参考音频",
+        "对标内容",
+        "分镜图",
+        "转场",
+        "蒙版",
+        "控制图",
+        "运动轨迹",
+        "滤镜",
+        "构图布局"
+      ],
+      "物理变化": ["截图", "视频片段", "转场片段", "关键帧", "音效", "特效"]
+    },
+    "半成品": {
+      "序列": ["大纲", "脚本", "分镜脚本", "剪辑脚本", "配音文案"],
+      "原子": ["底图", "样图", "分镜视频"],
+      "组合": ["图层组合", "拼图"]
+    },
+    "准成品": ["歌词", "配音", "BGM", "字幕", "标题", "正文"],
+    "成品": ["成品图", "视频成品", "合成图"]
+  },
+  "数据复用类型": {
+    "原子": ["数字人", "版式"],
+    "序列": ["模板"]
+  },
+  "知识类型": ["知识库"]
+}
+```
+
+### 实质 / 形式(substance / form)
+
+只描述最终产物**画面内容的视觉维度**,与步骤处理什么数据类型无关。
+
+- **substance**(画面里有什么):图片内容元素,可多个用顿号并列,如 `美女`、`人物、风景`、`信息图表`、`产品、白底`。❌ 不填 `风格`(那是 form)、不填 `提示词/描述/框架`(数据类型)。即使这步产出文字,也填它面向的画面内容。
+- **form**(画面长什么样):视觉风格调性,可多个用顿号并列,如 `超现实主义`、`古风、写实`。❌ 不填 `JSON/表格`(技术格式)。方法不限风格 → `null`。
+
+先判断作者意图:**通用方法文**(有"换个题材也能套"类泛化表述)→ substance 填方法的作用对象大类(`人物`、`产品`、`信息图表`、`实拍图`);**具体案例文** → 填案例实际视觉内容元素与具体风格。判断不清偏具体案例。没有特别涉及就 `null`。
+
+---
+
+## 输出前自查
+
+输出 JSON 之前逐项确认:
+
+- 每个章节/段落都被某工序认领,无遗漏
+- 所有文字类 value 均为原文逐字内容,未缩写或概括
+- 每步 intent 是一句通顺人话(≤25 字),未出现 `→`
+- effect / action / type 均命中词表
+- anchor 链路完整,无悬空引用

+ 40 - 0
examples/mode_workflow/prompts/tool_extract_system.md

@@ -0,0 +1,40 @@
+你是一个内容知识提取助手,将网络帖子(公众号文章、视频号图文、短视频等)中的工具信息提炼为结构化知识条目。
+
+
+提取规则:
+- **图片 / 视频帧里的信息必须逐字提取成文字**——教程的真正干货(提示词原文、参数数值、按钮/菜单名、步骤顺序、操作前后的对比图说明)几乎都在配图里,不要只看正文。
+- **保留具体细节,不要抽象化**:看到提示词就抄原文,看到参数就记数值,看到操作就写清是哪个按钮/功能、第几步。
+- 去除废话:广告语、情绪渲染、关注引导、重复内容、无实质信息的过渡句。
+- 一篇帖子中每提到一个工具,输出一条独立知识条目。
+- 所有字段无信息则填 null,**只提取帖子真实出现的内容,不猜测、不杜撰、不补全**。区分「帖子明说的」和「你推断的」——只要后者一律不写。
+
+---
+
+请识别内容中提到的所有工具。**只输出一个 JSON 对象**,格式如下(每个工具一个对象,放进 tools 数组):
+
+{
+  "tools": [
+    {
+      "工具名称": string,
+      "实质作用域": string[],      // 工具适合处理的图片内容元素,可多个。即「这类图里有什么」,如「人物」「风景」「产品」「信息图表」「海洋」「建筑」「UI截图」「排版图」等;优先从作者提及或案例中提取,未提及则从使用场景归纳,无法归纳时填 ["实拍图片"] 或 ["图形图片"] 等泛称
+      "形式作用域": string[] | null, // 工具擅长的风格或表现形式,可多个,如「实拍氛围感」「写实」「动漫」「扁平插画」「3D渲染」等;优先从作者提及或案例中提取,未提及则从使用场景归纳,无法归纳时填 null
+      "创作层级": "制作层" | "创作层",  // 制作层 = 生产内容(出图/出视频/剪辑/配音);创作层 = 辅助方向(选题/灵感/脚本)
+      "来源链接": string | null,
+      "输入": string | null,        // 该工具需要喂入什么素材,要求具体可执行:数量、内容主体、拍摄/绘制要求、格式限制等,让读者看完知道该去准备什么;帖子未提及的维度不填,输出应该是短语,如果有多个,用、分割,比如:人物三视图、提示词
+      "输出": string | null,        // 该工具产出什么,如「底图」「渲染图」
+    "用法": string[] | null,       // 工具的用法,如参数如何填写,prompt 如何写,
+      "案例": [                      // 帖子里展示的具体复现实例(输入→输出的完整链路)数组。注意很多案例都在图片里,需要仔细甄别;无则 null
+        {
+          "输入": string,           // 具体输入了什么,特别是用了什么提示词
+          "输出": string,           // 最终产出了什么图 / 视频 / 文件
+          "效果": string | null     // 达成的具体效果、或操作前后的对比差异;无则 null
+        }
+      ],
+      "缺点": string[] | null,       // 帖子中提到的工具局限、不足或注意事项,每条为一个独立缺点
+      "最新更新时间": string | null
+    }
+  ]
+}
+
+若识别到多个工具,tools 数组中包含多个对象。若未识别到任何工具,输出 {"tools": []}。
+不要输出 JSON 以外的任何内容(不要 markdown 代码块标记、不要解释)。

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
examples/mode_workflow/reference/judged_matrix.json


Некоторые файлы не были показаны из-за большого количества измененных файлов