系统拆解 ComfyUI------当前最灵活的AI图像/视频生成工作流工具。
一、本质定位:节点式AI生成引擎
| 工具 | 交互方式 | 核心哲学 | 适用人群 |
|---|---|---|---|
| Midjourney | 聊天命令 | 黑盒美学,Prompt即魔法 | 设计师、快速出图 |
| Stable Diffusion WebUI | 参数面板 | 调参炼丹,控制与易用平衡 | 进阶玩家 |
| ComfyUI | 节点图(Node Graph) | 全透明、全可控、可编程 | 工程师、流水线设计者 |
ComfyUI 不是"更好用的工具",是"可编程的生成基础设施"。
二、核心概念:节点(Node)与边(Edge)
2.1 节点 = 函数
每个节点是一个Python函数,有输入端口和输出端口:
┌─────────────────────────┐
│ KSampler (采样器) │
│ │
│ model ◀──── 模型输入 │
│ positive ◀─ 正向提示词 │
│ negative ◀─ 反向提示词 │
│ latent_image ◀─ 潜空间图 │
│ │
│ ▶ LATENT 输出潜空间图 │
└─────────────────────────┘
2.2 边 = 数据流
节点之间通过有向边连接,数据(张量、字符串、模型权重)沿边流动:
Load Checkpoint ──▶ CLIP Text Encode ──▶ KSampler ──▶ VAE Decode ──▶ Save Image
(加载模型) (编码提示词) (采样) (解码潜空间) (保存)
2.3 工作流 = 完整DAG
一个ComfyUI工作流就是一个有向无环图(DAG),描述从"随机噪声"到"最终图像"的完整计算路径。
三、标准文生图工作流拆解
[1] Load Checkpoint (加载SD模型)
├── model → [2] KSampler
├── clip → [3] CLIP Text Encode (Positive)
└── clip → [4] CLIP Text Encode (Negative)
[3] Positive Prompt: "masterpiece, best quality, 1girl, standing in garden"
└── CONDITIONING → [2] KSampler (positive)
[4] Negative Prompt: "bad anatomy, worst quality, lowres"
└── CONDITIONING → [2] KSampler (negative)
[5] Empty Latent Image (512x512, batch_size=1)
└── LATENT → [2] KSampler (latent_image)
[2] KSampler (steps=20, cfg=7.0, sampler_name=euler, scheduler=normal, seed=12345)
├── model ← [1]
├── positive ← [3]
├── negative ← [4]
├── latent_image ← [5]
└── LATENT → [6] VAE Decode
[6] VAE Decode
├── vae ← [1] (checkpoint里的VAE)
├── samples ← [2]
└── IMAGE → [7] Save Image
[7] Save Image → 输出到 output 目录
关键理解:潜空间(Latent Space)是核心------所有采样在压缩的潜空间进行,最后VAE解码回像素空间,节省显存。
四、核心节点类型详解
4.1 模型加载类
| 节点 | 功能 | 输出 |
|---|---|---|
CheckpointLoaderSimple |
加载SD 1.5/SDXL/Flux大模型 | MODEL, CLIP, VAE |
UNETLoader |
单独加载UNet(Comfy原生格式) | MODEL |
CLIPLoader |
单独加载CLIP文本编码器 | CLIP |
VAELoader |
单独加载VAE | VAE |
ControlNetLoader |
加载ControlNet模型 | CONTROL_NET |
4.2 条件控制类(决定"画什么")
| 节点 | 功能 | 关键技术 |
|---|---|---|
CLIPTextEncode |
文本编码为CONDITIONING | CLIP tokenizer + text encoder |
CLIPTextEncodeFlux |
Flux模型的双CLIP编码 | T5 + CLIP-L 双编码器 |
ConditioningSetArea |
限定提示词作用区域 | 区域控制,实现多角色分区 |
ConditioningCombine |
合并多个条件 | 多提示词融合 |
IPAdapterAdvanced |
图像提示适配 | 用参考图控制风格/人物 |
4.3 采样类(核心生成引擎)
| 节点 | 功能 | 参数意义 |
|---|---|---|
KSampler |
标准采样器 | steps(步数)、cfg(提示词强度)、sampler(算法)、scheduler(调度器) |
KSamplerAdvanced |
高级采样,可指定起始/结束步 | 用于inpainting、分步控制 |
SamplerCustom |
自定义采样算法 | 接入研究级采样器 |
采样器算法:
euler/euler_ancestral:快,基础质量dpmpp_2m/dpmpp_2m_sde:质量高,推荐uni_pc/uni_pc_bh2:步数少时质量好ddim:确定性采样,可复现
4.4 图像操作类
| 节点 | 功能 |
|---|---|
EmptyLatentImage |
创建空白潜空间图(文生图起点) |
LoadImage |
加载图片(图生图、ControlNet起点) |
VAEEncode |
像素图编码为潜空间图 |
VAEDecode |
潜空间图解码为像素图 |
ImageScale |
图像缩放 |
ImageCompositeMasked |
图像合成(带遮罩,用于inpainting) |
4.5 ControlNet类(结构控制)
Load Image ──▶ ControlNetApply ──▶ KSampler
▲
│
ControlNetLoader ──▶ (canny/depth/openpose/lineart模型)
| ControlNet类型 | 控制什么 | 适用场景 |
|---|---|---|
Canny |
边缘轮廓 | 保持构图重绘 |
Depth |
深度图 | 3D结构控制 |
OpenPose |
人体骨架 | 人物姿势固定 |
Lineart |
线稿 | 动漫上色 |
SoftEdge |
柔和边缘 | 风格化重绘 |
Segmentation |
语义分割 | 物体替换 |
五、高级工作流模式
5.1 图生图(Img2Img)
Load Image ──▶ VAEEncode ──▶ KSampler (denoise=0.75) ──▶ VAEDecode
▲ │
└── 噪声强度控制重绘幅度 ──────┘
denoise参数:0.0=原图不变,1.0=完全重绘,0.5-0.75常用。
5.2 局部重绘(Inpainting)
Load Image ──▶ Load Mask (或VAEEncodeMask) ──▶ SetLatentNoiseMask ──▶ KSampler
│
└── 只采样遮罩区域
5.3 高清修复(Hires Fix / 两步采样)
[1] KSampler @ 512x512 ──▶ VAEDecode ──▶ ImageScale(2x) ──▶ VAEEncode ──▶ [2] KSampler @ 1024x1024
│
└── 二次采样细化细节
5.4 多提示词分区(Regional Prompting)
Prompt1 + SetArea(0,0,256,512) ──┐
├── Combine ──▶ KSampler
Prompt2 + SetArea(256,0,512,512) ──┘
左半画面:Prompt1 | 右半画面:Prompt2
5.5 视频生成(AnimateDiff / SVD)
Load AnimateDiff Model ──▶ (注入KSampler的model输入)
│
Load Video ──▶ VAEEncode ──▶ KSampler (batch=16帧) ──▶ VAEDecode ──▶ Save Animated WEBP/GIF
六、ComfyUI vs WebUI 的核心差异
| 维度 | ComfyUI | WebUI (AUTOMATIC1111) |
|---|---|---|
| 可控性 | 每个张量可见,可中断、修改、复用 | 黑盒流水线,只能调参数 |
| 复用性 | 工作流存为JSON,分享即运行 | 依赖Prompt+参数记录,难精确复现 |
| 扩展性 | 自定义节点 = Python插件,生态爆炸 | 插件机制受限,依赖Gradio |
| 学习曲线 | 陡峭,需理解底层原理 | 平缓,开箱即用 |
| 性能 | 可手动优化节点图,减少冗余计算 | 固定流水线,有 overhead |
| 多GPU | 原生支持,不同节点可指定不同GPU | 单GPU,多卡需外部工具 |
七、自定义节点开发
ComfyUI的强大在于可编程。
7.1 最小节点示例
python
# custom_nodes/my_custom_node.py
import torch
from comfy.model_management import get_torch_device
class MyLatentMultiplier:
"""
自定义节点:将潜空间图乘以标量
"""
# 节点在UI显示的名称
CATEGORY = "latent"
RETURN_TYPES = ("LATENT",) # 输出类型
FUNCTION = "multiply" # 执行函数名
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"latent": ("LATENT",), # 输入:潜空间图
"multiplier": ("FLOAT", { # 输入:标量
"default": 1.0,
"min": 0.0,
"max": 10.0,
"step": 0.1
}),
}
}
def multiply(self, latent, multiplier):
# latent["samples"] 是实际的张量 (batch, 4, h, w)
samples = latent["samples"] * multiplier
return ({"samples": samples},) # 必须返回tuple
# 注册节点
NODE_CLASS_MAPPINGS = {
"MyLatentMultiplier": MyLatentMultiplier,
}
NODE_DISPLAY_NAME_MAPPINGS = {
"MyLatentMultiplier": "Latent Multiplier (Custom)",
}
7.2 节点开发关键规范
| 要素 | 规则 |
|---|---|
INPUT_TYPES |
定义输入端口,类型必须是大写标准名 |
RETURN_TYPES |
定义输出端口,与返回tuple长度一致 |
RETURN_NAMES |
可选,UI显示的名称 |
CATEGORY |
UI左侧分类名,用/创建子菜单 |
FUNCTION |
实际执行的方法名 |
| 数据传递 | 节点间传递的是Python对象(张量、字典、字符串),不是JSON |
八、生态与资源
8.1 核心仓库
| 资源 | 地址 | 用途 |
|---|---|---|
| ComfyUI 主仓库 | comfyanonymous/ComfyUI |
引擎本体 |
| ComfyUI Manager | ltdrdata/ComfyUI-Manager |
节点包管理器(必装) |
| Comfyroll Studio | 多种自定义节点集合 | 工作流增强 |
8.2 热门自定义节点包
| 包名 | 功能 | 场景 |
|---|---|---|
ComfyUI-AnimateDiff-Evolved |
视频生成 | 动画、短视频 |
ComfyUI-IPAdapter-Plus |
图像提示增强 | 人物一致性、风格迁移 |
ComfyUI-ControlNet-Aux |
预处理器集合 | Canny/Depth/OpenPose预处理 |
ComfyUI-Impact-Pack |
细节修复、人脸修复 | 人像精修 |
ComfyUI-Efficiency-Nodes |
性能优化节点 | 减少显存占用 |
ComfyUI-VideoHelperSuite |
视频加载/保存/处理 | 视频工作流 |
8.3 工作流分享平台
- OpenArt.ai / Civitai --- 社区工作流分享
- 工作流文件就是JSON,拖进ComfyUI即运行(需安装对应节点包)
九、给你的AI导游项目的联想
你之前设计网页版AI导游框架(输入→钩子引擎→模型→多模态输出),ComfyUI的节点哲学可以直接迁移:
┌─────────────────────────────────────────┐
│ 你的AI导游框架(ComfyUI式) │
├─────────────────────────────────────────┤
│ [UserInput] ──▶ [IntentClassifier] │
│ │ │
│ ▼ │
│ [HookEngine] ──▶ [KnowledgeSelector] │
│ │ │ │
│ ▼ ▼ │
│ [ContextAssembler] ──▶ [LLM API] │
│ │ │
│ ▼ │
│ [TTS Engine] ◀── [ImageGenerator] │
│ │ │ │
│ └────────┬───────────┘ │
│ ▼ │
│ [OutputMixer] ──▶ [User] │
└─────────────────────────────────────────┘
启示:
- 把"钩子引擎"做成可配置节点
- 把"叙事切片"做成可插拔模块
- 工作流JSON = 不同景点的导游策略配置