ComfyUI 实战:节点式 Stable Diffusion 工作流

ComfyUI 是当下最流行的 Stable Diffusion 节点式可视化工具。相比传统 WebUI 的一键出图,它把”加载模型→编码提示词→采样去噪→解码保存”拆成一张可拖拽、可连线、可保存的节点图。当你需要固定一套出图流程、复用 LoRA 与 ControlNet、或把生图接入自动化管线时,ComfyUI 的确定性工作流远比随机点按钮更可靠。本文从安装到生产落地,手把手带你跑通第一条节点工作流,并把它变成可以反复调用的工程资产。

一、为什么需要 ComfyUI

以 A1111 为代表的 WebUI 把流程封装在一个大黑盒里:你填提示词、选采样器、点生成,但每一步的中间状态不可见,换台机器或换个模型版本,出图结果就漂移。设想一个真实场景——你为电商活动调出了一张满意的海报风格,第二天想复刻,却怎么也调不出同样的味道,因为 WebUI 不会记录”当时到底跑了哪几个插件、什么顺序”。ComfyUI 反过来,把每个环节都暴露成节点:检查点加载器、CLIP 文本编码器、KSampler 采样器、VAE 解码器、图像保存节点,彼此用线连接。这种”显式图”带来三个实打实的好处。

  • 可复现:同一张工作流 JSON 在任何机器上跑出同一结果,告别”昨天还能出这张图”的玄学。
  • 省显存:节点图只加载真正用到的模型分支,比 WebUI 全量加载更轻,低端显卡也能跑。
  • 易批量:工作流可导出为 API 格式,用一行命令批量生图,天然适配自动化。

二、安装与启动

ComfyUI 是纯 Python 项目,无桌面依赖。Windows 用户推荐直接用官方 Portable 包(自带 torch);macOS / Linux 用户用虚拟环境安装最干净。模型放 models/checkpoints,LoRA 放 models/loras,ControlNet 放 models/controlnet。注意模型文件体积通常数 GB,务必先确认磁盘空间充足。

# Linux / macOS 一键启动(需 Git 与 Python 3.10+)
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
python main.py --listen 127.0.0.1 --port 8188

启动后浏览器打开 http://127.0.0.1:8188 即进入节点画布。首次运行会看到一张默认的”基础出图”工作流,这正是我们下一步要读懂的骨架。若你的显卡显存小于 8GB,启动时加 --lowvram 或 --medvram 参数可显著降低占用。

三、读懂节点画布:一次基础出图

最小的文生图链路由 5 个节点串成,理解它就理解了 ComfyUI 的全部心智模型:

  1. Load Checkpoint:加载底模(如 SD1.5 / SDXL),输出 MODEL、CLIP、VAE 三路。
  2. CLIP Text Encode (Prompt):分别接”正向提示词”和”负向提示词”,把文字编码成条件向量。
  3. KSampler:核心采样器,吃进模型、条件和噪声,按步数去噪,输出潜空间图像。
  4. VAE Decode:把潜空间图解码回像素空间。
  5. Save Image:把像素图存到 output/ 目录。

连线规则很简单:Checkpoint 的 MODEL 接 KSampler 的 model,CLIP 接两个 Text Encode 的 clip,Text Encode 的 CONDITIONING 接 KSampler 的 positive / negative,KSampler 的 LATENT 接 VAE Decode,VAE Decode 的 IMAGE 接 Save Image。在画布上右键”Add Node”即可搜索并添加上述节点,拖拽端口连线即可。当一条线连对,端口会高亮;连错类型(比如把 IMAGE 接到 LATENT)则会提示不兼容,这正是节点图比黑盒更安全的地方。

四、KSampler 采样参数精解

KSampler 是整张图的大脑,它的几个参数直接决定出图质量与速度,值得单独讲清楚:

参数含义常用值
steps去噪迭代步数,越多越精细但越慢SD1.5 取 20-30,SDXL 取 25-35
cfg提示词遵循度,越高越贴提示词7.0 左右,超过 12 易过饱和
sampler_name采样算法dpmpp_2m / euler
scheduler噪声调度策略karras / normal
denoise重绘强度(图生图时生效)1.0 文生图,0.5-0.7 图生图
seed随机种子,决定构图基底-1 随机,固定值可复现

