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 的全部心智模型:
- Load Checkpoint:加载底模(如 SD1.5 / SDXL),输出 MODEL、CLIP、VAE 三路。
- CLIP Text Encode (Prompt):分别接”正向提示词”和”负向提示词”,把文字编码成条件向量。
- KSampler:核心采样器,吃进模型、条件和噪声,按步数去噪,输出潜空间图像。
- VAE Decode:把潜空间图解码回像素空间。
- 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 只负责执行生图。
| 维度 | ComfyUI | A1111 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 能力沉淀为稳定资产的关键一步。




