AI 图像负向提示词无效:排查与修复

负向里写了 'text, watermark, extra fingers',结果三样都还在?通常是七个原因之一:没接进去、CFG 太低、被正向反向召唤、超过 75 token 被截断、权重语法不对、checkpoint 过度训练,或者你用的是天生无视负向的 Flux 模型。

你在负向提示词里仔细列了 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_promptneg_promptunconditional_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

uglybadweird 这种低价值通用词砍掉,它们少有帮助还挤掉具体 token。

如果你在 AUTOMATIC1111、Forge 或 ComfyUI 里确实需要长负向,用大写的 BREAK 关键字开启一个全新的 75 token 分块、把相关的拒绝项分组,比如 text, watermark BREAK extra fingers, deformed handsBREAK 必须大写;小写的 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 月,你有三个办法,按推荐程度排序:

  1. 在 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 管线文档

  2. 在 ComfyUI 里安装 sd-dynamic-thresholding,在 Flux 模型和 KSampler 之间加一个 DynamicThresholdingFull 节点。这样你就能把 CFG 推到 1 以上并传入真正的负向。效果时好时坏,渲染时间大约翻倍,但确实能用。

  3. 干脆不用负向,改用正向描述。 这通常是更好的 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——模型把 notext 当独立概念,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_scaletrue_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 提示词遵循度领先,但如上所述,它对负向的处理方式不同。

相关阅读

标签: #排查 #ai-image #negative-prompt #Prompt 工程 #diffusion