经验法则:SDXL 配 dpmpp_2m + karras、步数 30、cfg 7,是一个几乎不会出错的高质量起点。当你要复现某张图,把 seed 固定下来,其余参数不变,就能稳定产出同基底的变体。

五、用 LoRA 与 ControlNet 增强控制

5.1 挂载 LoRA

LoRA 是轻量风格/角色微调权重。在 Checkpoint 与 KSampler 之间插入 Load LoRA 节点:Checkpoint 的 MODEL 接 Load LoRA 的 model,输出 model_strength / clip_strength 再分别送往 KSampler 与 Text Encode。权重一般设 0.6~0.8,过高容易过拟合、丢失底模质感。你可以串多个 LoRA 节点,实现”风格 A + 角色 B”的叠加效果。

# 节点连接(文字示意)
Load Checkpoint.model  -> Load LoRA.model
Load LoRA.model_strength -> KSampler.model
Load Checkpoint.clip   -> Load LoRA.clip
Load LoRA.clip_strength -> CLIP Text Encode.clip

5.2 ControlNet 控制姿态与构图

ControlNet 让你用一张参考图(姿态、边缘、深度、线稿)约束出图结构。插入 ControlNet Loader 加载对应预处理器模型,用 Apply ControlNet 节点把它接到 KSampler 的 positive 条件上,再把参考图接进预处理器。比如用 openpose 控制人物姿态、用 canny 锁定线稿轮廓,出图就不会”跑偏”。多个 ControlNet 可并行叠加,分别控制不同维度,代价是显存与步数成倍增加。

六、把工作流存成可复用 JSON(API 模式)

ComfyUI 最被低估的能力是”可序列化”。在画布上点 Save (API Format),会导出一份 workflow_api.json,里面是节点的完整参数与连线。这份 JSON 可以脱离界面、用命令行批量执行,是接入 CI、定时任务、后端服务的钥匙。本质上,你设计的每一条工作流都是一段”出图程序”。

# 用 comfy-cli 在命令行跑工作流
comfy cli run --workflow workflow_api.json --prompt "1girl,solo,studio light,high detail"

# 或直接 POST 到本地 ComfyUI 的 /prompt 接口(无需界面)
curl -s http://127.0.0.1:8188/prompt   -H "Content-Type: application/json"   -d @workflow_api.json

返回里带 prompt_id,再轮询 /history/{prompt_id} 即可拿到生成结果路径。把这一步封装进脚本,就能做到”每天凌晨自动出一批图”。下面是一个最小的工作流 API JSON 骨架,你可直接据此理解节点结构:

{
  "3": {"class_type": "KSampler", "inputs": {
    "seed": 12345, "steps": 30, "cfg": 7.0,
    "sampler_name": "dpmpp_2m", "scheduler": "karras", "denoise": 1.0,
    "model": ["11", 0], "positive": ["6", 0],
    "negative": ["7", 0], "latent_image": ["5", 0]}},
  "11": {"class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": "sd_xl_base_1.0.safetensors"}},
  "9": {"class_type": "VAEDecode", "inputs": {"samples": ["3", 0], "vae": ["11", 2]}},
  "10": {"class_type": "SaveImage", "inputs": {"images": ["9", 0]}}
}

七、用 FastAPI 把 ComfyUI 包装成出图服务

当工作流跑通后,下一步是让它对外提供服务。ComfyUI 自带 /prompt 与 /history 两个 HTTP 接口,配合 FastAPI 包一层即可变成内部出图 API。这样前端或 Agent 只需 POST 一张提示词,就能拿回图片 URL,完全不用碰节点画布。

import requests, time, uuid

COMFY = "http://127.0.0.1:8188"

