一次生成 20 个角色却全都撞脸:我用"角色合同"重做了批量生成流程
很多 AI 角色项目有一个很隐蔽的问题:单张图挑出来都不错,二十张铺开后却像同一个模特换装。客户说"人物没有辨识度",团队通常继续改提示词、换模型、抽种子,成本增加了,撞脸依旧存在。
根因是流程里缺少一个中间层:角色身份没有被建模。

把角色生成看成数据建模
我现在会先给每个角色建立 character_id,并把描述拆成两个集合。
第一组是不可随意变化的身份锚点:年龄段、脸型、五官比例、体态、发型轮廓和标志物。第二组是镜头允许变化的属性:衣服、动作、背景、光照和表情。
ts
type CharacterContract = {
characterId: string
identityAnchors: {
ageBand: string
faceShape: string
bodyType: string
hairSilhouette: string
signatureProp?: string
}
allowedVariations: Array<'outfit' | 'pose' | 'lighting' | 'camera'>
}
有了这层结构,生成失败不再只是"感觉不像"。系统可以记录是哪一个锚点漂移,也可以只重做冲突字段。

批次差异来自矩阵,不来自随机数
如果同一批角色都是"二十多岁、精致五官、标准身材",模型自然会收敛到相似面孔。要提高可分性,需要在生成前做差异矩阵。
| 角色 | 年龄 | 轮廓 | 体态 | 发型 | 标志物 |
|---|---|---|---|---|---|
| 店主 | 48 | 方脸 | 敦实 | 短发 | 黑框眼镜 |
| 产品经理 | 31 | 长脸 | 清瘦 | 侧分 | 银色腕表 |
| 工程师 | 26 | 圆脸 | 微胖 | 卷发 | 无眼镜 |
这里最重要的是排他性。除了写"店主戴黑框眼镜",还应写"其他角色不得使用眼镜作为标志物"。除了定义产品经理清瘦,也要避免其他核心角色使用相同轮廓与体态组合。
这比单纯增加提示词长度有效,因为它是在控制角色集合的分布。
先产身份证,再产海报和镜头
每个角色先生成一张标准基准图:中性背景、稳定光线、无遮挡、正面或三分之二侧面。把图片哈希与角色合同、模型版本、提示词版本和种子绑定。
之后所有海报、分镜和视频镜头都引用该版本的角色身份证。造型发生变化时新建版本,不覆盖旧版本。这样,历史物料不会因为一次设定更新而失去可复现性。
验收要看两个方向
只检查"同一角色是否一致"还不够,还必须检查"不同角色是否足够不同"。
- 角色内一致性:同一个人在远景、近景和不同情绪下仍可辨认;
- 角色间可分性:不同人物放在同一画面或缩略图墙里不会混淆。
我会先做一个很朴素的盲认测试:隐藏角色名,把全批缩略图铺开,观察成员能否在两秒内完成区分。然后再用视觉向量相似度筛出疑似撞脸的组合,交给人工复核。

向量距离不能替代美术判断,但很适合做第一层筛查。最终状态只保留三种:通过、定点修改、推倒重建。不要让"差不多"进入后续几十个镜头。
这套方法为什么适合小团队
小团队最怕隐性返工。早期少花半小时建角色合同,通常能省下后期逐镜头修脸、重做封面和重新让客户确认的时间。
更重要的是,合同可以被程序读取。后续可以接入提示词组装、资产命名、重复检测、版本管理和自动验收,把角色资产从零散图片变成可维护的数据。
最后
批量角色生成不是"多调用几次模型",而是一个身份设计与质量控制问题。稳定的顺序应该是:角色合同 → 差异矩阵 → 基准身份证 → 场景生成 → 双向验收。
当角色要进入企业官网、小程序、App 或小游戏时,这种可追踪方式尤其重要。更多可复用的视觉资产可以在如意图库查看,智能体工程实践可参考《大鹏 Codex 智能体软件工程》。