你在负向提示词里仔细列了”blurry, low quality, text, watermark, extra fingers, deformed hands, jpeg artifacts”。出图回来 T 恤上有字,角落里隐约有水印,手是六根指头。看起来负向提示词被丢掉了。有时候确实丢了——API 客户端就没传过去。但更常见的是:模型在解析它,只是你要否定的概念在底模权重里太牢固,或在你的正向提示词里被反向召唤了,负向推不动。把负向提示词当成众多工具之一,不要当万能橡皮擦。
常见原因
按真实管线里的出现频率排序。
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 的 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 想要权重要靠 compel 或 prompt-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 调节,或换文档明确支持负向的模型。