Skip to content

出口处没有自动检查:坏产物直接交付,需要一道只判可数四问的判官 #323

Description

@johnnyzhang-eng

现象

出口处没有任何自动检查。ActionTaskExecutor._run_character_action 把帧上传完就组 payload 返回,update_result 无条件置 COMPLETED——一段把角色分裂成两个人的 walk、一段凭空多出一把剑的 attack、一段脚被画面底边裁掉的 idle,与一段干净的产物在任务状态里长得完全一样

唯一挡在前面的是 _require_size(尺寸不对就抛),它只看画布,不看画布里是什么。

为什么本地像素指标不够

ports.ActionQuality 那三个数(motion_scale / dead_frames / loop_seam)零成本、恒可得,但它们量的是帧与帧之间的关系:动没动、有没有死帧、闭不闭环。它们回答不了"这一帧画面有什么"——像素统计分不出"两个角色"和"一个角色 + 一件道具",也分不出"这个姿势属不属于 attack"。

#311 提的 subject_blobs()(alpha 连通块计数)是同一层的免费近似,能覆盖四问里的第一问,但同样有那个歧义:挥出去的手臂被抠断、角色手持长条物,都会被数成第二块。

所以这里要的是另一种仪器,不是同一种仪器做得更好。

提案:判官只判"可数四问"

一次付费的看图问答,问四个有唯一答案的问题:

读数 问题 期望
subject_count 画面里有几个角色主体 1
foreign_objects 母版里没有、生成帧里却出现的物体
action_matches 这一帧的姿态属不属于所要求的动作类别 true
clipped 角色有没有被画面边缘裁到 false

为什么不判"好不好看"

出参里刻意没有 score 字段,这是本提案最重要的一条,理由有两层:

一,主观评分的噪声能盖过真实差异。 同模型同输入的"整体质量 1-10"重复问,分数会漂;而我们要用它来比较的两次改动,效果差异往往比这个漂移还小。测出来的排名是采样噪声的排名,不是质量的排名。

二,出参里一旦有个分数,迟早有人拿它卡阈值。 那时卡掉的是噪声——而误杀掉的是用户已经付过钱的产物,退不回来。漏放一个坏产物,用户可以重试;误杀一个好产物,用户损失是实的。这两种错误的代价不对称,所以判据必须是"有唯一答案、人眼复核一遍就能确认对错"的那种,不能是分数。

"好看"由输入端(母版规格 + 提示词骨架)保证,不由出口这道闸保证。

三条设计红线

  1. review() 返回 GateDecision | None,None = 没判。 没判与"判了没问题"必须是两个可分辨的返回值——只有后者能支持"这批产物是干净的"这句话,而它们在一个布尔里长得一样。
  2. 判官故障永不拦截。 判读读不出结论时记 error 并放行:因为我们自己的仪器坏了而扣住用户已付费的产物,是最糟的失败方式。同理,provider 读不出四个读数时必须抛错、不得兜底成"通过",否则"判官坏了"和"产物没问题"在下游长得一样。
  3. 先 shadow 再谈拦截。 QUALITY_GATE_ENABLED / QUALITY_GATE_ENFORCE 两个开关分开,都默认 false。阈值要拿 shadow 数据定,顺序反过来就是拍脑袋定判据。

成本

只判一帧(取中间那帧——首帧最接近母版,正是"动作对不对"最看不出来的一帧),即每交付一个动作多一次调用。闸口默认关,开它是一次明确的花钱决定。

与在飞工作的关系

  • #311(成色落库):互补,不重叠。那边落的是引擎本地算出来的 ActionQuality,这边落的是判官读数;两份数据源与代价都不同,payload 里分别用 qualityjudge 两个键,不共用。
  • #278 第 1 条(质检 + 坏帧自动重生成):本 issue 是它的前置,不是它。自愈要的是"据此重生成"那一步,而定"哪些帧该重生成"需要先有判据和基线数据;本 issue 只做到"判读 + 记账"。
  • #7(E1 统一评判):那份实验矩阵里的 VLM-Judge 一支,取其中"可数问答"的部分落地,不取多信号加权打分的部分——理由见上面"为什么不判好不好看"。

验收

  • 控制样本先验仪器:合成图(白底 + N 个不相接的黑块)喂进去,单主体读 1、双主体读 ≥2;并单独断言合成图本身数得出差别,否则那两条就是同一个断言跑了两遍。
  • 桩必须真的去数提交上来的图,不能是写死的一条回答——写死的桩发现不了请求形状错、base64 错、参考图顺序错。
  • 断言 JudgeVerdict 的字段名里没有 score / rating / grade
  • 闸口关时一次调用都不发,且 result 里没有判官读数(不是"读数说没问题")。
  • 判官抛错时任务照常 COMPLETED,读数里带 error

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions