第一次打开 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 的推理录像。
把两个方向分开看
原理演示 · 不运行模型拖动滑块查看;没有调用模型。
演示底图来自本地既有 SD1.5 输出,已核对 PNG 内嵌工作流;不作为这组 SD3.5 参数的生成结果。 动画只说明方向;反向展示会回到已知底图,真实模型并没有这张答案。
多看一层:SD3.5 与早期扩散模型有何不同?
早期 DDPM 用加噪过程与学习到的反向过程建立生成方法;LDM 则把主要生成运算放进潜空间,也就是图像的一种压缩表示。最后的 VAE Decode,把生成出的潜表示转换成我们能看的像素图。
SD3/SD3.5 采用 MMDiT 与 rectified flow(整流流)路线。这里的网络学习状态如何沿生成方向变化,不能简单套成“所有模型都用 UNet 猜噪点”。下式表达的是数据与噪声的线性混合路径;实际生成时,需要用学到的速度场推进。
演示把这种混合画在 RGB 图片上,便于观察;真实 SD3.5 主要在潜空间运算。把本页动画倒放只能还原已知底图,模型推理则是在生成一个新的样本。
z₀ 是图像的潜表示,ε 是随机噪声,t 表示混合的位置。
再回到工作流:Empty SD3 Latent Image 主要确定这次生成的潜表示尺寸与批量大小;KSampler 根据 Seed 准备初始随机噪声,再调用模型推进采样。最后经过 VAE 解码,才得到图片。
04 / KSampler 上,先分清三个数字
下面这张也是实际界面的截图,已经把 Seed 改成 42,生成后控制设为 fixed。三个数字分别管起点、更新次数和条件引导,改变它们的理由并不一样。
Seed:随机过程的起点
Seed 是初始化随机过程的整数。在这套本地工作流里,它决定初始噪声怎样产生。前面的演示可以换 Seed 看噪声分布,再填回 42,观察相同的噪声起点回来。 本页使用的随机数算法只供演示,不对应 ComfyUI 相同 Seed 实际产生的噪声。
做提示词对比时,我会先把生成后控制改为 fixed,再固定模型、尺寸、采样器等条件,只改一句提示词。否则即使 Seed 框里刚填好了数字,randomize 也会让下一次运行换一个起点。
同一个 Seed 不负责锁定人物身份。更换模型、精度、尺寸、节点或软硬件环境后,也不能指望那个数字单独保证完全复现。
Steps:把生成过程分成多少次更新
Steps 是采样步数。这次选用 euler,20 步可以理解为沿着生成过程推进 20 次。它是一次生成里的计算步骤,不是让模型重新训练 20 次。
拖动下面的步数,看看一条路径被分成多少段。步数增加通常意味着更多计算,但不能据此保证画面一直变好。把 20 改成 40,也不等于照片清晰度翻倍。
这张图只表达离散步进的含义,曲线本身始终不变。实际采样的数值误差会受步数和算法影响;不同采样器,一步的计算成本也未必相同。
CFG:把文字条件的影响放大多少
CFG 是 Classifier-Free Guidance,通常译为无分类器引导。可以先理解为:比较“按正向条件预测的方向”和“对照方向”,再把两者的差异乘上一个系数。
假设模型对“瓶中星系”的条件给出了一个不同的更新方向,CFG 会放大这种差异。它不是“有百分之多少听提示词”的开关,也不是越大越好;引导过强可能损失自然度、让颜色或细节变得生硬。
这里画的是向量关系,不是画质评测。常规两路 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 字段,也不能直接把它解释成这节课里的本地噪声控制。
理解这一课,不需要背下每个参数的最佳值。下一次想改图时,能先说清自己要改变的是画面内容、随机起点、采样过程还是引导强度,再只动对应的一项,就已经可以开始有根据地比较了。