def generate(workflow: dict, prompt_override: str):
    # workflow 为 Save (API Format) 导出的 JSON,此处覆盖正样本提示词
    workflow["6"]["inputs"]["text"] = prompt_override
    r = requests.post(f"{COMFY}/prompt", json={"prompt": workflow})
    pid = r.json()["prompt_id"]
    while True:
        hist = requests.get(f"{COMFY}/history/{pid}").json()
        if pid in hist:
            return hist[pid]["outputs"]["10"]["images"][0]["filename"]
        time.sleep(1)

# 调用示例
# print(generate(workflow_json, "a cyberpunk cat, neon city, cinematic"))

生产环境里记得加队列与并发上限,避免多请求同时抢占显存导致 OOM;也可以把生成的文件名回写数据库,做成异步任务。

八、与本地推理栈打通

ComfyUI 只是出图前端,真正干活的是本地 GPU 推理。它可以和你的整体 AI 基建共享一张显卡:把生图任务排进统一的 本地大模型推理引擎 调度队列,避免和 Dify + Ollama 的对话推理抢显存。若你想用自己微调的模型,Unsloth 微调 产出的 LoRA 可直接在第五步挂载进来,形成”微调→出图”的闭环。多智能体编排场景则可参考 AutoGen 多智能体 把”生成提示词”交给 Agent,ComfyUI 只负责执行生图。

维度ComfyUIA1111 WebUI
可控性节点级,完全透明封装黑盒,靠插件
显存占用较低(按需加载)较高(全量加载)
批量/自动化原生 API JSON需额外脚本
工程集成天然 HTTP / JSON需额外扩展
学习曲线略陡(需懂节点)平缓(填表即用)

九、常见误区与排障

现象根因与对策
节点报红色不兼容端口类型不匹配,检查 MODEL/CLIP/LATENT/IMAGE 是否接错
出图全黑或噪点VAE 未正确连接,或使用了不匹配底模的 VAE
显存不足 OOM加 –lowvram,或降低分辨率、减少 ControlNet 数量
LoRA 无效权重过低或 LoRA 与底模版本不一致(SD1.5/SDXL 混用)
API 调用无返回确认 main.py 带 –listen,且防火墙放行 8188 端口

十、生产落地检查清单

检查项建议
模型路径确认 checkpoints/loras 已就位,避免运行时 404
采样参数SDXL 常用 DPM++ 2M Karras,步数 20-30
LoRA 权重0.6-0.8,过高易失真
显存上限低显存机开启 –lowvram 或 –medvram
批量执行用 API JSON + 队列,别开界面手动点
服务封装用 FastAPI 包一层,加并发上限防 OOM
结果留存工作流 JSON 入库,作为团队资产复用

十一、结语

ComfyUI 的价值不在”更酷的界面”,而在把出图变成可描述、可保存、可复现的工程资产。当你把常用风格、常用控制流固化成一张张工作流 JSON,它们就成了团队可以反复调用的”出图函数”。从今天的最小链路开始,逐步挂上 LoRA 与 ControlNet,再用 FastAPI 把它变成内部服务,你的 AI 图像生产线就真正立起来了——而这,正是把 AI 能力沉淀为稳定资产的关键一步。

上一篇 SvelteKit 实战:用文件路由与 SSR 构建全栈 Web 应用
下一篇 Vault 实战:用动态密钥与 PKI 管理企业机密
最新评论
Docker 网络模式详解:bridge/host 生产选型 - FSData
Docker 网络模式详解:bridge/host 生产选型 - FSData
8月20日
[…] 注意最后那条:把端口绑定到 127.0.0.1,再由宿主机上的 Nginx 反代进来,比直接 -p 80:80 暴露安全得多,也方便统一做
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
8月20日
[…] Pinia 的工程化用法,可以参考我们之前的实战文章 《Vue3 组合式 API + Pinia:状态管理从入门到实战》,那里覆盖了 Sto
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
8月19日
[…] 状态,点一下就能起停容器,配合我们讲过的 Docker Compose 编排 […]
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
8月19日
[…] 缓存三大坑的本质都是”缓存失效导致请求穿透到数据库”。记住口诀:穿透用布隆、击穿用锁、雪崩用错峰。配合合理的过期策略
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
8月19日
[…] Docker 镜像部署。结合我们之前写的 Docker Compose 一键编排实战,可以在 CI […]