现象
任意角色生成动作后,i2v 产物都会多出一件斗篷/罩袍,并倾向于给角色手里塞一件武器;母版自身的特征(挂件、软管、胸铠等)反而被挤掉。
此前归因为"模型没守住角色一致性"。该归因是错的。
根因
ai_engine/prompt/walk.py:
DEFAULT_GARMENT = "the cape and tabard"
WALK_BODY_SIDE = (
"... {garment} swing with the steps, "
"the weapon stays held low and steady at the side in a fixed grip, ..."
)
ai_engine/prompt/actions.py(idle / attack)同样带 DEFAULT_WEAPON = "the sword"、DEFAULT_GARMENT = "the cape";jump.py 相同。
而 strategy/concrete.py 的 _build_prompt() 只传 facing:
return build(facing=action.facing)
于是 garment / weapon 全部落到默认值——那是当初为某个持剑披风角色写的词。每个角色都被提示词要求穿斗篷罩袍、手持武器。
更进一步:walk 模板里 weapon 那句是写死的,连参数都没有(actions.py 的 idle/attack 有 {weapon} 占位符,walk 没有)。
验证
2026-08-11 用一个完全没有布料结构的刚性角色(球形头盔 + 贴身帆布服 + 厚底靴)实跑,母版不含任何披挂。i2v 产物仍出现一件及膝大斗篷,同时母版的颈后软管消失。
这排除了"软布料勾出斗篷"的假设,指向提示词本身。
影响
直接打在产品核心卖点上:我们卖的是角色一致性,而一致性被自己的提示词破坏。任何非"持剑披风"体型的角色都会被拽向该原型。
修改方向
提示词只描述动作,角色身份由母版承担。
- 模板去掉硬编码的装备默认值;walk 的 weapon 子句参数化或整句去掉;
CharacterCard 增加结构化的角色特征字段(现在只有自由文本 desc,没有地方存"这个角色穿什么、拿什么");
_build_prompt() 把角色特征接上。
验收
同一角色、同一母版、同一视频参数,只改提示词复跑一次,对照产物是否还出现母版上没有的披挂。这样能干净归因。需要一次按次计费的视频调用。
相关
代码在 #180 / #181 的范围内,本 Issue 独立跟踪,避免夹带。
现象
任意角色生成动作后,i2v 产物都会多出一件斗篷/罩袍,并倾向于给角色手里塞一件武器;母版自身的特征(挂件、软管、胸铠等)反而被挤掉。
此前归因为"模型没守住角色一致性"。该归因是错的。
根因
ai_engine/prompt/walk.py:ai_engine/prompt/actions.py(idle / attack)同样带DEFAULT_WEAPON = "the sword"、DEFAULT_GARMENT = "the cape";jump.py相同。而
strategy/concrete.py的_build_prompt()只传facing:于是
garment/weapon全部落到默认值——那是当初为某个持剑披风角色写的词。每个角色都被提示词要求穿斗篷罩袍、手持武器。更进一步:walk 模板里 weapon 那句是写死的,连参数都没有(
actions.py的 idle/attack 有{weapon}占位符,walk 没有)。验证
2026-08-11 用一个完全没有布料结构的刚性角色(球形头盔 + 贴身帆布服 + 厚底靴)实跑,母版不含任何披挂。i2v 产物仍出现一件及膝大斗篷,同时母版的颈后软管消失。
这排除了"软布料勾出斗篷"的假设,指向提示词本身。
影响
直接打在产品核心卖点上:我们卖的是角色一致性,而一致性被自己的提示词破坏。任何非"持剑披风"体型的角色都会被拽向该原型。
修改方向
提示词只描述动作,角色身份由母版承担。
CharacterCard增加结构化的角色特征字段(现在只有自由文本desc,没有地方存"这个角色穿什么、拿什么");_build_prompt()把角色特征接上。验收
同一角色、同一母版、同一视频参数,只改提示词复跑一次,对照产物是否还出现母版上没有的披挂。这样能干净归因。需要一次按次计费的视频调用。
相关
代码在 #180 / #181 的范围内,本 Issue 独立跟踪,避免夹带。