跳到正文
Kwei 个人主页作品集 project library

COMFYUI × STABLE DIFFUSION

在 ComfyUI 里,
看懂一张图怎么生成

从真实界面出发,把提示词、Seed、步数和 CFG 放回它们各自起作用的位置。

8 分钟阅读真实截图 · 可交互
真实 Mac 窗口截图。官方工作流经过课堂排布;模型红框表示本机缺少对应权重。本次未执行 SD3.5 生图。

点一个名称,在真实截图中找到它。点图可以查看完整窗口。

本文目录06

第一次打开 ComfyUI,容易被一画布的方框和连线挡住。Seed、Steps、CFG 都能改,但如果只是记住别人给的数字,换一个工作流,还是不知道从哪里下手。

这一课就沿着一张图片的生成过程往下看。我们用一个简单的题目:木桌上放着透明玻璃瓶,瓶子里有粉红色和红色的星系。先找到内容在哪里写,再看噪声从哪里来,最后弄清采样器上的几个数字。

01 / 先在界面里找到这条路线

ComfyUI 是搭建和运行工作流的工具,SD3.5 是它可以调用的模型。模型包含网络结构和训练得到的参数;它在训练中学到图像与文字之间的规律,生成时用这些能力处理当前输入。

页首是我这台 Mac 上的真实 Comfy Desktop 界面。导入的是官方 SD3.5 Large FP8 一体模型工作流,并为这堂课重新排了节点、改了提示词和 Seed。点击截图下方的名称,可以在截图上找到对应位置。

左上的红框还有一层意思:这台机器没有对应的 SD3.5 权重,工作流能打开,模型还不能运行。界面、工作流、模型文件,是三样需要配齐的东西。这里展示参数位置,没有运行这份 SD3.5 工作流。

02 / 提示词先变成条件,再参与生成

正向提示词,描述想让画面里出现什么。这次我把“玻璃瓶、木桌、瓶中星系、柔和侧光”写进 Positive Prompt。文本编码器会把这段话转成模型能用的表示,再送到采样器。

负向提示词,给生成过程提供一个要远离的对照方向。比如在 Negative Prompt 里写 text, watermark,表示希望减少额外文字和水印。它会影响采样时的引导,不能保证画面里绝对没有这些内容,也不会在出图后自动执行一次擦除。

两个框都通过连线进入 KSampler。这样再看提示词,就能理解:它们在生成过程中参与判断,不是写完之后贴在图片上的说明。具体影响有多强,还要和后面讲的 CFG 一起看。

03 / 为什么从噪声开始,也能得到图像?

理解扩散模型,可以先看两个方向。正向加噪,是把已知图片与随机噪声混合,构造训练用的题目。模型见过大量图片及不同噪声程度的版本,训练的目标是学会在这些状态之间如何更新。

反向生成,是让训练后的模型从噪声出发,逐步形成符合条件的图像。早期扩散模型常把这称为反向去噪过程。每一步都要根据当前状态、时间位置和文字条件估计下一步怎样走。生成时没有一张“正确答案图片”藏在噪声后面,等着被擦干净。

拖动下面的滑块,先看图片怎样被噪声淹没;再看相反的方向。为了让变化容易看见,演示用了已有的瓶子图作底图。它只帮助理解方向,不是 SD3.5 的推理录像。

把两个方向分开看

原理演示 · 不运行模型
这里用画布演示图片与噪声的混合。
t = 0 · 已知底图t = 1 · 噪声
噪声混合系数 t = 0.55

拖动滑块查看;没有调用模型。

演示底图来自本地既有 SD1.5 输出,已核对 PNG 内嵌工作流;不作为这组 SD3.5 参数的生成结果。 动画只说明方向;反向展示会回到已知底图,真实模型并没有这张答案。

多看一层:SD3.5 与早期扩散模型有何不同?

早期 DDPM 用加噪过程与学习到的反向过程建立生成方法;LDM 则把主要生成运算放进潜空间,也就是图像的一种压缩表示。最后的 VAE Decode,把生成出的潜表示转换成我们能看的像素图。

SD3/SD3.5 采用 MMDiT 与 rectified flow(整流流)路线。这里的网络学习状态如何沿生成方向变化,不能简单套成“所有模型都用 UNet 猜噪点”。下式表达的是数据与噪声的线性混合路径;实际生成时,需要用学到的速度场推进。

演示把这种混合画在 RGB 图片上,便于观察;真实 SD3.5 主要在潜空间运算。把本页动画倒放只能还原已知底图,模型推理则是在生成一个新的样本。

zₜ = (1 − t) z₀ + t ε

z₀ 是图像的潜表示,ε 是随机噪声,t 表示混合的位置。

再回到工作流:Empty SD3 Latent Image 主要确定这次生成的潜表示尺寸与批量大小;KSampler 根据 Seed 准备初始随机噪声,再调用模型推进采样。最后经过 VAE 解码,才得到图片。

04 / KSampler 上,先分清三个数字

下面这张也是实际界面的截图,已经把 Seed 改成 42,生成后控制设为 fixed。三个数字分别管起点、更新次数和条件引导,改变它们的理由并不一样。

起点 / 次数 / 引导真实窗口中的参数区域,可点图查看完整截图。Seed 和提示词已在界面中修改,未运行生成。Seed 42 · fixed · 20 步 · CFG 显示 4.0

Seed:随机过程的起点

Seed 是初始化随机过程的整数。在这套本地工作流里,它决定初始噪声怎样产生。前面的演示可以换 Seed 看噪声分布,再填回 42,观察相同的噪声起点回来。 本页使用的随机数算法只供演示,不对应 ComfyUI 相同 Seed 实际产生的噪声。

做提示词对比时,我会先把生成后控制改为 fixed,再固定模型、尺寸、采样器等条件,只改一句提示词。否则即使 Seed 框里刚填好了数字,randomize 也会让下一次运行换一个起点。

同一个 Seed 不负责锁定人物身份。更换模型、精度、尺寸、节点或软硬件环境后,也不能指望那个数字单独保证完全复现。

Steps:把生成过程分成多少次更新

Steps 是采样步数。这次选用 euler,20 步可以理解为沿着生成过程推进 20 次。它是一次生成里的计算步骤,不是让模型重新训练 20 次。

拖动下面的步数,看看一条路径被分成多少段。步数增加通常意味着更多计算,但不能据此保证画面一直变好。把 20 改成 40,也不等于照片清晰度翻倍。

20

这张图只表达离散步进的含义,曲线本身始终不变。实际采样的数值误差会受步数和算法影响;不同采样器,一步的计算成本也未必相同。

CFG:把文字条件的影响放大多少

CFG 是 Classifier-Free Guidance,通常译为无分类器引导。可以先理解为:比较“按正向条件预测的方向”和“对照方向”,再把两者的差异乘上一个系数。

假设模型对“瓶中星系”的条件给出了一个不同的更新方向,CFG 会放大这种差异。它不是“有百分之多少听提示词”的开关,也不是越大越好;引导过强可能损失自然度、让颜色或细节变得生硬。

4.0

这里画的是向量关系,不是画质评测。常规两路 CFG 中,即使负面框为空,也会由空文本构造对照条件;CFG 为 1 时通常跳过这一路,直接使用正向预测。因此,CFG=1 仍然有正向条件,并不等于忽略提示词。

05 / 另外三个选项,先记住各自管什么

同一个采样器里,还有 sampler、scheduler 和 denoise。把它们分开理解,遇到问题时才知道该动哪一个。

界面上的名字它负责什么这堂课怎样处理
sampler / 采样器按什么数值算法更新当前状态。保持 euler,先不同时换算法。
scheduler / 调度器安排采样经过哪些噪声或时间位置。保持 sgm_uniform。
denoise / 降噪影响实际使用的噪声日程范围。图生图时,较低值通常保留更多输入结构。本次纯文生图取 1。0.5 不是“只改一半像素”。

这里用的是 SD3.5 Large FP8 示例。Large Turbo 是另一种经过蒸馏的版本,所需步数与引导设置会不同。换模型时,要一起看它对应的工作流;不要把一组数字当成所有模型的通用配方。

06 / 把理解变成一次能检查的操作

这次可以先不追求做出复杂画面,只验证一个问题:提示词中的一个变化,能不能在图片里看出来。准备好模型后,先用固定 Seed 跑一次,再只修改“侧光”的描述;把两次提示词和结果一起保存。

页面里的 Seed、Steps 和 CFG 控件,会同步到下面的工作流下载中。你可以改写正负提示词,保存 JSON,再导入自己的 ComfyUI。噪声滑块只是原理演示,不会被误写成 denoise 参数。

带走当前设置

下载的是 JSON,不会启动生成。导入 ComfyUI 后,需要准备对应的 SD3.5 Large FP8 模型。工作流许可随文件说明一起保留。

换成 Nano Banana Pro 时,界面会不同。它在 ComfyUI 中通过远程 API 节点调用,不是接到 KSampler 上的 SD checkpoint。官方节点没有独立的负面提示词、Steps、CFG 或 denoise 输入;即使看到 Seed 字段,也不能直接把它解释成这节课里的本地噪声控制。

理解这一课,不需要背下每个参数的最佳值。下一次想改图时,能先说清自己要改变的是画面内容、随机起点、采样过程还是引导强度,再只动对应的一项,就已经可以开始有根据地比较了。