现象
无法回答「上一次改提示词到底有没有让产出变好」。
原因
引擎已经把成色算出来了:impl/character_generator.py 的 _assess() 产出 ActionQuality(motion_scale / dead_frames / loop_seam),装进 GeneratedAction.quality。
ports/__init__.py 里 motion_scale 的语义写得很明确:接近 0 = N 张同一张图 = 这不是动画,不要交付。
但 app/server/orchestrator/executor.py 组装结果时只返回 {"type", "action_type", "frames"},quality 整个被丢掉,update_result 无条件置 COMPLETED。
character_generator.py 的 docstring 把分工写得很清楚——引擎如实报数,判决交给调用方。调用方从来没接。
后果
- 一段每帧都一样的 walk 与一段步态干净的 walk,帧数、时长、状态完全相同,调用方分辨不出。
- 任何提示词改动都无法做前后对比,只能交「看起来更好」。
- 判官/自愈这类后置质量机制没有可用的基线数据,阈值只能拍脑袋定——而误杀的代价是用户已付费的产物。
要做
executor.py 产出 payload 时带上 quality。
- 同时写入
prompt_version(提示词模块的版本常量)。理由:改提示词会永久断开历史可复现性,同一个任务用新提示词重跑得到的不是同一件东西。没有版本标签的话,改完之前的所有数据都不可比。
- 本步只记账,不做任何判决——不因为 quality 差就置 FAILED。判决需要先有基线。
顺带新增一个免费指标
slicing/quality.py 加 subject_blobs():抠图后 alpha 掩码的连通块计数,零 API 直接命中「画面里有几个角色」。
返回逐帧计数而不是均值,理由与 dead_frames 给下标相同:分布形态对应不同的病——全程 2 块 = 真的生成了第二个角色;只有中段 2 块 = 挥出去的手臂或持物被抠断了。
必须先校准:用已知单人 / 双人 / 单人持长条物的样本验证。一个会把长剑数成第二个人的计数器,比没有计数器更坏。
现象
无法回答「上一次改提示词到底有没有让产出变好」。
原因
引擎已经把成色算出来了:
impl/character_generator.py的_assess()产出ActionQuality(motion_scale/dead_frames/loop_seam),装进GeneratedAction.quality。ports/__init__.py里motion_scale的语义写得很明确:接近 0 = N 张同一张图 = 这不是动画,不要交付。但
app/server/orchestrator/executor.py组装结果时只返回{"type", "action_type", "frames"},quality 整个被丢掉,update_result无条件置 COMPLETED。character_generator.py的 docstring 把分工写得很清楚——引擎如实报数,判决交给调用方。调用方从来没接。后果
要做
executor.py产出 payload 时带上 quality。prompt_version(提示词模块的版本常量)。理由:改提示词会永久断开历史可复现性,同一个任务用新提示词重跑得到的不是同一件东西。没有版本标签的话,改完之前的所有数据都不可比。顺带新增一个免费指标
slicing/quality.py加subject_blobs():抠图后 alpha 掩码的连通块计数,零 API 直接命中「画面里有几个角色」。返回逐帧计数而不是均值,理由与
dead_frames给下标相同:分布形态对应不同的病——全程 2 块 = 真的生成了第二个角色;只有中段 2 块 = 挥出去的手臂或持物被抠断了。必须先校准:用已知单人 / 双人 / 单人持长条物的样本验证。一个会把长剑数成第二个人的计数器,比没有计数器更坏。