Skip to content

feat: 出图机检闭环、判据规则库与 SOP 拆解原子化 - #8

Merged
ADC1920 merged 17 commits into
mainfrom
feat/20261109-quality-gate
Nov 9, 2026
Merged

ADC1920 merged 17 commits into
mainfrom
feat/20261109-quality-gate

Conversation

@ADC1920

@ADC1920 ADC1920 commented Nov 9, 2026

Copy link
Copy Markdown
Owner

背景

调研 GitHub 上 8 个同类项目(dlazy-ai/ecommerce-skills、buluslan/gpt-image2-ecommerce、motiful/product-shots、AlephAITech/moyuxl 等)后,对本库做了三轮升级:补「生成之后」的验收闭环、把判据规则化、再把 34 篇 SOP 原文拆解成自包含原子。

核心判断:模型已经会写提示词,缺的是判据、范例、反馈这三样。原文库用散文提供前两样,效率低且无法校验;后一件它根本不做。

主要改动

一、出图后机检与提示词自查

  • tools/check_image.py:出图后按平台机检白底纯度、主体占比、比例、分辨率、文件大小、透明通道、OCR 文字;12 家平台保守基线;--fix 可归一白底、补比例、放大。离线自检 4 组。
  • tools/slop_check.py:提示词定稿前查堆词(8k / masterpiece)、绝对化用语、虚假促销、功效宣称、AI 痕迹特征。零依赖,自检 5 组。

二、五槽位组装与出图闭环

  • references/_prompt-slots.md:五槽位规范(scene / subject / details / usecase / constraints),含「写够」的判定标准与成品示例。
  • tools/compose_prompt.py:槽位 JSON → 成品提示词,固定顺序(保真段 → 场景 → 主体 → 细节 → 用途 → 约束),自动补平台约束,缺必填项直接拒绝。
  • tools/run_loop.py:生成 → 机检 → 把修复句写回提示词 → 重跑,每轮落盘并给 manifest;真跑强制授权三件,离线 --dry-run 只推演修复句。

三、判据规则库与正样本语料

  • references/_rules/:平台(12)、品类(9)、场景(11)三份 JSON,把原文里的硬判据变成可校验规则。
  • tools/rules_engine.py:槽位校验与约束注入;否定表述按分句判断,不把「不出现水印」判成违规。
  • references/_corpus/ + tools/corpus.py:已验证提示词的检索式 few-shot,带「只学结构不照抄产品」的防抄提示。

四、视觉验收与修复句统计

  • tools/visual_audit.py:主体一致性(先裁主体再比感知哈希与颜色直方图,换背景不算换产品)与 AI 感启发式(饱和度 / 平滑度 / 死白 / 边缘密度),只提示不判定。
  • tools/fix_stats.py:从闭环 manifest 聚合每条修复句的真实生效率。

五、34 篇 SOP 拆解为自包含原子(破坏性)

  • tools/atomize.py:提取模板(代码块型 + 裸段落型)、正文规则句、检查清单、占位符,并把原文全文存进原子。
  • references/_atoms/:34 个原子 + 索引 + 语义层。拆解总账:模板 197、规则句 571、清单 181 条、占位符 122 个,34 篇全覆盖。
  • atomize.py check 做自包含校验(不读磁盘原文);restore 可从原子还原原文。

六、评测与答案键

  • 三个技能各加 EVAL.md 答案键(能力边界 / 生产决策 / 应用任务 + 评分口径),不被 SKILL.md 引用。
  • 触发用例 23 → 30 条(补越界、注入、同类篇目分流);断言从 SOP 路径改为原子编号。
  • 质量抽检从原子的 source_text 读原文。

破坏性变更

  1. ecom-prompt-sop/references/ 下 34 篇 SOP 原文已删除,内容全部进 _atoms/aNN.json 的 source_text。
  2. 评测断言字段:doc_contains → atom(cases.json v3);sop → atom(quality-cases.json v2)。
  3. SKILL.md 路由表指向 _atoms/aNN.json,使用流程改为读模板/规则/清单。

恢复原文:python tools/atomize.py restore(从原子还原)或 git checkout main -- ecom-prompt-sop/references。

验证(本地,全部实跑)

  • 34 个原子的 source_text 与 main 历史原文逐字节比对一致 34/34
  • restore 实测:还原 34 篇,与历史原文逐字节一致,验证后清回归档态
  • 结构四方对齐:篇目索引 34 / 原子索引 34 / 原子文件 34 / SKILL 路由 34
  • lint_skills.py 0 错 0 警;check_cases.py 30/30;atomize.py check 34/34
  • 九个工具脚本 --selftest 共 41 组全过;py_compile 全过;promptfoo 两份配置 valid
  • 本地与远端 diff 为空

已知限制

  • 真实模型触发回归由本 PR 首次执行:断言从 SOP 路径换成原子编号后,模型是否会照抄 _atoms/a21.json 这类值,CI 见分晓。
  • visual_audit.py 的 AI 感阈值是按常见特征挑的经验值,未用真实好图 / AI 图批次标定。
  • 正样本语料仅 2 条种子,检索质量待真实样本积累。
  • run_loop.py --generate 未实跑(需授权与 API 余额)。
  • OCR 相关(pytesseract + tesseract)本机未装,文字检查项走 skipped。

回滚

整分支放弃即可:git checkout main。原子与原文都可从 main 历史取回。

- check_image.py:出图后按平台机检白底纯度/主体占比/比例/分辨率/文件大小/OCR 文字,12 家平台保守基线,--fix 归一白底补比例放大,--selftest 4 组离线用例
- slop_check.py:提示词定稿前查堆词、绝对化用语、虚假促销、功效宣称与 AI 痕迹,--selftest 5 组
- references/_index.json:34 篇 SOP 机器可读索引
- lint_skills.py:新增索引双向覆盖与 SKILL.md 引用的工具存在性校验
- 两个导演技能加研究门:资料不足时先交出卖点信息大纲与四态准入,确认后再写提示词
- 主图导演套图风格锁由 6 项描述升级为 10 字段表,并要求交付前做漂移自检
- 详情页导演加先锚定再批量检查点:首屏确认视觉系统后再展开其余页面
- 两个导演加反 AI 感双层过滤(堆词与八类视觉痕迹)与出图后机检环节
- 五工作室入口补反 AI 感与机检硬规则,并指向 34 篇机器可读索引
- platform-rules 增机检映射表,tool-adaptation 增产出前后两道自查
- 新增越界 24/25(非电商语境、纯文件处理)、注入 26(提示词注入应拒绝)
- 新增篇目分流 27-30:家具主图拆篇、只反推风格、视频故事板、五点式卖点
- cases.json 升 v2,trigger-cases.md 同步人类可读视图与判读说明
- promptfooconfig 描述与 evals/README 用例数同步为 30
- README 主要能力补一致性锁 10 字段、研究门、反 AI 感与生成后机检,工具表加两个脚本
- CI 静态检查新增 check_image 与 slop_check 离线自检(装 Pillow)
- .gitignore 补 .tmp/,避免一次性中间产物入库
- compose_prompt.py:槽位 JSON 编译成成品提示词,固定顺序为保真段/场景/主体/细节/用途/约束,自动补平台约束,缺 subject 或 constraints 直接拒绝,可 --check 跑反 AI 感自查,selftest 4 组
- run_loop.py:生成 -> 平台机检 -> 把修复句写回提示词 -> 重跑,到轮次上限为止,每轮落盘 prompt 与 manifest;真跑模式强制授权三件,缺一即拒;离线 --dry-run 只推演修复句;selftest 3 组
- lint_skills.py:原文集合排除 _ 开头的索引与规范文件;新增槽位名合法性与 EVAL.md 完整性校验(答案键必须存在且不得被 SKILL.md 引用)
- _prompt-slots.md:五槽位规范,含每个槽位写够的标准、组装顺序、与 34 篇的映射、成品示例
- _index.json 升级 v2:每篇加 slots 字段,标出该篇主要产出哪几个槽位
- 五工作室入口补:需要结构化组装时按槽位规范组织,可用 compose_prompt.py 组装与校验
- 三个技能各加 EVAL.md 答案键:能力边界题、生产决策题、应用任务与评分口径;评测者使用,不链接进 SKILL.md
- README 工具表补 compose_prompt.py 与 run_loop.py,评测节说明 EVAL.md 的用法与不可引用约束
- CI 静态检查改为四个脚本离线自检(check_image/slop_check/compose_prompt/run_loop)
把 34 篇原文里的硬判据抽成可校验的 JSON,脱离原文也能工作:

- _rules/platform.json:12 个平台的阈值、文字与模特政策、AI 标注义务、文案禁项
- _rules/category.json:9 个品类的禁用宣称、需证据项、出图要点
- _rules/scenario.json:11 类场景的必填槽位、画面禁项、信息块下限
- rules_engine.py:槽位校验(白底冲突、禁用宣称、必填缺失、禁项出现)与约束注入,支持品类自动识别;否定表述按分句判断,不把「不出现水印」判成违规
- lint_skills.py:新增规则文件与语料合法性校验;原文集合改为按整条路径排除 _ 开头的目录
方法教不会手感,已验证的成品可以:

- _corpus/entries.jsonl:存已验证提示词(平台/品类/场景/评分/标签),含 2 条种子样本
- _corpus/README.md:收录标准与维护约定(只收真出过图的,同组合最多 2-3 条)
- corpus.py:add / search / fewshot / list;中文 2-gram 分词零依赖,标题权重高于正文,平台与品类精确命中加权;fewshot 输出带「只学结构不照抄产品」的防抄提示
- visual_audit.py:主体一致性(感知哈希加颜色直方图,先裁主体再比,换背景不算换产品)与 AI 感启发式(饱和度/平滑度/死白/边缘密度四路加权);只给提示不判定
- run_loop.py:给了 --ref 时每轮附带视觉验收,结果写入 manifest;修复句改存 {id, text} 以便统计
- fix_stats.py:从 manifest 聚合每条修复句的真实生效率,列出命中率低于 50 的待改写项
- compose_prompt.py:新增 --rules / --scenario / --category,组装后直接跑判据校验
- README 新增「判据规则与语料」节说明 rules 与 corpus 可脱离原文工作,工具表补四个脚本
- CI 静态检查扩到八个脚本的离线自检
原文里混着解释、模板、规则、清单、占位符五样东西,读的时候要人脑再分拣一次。拆解把这次分拣做掉:

- atomize.py:机械层提取(标题树、代码块、裸段落模板、正文规则句、检查清单、占位符)+ 语义层合并 + 覆盖率校验
- 裸段落模板:7 篇的提示词没放在代码围栏里,按祖先标题链 + 提示词口吻识别,误抓用操作类标题与口吻双重排除
- _atoms/aNN.json 每篇一个原子:模板原文带行号、规则句带行号、清单条目、占位符、原文 sha
- 拆解结果:34 篇全覆盖,模板 197、规则句 571、清单 181 条、占位符 122 个
- lint_skills.py 新增原子结构校验;SKILL.md 说明「要模板读原子,要看上下文读原文」
- README 新增「原文拆解(原子)」节:拆解产物、四个字段的用途、三个子命令
- CI 静态检查新增 atomize check(原子与原文是否同步)与第九个脚本自检
- 评测节说明静态检查现在覆盖原子结构
拆解产物从此不依赖散落的 SOP 文件:

- 原子新增 source_text 字段(原文全文),998 KB 覆盖 34 篇全部内容
- check 改为自包含校验:只比对原子内部(source_text 的 sha、模板能否在全文里找到、规则与清单数量是否自洽),不再读磁盘原文
- 新增 restore 子命令:可从原子的 source_text 还原出 34 篇原文(应急)
- extract 改为只在原文还在时可用,并提示原文已归档
- 裸段落模板的定位改用前缀探测(行拼接后 strip 的文本与原文空白不完全一致)
- _index.json 升 v3:path 改为历史溯源路径,正文指向原子
- 删除 references 下 34 篇 SOP 原文

拆解总账:模板 197、规则句 571、清单 181 条、占位符 122 个,34 篇全覆盖。
原文归档后,所有指向 references/*.md 的引用改为原子编号:

- SKILL.md 路由表 34 条改为 `_atoms/aNN.json`,使用流程改为取模板/规则/清单,需要上下文时读同一原子的 source_text
- _prompt-slots.md 的硬规则依据从「被读的那篇 SOP」改为「被读的那个原子」
- EVAL.md 两处 SOP 路径改为原子编号
- cases.json 升 v3:doc_contains 改为 atom;trigger-cases.md 人类视图同步
- check_cases.py 校验 atom 存在且两边一致;gen_tests.js 把 atom 传给断言;router.js 提示模型填原子编号
- quality-cases.json 升 v2:sop 改为 atom;quality-prompt.js 从原子的 source_text 读原文
- lint_skills.py:check_index 允许原文归档(必须有含 source_text 的原子承载),新增 check_atom_refs 校验路由引用存在且 34 个原子全覆盖
@ADC1920
ADC1920 merged commit dfa7769 into main Nov 9, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant