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

COMFYUI / 把实验方案交给下一位同事

把 ComfyUI 工作流发给同事,然后呢?

一份可导出的工作流,怎样变成团队能讨论、验证和复现的实验方案。以一张咖啡杯商品图为例,聊聊创意人员怎样和算法同事对齐。

约 11 分钟阅读
本文目录11 节

“效果不错,把流程发我一下”

设想一个小团队正在做商品海报。设计同事把一张实拍杯子变成了插画,发进群里。大家觉得方向不错,算法同事接着问:用的哪个模型?图怎么进去的?杯把有没有专门控制?这张能再跑一次吗?

这时,单发一张成图有点不够。再补一张工作流截图,也可能看不清那些缩得很小的参数。最后大家只好挤到一台电脑前,看作者挨个点开节点解释。画面做出来了,做法还留在那个人的电脑上。

ComfyUI 很适合解决这类交接问题。模型、输入、处理步骤和参数,可以组织成一份能保存、能打开、还能继续修改的工作流。对 AI 图像和视频实验团队来说,它可以成为一张共同查看的实验台。

我看重的是这个延续性:创意人员试出一个方向,算法同事能沿着同一套流程检查;算法改了其中一段,创意人员也能拿熟悉的素材验证。每个人都能接着已有的实验往下做,不必从一张效果图重新猜起。

导出的文件里,装着哪些东西?

工作流可以理解为一张可执行的步骤图。节点负责加载模型、处理图像、采样或保存;连线说明数据从哪里来、送到哪里去;节点上的参数决定这一步怎么做。ComfyUI 的工作流说明支持把这张图独立保存成 JSON 文件。

JSON 是一种记录结构化信息的文本格式。交接时不必逐行读它,收件人把文件加载进 ComfyUI,就能重新打开那份流程。用于画布编辑的保存格式还会保留布局、分组等信息,便于继续读图。

但它不会顺手把你硬盘上的模型权重、输入图片和 Python 环境都塞进去。更接近剪辑软件的工程文件:工程知道某段素材放在哪里,发工程时仍然得把素材交代清楚。官方依赖说明也把这些外部文件和运行依赖单独列了出来。

这一区别会直接影响协作。导出成功,说明方案可以传递;接收方能否运行,还要看所需资源是否齐全。下面这张图把两部分放在一起:中间是流程,周围是让它再次运行所需的条件。

流程示意工作流保存做法,附件补齐执行条件

工作流文件里组织的方案

  1. 输入读入素材

    检查画幅、尺寸与文件

  2. 模型与条件确定生成依据

    模型、VAE、提示词与参考

  3. 采样执行这一版方案

    Seed、步数、CFG、采样器等

  4. 输出保存可以检查的结果

    解码、保存,并标记对应配置

一起交接的复现附件把执行条件补齐
  • 素材输入文件与预处理

    记录裁切、缩放及文件标识

  • 模型名称之外还要可定位

    版本、来源与文件校验值

  • 节点与环境把运行条件写清楚

    ComfyUI、自定义节点与依赖版本

  • 结果记录保留观察与选择理由

    哪一版配置、什么现象、下一步做什么

JSON 保存节点、连线和参数;素材、模型文件及运行环境需要另外交代。

和算法同事,先说清楚改什么

回到那只杯子。如果需求只写“插画感再强一点,产品别变”,两边可能都很努力,却在做不同的事。有人增强了颜色,有人换了模型,有人把杯子的边缘重新画了一遍。交付时才发现,大家对“产品别变”的理解不一样。

我会先把这句话拆开:想增强的是笔触、色块,还是轮廓的概括?不能改变的是杯把方向、杯口形状,还是杯身的标记?这些要先在图上指给对方看。

再把改动落到具体节点上:“这轮先不换模型,只比较 KSampler 里的 denoise。杯把还在不在右边?杯口有没有歪?蓝色圆形还在原位吗?”同事可以沿着同一张图检查,不必猜我说的“差点意思”到底差在哪里。

例子:把这只杯子变成插画

就用下面这只杯子。目标是把摄影质感改成大色块的插画,同时尽量保留杯子的样子。杯口是一圈椭圆,杯把在右边,正面有一个蓝色圆形。先把这三处记住,等会儿看结果就有了落点。

这个例子用基础的 Stable Diffusion 1.5 图生图流程,只需要内置节点,方便把输入、连线和参数讲清楚。先把最基础的流程跑明白,后面更换模型,也能沿用这套对照方法。下载下方的 512×512 输入图,团队选用同一份 SD 1.5 模型,接下来每个人处理的才是同一个问题。

  1. 1杯口
  2. 2杯把
  3. 3蓝色标记
AI 生成的教学输入图。标记用于对照生成结果,不是传给模型的遮罩或控制条件。下载教学输入图片 PNG ↓

这 8 个节点怎么接

顺着图片走一遍:Load Image 读入杯子,VAE Encode 把像素图转成模型使用的潜空间表示;KSampler 接收它,结合提示词进行采样;VAE Decode 再把结果转回像素图,最后由 Save Image 保存。

旁边还有两路输入:Load Checkpoint 提供 MODEL、CLIP、VAE;两个 CLIP Text Encode 分别把正向、负向提示词转成条件,送给 KSampler。正负提示词用的是同一种节点,只是连接的位置不同。

下面把这 8 个节点重新画开了,名称和端口对应实际流程。点节点可以看它接什么、填什么,以及这一步容易漏掉什么。橙色的 KSampler 是这一轮要改的地方。

图生图 · 节点连线一张杯子图片,经过这 8 个节点

点一个节点,下面就会出现它的用法。图可以左右滑动;连线旁的英文是数据类型或输入接口。

#10 IMAGE → #12 pixels#14 VAE → #12 vae#14 VAE → #8 vae#14 MODEL → #3 model#14 CLIP → #6 clip#14 CLIP → #7 clip#6 CONDITIONING → #3 positive#7 CONDITIONING → #3 negative#12 LATENT → #3 latent_image#3 LATENT → #8 samples#8 IMAGE → #9 images

#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 个基础节点已连接;导入后选择本机 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 在团队里好用,就好用在这里。设计同事可以指着图说哪一处不能变,算法同事可以指着节点说准备怎么改。发文件时多留下这些具体信息,下一位同事打开后,就知道先跑哪一份、到哪里改、拿什么判断结果。

案例输入图片