“效果不错,把流程发我一下”
设想一个小团队正在做商品海报。设计同事把一张实拍杯子变成了插画,发进群里。大家觉得方向不错,算法同事接着问:用的哪个模型?图怎么进去的?杯把有没有专门控制?这张能再跑一次吗?
这时,单发一张成图有点不够。再补一张工作流截图,也可能看不清那些缩得很小的参数。最后大家只好挤到一台电脑前,看作者挨个点开节点解释。画面做出来了,做法还留在那个人的电脑上。
ComfyUI 很适合解决这类交接问题。模型、输入、处理步骤和参数,可以组织成一份能保存、能打开、还能继续修改的工作流。对 AI 图像和视频实验团队来说,它可以成为一张共同查看的实验台。
我看重的是这个延续性:创意人员试出一个方向,算法同事能沿着同一套流程检查;算法改了其中一段,创意人员也能拿熟悉的素材验证。每个人都能接着已有的实验往下做,不必从一张效果图重新猜起。
导出的文件里,装着哪些东西?
工作流可以理解为一张可执行的步骤图。节点负责加载模型、处理图像、采样或保存;连线说明数据从哪里来、送到哪里去;节点上的参数决定这一步怎么做。ComfyUI 的工作流说明支持把这张图独立保存成 JSON 文件。
JSON 是一种记录结构化信息的文本格式。交接时不必逐行读它,收件人把文件加载进 ComfyUI,就能重新打开那份流程。用于画布编辑的保存格式还会保留布局、分组等信息,便于继续读图。
但它不会顺手把你硬盘上的模型权重、输入图片和 Python 环境都塞进去。更接近剪辑软件的工程文件:工程知道某段素材放在哪里,发工程时仍然得把素材交代清楚。官方依赖说明也把这些外部文件和运行依赖单独列了出来。
这一区别会直接影响协作。导出成功,说明方案可以传递;接收方能否运行,还要看所需资源是否齐全。下面这张图把两部分放在一起:中间是流程,周围是让它再次运行所需的条件。
工作流文件里组织的方案
- 输入读入素材
检查画幅、尺寸与文件
- 模型与条件确定生成依据
模型、VAE、提示词与参考
- 采样执行这一版方案
Seed、步数、CFG、采样器等
- 输出保存可以检查的结果
解码、保存,并标记对应配置
JSON 保存节点、连线和参数;素材、模型文件及运行环境需要另外交代。
和算法同事,先说清楚改什么
回到那只杯子。如果需求只写“插画感再强一点,产品别变”,两边可能都很努力,却在做不同的事。有人增强了颜色,有人换了模型,有人把杯子的边缘重新画了一遍。交付时才发现,大家对“产品别变”的理解不一样。
我会先把这句话拆开:想增强的是笔触、色块,还是轮廓的概括?不能改变的是杯把方向、杯口形状,还是杯身的标记?这些要先在图上指给对方看。
再把改动落到具体节点上:“这轮先不换模型,只比较 KSampler 里的 denoise。杯把还在不在右边?杯口有没有歪?蓝色圆形还在原位吗?”同事可以沿着同一张图检查,不必猜我说的“差点意思”到底差在哪里。
例子:把这只杯子变成插画
就用下面这只杯子。目标是把摄影质感改成大色块的插画,同时尽量保留杯子的样子。杯口是一圈椭圆,杯把在右边,正面有一个蓝色圆形。先把这三处记住,等会儿看结果就有了落点。
这个例子用基础的 Stable Diffusion 1.5 图生图流程,只需要内置节点,方便把输入、连线和参数讲清楚。先把最基础的流程跑明白,后面更换模型,也能沿用这套对照方法。下载下方的 512×512 输入图,团队选用同一份 SD 1.5 模型,接下来每个人处理的才是同一个问题。
- 1杯口
- 2杯把
- 3蓝色标记
这 8 个节点怎么接
顺着图片走一遍:Load Image 读入杯子,VAE Encode 把像素图转成模型使用的潜空间表示;KSampler 接收它,结合提示词进行采样;VAE Decode 再把结果转回像素图,最后由 Save Image 保存。
旁边还有两路输入:Load Checkpoint 提供 MODEL、CLIP、VAE;两个 CLIP Text Encode 分别把正向、负向提示词转成条件,送给 KSampler。正负提示词用的是同一种节点,只是连接的位置不同。
下面把这 8 个节点重新画开了,名称和端口对应实际流程。点节点可以看它接什么、填什么,以及这一步容易漏掉什么。橙色的 KSampler 是这一轮要改的地方。
点一个节点,下面就会出现它的用法。图可以左右滑动;连线旁的英文是数据类型或输入接口。
#10 Load Image
- 做什么
读入这次要处理的杯子图片。
- 接什么
本地文件 cup.png,512×512 像素。
- 本例设置
点 upload,上传下载的 cup.png。
IMAGE 输出接 #12 VAE Encode 的 pixels。
- 检查什么
预览里应是右侧有杯把、正面有蓝色圆形的杯子。
MASK 输出在本例未连接,没有局部保护区域。
#14 Load Checkpoint
- 做什么
加载同一份 SD 1.5 模型,并提供这条流程使用的三类组件。
- 接什么
本机可用、包含兼容 CLIP 和 VAE 的完整 SD 1.5 checkpoint 文件。
- 本例设置
把 SELECT_YOUR_SD15_CHECKPOINT.safetensors 换成本机实际文件。
MODEL → #3;CLIP → #6、#7;VAE → #12、#8。
- 检查什么
A、B 必须选同一文件;记录文件版本及 SHA-256。
JSON 只有文件名,不包含模型权重。
#12 VAE Encode
- 做什么
把杯子的像素图转成采样器使用的潜空间表示。
- 接什么
pixels:#10 的 IMAGE。
vae:#14 的 VAE。
- 本例设置
LATENT 输出接 #3 的 latent_image。
本例直接处理准备好的 512×512 图,没有额外缩放节点。
- 检查什么
这里必须接杯子图,不是 Empty Latent Image。
编码、解码使用同一条流程中匹配的 VAE。
#6 CLIP Text Encode · 正向
- 做什么
把想要的内容和风格写成采样条件。
- 接什么
clip:#14 的 CLIP。
text:下方参数卡中的完整正向提示词。
- 本例设置
文本描述杯子、插画、大色块与柔和日光。
CONDITIONING 输出接 #3 的 positive。
- 检查什么
A、B 两次不要改提示词。
它提供文本条件,不是对杯形的硬性锁定。
#7 CLIP Text Encode · 负向
- 做什么
把希望减少的内容作为负向条件送入采样。
- 接什么
clip:同一个 #14 的 CLIP。
text:blurry, distorted object, extra handle。
- 本例设置
CONDITIONING 输出接 #3 的 negative。
与正向使用同一种节点,靠连接端口区分用途。
- 检查什么
不要把正负连反。
写了 extra handle 仍要检查结果,不保证不会多出杯把。
#3 KSampler
- 做什么
结合原图潜空间、模型和提示条件,执行这轮采样。
- 接什么
model:#14;positive / negative:#6 / #7。
latent_image:#12 编码后的杯子图。
- 本例设置
seed 424242;自动变化 fixed;steps 20;cfg 7。
sampler euler;scheduler normal。
唯一对照变量:A denoise 0.25 → B denoise 0.55。
- 检查什么
切换 B 时只改 denoise,别同时动其他设置。
核对实际执行的 Seed;fixed 是界面控件,不是 API prompt 的节点输入。
#8 VAE Decode
- 做什么
把采样后的潜空间表示还原成可查看的像素图。
- 接什么
samples:#3 的 LATENT。
vae:#14 的 VAE。
- 本例设置
IMAGE 输出接 #9 Save Image 的 images。
- 检查什么
这里接的是采样后的结果,不是 #12 刚编码的原图。
换模型或 VAE 属于另一轮实验,本轮先固定。
#9 Save Image
- 做什么
把生成结果保存成图片,便于和输入图对照。
- 接什么
images:#8 的 IMAGE。
- 本例设置
先保存 A,再保存 B;文件名与相应工作流对应。
同时保留导出的 A、B 工作流 JSON。
- 检查什么
对照杯口、杯把、蓝色标记,再看插画风格。
保存原始输出文件,别只留聊天软件里的截图。
图中省略了部分界面控件,节点编号与可下载工作流一致。
8 个基础节点已连接;导入后选择本机 SD 1.5 模型,并上传 cup.png。工作流只做过结构核对,尚未运行生成。B 在同一流程中只改 denoise 为 0.55。
只改 denoise,跑两次
先把下载的工作流拖入 ComfyUI。在 Load Checkpoint 里选择本机的 SD 1.5 模型;下载文件里的模型名是占位名,必须改。再到 Load Image 上传 cup.png。模型权重不在 JSON 里,流程文件也不会替你安装模型。
找到编号 #3 的 KSampler:Seed 填 424242,Seed 自动变化方式设为 fixed,步数 20,CFG 7,采样器 euler,调度器 normal。正负提示词照下方填写。这些都是本次对照的固定条件。
A 先用 denoise = 0.25,保存结果和这一版工作流。接着只把同一节点的 denoise 改成 0.55,跑 B,再保存 B 的结果和工作流。不要中途顺手“优化”提示词,否则就不知道差异是哪个改动带来的。
denoise 通常叫重绘强度。在这类基础图生图流程里,较低的值通常较多保留输入图,较高的值允许更大的变化。0.55 不等于改掉 55% 的像素,也不保证更接近插画。图生图的编码、采样顺序可以对照ComfyUI 作者的示例。
下面是待执行的两组参数,可以切换查看。杯子图是准备好的输入,还没有经过这两组配置生成,不能据此判断哪一组更好。
生成后,检查这三处
把原图、A、B 并排放,先别急着挑最漂亮的。对着输入图上圈出的三处,一项一项看。可以像下面这样记录;表中的失败情况是检查举例,不是这次已经跑出的结果。
这三处看完,再看插画目标:杯身是不是出现了更明确的色块,原来的摄影高光是否被概括,背景和主体是不是同一种画风。最好提前放一张团队认可的风格参考在旁边,免得一个人在找扁平插画,另一个人在找油画笔触。
假如 B 的色块更明显,却把杯把改坏了,可以写:“风格方向更接近,杯把不合格。”这条记录会比“B 更好,继续调”有用。下一轮就有具体的问题:是回调 denoise,还是增加结构条件,或者保留产品再处理背景?一次只验证一种改法。
还要提醒一句:这张图没有连遮罩,三个标记只是看图用的,不会替模型锁住杯子。负向提示词里的 extra handle 也只是一项条件,不能保证绝不多长一个杯把。若蓝色标记换成真实商品 Logo,这条基础流程不保证它原样保留。
固定一个 Seed 只能帮助比较这一次。初步找到方向后,再预先选几组种子,让 A、B 用同一组种子逐对测试;也要换几只杯子,看看换了形状和背景还能不能用。保存所有结果,才知道方法哪里可靠、哪里容易出错。
| 检查位置 | 具体看什么 | 出现这些情况就记下来 |
|---|---|---|
| ① 杯口 | 椭圆轮廓、前后边缘和咖啡液面 | 杯口歪斜;轮廓断开;杯沿与液面混在一起 |
| ② 杯把 | 是否仍在右侧;上下连接点是否合理 | 多出一个杯把;杯把换边;和杯身断开 |
| ③ 蓝色标记 | 颜色、基本形状及在杯身的位置 | 消失;移位;被改成其他图案或文字 |
左右滑动查看完整表格
对照表
发给同事哪些文件
这轮做完,我会建一个“杯子插画化-v01”文件夹。工作流、输入和结果放一起,A 对应 A,B 对应 B,别让同事在十张“最终版”里找答案。
模型太大,可以不反复复制,但要写明下载位置、版本和文件哈希。哈希是根据文件内容计算的校验值,用来判断两个人拿到的是不是同一份文件。只写一个模型昵称,或者说“就那个最新版”,都不够明确。
环境也写实际使用的版本:ComfyUI、前端、PyTorch、设备及计算精度。本例使用基础节点;如果后来加了自定义节点,再补上仓库与版本。不要让接收方为了打开这次实验,先把所有东西都更新一遍。
下面这份记录已经填入杯子图片的校验值、下载工作流的文件名,以及 A、B 的计划参数。实际模型、环境和生成结果仍需运行后补充。这是交接记录,不是另一个能拖进 ComfyUI 的工作流。
| 文件 | 里面放什么 |
|---|---|
| cup.png | 本轮使用的输入图,保留原文件 |
| cup-A.workflow.json / cup-B.workflow.json | 实际运行时的两份画布,分别保存 denoise 0.25 和 0.55 |
| result-A.png / result-B.png | 两组生成结果;图片与对应工作流一一匹配 |
| experiment-record.json | 模型和环境、实际 Seed、三处细节的观察、下一步改什么 |
左右滑动查看完整表格
对照表
两种 JSON 怎么导出
如果对方要在画布上读图、改节点,就从 File → Export 导出保留布局的普通工作流 JSON。在当前前端的菜单定义中,保存到工作区和下载导出文件是不同的操作,单点 Save 不等于已经拿到可发送的本地文件。不同版本的菜单文字可能有差别,交接时确认下载得到的是那份工作流即可。
如果算法或开发同事要通过程序调用,则使用 File → Export (API)。这种 JSON 面向执行,保留节点输入及关系,不带画布位置、分组等编辑布局信息。两种格式的文件后缀都可能是 .json,交接时最好在文件名里区分。具体入口与用途可对照官方 API 格式说明。
例如,把供人继续编辑的文件叫 cup-style.workflow.json,把供程序接入的文件叫 cup-style.api.json。它们对应同一轮方案;修改后重新导出,避免画布上已经换了参数,程序还在跑上周那份。
还可以利用输出文件里的工作流元数据:在保存节点和相关设置支持、元数据也保留完整时,把输出文件拖回画布,可以恢复所附的工作流。但聊天截图不是原文件,转码或平台处理也可能让附带信息丢失。正式交接时,我会把原始输出和同轮 JSON 放在一起。
同事拿到后怎么检查
同事收到文件后,先照记录跑 A:加载 A 的工作流,选对模型,上传同一张 cup.png,确认 KSampler 的 denoise 是 0.25、Seed 是 424242,自动变化方式是 fixed。先别换风格、别加节点,把原方案跑通再说。
如果界面报错,就按缺少的模型、素材或节点去查。如果能生成,但杯子差别很大,就逐项对照实际输入、模型文件、正负提示词、Seed 和采样参数。也要看看是不是误载了 B 的流程。文件名写清楚,确实能省掉这种尴尬。
参数相同也不等于跨机器一定逐像素相同。PyTorch 的复现说明指出,跨版本、平台或设备不能保证完全一致。团队要先约好,是核对这套方案能否重复运行、关键形状是否符合要求,还是必须输出完全相同的像素;后一种要求对环境的核对更严格。
A 核对好以后,再只改 denoise 跑 B。若算法同事想加入结构控制,就另存一个 C 方案,说明新增了哪些节点、模型和输入。这样再看结果,大家知道这一轮究竟动了哪里。
等到准备把流程接进正式产品,再讨论队列如何配置、失败任务怎么处理,以及算力成本能否接受。ComfyUI 本身已有队列和基础输入校验,API 导出方便程序接入;具体产品还需要哪些能力,要按实际需求补齐。
小结
这只杯子的实验,最后应该留下四样东西:输入图、A/B 工作流、对应结果,以及一份记录。记录里说明只改了 denoise,并把杯口、杯把、蓝色标记的变化写清楚。
我觉得 ComfyUI 在团队里好用,就好用在这里。设计同事可以指着图说哪一处不能变,算法同事可以指着节点说准备怎么改。发文件时多留下这些具体信息,下一位同事打开后,就知道先跑哪一份、到哪里改、拿什么判断结果。