ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AI绘画为何画不好“骑自行车的鹈鹕”?组合泛化与可控生成实战解析

AI绘画为何画不好“骑自行车的鹈鹕”?组合泛化与可控生成实战解析 我上周突发奇想拿几个主流图像生成模型做了个近乎恶搞的压力测试让它画一只骑自行车的鹈鹕。结果返回来一批让我笑到肚子疼的图——有的鹈鹕长了一只人手整只鸟趴在自行车大梁上像一滩精神萎靡的糯米饭有的把该有的喉囊画没了变成一只瘦长鸭子还有的干脆让自行车悬浮在地面上轮子扭成一团麻花。我一边看一边骂你倒是会画鹈鹕也倒是会画自行车怎么两样东西放到一起就集体退化成了抽象艺术家后来我冷静下来发现这个“无厘头”题目其实棒得不得了。它表面是在为难 AI实际上精准刺中了当前图像生成模型最大的软肋组合泛化compositional generation。你让模型画一只猫、一辆车、一座城堡它都能来一手漂亮的但你要它把两个不常见搭配的概念组合成一个合理的物理场景它就原形毕露了。这篇文章想把这件“小事”拆开聊聊顺便分享一些我实测后能落地的补救方案。适合所有玩 AI 绘画、做提示词工程、或者单纯好奇“这破 AI 怎么连这都画不出来”的人看。1. 一次离谱的翻车实验我让 AI 画了一周的鹈鹕先说结论在我试过的几个主流模型里能一次画对“骑自行车的鹈鹕”的概率基本接近零。让我印象最深的还不是“画得丑”而是它每种失败方式都非常有规律简直像同一个师傅教出来的。1.1 我亲眼见过的那些“喜剧”输出这些失败模式我归类下来大概有下面几种每一种都能单独拿出来当梗图失败表现直观描述背后暴露的问题主体错位自行车成了主角鹈鹕缩在角落里当装饰模型对“两个物体”的主次关系判定能力弱肢体融合鹈鹕的翅膀变成两只人手死死握着车把“握把”这个动作的语义被默认绑定给了人类肢体物种退化喉囊消失长喙变短画出来像鸭子和鹅高复杂度解剖结构特征在组合场景中被注意力机制挤掉物理悬浮鹈鹕稳稳浮在自行车上方脚离踏板十万八千里模型只学了“骑车”的图像标签没学接触关系车体崩坏车轮扭曲、踏板消失、链条款乱画细节特征在生成时被优先级更高的主体抢占资源比例失控鹈鹕比自行车还大或者小到可以站在车把上模型对不同物体之间的尺度关系没有强约束每种失败背后都不是随机抽风而是模型在“理解语义”和“拼合视觉结构”这两个环节里卡了壳。比如“翅膀变手”这种简直把人类语义偏置写在脸上了。1.2 失败不是偶然换模型、换提示词也一样我一开始以为是提示词写得不够细后来换了不同表达方式中文、英文、加权重、堆负面提示词、换不同模型再战……结果大同小异。有的模型稍微拟人化一点有的模型稍微抽象一点但基本逃不出上面那张表。这让我意识到问题不在某一个商业产品或开源模型身上而是整个“基于海量图文对训练、靠文本编码器引导扩散生成”的技术路线对没有见过的组合关系缺乏真正的推理能力。换句话说这不是某个公司偷懒没调好而是这一类系统的系统性短板。所以“全世界的 AI 都画不好一只骑自行车的鹈鹕”这句话虽然带点夸张但从根子上讲还挺诚实。2. 两个概念都画得很好合在一起为什么崩要理解这个梗得先理解 AI 画画到底是怎么“学会”画一只鹈鹕的。它不像人类那样见过真的鹈鹕在地上扑腾而是靠吃海量图文数据在统计层面记住“鹈鹕长什么样”。这种方法对单个概念效果极好但对“概念之间的关系”它就是先天不足。2.1 训练数据里根本没有“鹈鹕骑自行车”这个选项图像生成模型的本质是在学习一个概率分布。你给它一张图它会把图打散成海量特征训练一圈下来它记住了哪些像素组合“更常见”“更合理”。在真实的图片语料库里“鹈鹕”单独出现的照片很多“自行车”单独出现的照片也很多甚至“人骑自行车”的照片多到爆炸。但“鹈鹕骑自行车”呢我几乎可以打赌在全球所有公开训练集里这玩意儿可能连一百张都凑不出来——甚至一张都找不出来也是正常的。概率低到这个程度模型就没办法好好学。当它遇到这种低概率组合时唯一能做的是在两个高概率概念之间做插值而插值的结果往往就是“妥协”要么偏向人的骑行姿态要么偏向鸟的静态特征最后拼出个四不像。你可以类比一个没见过菜刀切水果的厨师你让他做“水果切菜刀”这道菜他大概率会把菜刀放在水果旁边而不是真去切。因为他的经验里“菜刀切东西”才是高概率事件水果是等着被切的。2.2 “骑车”这个动作默认属于人类这里有一个更微妙的原因文本编码器也就是把你的提示词变成模型能理解的向量空间的那一层对动作类词汇的语义绑定几乎都是围绕人的。“骑自行车”在训练语料里绝大多数情况的主语都是人。于是模型内部形成了一个很顽固的关联骑自行车 人类的姿势 人类的腿脚 人类面对车把的躯干角度。当你把主语替换成鹈鹕时文本编码器倒也能识别出“鹈鹕”这个词但生成模型在布局阶段仍然默认调用了人类骑行的骨架。结果就是你让它画鹈鹕骑车它画出来的往往是一个“套着鸟皮的人”或者是一只模仿人体姿态的鸟。翅膀变手、腿被无限拉长这些离谱操作都是因为这个隐形的“人类骑行模板”在起作用。从语义学上讲这叫做“动作的主语槽位被高频主语垄断”。鹈鹕想挤进“骑车”这个槽位但槽位旁边的所有视觉记忆都写着“人类用脚蹬踏板”鹈鹕就只能硬拗。2.3 扩散模型像不像一个硬凑画面的新手插画师再往底层一点当前主流的扩散模型比如 Stable Diffusion 一系生成图片的过程不是一步到位而是从一团纯噪声开始一点点“去噪”成一张图。这个过程中最开始几步就会决定图片的构图大方向后面所有步骤都是在往这个框架里填细节。如果早期去噪时模型就没有把“鹈鹕坐在座椅上”这件事的拓扑结构想清楚后面你再花多少步精修也很难把崩掉的骨架救回来。你加再多“masterpiece, best quality”也只是让画面变糊变精致结构错误纹丝不动。这就像一个完全没有见过鸟骑车的新手插画师你逼他画一张这种图。他一开始勾勒构图时就已经画成了“人形鸟坐在车架上方”后面就算用再高级的笔刷也只能把错误的结构越描越精细不可能突然改对。3. 蹬踏、重心与水袋模型缺失的物理常识如果说前面聊的是“语义层面”的问题那接下来这部分要聊的是“物理常识层面”。这也是鹈鹕骑自行车这个题目最缺德的地方——它很考验模型对真实世界的因果理解。3.1 一种不需要学就会的常识叫做“身体经验”人类看到“鹈鹕骑自行车”这个描述时脑子里会立刻构建出一个物理场景一只大鸟笨拙地坐在车座上两条短腿努力伸向踏板长长的喉囊在风中晃荡重心摇摇欲坠。我们甚至能脑补出它骑得歪歪扭扭、马上要摔的样子。为什么能脑补出来因为我们有身体经验。我们知道“坐”需要支撑面知道“蹬”需要脚与踏板持续接触知道“平衡”在大鸟那粗笨的身体上大概率会失败。这些常识不是从某一本书里查来的而是身体作为“物理模拟器”长期运行后沉淀下来的。但图像生成模型没有身体。它没有踩过踏板没有感受过重心偏移没有体会过风吹在翅膀上的阻力。它对“骑自行车”的全部理解来自成千上万张二维照片里像素与像素的共现模式。所以它画出来的骑行场景本质上只是个“看起来像骑行的视觉标签”而不是一个力学成立的过程。你让它画人骑车它能抄一万个范例你让它画鹈鹕骑车它没有范例可抄物理常识又为零于是只能闭眼瞎编。3.2 解剖结构在交叉注意力里的“内卷”还有一个特别有意思的细节鹈鹕这种动物的关键特征在组合生成任务里极其容易被牺牲掉。 鹈鹕的辨识度主要靠三样巨大的喉囊、长而带钩的喙、蹼足。但这三样东西在语义编码里并不算“高频词”。当画面里同时出现自行车车把、车座、踏板、车轮这些结构时模型的注意力分配就像一场资源争夺战。文本提示词里的每个词都会变成一组注意力权重去“抢”图像区域里的展现机会。“手”天生适合握车把“脚”天生适合踩踏板于是模型倾向于把鸟的翅膀画成手、把鸟腿拉长成人腿。而喉囊这种“不参与骑行动作”的特征往往在争夺中输掉最后被模型直接丢弃。结果就是你要求画一只鹈鹕骑车它给你画一只没有喉囊的长嘴鸭骑在一台结构残缺的自行车上。模型并非不知道鹈鹕长什么样只是在组合场景下它觉得“骑车”这个任务的特征权重更高把物种特征挤到了画面之外。这有点像让一个不擅长同时处理多任务的人一边背唐诗一边做算术他大概率会把唐诗背成乘法口诀——“床前明月光三七二十一”。4. 不同模型各有各的死法横向对比和提示词干扰虽然所有模型在“鹈鹕骑车”上都翻车但翻车方式还是有差别的。搞清楚这些差别你至少能知道手上这个工具更适合哪种补救思路。4.1 扩散模型 vs 自回归视觉模型我把测试结果按技术路线大致分了两类对比维度扩散类模型自回归视觉模型整体构图早期定生死后期难救按 token 顺序生成容易前半段画完忘了后半段局部细节高频特征保留好低频特征常丢失单体物体内部细节更完整空间关系能大致画出“上下左右”长距离空间关系混乱悬浮、穿插常见典型死法鸟变成人形、喉囊消失自行车被拆成几个无关零件鸟和车各过各的我自己的感觉是扩散类模型更容易把“动作”拟人化自回归类模型更容易把“场景”碎片化。但结果都一样——画不好。这个区别的价值在于如果你用的是扩散模型补救重心可以放在“约束姿态骨架”上如果你用的是自回归模型补救重心则要放在“限制元素数量、分步生成再做叠加”上。4.2 你的提示词正在决定它怎么摔提示词在这个问题里的影响力比你想象中大但也没大到能起死回生的程度。关键是它会决定模型“优先摔向哪一边”。我做了几组对比感受很深只写“pelican riding bicycle”模型默认采用人类骑行模板鸟被套进人形骨架。写“pelican riding bicycle, bird feet on pedals”踏板和鸟脚的接触关系稍微改善但车把、车座依然错乱。写“a giant pelican, huge throat pouch, sitting on bicycle saddle, legs reaching to pedals, webbed feet”物种特征保住了但自行车细节又开始崩。加“--no human arms, no hands, no deformed legs”这类负面提示词能挡掉一部分经典错误但解决不了构图层的根本问题。结论是提示词像方向盘只能决定车往哪边翻不能把车从沟里开出来。真要修好图得靠后面讲的工程化手段。4.3 一个冷门坑语言版本对组合的影响这个发现是我偶然注意到的。同样一个描述用中文写和用英文写生成的“失败姿势”居然不一样。原因在于很多多模态模型的文本编码器是以英文为主训练对中文的 token 切分比较粗糙。“鹈鹕”这种不算极高频的中文词可能被切分成几个语义碎片和图像特征的绑定关系比较弱。英文里写“pelican with a large throat pouch”则能更精确地调用视觉特征。这也带来一个实操建议遇到这种需要精确控制物种特征的需求尽量用英文写提示词并把关键身体部位throat pouch、webbed feet、long beak显式列出来。不要指望中文里一个“鹈鹕”词就能把完整图像特征拉满。5. 实操方案如何让 AI 安安稳稳画出一只骑车鹈鹕讲完原理到了大家最喜欢抄作业的环节。如果客户真的要求画一只骑自行车的鹈鹕当吉祥物或者你就是想在朋友圈发一张不那么抽象的作品下面这些方法是我亲测有效的。5.1 少用一句话难为它拆解 局部重绘我的核心思路很简单不要要求模型一步到位画出“骑自行车的鹈鹕”而是把任务拆成“鹈鹕”和“自行车”两个独立画面最后用局部重绘把它们合层。具体步骤是这样的先用一个干净的提示词生成一只站在浅色背景里的鹈鹕要求全侧身、姿态放松、喉囊明显。生成一辆自行车侧视图最好单独占画面不要有任何其他物体。用支持局部重绘inpainting的工具把“鹈鹕”这张图作为底图在画面下方蒙版出一片区域提示词写“a classic bicycle, side view, in the lower area”。模型只对蒙版区域重新生成鹈鹕主体部分不会被改变。最后用图生图统一光照和色调或者再用局部重绘把鸟的脚修到踏板上。这套流程的缺点是慢、繁琐但优点是非常稳。因为两件事都是模型本来就擅长的“单项生成”最后合层时它也只需要处理接触点而不是从零构造一个新概念。5.2 用姿态骨架把“骑行”姿势钉死如果你用的扩散模型支持 ControlNet一个用来给生成过程加额外条件约束的插件体系那千万不要浪费这个武器。它的作用相当于给模型画了一副“骨架”强制画面里的人物或动物按你指定的姿态摆放。具体可以这样操作找一张真实的人骑自行车的侧视照片用姿态提取工具提取 openpose 骨架。把这个骨架作为 ControlNet 条件输入提示词写“a pelican riding a bicycle”后生成。如果生成结果里鸟嘴还是像人脸就加强物种约束词或者叠加 reference 图参考图功能固定鹈鹕特征。这里有个小坑人类骑车的骨架和鸟的解剖结构毕竟不一样。骨架太“人”的话鸟会被拉成长臂猿。解决办法是生成后把姿态骨架的腿缩短、身体压低甚至自己手动画一版简化的“鸟骑车”骨架图再作为条件输入。这一步稍微花点时间但效果远好于完全交给模型自己发挥。5.3 参考图与 LoRA保住“鹈鹕味”如果你试了很多次模型画出来的鸟始终像鸭子或鹅那说明它在训练数据里对“鹈鹕”的特征记忆本身就不够牢。这时候最有效的办法是给模型“开小灶”仪式性的做法用参考图功能比如 IP-Adapter 这类工具输入一张真实鹈鹕的照片让生成结果在风格上向它靠拢。这样至少能保证喉囊、喙的形状对味。项目级的做法收集 10~20 张不同角度、不同背景的鹈鹕图片训练一个小型 LoRA一种轻量级的模型微调方式只调整极少参数就能让模型额外学会某个特定概念。权重调到 0.7~0.9生成时叠加提示词鹈鹕感瞬间就回来了。我建议有长期相关需求的人直接走 LoRA 路线。虽然训练过程会花掉半小时到几小时不等但之后你不仅能让它骑车还能让它开飞机、坐沙发、泡温泉一劳永逸。别把数据搞得太复杂选干净的单主体图片就好。5.4 一份可以直接抄的提示词配方根据我反复试错的经验下面这套配方是目前一次性成功率相对较高的仍然需要局部修图可以直接复制改用途a brown pelican with a large orange throat pouch, long hooked beak, webbed feet, white and gray feathers, sitting on the saddle of a classic city bicycle, one webbed foot resting on the pedal, wings folded, side view, photorealistic, soft daylight, clean background, highly detailed --no human arms, no hands, no extra legs, no deformed beak, no broken wheel, no skew wheel spokes翻译成白话就是一只棕色鹈鹕大喉囊长钩喙蹼足坐在一辆城市自行车的座椅上一只蹼足搭在踏板上翅膀收拢侧视写实干净背景高细节——负面提示词里明确排除人手、额外腿、变形喙和断裂车轮。注意几点强调“one webbed foot resting on the pedal”之所以有效是因为它把接触关系讲得更具体“classic city bicycle”是为避免车轮和车架乱编“no human arms”能有效压制翅膀变手。如果一次没出理想效果别连续硬抽卡改成小步调整局部蒙版更省钱。5.5 出图后自查清单别让细节毁掉交稿AI 生成的图在远处看往往很唬人但放大到细节处惨不忍睹。所以我养成了出图后对照清单检查的习惯尤其是组合生成图检查项合格标准不合格时的处理喉囊明显存在位置在喙下方局部重绘提示“throat pouch”并锁住区域喙形长而下弯带钩重绘嘴部脚部是蹼足且与踏板/地面有接触重绘脚部写“webbed feet on pedal”翅膀没有变成人手或额外上肢负面提示词补“no arms, no hands”车架车架、前后轮、链条、踏板齐全若缺零件整块重绘自行车区域接触关系鸟与车座有遮挡关系脚与踏板相交修接触点比例鸟和车的大小关系符合常识重绘时调整提示词中的尺度暗示这套检查表不只适用于鹈鹕骑车任何“两个不相关物体组合”的任务都可以套用。本质上你是在当那个模型缺失的“物理常识审核员”。6. 鹈鹕只是前菜组合泛化才是图像大模型的大考那个骑自行车的鹈鹕笑过之后真把它当回事的人不多。但我觉得它恰好给整个生成式 AI 行业出了一道很好的思考题。6.1 真正难住它们的从来不是单个物体别说是鹈鹕骑车你在日常创作里会遇到无数类似需求一只穿着律师西装、手里拿咖啡的柴犬一位倒立在月球上的宇航员一头在会议室里做报告的大象。这些场景在真实世界里大概率不存在但它们背后是“合理的语义逻辑 组合关系理解”。人类能轻松理解并执行这些需求是因为我们在脑子里拆解了“西装是穿的”“柴犬可以穿”“咖啡需要用手拿”“手可能是爪子的变体”等一系列常识。而当前的图像生成模型缺的恰恰是这层“常识引擎”。单项生成再强也只是“星光大道个人秀”。组合生成能力才是衡量一个模型是否真正理解世界关系的试金石。鹈鹕骑车这个题目就是一面照妖镜。6.2 业界的解法方向合成数据、关系评测与可控生成针对组合泛化这一软肋业界其实已经在动了。比如通过合成数据制造大量“不常见关系”的图文对让模型在训练阶段见过更多组合再比如设置更严格的关系类评测基准不只关注画面好不好看还专门检查物体数量、位置关系、属性绑定是否准确可控生成路线则是一步步把“自由发挥”的空间收窄用布局、深度、骨架等条件信息把所有重要结构提前指定好。这些方向听起来都很有希望但离“一个不擅长画鹈鹕骑车的模型忽然变得擅长”还有距离。对普通创作者来说最实际的建议还是不要期待模型变成一个无所不能的画家而是把它当成一个需要你在结构上盯版的合作者。6.3 把 AI 当“聪明但缺常识的乙方”来合作我后来再接到任何“奇怪组合”的插画需求时已经不会第一反应去骂模型了。我的工作模式变成了先判断这件事是模型擅长的“单项生成”还是生疏的“关系生成”如果是后者就直接走拆解、骨架约束、局部重绘、LoRA 强化这一整套流程每一步都把模型当成一个才华横溢但完全不懂物理的乙方事无巨细地给它下指令。这个思路放在很多 AI 协作场景里都成立你永远比模型更懂“世界应该是怎样运转的”那你就要承担起那双发现荒谬之处的眼睛。鹈鹕能不能骑好自行车不重要重要的是你是否愿意替模型去想清楚——它那只巨大的喉囊在风吹过来的时候到底应该飘向哪一边。反正现在谁再拿这个梗跟我抬杠我就把分解后的工作流截图甩过去告诉他不是 AI 不行是你不会拆需求。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进