你在负向提示词里仔细列了 blurry, low quality, text, watermark, extra fingers, deformed hands, jpeg artifacts。出图回来 T 恤上有字,角落里隐约有水印,手是六根指头。看起来负向提示词被丢掉了。
最快的修复: 把请求体打印出来,确认模型确实收到了非空的 negative_prompt,然后把 CFG 提到 8 重跑。这两步能解决大多数”负向无效”的情况。如果你用的是 Flux 模型(Flux Dev、Flux Schnell 或 Flux.2),负向在默认设置下是关掉的,必须开启 true CFG 才生效——直接跳到 Flux 那一节。
有时候提示词确实没到——客户端就没传。但更常见的是模型在正常解析它,只是你要否定的概念在 checkpoint 权重里太牢固,或被你自己的正向提示词反向召唤了。把负向提示词当成众多杠杆之一,不要当万能橡皮擦。
你属于哪一类?
| 症状 | 可能原因 | 跳转 |
|---|---|---|
| 网页 UI 里能用,自己脚本里不行 | 字段没传 / 字段名错 | 原因 1、步骤 1 |
| 调高 CFG 后不想要的东西变淡 | CFG 太低 | 原因 2、步骤 2 |
| 正向里写了杂志、海报、招牌 | 正向在召唤它 | 原因 3、步骤 3 |
| 只有长负向里靠后的几项失效 | 超过 75 token 被切掉 | 原因 5、步骤 4 |
(word:1.4) 被当成普通文字 | 运行环境权重语法不对 | 原因 6、步骤 5 |
| 正向清空了水印还在 | checkpoint 过度训练 | 原因 4、步骤 6 |
| 底图干净,过 refiner 后变脏 | 没把负向传给 refiner | 原因 7、步骤 7 |
| 模型是 Flux(Dev/Schnell/.2) | 负向默认被禁用 | 步骤 8 |
常见原因
按真实管线里的出现频率排序。
1. 负向提示词压根没到模型
在 API 调用里这是最常见的——根据服务商,字段名是 negative_prompt、neg_prompt 或 unconditional_prompt,写错一个字符就传成空串。UI 在某些 workflow 下也会悄悄丢掉这个字段(比如某些 Comfy 节点的 img2img)。
如何识别:把发出的请求体打印出来。如果 negative_prompt 缺失或为空字符串,模型从未看到它。
2. CFG 太低,负向咬不住
CFG 控制模型多大程度上往正向推、多大程度上远离负向。CFG 4-5 时负向作用弱;7-9 才咬;12 以上会矫枉过正成丑陋伪影。
如何识别:保持负向不变,把 CFG 调到 8 重跑。如果不想要的元素消失了,低 CFG 就是元凶。
3. 正向提示词正在召唤你想否定的东西
如果正向里写了”杂志封面”,模型一定会出字——负向里写 text 是在和整个正向开战。负向提示词无法克服正向内部的矛盾。
如何识别:把正向提示词通读一遍,问自己”一个一根筋的模型会不会理解为要加上这个东西?“若是,先修正向。
4. 模型对该概念过度训练
某些 checkpoint(尤其是写实微调)训练集里塞满了带水印的图库照片。负向能微调但克服不了硬编码的偏见。
如何识别:完全空正向 + 满负向出图。如果水印还在,是底模的锅。
5. 负向太长被截断
CLIP 的硬上限是 77 token,但其中两个被起止标记占掉,所以你实际只有 75 个真正可用的 token(大约 50-60 个英文词)。在原生 Diffusers 里,超出部分会被静默丢弃——可能恰好包含你最在意的那个概念。AUTOMATIC1111、Forge、Fooocus、InvokeAI 和 ComfyUI 通过把提示词切成 75 token 的分块来绕开这个限制(有效上限因此涨到 150、225……),但脚本里裸调 pipe(...) 不会这么做。
如何识别:用 CLIP tokenizer 数 token 数。如果你的负向超过 75 token 而你又是直接调 Diffusers,尾巴就被吃了。在 Diffusers 里留意控制台里的警告 The following part of your input was truncated because CLIP can only handle sequences up to 77 tokens。
6. token 权重语法和平台不匹配
(blurry:1.4) 在 AUTOMATIC1111 能跑,原生 Diffusers 不能。[blurry:1.4] 在不同 UI 里又有不同语义。语法错误意味着解析器看到的是乱码,权重没生效。
如何识别:先用裸词测试,不带括号和权重。裸词能用而带权重不行,就是语法问题。
7. SDXL refiner 把底模刚刚去掉的东西又加回来
SDXL 是 base + refiner 两阶段管线。如果负向只传给 base 没传 refiner,refiner 可能在干净底图上再加细节(包括类似水印的噪声)。
如何识别:只跑 base(关掉 refiner)对比。base 干净、refined 脏 = refiner 的问题。
8. 你用的是 Flux 模型,它天生无视负向
Flux Dev、Flux Schnell 和 Flux.2 都是 guidance-distilled(引导蒸馏) 模型:classifier-free guidance 行为被烤进了权重,所以它们以内部 CFG 1 运行,此时负向提示词毫无作用。截至 2026 年 6 月,对刚从 SDXL 切过来的人来说,这是负向”完全没反应”的头号原因。负向字段在 UI 里是有的,但除非开启 true CFG,否则它是哑的。
如何识别:看你的 checkpoint 名字。如果里面带 flux 而你的负向在任何 CFG 下都零效果,就是这个原因。修复见步骤 8。
开始前准备
- 保留一张”坏图”,记下确切的正向 + 负向字符串和所有参数。
- 确认你用的 API 或 UI 是否支持负向提示词(一些基础服务商不支持)。
- 决定哪个不想要的元素最重要——一次一个比同时干掉所有要快。
需要收集的信息
- 完整正向和负向提示词字符串(从请求日志里复制,不要靠记忆)。
- CFG、采样器、模型名、模型版本。
- 两段提示词的 token 数(用 CLIP tokenizer)。
- 你跑的是 base only、refiner only 还是双阶段。
- 你的客户端用的具体字段名(
negative_prompt还是neg_prompt还是其它)。 - 模型家族(SDXL、SD 1.5、Flux Dev/Schnell/.2、Qwen-Image)——这决定了负向到底适不适用。
一步步修复
按 ROI 排序。
步骤 1:确认负向真的被发出去
打印发出的请求体:
import json
print(json.dumps(payload, indent=2))
或用 curl:
curl -v -X POST $API_URL \
-H "Authorization: Bearer $KEY" \
-d '{"prompt": "...", "negative_prompt": "blurry, text, watermark", "cfg_scale": 7.5}'
如果 negative_prompt 键缺失,改字段名。一半”负向无效”工单到这里就解决了。
步骤 2:提高 CFG 重测
试 CFG 8.0,再试 9.5。注意过度矫正(色彩寡淡、边缘过焦),但如果 CFG 8 让不想要的元素消失了,低 CFG 就是原因。
{"cfg_scale": 8.5}
步骤 3:修正向,别再召唤不想要的东西
如果你写了”工作室人像,杂志封面级,时尚大片”再负向 no text,等于自己跟自己打架。重写:
正向:studio portrait, soft rim light, neutral grey backdrop, plain background
负向:text, watermark, signature, letters, logo
一个干净的正向比一个着急的负向更有用。
步骤 4:把负向裁到 60 token 以下
顺序有讲究——把最重要的拒绝放最前,因为在原生 Diffusers 里第 75 token 之后的内容会被丢弃,而且即便在限额内,靠前的 token 权重也更大。
负向:text, watermark, extra fingers, deformed hands, blurry, low quality
像 ugly、bad、weird 这种低价值通用词砍掉,它们少有帮助还挤掉具体 token。
如果你在 AUTOMATIC1111、Forge 或 ComfyUI 里确实需要长负向,用大写的 BREAK 关键字开启一个全新的 75 token 分块、把相关的拒绝项分组,比如 text, watermark BREAK extra fingers, deformed hands。BREAK 必须大写;小写的 break 会被当成普通词。
步骤 5:用平台正确的权重语法
在 AUTOMATIC1111 / Forge / Fooocus / ComfyUI / InvokeAI 里,(word:1.5) 语法的行为是一致的:
(watermark:1.5), (text:1.4), (extra fingers:1.3), blurry, deformed
但在原生 Diffusers 里这套括号语法只是普通文字——想要权重得用 compel 库,它有自己的 word++ / word-- 语法,并通过 negative_prompt_embeds 把结果喂进去。没有它,括号毫无作用。
针对 SD 1.5 和 SDXL,textual-inversion embedding 往往比打字的词更管用:把 EasyNegative embedding 放进你的 embeddings 文件夹,然后在负向里加 EasyNegative。这一个 token 就打包编码了一堆”画质差 / 解剖错误 / 伪影”的概念,纯文字很难表达到位。
步骤 6:换 checkpoint,如果概念已被过度训练
如果一个图库照微调过的 checkpoint 总是出水印,换一个数据更干净的(一个 “photo-real-clean” 变体,或没图库微调的 SDXL 底模)。相关:AI 图像水印残留。
步骤 7:负向同时传给 base 和 refiner(SDXL)
SDXL 管线里,确认 refiner 阶段也收到了负向:
image = pipe(
prompt=pos,
negative_prompt=neg,
).images[0]
image = refiner(
prompt=pos,
negative_prompt=neg,
image=image,
).images[0]
很多教程忘了在 refiner 调用里写 negative_prompt——默认空就会把坏内容加回来。
步骤 8:Flux 需要 true CFG 或 Dynamic Thresholding
如果你的模型是 Flux Dev、Flux Schnell 或 Flux.2,普通的负向毫无作用,因为引导被蒸馏进了权重。截至 2026 年 6 月,你有三个办法,按推荐程度排序:
-
在 Diffusers 里用 true CFG。 Flux 管线只有在
true_cfg_scale大于 1 时才支持negative_prompt。这是最干净、官方支持的路径:image = pipe( prompt=pos, negative_prompt="blurry, low quality, text, watermark", true_cfg_scale=3.5, # 如果这个保持 1,负向会被忽略 num_inference_steps=50, ).images[0]注意
true_cfg_scale和 Flux 的guidance_scale(蒸馏引导,通常 3-4)是两个不同参数。把true_cfg_scale留在默认值 1 会静默丢弃负向。完整参数列表见 Diffusers Flux 管线文档。 -
在 ComfyUI 里安装
sd-dynamic-thresholding,在 Flux 模型和KSampler之间加一个DynamicThresholdingFull节点。这样你就能把 CFG 推到 1 以上并传入真正的负向。效果时好时坏,渲染时间大约翻倍,但确实能用。 -
干脆不用负向,改用正向描述。 这通常是更好的 Flux 工作流:与其否定
extra fingers,不如描述正确结果——a hand with exactly five fingers, anatomically correct。Flux 对详细正向的遵循度很高,这也是它在 2026 年提示词遵循度领先的原因。
验证
- 用修正后的提示词出 4 张一组的图。不想要的元素应该在 4 张里都不见或很罕见。
- 把负向清空再出图,确认不想要的元素回来了。证明负向现在是有用的。
- 跑一组极端配置(CFG 12、最大权重)确认模型能彻底压制该元素——你不会用这个配置出片,但能证明杠杆有效。
长期预防
- 为每个 checkpoint 维护一套测试过的负向词库。在 SDXL base 上有用的,到 Flux 上不一定有用。
- 把正向 + 负向 + CFG + 采样器 + checkpoint 一起记日志。负向失效时,可以从已知好配置二分定位。
- 先修正向。负向是修正器不是改写器。
- 负向控制在 60 token 内;最关键的拒绝放进前 20 个 token。
- 自定义管线里在 CI 里校验请求体——断言
negative_prompt存在且非空,并且 Flux 任务的true_cfg_scale大于 1。 - 换 checkpoint 版本后重新测试你的负向词库。
- 记录每个 preset 针对的模型家族。SDXL 负向最强,Flux 需要 true CFG 或正向描述,Qwen-Image(阿里巴巴,Apache 2.0 协议)又是另一套行为——别假设一套词库能跨家族通用。
常见坑
- 把负向当愿望清单,塞 200 词。尾巴会被丢弃。
- 在负向里写
no text——模型把no和text当独立概念,text才是被注册的那个。直接写你拒绝的概念。 - 在不解析 AUTOMATIC1111 权重语法的原生 Diffusers 脚本里用了那套语法。
- 忘了托管服务商可能去掉或重映射字段。查文档。
- CFG 拉到 15+ 暴力压制——出图会过焦寡淡。不如修正向或换 checkpoint。
- 在 Flux 上用负向却没把
true_cfg_scale设成大于 1(Diffusers),也没加 Dynamic Thresholding(ComfyUI)。否则这个字段是哑的。 - 以为负向能修一切。结构性问题用 参考图 或 ControlNet,负向修不了。
FAQ
Q:是不是该默认就用一长串负向?
不。从论坛抄来的默认负向常常自相矛盾或浪费 token。用一个简短、针对你 checkpoint 实际问题的负向。
Q:我的正向很短很干净,模型还是会加字。怎么办?
试不同的 checkpoint。一些写实微调把水印 / 字深度烙在模型里,没有负向能完全去掉。
Q:能给负向写个正则或模板吗?
把负向当 checklist:按 checkpoint、按风格。没有通用正则。保存 3-4 个命名 preset(“portrait-clean”、“product-clean”、“anime-clean”)复用。
Q:Flux 对负向的尊重程度一样吗?
不一样。Flux Dev、Flux Schnell 和 Flux.2 是引导蒸馏模型,默认设置下无视负向。在 Diffusers 里你通过把 true_cfg_scale 设到 1 以上来重新启用它;在 ComfyUI 里你加 sd-dynamic-thresholding 扩展里的 DynamicThresholdingFull 节点。两者都要多花渲染时间,所以对 Flux 很多人干脆跳过负向、改用正向描述想要的结果。
Q:Flux 上的 guidance_scale 和 true_cfg_scale 有什么区别?
guidance_scale 是 Flux 的蒸馏引导值(通常 3-4),不使用负向提示词。true_cfg_scale 是真正的 classifier-free guidance:只有大于 1 时才生效,也只有那时你的 negative_prompt 才真正被应用。如果你设了负向却把 true_cfg_scale 留在 1,它会被静默丢弃。
Q:如果我的模型老出水印,该换成哪个 checkpoint?
要论最深的干净社区微调库和最强的负向响应,留在 SDXL。如果你需要清晰的图内文字或商用授权,Qwen-Image(Apache 2.0)是 2026 年很强的选项。Flux 提示词遵循度领先,但如上所述,它对负向的处理方式不同。