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

你写了'no text, no watermark, no extra fingers',结果三样都还在——负向提示词要么没接进去,要么太长,要么在和过度训练的概念硬刚。靠消融法定位。

你在负向提示词里仔细列了”blurry, low quality, text, watermark, extra fingers, deformed hands, jpeg artifacts”。出图回来 T 恤上有字,角落里隐约有水印,手是六根指头。看起来负向提示词被丢掉了。有时候确实丢了——API 客户端就没传过去。但更常见的是:模型在解析它,只是你要否定的概念在底模权重里太牢固,或在你的正向提示词里被反向召唤了,负向推不动。把负向提示词当成众多工具之一,不要当万能橡皮擦。

常见原因

按真实管线里的出现频率排序。

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 的 token 上限是 77(约 60 词)。过长的负向被切断在某个 token 中间。77 之后的 token 被静默丢弃——可能恰好包含你最在意的那个概念。

如何识别:用 CLIP tokenizer 数 token 数。如果 > 77 就尾巴被吃了。

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 的问题。

开始前准备

  • 保留一张”坏图”,记下确切的正向 + 负向字符串和所有参数。
  • 确认你用的 API 或 UI 是否支持负向提示词(一些基础服务商不支持)。
  • 决定哪个不想要的元素最重要——一次一个比同时干掉所有要快。

需要收集的信息

  • 完整正向和负向提示词字符串(从请求日志里复制,不要靠记忆)。
  • CFG、采样器、模型名、模型版本。
  • 两段提示词的 token 数(用 CLIP tokenizer)。
  • 你跑的是 base only、refiner only 还是双阶段。
  • 你的客户端用的具体字段名(negative_prompt 还是 neg_prompt 还是其它)。

一步步修复

按 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 以下

顺序有讲究——把最重要的拒绝放最前。77 之后的 token 被丢弃。

负向:text, watermark, extra fingers, deformed hands, blurry, low quality

像”ugly”、“bad”、“weird”这种低价值通用词砍掉,它们少有帮助还挤掉具体 token。

步骤 5:用平台正确的权重语法

AUTOMATIC1111 / ComfyUI / InvokeAI:

(watermark:1.5), (text:1.4), (extra fingers:1.3), blurry, deformed

原生 Diffusers 想要权重要靠 compelprompt-weighting 中间件。没有这些中间件,括号就是噪声。

步骤 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——默认空就会把坏内容加回来。

验证

  • 用修正后的提示词出 4 张一组的图。不想要的元素应该在 4 张里都不见或很罕见。
  • 把负向清空再出图,确认不想要的元素回来了。证明负向是有用的。
  • 跑一组极端配置(CFG 12、最大权重)确认模型能彻底压制该元素——你不会用这个配置出片,但能证明杠杆有效。

长期预防

  • 为每个 checkpoint 维护一套测试过的负向词库。在 SDXL base 上有用的,到 Flux 上不一定有用。
  • 把正向 + 负向 + CFG + 采样器 + checkpoint 一起记日志。负向失效时,可以从已知好配置二分定位。
  • 先修正向。负向是修正器不是改写器。
  • 负向控制在 60 token 内;最关键的拒绝放进前 20 个 token。
  • 自定义管线里在 CI 里校验请求体——断言 negative_prompt 存在且非空。
  • 换 checkpoint 版本后重新测试你的负向词库。

常见坑

  • 把负向当愿望清单,塞 200 词。尾巴会被丢弃。
  • 在负向里写”no text”——模型把”no”和”text”当独立概念,“text”才是被注册的那个。直接写你拒绝的概念。
  • 在不解析 AUTOMATIC1111 权重语法的原生 Diffusers 脚本里用了那套语法。
  • 忘了托管服务商可能去掉或重映射字段。查文档。
  • CFG 拉到 15+ 暴力压制——出图会过焦寡淡。不如修正向或换 checkpoint。
  • 以为负向能修一切。结构性问题用 参考图 或 ControlNet,负向修不了。

FAQ

Q:是不是该默认就用一长串负向?

不。从论坛抄来的默认负向常常自相矛盾或浪费 token。用一个简短、针对你 checkpoint 实际问题的负向。

Q:我的正向很短很干净,模型还是会加字。怎么办?

试不同的 checkpoint。一些写实微调把水印 / 字深度烙在模型里,没有负向能完全去掉。

Q:能给负向写个正则或模板吗?

把负向当 checklist:按 checkpoint、按风格。没有通用正则。保存 3-4 个命名 preset(“portrait-clean”、“product-clean”、“anime-clean”)复用。

Q:Flux 对负向的尊重程度一样吗?

Flux 和负向的关系是另一回事——很多 Flux 变体完全无视它。改用正向和 CFG 调节,或换文档明确支持负向的模型。

相关阅读

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