AI工作流的典型:ComfyUI的超简单理解
ComfyUI相对算是个特化的AI应用,比较针对文生图、图生图、图生视频领域。内核上来说是一个AI工作流应用,对比其它同内核产品来说,已经达到了我对现阶段AI工作流应用的预期:即简单易学、使用方便、产出有效(还有Dify也挺好)。但还是之前提到的那句话,目前为止都是在用工作流、Agent之类的概念去临时解决AI模型过于通用的问题,个人预测后续此类应用会越来越多,并且逐渐普及并诞生更多特化型的AI应用。我们现在也可以通过这类产品去更容易的理解AI,便于我们以后进入“伴生AI”(个人感觉AI个人应用层面的终点概念,再聊)的时代。

绝大多数人对ComfyUI的了解可能是图生视频了,就产出的结果上来说,虽然AI还无法做到长时间、复杂运动场景视频的连贯性,但是在短视频领域已经基本上到了一个难辨真假的地步。
本文中部分翻译与原文有不同,我尽量避免有AI领域的术语,去简单解读解读一下ComfyUI相关的概念,基本上也适用于其它AI工作流应用。
一、基本概念
Workflow工作流
● Workflow是由Node节点和节点间的Link连接组成的、能完整处理输入和输出的数据处理流程;
● 我们可以简单的把工作流理解为一个完整的程序;
● ComfyUI提供了可视化编辑工作流的功能,这也是扣子等其它AI工作流应用类似的地方,但ComfyUI的可视化做的更简洁、有效。你可能也在其它领域中见过此类功能,比如虚幻引擎的蓝图(一个功能强大的可视化开发插件);
● 当然你也可以将一段工作流打包为可复用的节点,供其它工作流调用;
Node节点
概念
● 在ComfyUI中,节点是最基础的执行单元,每个节点可以负责执行不同的数据处理任务。执行的任务是由节点的类型决定的,Comfy内置有大多需要用到的节点类型,同时也支持自定义节点;
● 节点通过Link连接到另一个节点,多个节点连接就组成了工作流;
● 节点一般情况下需要设定输入、输出、属性才能正常运行;
● 节点一般是一段对输入进行数据处理的Python代码;
Input/Output输入输出类型
● Model,即Diffusion Model扩散模型,节点使用的扩散模型:
○ 生成图像时的一种技术方法,简单来说是通过逐步添加随机噪声,然后再逐步根据模型训练结果去除,实现从噪声到高保真数据的生成;
○ 当年最出名的Stable Diffusion、以及后来的DALL-E 3等模型,都属于这一类;
● CLIP,即CLIP Model对比语言-图像预训练模型(Contrastive Language-Image Pre-training Model),节点使用的CLIP模型:
○ 作用是输入图像输出文本解释、或输入文本输出匹配的图像;
○ 通过大规模的图文配对数据训练达成对齐文本与图像特征的结果;
○ 我们的自然语言文字输入、以及Prompt提示词一般会给CLIP Model作为数据使用;
● VAE,即VAE Model变分自编码器(Variational Autoencoder):
○ 作用是编码和解码,提取图片或数据的低维特征、或者根据低维特征生成图片或数据;
○ 一般图像生成的最后一步是通过VAE解码。如果需要ComfyUI生成类似风格的图像,则输入的图像需要先通过VAE编码;
● Latent,即Latent image潜影:
○ 源自摄影领域的说法,在AI领域里,指的是图像经VAE编码后的数据、或者用来输入到VAE进行生成图像的数据;
○ 在生图的工作流中,Latent image就是解码前的最终结果了;
● Image,即Pixel image像素图像:
○ 就是常规上说的图像;
● Mask,即遮罩:
○ 一般是与原图大小、尺寸一致的黑白图像;
○ 通过像素点的黑白灰,定义哪些区域需要被处理;
○ 一般情况下白色标识需要修改、黑色标识完全不修改、灰色标识需要处理边缘的过渡;
○ 作用是在二维层面限制模型的操作范围,避免修改掉不想要模型修改的部分;
● Mesh,即网格:
○ 一般是由Vertice点、Edge边、Face面组成的三维几何结构;
○ 举例说明就是人体的骨架结构,可以通过摆出姿势,使最后图像符合想要的姿势;
○ 作用是定义形状、姿态,使模型生成符合三维空间结构的图像;
● Conditioning,条件型:
○ 一般分为Positive积极、Negative消极;
○ Positive代表的是节点必须处理的内容;
○ Negative代表的是节点必须避免的内容;
○ 通过条件的设定可以规范节点的输出;
● Number,数值:
○ 整数或浮点型的数值;
Status节点状态
● Normal正常:节点正常的状态;
● Running运行中:节点在执行时的状态,节点外框会显示绿色;
● Error异常:节点执行失败的状态,一般情况下是由于输入不正确导致的,节点外框会显示红色,同时不正确的输入会标红;
● Missing缺失:节点不存在,一般只会在导入时,因为没有安装相应的自定义节点而出现;
Mode模式
● 执行模式,决定了节点的执行方式:
○ Always:正常执行;
○ Never:不执行,节点不会执行,也不会进行任何输出;
○ Bypass:绕过执行,节点不会执行,会将输入原样不动的输出;
○ OnEvent:目前没有开放,按经验来看,后续会增加Event事件通知执行;
○ OnTrigger:目前没有开放,按经验来看,后续会增加满足条件后Trigger触发执行;
Property属性
● Property可以简单理解为节点的参数,使用来调节、或配置节点对输入数据的处理方式;
● 属性是类型敏感的,这意味着不同数据类型间必须经过转换才能使用;
● 属性可以有不同的输入模式:
○ Widget Mode组件模式:此模式下,属性值手动输入;
○ InputMode输入模式:此模式下,属性值会作为节点的一个输入项处理,此时需要用Link连接一个输出。一般情况下为保证前后属性一致,会用输入模式处理公共属性;
Custom Node自定义节点
● 除了ComfyUI自带的内置节点外,也可以通过ComfyUIManager、Git、手动安装等方式引入外部自定义节点;
● 正常推荐通过内置的ComfyUIManager安装,便于使用;
Link连接
● 节点之间通过Link连接;
● Link代表了数据的传输,所以一个连接的起点和终点是同一种类型,即一个节点的一个输出,连接到另一个节点的一个相同类型的输入;
● 如果工作流体量较大,导致连接间交叉、重叠,也可以使用Reroute创建小的连接的断点,方便组织工作流的可视化;
Model模型
● Comfy中,可以通过ComfyUIManager安装多种多样的模型,这也是最容易理解和操作的方式;
● Comfy中也支持安装自己的模型,这个就多种多样了,这里不赘述;
● 一般情况下可以在工作流中,通过创建LoadCheckpoint、LoadLoRA、LoadVAE等节点加载指定文件夹下的模型;
二、简单例子——文生图
一个简单的文生图工作流,实现根据提示词生成指定大小的图片。
它会包括如下节点:
● LoadCheckpoint:
○ 此节点是一般情况下用来加载模型的节点;
○ 他可以根据选择的模型,解析出Model、Clip、Vae三个类型的输出;
● EmptyLatentImage:
○ 此节点用来创建一个空白的潜影图像,后续会以此为基础进行图像的生成绘制;
○ 此节点也可以换为LoadImage和VAEEncode的组合,生成一个已知图像的潜影,实现图生图;
○ 此节点可以填写width、height指定生图的尺寸大小,填写batch_size指定生图数量;
○ 此节点没有输入,输出为Latent;
● CLIPTextEncoder:
○ 此节点用来确定提示词,会输出Conditioning类型,连接到后续节点的条件输入上;
○ 后续节点的条件输入一般分为Positive、Negative。在连接到Positive的此类型节点中输入想要的结果,在连接到Negative的此类型节点中输入不想要的结果,即可实现对生图的提示词限制;
○ 此节点输入为CLIP类型,输出为Conditioning;
● KSampler:
○ KSampler节点是此工作流的核心,通过将DiffusionModel扩散模型、潜影图像、提示词进行处理后,生成新的潜影图像;
○ 此节点可以设置多个属性,包括seed(随机种子)、control_after_generate(同批次多张图片时,随机种子的生成方式)、steps(降噪次数)、cfg(提示词的控制强度,数值越高时生成的图片越会严格遵循提示词)、sampler_name(采样算法)、scheduler(控制每步执行的强度)、denoise(降噪的强度);
○ 此节点的输入为LoadCheckpoint的Model输出、CLIPTextEncoder输出的Positive和Negative提示词、EmptyLatentImage输出的潜影图像,输出为Latent潜影图像;
● VAEDecode:
○ 此节点会将Latent潜影图像通过指定的VAE模型解码为像素图像;
○ 此节点的输入为KSampler输出的潜影图像、LoadCheckpoint输出的VAE,输出为Image像素图像;
● SaveImage:
○ 此节点会将输出的像素图像储存在ComfyUI/output文件夹下,你可以设置文件名的前缀;
○ 此节点的输入为VAEDecode输出的Image像素图像;
三、总结
AI毫无疑问是接下来的技术重点了,虽然现在有很多通用型的AI模型,但处理实际问题时,特化型的AI在现在更有优势。一方面因为背景信息的数据量实在太过庞大,在实现AI伴生之前,我们很难让AI去理解问题背景以及过往经验,或者帮助其理解的成本远高于产出的收益;另一方面我们的问题处理的内容已经过于工作化,偏向于只处理片面信息以达成工作的流程化。尽管现在的AI还存在这样那样的问题,但可预见的未来里我们都会开始接触特化型的AI去协助解决局部的问题,不管是编程、招聘、医疗、客服、科研论文、绘图等等,这已经是现状了。现在在生活工作中实际应用AI的门槛确实还是很高,但不妨碍我们通过类似ComfyUI这类优秀的产品去理解概念。
更多推荐


所有评论(0)