你写 a woman in a red hat next to a blue car,结果出来的是女人戴红帽、旁边的车也变成红色。或者 a wooden chair and a metal table 出来两件家具全是木头。这就是属性串色(也叫概念串色、属性渗漏),是 Stable Diffusion 1.5、SDXL 和 Flux 系列上最常见的多主体失败之一。根因在于:文本编码器把整段 Prompt 压进同一个共享上下文,cross-attention 没法稳定判断哪个形容词绑哪个名词,于是某个属性就扩散到了附近每个名词上。
最快修法:把每个属性紧贴它的名词放,每对”属性 + 名词”用权重包起来,比如 (red hat:1.3),再用 BREAK 把两个主体切开。光这一招就能搞定大部分两主体串色。如果是三个及以上主体,直接上 Regional Prompter 或 ControlNet——再怎么调措辞也分不干净。注意 Flux 2(2025 年底发布,单 VLM Prompt)反过来:要写一句干净的自然语句,而不是逗号堆关键词。
先判断你是哪种情况
| 症状 | 最可能的原因 | 跳到 |
|---|---|---|
| 两个主体,一个颜色蹿到两个上 | 属性离名词太远、没加权重 | Step 1-2 |
| 材质串了(木/金属糊一起) | SD 1.5 / SDXL base 上 cross-attention 取平均 | Step 1-2 |
| 3+ 主体,属性全乱 | 没有空间约束 | Step 3-4 |
| 只在 SDXL 不接 refiner 时串 | base 单跑 cross-attention 更糊 | 原因 4 |
| Flux 上用逗号关键词 Prompt 串色 | 给 T5 / VLM 用错了 Prompt 风格 | FAQ + Step 1 提示 |
| Prompt 超过约 60 token | CLIP 上下文被压缩 | Step 5 |
常见原因
按命中率从高到低。
1. 属性离它的名词太远
写 a red hat and a blue car 时,red、hat、blue、car 这几个 token 都挤在同一个共享文本上下文里(SD 1.5 / SDXL 是 77-token 的 CLIP 窗口)。不同颜色的物体越多,cross-attention 越糊,往往先出现的属性”赢”整张图。研究里的经典例子是 a pink sunflower and a yellow flamingo 出来颜色对调了。
如何判断:数一下 Prompt 里有几个主体。一句话里 2 个以上主体、颜色或材质不同,几乎一定串,尤其是形容词和名词中间还隔着别的词时。
2. 没给绑定对加注意力权重
red hat 和 red, hat 对模型来说完全是两回事——一个逗号就可能把绑定断开。不给这一对加权,模型就只能在整张图上取平均色。
如何判断:Prompt 里没有任何括号或权重符号包住”属性 + 名词”。
3. Prompt 太长
超过大约 60-70 token,CLIP 类编码器开始压缩上下文,远端 token 的 attention 精度下降,串得更厉害。
如何判断:把 Prompt 丢进 token 计数器(Automatic1111 / Forge 在输入框旁边直接显示数量,如 30/75)。核心场景超过约 60 token 就是问题。
4. 用 SDXL base 但没接 refiner
SDXL base 单跑比 base+refiner 更容易串色。refiner 在低 denoise 下会重新对齐 cross-attention,能修掉一部分串色。
如何判断:同一 Prompt、同一 seed,开/关 refiner 各跑一次。开了之后串色减轻,就说明 refiner 不能省。
5. 复杂场景没有空间约束
3+ 不同主体时,光靠 Prompt 措辞分不干净——目标越多,cross-attention 越退化。必须加空间约束(分区提示词或 ControlNet 分割图)。
如何判断:场景里有 3 个以上主体,每个都有自己的颜色和材质。
最短修复路径
从上往下做,串色没了就停。
Step 1:把属性贴到名词上并给这一对加权
先把每个形容词挪到它名词的正前面、紧贴在一起。a red hat ... a blue car 比 red, blue, a hat, a car 绑得稳得多。然后把每对”属性 + 名词”用括号包起来加权。SD 1.5、SDXL、Automatic1111、Forge、ComfyUI(配权重节点)都支持这套冒号-权重语法:
(red hat:1.3), woman wearing it, standing next to (blue car:1.3)
权重把这两个 token 作为一个单位放大,让 cross-attention 把它们当成绑定的一对。权重 1.1-1.4 最稳,超过约 1.5 主体就开始扭曲或过饱和。在 ComfyUI 里,同样的效果靠 CLIP Text Encode 节点里的权重语法实现。
Flux 提示:Flux.1(dev/Pro/Schnell)用 CLIP-L 加 T5 文本编码器,Flux 2(2026)用单个 VLM 驱动的 Prompt。Flux 在 T5/VLM 这条路上不认
(...:1.3)权重语法——它读的是自然语言。所以 Flux 上要用句式来修串色(见 FAQ),别用数字权重。
Step 2:用 BREAK 切开主体
Automatic1111、Forge、ComfyUI(配对应节点)都支持 BREAK,它会结束当前文本块、开一个新块,编码器在段落之间补齐到新的 75-token 块:
(red hat:1.2), woman portrait, soft daylight
BREAK
(blue car:1.2), parked behind her, glossy paint
每个 BREAK 块拿到自己独立的块,red 跨进来污染 car 的概率就低很多。一个坑:BREAK 切的是块,不是图像区域——它不控制主体落在哪,堆太多还偶尔会把主体和它自己的属性切散。两三个主体用它正合适;再多就上 Step 3。
Step 3:分区提示词(画出每个主体的位置)
更难的场景,把每段子 Prompt 限制到画布的某个区域:
- Regional Prompter——原版 hako-mikan/sd-webui-regional-prompter(Automatic1111),有维护中的 Forge 移植版(
sd-forge-regional-prompter)。按列/行切画布,每个区域分配不同 Prompt。 - ComfyUI regional——用
Conditioning (Combine)加Conditioning (Set Mask),或 Impact-Pack 的RegionalPrompter节点,把每段子 Prompt 绑到空间 mask 上。 - Attend-and-Excite——采样时强制 attention 必须关照到每个主体 token 的方法;有节点/插件版,适合顽固的两主体场景。
Regional Prompter 左右分栏示例:
woman portrait, soft daylight
ADDCOMM
(red hat:1.3), woman, urban street
ADDCOL
(blue car:1.3), parked, glossy paint
ADDCOMM 的内容作用于整张图;ADDCOL 开一个新的列区域。(旧语法用 ADDBASE 表示基础 Prompt、用 BREAK 分隔区域——两套都还能用,按你版本文档里写的来。)Prompt 里任何地方出现 ADDCOL 或 ADDROW 都会自动开启区域模式。
Step 4:硬布局上 ControlNet 分割图
主体必须固定在某些区域时:
- 在任意画图工具里随手画一张分割图(左边女人 = 一种纯色,右边车 = 另一种纯色)。
- 用
seg预处理器(ADE20K风格调色板)喂进 ControlNet。 - ControlNet 权重设 0.7-1.0。
- 在上面叠一层分区提示词,让每个分割区域拿到自己的属性 Prompt。
这样空间控制(每个主体在哪)和属性控制(每个主体长什么样)就同时锁住了,是商品图和合影场景最可靠的路子。
Step 5:缩短,再分两次出图
核心 Prompt 超过约 60 token 就砍,把风格词挪到一段简短后缀。最顽固的串色,最干净的兜底是分两次生成,让每个主体在自己的上下文里拿满 attention 预算:
- 第一次只画第一个主体。
- 第二次用 outpaint 或 inpaint 把第二个主体放进场景。
每个主体都在独立上下文里生成,没有共享上下文,属性自然无处可串。
如何确认修好了
别信单张图。把改后的 Prompt 在固定的 4 个 seed 上重跑一遍(改前改后用同一组 seed,保证唯一变量就是你的改动)。满足以下条件才算稳:
- 绑定的颜色/材质在至少 4 张里的 3 张上落到正确主体上。
- 另一个主体保住自己的属性(没换、没糊)。
- 权重从 1.2 调到 1.3 时绑定更紧、而不是把主体搞扭曲。
如果 4 张里还有 2 张以上串色,说明约束力不够这个场景的复杂度——往下走一步(权重 -> BREAK -> 分区 -> ControlNet),别在那儿换 seed 死磕。
预防建议
- 任何含 2+ 不同颜色 / 材质主体的 Prompt,默认就上注意力权重,并把每个形容词紧贴它的名词。
- 核心场景控制在约 60 token 内,风格词放到独立后缀。
- 把常用的”左右主体分栏”在 Regional Prompter 里存成 preset。
- 多 SKU 商品图:每个 SKU 单独出图,最后在 Photoshop / Affinity 里合成,别跟绑定硬刚。
- Flux 上用自然语句写 Prompt;标签风格 + 权重留给 CLIP 类的 SD 1.5 / SDXL。
- 新 Prompt 在 4 个 seed 上各跑一遍;2 张以上串色就重构 Prompt,别死磕重 roll。
FAQ
为什么两个物体是颜色互换、而不只是渗漏?
根因一样。cross-attention 绑不干净时,可能把形容词错挂到别的名词上——就是文献里那个 pink sunflower / yellow flamingo 对调。把每个形容词贴到名词上再给这一对加权,串色和互换都能一起修掉。
Flux 上也会串吗?修法一样吗?
Flux 比 SD 1.5 / SDXL 串得少,因为它的 T5(Flux.1)或 VLM(Flux 2)编码器更会读上下文——但用关键词堆砌的 Prompt 还是会串。修法不一样:写成一句连贯的话(A woman in a red hat stands beside a glossy blue car),而不是逗号标签,并且别加数字权重,T5/VLM 这条路根本不认。
把错误颜色塞进负面 Prompt 有用吗?
有时候能当膏药用。把 red car 加进负面 Prompt 能把车往红色之外推,但常常会全局把颜色压暗或带偏,治不了绑定本身。优先用权重或分区控制;负面 Prompt 只用来轻推那种差一点点的情况。
权重多高算太高? 单对”属性 + 名词”超过约 1.5,通常就开始过饱和、出光晕或人体变形。保持在 1.1-1.4,要更强就再叠一招(BREAK 或分区),而不是一味往上拉权重。
BREAK 没把我的主体分开,为什么?
BREAK 切的是 token 块,不是图像区域。它能减轻跨 token 串色,但不控制位置,而且 BREAK 太多还会把主体和它自己的属性切散。要真正的空间分离,用 Regional Prompter 或 ControlNet(Step 3-4)。