打开 ComfyUI 的第一天,很多人是崩溃的。界面里没有 WebUI 那种清爽的“提示词输入框 + 生成按钮”,只有一张像电路图一样的画布,上面布满了方块和连线。你可能会想:这真的是个绘画工具吗?
是的,它不仅是绘画工具,而且很可能是未来几年里,最值得动手掌握的 AI 视觉工作流工具。ComfyUI 的核心不是“生成一张图”,而是“把生成过程拆成可编辑的节点,再自由搭建成流程”。2027 年的今天,AI 绘画和 AI 视频生成的门槛已经比两年前低了很多,但真正让创作者拉开差距的,已经不是谁的显卡更好,而是谁更会搭工作流。
这篇文章不会给你一本几百页的说明书,而是用一条清晰的路线,带你从零开始理解 ComfyUI 的核心逻辑,走通第一个文生图工作流,再延伸到 LoRA、ControlNet 和 AI 视频生成,最后把最常见的坑都列出来。读完这篇文章,你不一定能成为专家,但一定不会再对着空白画布发懵。
1. 这篇文章真正要解决的问题
先说一个普遍的误区:很多人以为学 ComfyUI,就是学“怎么安装软件”“怎么下载模型”。其实安装只是最简单的一步,真正难的是理解工作流的结构。
如果你之前用过 Midjourney 或 Stable Diffusion WebUI,你会发现它们是“填表式”的工具:写好提示词,点生成,出图。ComfyUI 则完全不同,它允许你把“加载模型”“写提示词”“设置采样步数”“保存图片”这些环节全部拆开,然后像搭积木一样重新连接。
这篇文章要解决的问题有三类:
- 认知问题:ComfyUI 的节点和连线到底代表什么?为什么它比 WebUI 更适合做视频和控制类任务?
- 操作问题:从安装、启动到跑通第一条工作流,中间有哪些关键步骤?如何避免下载了一堆模型却不知道用哪个?
- 进阶问题:如何搭建一个包含 LoRA、ControlNet 的实用工作流?AI 视频工作流需要哪些必备组件?显存不够时有哪些降级方案?
如果你是下面这类读者,这篇文章应该能帮你省下不少时间:
- 用过 WebUI,但经常被网上的复杂工作流图吓退,想系统补上 ComfyUI 这一课。
- 刚接触 AI 绘画,直接想从 ComfyUI 入门,但被各种版本和插件搞糊涂了。
- 想用 ComfyUI 做视频生成,但不知道本地画布、AnimateDiff 和最新视频模型之间是什么关系。
2. ComfyUI 的核心概念:节点、连线与工作流
2.1 节点是什么
一个“节点”就是工作流里的一个功能模块。比如“加载大模型”(Checkpoint Loader)是一个节点,“写正向提示词”(CLIP Text Encode)是一个节点,“保存图片”(Save Image)也是一个节点。
每个节点做一件非常具体的事,它接收上游传来的数据,处理后传给下游。你可以把节点想象成工厂流水线上的一台台机器:一台负责搅拌原料,一台负责压制成型,一台负责包装。所有机器串联起来,就是一条完整的生产线。
在 ComfyUI 里,这条生产线叫做“工作流”(Workflow)。你画布上看到的所有方块和连线,本质上是一张可编辑的生产流程图。
2.2 数据在节点之间怎么流动
节点之间的连线是有方向的,一般从左侧输入,从右侧输出。
常见的三种数据类型:
- MODEL(模型):整个生成过程的核心引擎,负责理解提示词并生成潜空间特征。
- CLIP(文本编码器):把自然语言提示词转换成模型能理解的向量。
- VAE(变分自编码器):负责把潜空间数据解码为真实的像素图片。
理解这三者的分工,你就能看懂大部分工作流的结构。一个最简单的文生图工作流,逻辑就是:
加载大模型 → 文本编码(正向提示词 + 负向提示词)→ 创建空白潜空间 → 采样器生成潜空间图像 → VAE 解码 → 保存图片2.3 ComfyUI 与 WebUI 的本质差异
ComfyUI 更像“可视化编程”,WebUI 更像“一键式工具”。
很多人在 WebUI 里调整参数,点击“生成”按钮后,其实是软件内部帮你执行了一整套固定流程。你虽然能改提示词、步数、采样器,但很难改变流程本身。
ComfyUI 则把流程控制权交还给你。你想在采样之前插入一个 ControlNet?想连续跑两次采样?想把多张图拼接起来?都可以通过连线实现。
这意味着,学习 ComfyUI 的曲线确实比 WebUI 更陡,但它的上限也高得多。尤其是当你需要做精准控制、批量处理或视频生成时,ComfyUI 几乎是当前本地工具里最合适的选择。
3. 环境准备:显卡、显存与本地部署方式
3.1 硬件要求:先看显存,再看 GPU 型号
ComfyUI 是本地部署工具,对硬件有要求。对 2027 年的新手来说,可以按这个标准判断:
- 轻度体验(文生图,分辨率 512-768):4GB 以上显存可以跑,但速度较慢,建议 8GB 起步。
- 日常使用(文生图 + LoRA + ControlNet):8GB 显存是入门底线,12GB 以上更从容。
- AI 视频生成:建议 12GB 以上显存。NVIDIA RTX 3060 12GB 是很多入门用户的选择,能跑,但需要控制分辨率、帧数和模型规模。
需要说明的是,NVIDIA 显卡在 AI 生成领域依然是首选,因为 CUDA 生态和 PyTorch 的适配最成熟。如果只有核显或 AMD 显卡,也不是完全不能用,但大概率会有驱动和环境上的麻烦,新手不建议走这条路。
3.2 安装方式一:整合包(新手最推荐)
对完全没有命令行经验的新手,最稳妥的方案是使用社区整合包。秋叶一键整合包(ComfyUI 版本)是中文社区里常见的打包方案,它把 Python 环境、ComfyUI 主程序、常用自定义节点和部分模型封装在一起,解压即可运行。
使用整合包的注意事项:
- 下载后先看解压说明,确认是否包含“启动脚本”和“模型放置目录”。
- 整合包通常自带独立的 Python 环境,不需要你手动安装 Python。
- 遇到报错时,优先去整合包作者提供的说明文档里找答案,不要直接重装。
3.3 安装方式二:手动安装(进阶推荐)
如果你有一定的 Python 基础,或者以后想深度二次开发,手动安装能让你更清楚每一步在做什么。核心步骤:
# 1. 克隆 ComfyUI 仓库 git clone https://github.com/comfyanonymous/ComfyUI.git cd ComfyUI # 2. 创建虚拟环境并安装依赖 python -m venv venv source venv/bin/activate # Windows 下为 venv\Scripts\activate pip install -r requirements.txt # 3. 启动 ComfyUI python main.py启动成功后,浏览器访问http://127.0.0.1:8188就能看到工作台界面。
3.4 模型目录在哪里
ComfyUI 的模型目录默认在ComfyUI/models/下,下面几个子目录需要记清楚:
| 目录名 | 存放内容 |
|---|---|
checkpoints | 主模型(大模型),如 SD1.5、SDXL 系列 |
loras | LoRA 模型 |
controlnet | ControlNet 模型 |
vae | VAE 模型 |
embeddings | 负面嵌入或文本反转模型 |
diffusion_models | 扩散模型(部分视频工作流和最新架构会用到) |
下载模型之前,先确认你下载的模型类型应该放进哪个目录,否则加载时会找不到模型。
4. 从零开始搭建第一个文生图工作流
4.1 打开后的第一件事:跑通默认工作流
新安装的 ComfyUI 打开后,画布上通常已经有一个默认工作流。请不要急着删掉,先直接点击右侧或底部的“运行”按钮(Queue Prompt)。
如果一切正常,你会看到画布上的节点逐步亮起,最后生成一张图片。此时祝贺你已经完成了 ComfyUI 的“Hello World”。接下来要做的是理解这个默认工作流里到底发生了什么。
4.2 读懂一个文生图工作流的每个节点
以常见的默认工作流为例,通常包含以下节点:
| 节点类型 | 作用 | 关键参数 |
|---|---|---|
| Checkpoint Loader | 加载主模型 | ckpt_name |
| CLIP Text Encode | 编码正向提示词 | text |
| CLIP Text Encode | 编码负向提示词 | text |
| Empty Latent Image | 创建空白潜空间 | widthheightbatch_size |
| KSampler | 采样器 | seedstepscfgsampler_nameschedulerdenoise |
| VAE Decode | 潜空间解码为图片 | 无 |
| Save Image | 保存图片 | filename_prefix |
其中最容易让新手困惑的是KSampler(采样器)。它的作用是在潜空间里,通过逐步去噪的过程,把随机噪声“演化”成符合提示词描述的图像。你可以暂时把它理解为“渲染引擎”,它需要知道:
- seed(随机种子):相同 seed 在相同条件下会生成相同结果。想要变化,通常就改 seed。
- steps(采样步数):去噪迭代次数。步数太少会模糊,太多会浪费时间,常见设置在 20-30。
- cfg(提示词引导系数):数值越高,图像越严格遵循提示词;过高会导致色彩过饱和或伪影。常见设置在 5-8。
- denoise(重绘幅度):如果是文生图,通常为 1;如果是图生图,降低它表示保留更多原图结构。
4.3 动手搭建:从空白画布搭一条完整链路
不用怕,搭工作流就像拼积木。你只需要按顺序把节点拖出来,然后用鼠标从一个节点的输出口拖到另一个节点的输入口。
CheckpointLoaderSimple ├─ MODEL → KSampler ├─ CLIP → CLIPTextEncode(正向)→ KSampler ├─ CLIP → CLIPTextEncode(负向)→ KSampler └─ VAE → VAEDecode → SaveImage EmptyLatentImage → KSampler一个完整的组装顺序:
- 双击画布空白处,弹出节点搜索框。
- 输入
CheckpointLoaderSimple并回车,把它放到画布上。 - 搜索
CLIPTextEncode,添加两个,分别作为正向和负向提示词输入。 - 搜索
EmptyLatentImage,设置宽度 512、高度 512、批量大小 1。 - 搜索
KSampler,设置 seed 为 12345,steps 为 25,cfg 为 7,sampler_name 为dpmpp_2m,scheduler 为karras。 - 搜索
VAEDecode和SaveImage。 - 按照数据流方向把所有节点连起来,输入一段简单提示词,运行。
如果连线正确,你应该能在运行后看到一条完整的执行路径。运行失败的常见原因通常是:节点类型不匹配(比如把 CLIP 接到了 VAE 输入口)、模型没放进正确目录、显卡显存不足。
5. 工作流进阶:LoRA、ControlNet 与批量生成
5.1 加入 LoRA:用轻量模型改变画风
LoRA(Low-Rank Adaptation)是一种轻量模型微调技术。在 ComfyUI 中加入 LoRA,本质上是在 KSampler 之前,把 LoRA 的权重叠加到主模型的 MODEL 和 CLIP 上。
操作步骤:
- 确定主模型与 LoRA 的兼容性。比如 SD1.5 的 LoRA 不能用在 SDXL 主模型上。
- 把 LoRA 文件放到
ComfyUI/models/loras/。 - 添加
LoraLoader节点,选择 LoRA 文件,并设置strength_model(模型权重强度)和strength_clip(文本编码器强度)。 - 像插线一样,把原本从 Checkpoint Loader 直接到 KSampler 的 MODEL 和 CLIP 连线,改为先经过 LoraLoader 再进入 KSampler。
常见问题是“LoRA 加载了但看不出效果”。这时先确认权重强度是否太低(一般 0.6-0.9 比较明显),再确认提示词中是否写出了触发词(LoRA 作者通常会提供推荐触发词)。
5.2 接入 ControlNet:精准控制构图
ControlNet 可以在生成时加入额外条件,比如控制人物姿势、边缘线稿、深度信息等。以姿态控制为例,工作流会变成:
CheckpointLoaderSimple → MODEL → ControlNetLoader(加载控制模型) 图像加载(姿势参考图)→ 预处理器 → ControlNet 应用节点 → KSampler涉及的关键节点:
- ControlNetLoader:加载 ControlNet 模型。
- 预处理器:从参考图中提取姿势骨骼或线稿。
- ControlNet 应用条件:把处理后的条件数据注入采样过程。
新手第一次接入 ControlNet 时,最容易出错的是预处理器的输出类型与 ControlNet 模型要求的输入类型不一致。建议先从官方示例工作流开始,跑通后再替换自己的图片。
5.3 批量出图:用 API 调用 ComfyUI
ComfyUI 本身也可以作为一个后端服务用,你可以通过 HTTP API 提交工作流任务,然后轮询获取结果。这对需要批量生成或集成到业务系统的场景非常有用。
核心接口是POST /prompt:
import json import urllib.request server_address = "127.0.0.1:8188" # 工作流 JSON 文件,可以先在 ComfyUI 界面中通过“导出工作流”得到 with open("workflow.json", "r", encoding="utf-8") as f: workflow = json.load(f) # 修改要调整的节点参数,比如提示词节点 for node in workflow.values(): if node["class_type"] == "CLIPTextEncode": node["inputs"]["text"] = "a beautiful landscape, best quality" payload = json.dumps({"prompt": workflow}).encode("utf-8") req = urllib.request.Request( f"http://{server_address}/prompt", data=payload, headers={"Content-Type": "application/json"}, ) with urllib.request.urlopen(req) as resp: result = json.loads(resp.read()) print("任务 ID:", result.get("prompt_id"))提交成功后,可以通过GET /history/{prompt_id}查看任务状态和输出结果。生产环境里,建议把每次提交的 workflow 存一份副本,并记录 prompt_id,方便回溯。
6. AI 视频工作流:从关键帧到视频生成
6.1 视频工作流和图像工作流有什么不同
图像工作流的终点是“一张图”,视频工作流的终点是“一系列连续的帧”。因此,视频工作流通常会在图像工作流的基础上增加几个环节:
图像生成链路(生成关键帧)→ 帧间插值 / 视频模型生成 → 帧序列 → 视频编码 → 保存视频最简单的理解方式:先确定关键帧的构图与风格,再让模型生成中间帧,最后把帧序列合成视频文件。
6.2 常见的本地视频生成方案
从 2025 年到 2027 年,本地视频生成的方案已经非常多样。在 ComfyUI 生态中,常见的有:
- AnimateDiff:基于 Stable Diffusion 的动画工作流。它把“时间”维度加入潜空间,让同一套文生图模型生成连续帧。优点是社区工作流多、入门资料丰富,缺点是帧间一致性和动作幅度需要调参。
- Wan 系列视频模型:国内开源社区中的视频生成模型,支持文生视频和图生视频,对中文提示词理解较好,逐渐成为本地视频工作流中的热门选择。
- 其他基于扩散模型的视频方案:不同模型的 ComfyUI 节点包不同,但核心链路仍然是“文本/图像输入 → 视频扩散模型 → 帧序列 → 视频输出”。
以 AnimateDiff 为例,一个基础工作流一般需要:
- 加载主模型和 AnimateDiff 专用模型。
- 设置视频长度(帧数)和分辨率。
- 使用专门的采样流程生成帧序列。
- 将帧序列通过视频编码节点保存为 MP4 或 GIF。
6.3 显存不足时的降级方案
很多新手问“3060 12GB 能跑视频吗”。从材料看,12GB 显存属于入门水平,可以跑,但非常依赖参数控制。建议采用以下降级方案:
- 降低分辨率:视频生成的分辨率越高,显存占用呈平方级增长。先把分辨率降到 512 或 640 级别。
- 减少帧数:帧数直接决定时序维度的计算量。从 16 帧开始测试,跑通后再增加。
- 关闭无关插件:画布上尽量只保留当前工作流用到的节点,不要加载大量未使用的自定义节点。
- 使用低显存优化选项:部分节点支持
lowvram或medvram模式,可以在启动参数中配置。整合包一般也有相应的启动选项。
视频生成是一个重资源任务,实际迭代会很慢。建议先跑通一个小尺寸的完整流程,确认效果后再逐步放大。
6.4 视频工作流的保存与导出
视频生成完成后,会得到一系列帧图。ComfyUI 里通常会有专门的节点负责把帧序列编码成视频文件,常见格式是 MP4(H.264)或 GIF。
如果你在别人分享的工作流里找不到保存视频的节点,可以尝试添加节点时搜索VHS(VideoHelperSuite)系列节点,它提供了从帧序列合成视频的常用工具。要注意不同节点包的版本差异,最好在 ComfyUI Manager 里先确认已安装的组件。
7. 完整示例:文生图工作流 JSON 与 API 批量生成
7.1 工作流 JSON 长什么样
ComfyUI 的工作流可以导出为 JSON 文件。下面是一个简化版文生图工作流的逻辑示例,帮助你理解结构:
{ "1": { "class_type": "CheckpointLoaderSimple", "inputs": { "ckpt_name": "your_model.safetensors" } }, "2": { "class_type": "CLIPTextEncode", "inputs": { "text": "a beautiful landscape, best quality", "clip": ["1", 1] } }, "3": { "class_type": "CLIPTextEncode", "inputs": { "text": "blurry, low quality", "clip": ["1", 1] } }, "4": { "class_type": "EmptyLatentImage", "inputs": { "width": 512, "height": 512, "batch_size": 1 } }, "5": { "class_type": "KSampler", "inputs": { "seed": 12345, "steps": 25, "cfg": 7, "sampler_name": "dpmpp_2m", "scheduler": "karras", "denoise": 1, "model": ["1", 0], "positive": ["2", 0], "negative": ["3", 0], "latent_image": ["4", 0] } }, "6": { "class_type": "VAEDecode", "inputs": { "samples": ["5", 0], "vae": ["1", 2] } }, "7": { "class_type": "SaveImage", "inputs": { "filename_prefix": "output", "images": ["6", 0] } } }这个 JSON 的实质是节点字典,每个节点的inputs里的["1", 0]表示“引用 1 号节点的第 0 个输出”。理解这个格式后,你就能用代码动态修改工作流参数了。
7.2 完整批量生成脚本
在 Python 中,提交任务并等待结果:
import json import time import urllib.request import urllib.parse SERVER = "127.0.0.1:8188" def queue_prompt(workflow): data = json.dumps({"prompt": workflow}).encode("utf-8") req = urllib.request.Request( f"http://{SERVER}/prompt", data=data, headers={"Content-Type": "application/json"}, ) with urllib.request.urlopen(req) as resp: return json.loads(resp.read()) def get_history(prompt_id): with urllib.request.urlopen(f"http://{SERVER}/history/{prompt_id}") as resp: return json.loads(resp.read()) def wait_for_result(prompt_id, timeout=120): start = time.time() while time.time() - start < timeout: history = get_history(prompt_id) if prompt_id in history: outputs = history[prompt_id].get("outputs", {}) if outputs: return outputs time.sleep(3) raise TimeoutError("等待任务超时") if __name__ == "__main__": with open("workflow.json", "r", encoding="utf-8") as f: wf = json.load(f) prompt_id = queue_prompt(wf)["prompt_id"] print("已提交任务:", prompt_id) result = wait_for_result(prompt_id) print("任务完成,输出信息:") print(json.dumps(result, indent=2, ensure_ascii=False))运行这个脚本的前提是 ComfyUI 已经启动,并且workflow.json中的节点参数正确。如果返回 400 错误,多半是 JSON 格式不对,或节点引用的数据类型不匹配。
7.3 如何验证生成结果
判断工作流是否运行成功,不能只看“有没有输出图片”,还要关注以下指标:
- 执行时间:如果某个节点执行时间异常长,可能是模型太大或显存溢出。
- 图片内容:是否与提示词基本吻合,有无明显畸变或色彩异常。
- 日志输出:ComfyUI 控制台会打印每个节点的加载时间和执行状态。如果某个节点报错,控制台信息里一般会指明原因。
8. 常见问题与排查方法
这里整理了 ComfyUI 新手使用过程中最常见的几类问题,建议收藏备用。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 启动后浏览器打不开 | 端口被占用或服务未启动 | 查看控制台是否显示Starting server | 确认端口 8188 是否被其他程序占用,或修改启动参数换端口 |
| 加载模型失败 | 模型文件缺失或路径不对 | 检查ComfyUI/models/checkpoints/是否存在模型 | 下载模型放入正确目录,确认文件名含中文时导致编码问题则重命名为英文 |
| 弹窗提示“请安装缺失的包或节点” | 工作流使用了未安装的自定义节点 | 查看弹窗提示的具体节点名 | 通过 ComfyUI Manager 搜索并安装缺失节点,也可手动将节点包放进custom_nodes/后重启 |
| 生成速度极慢 | 显存不足或模型过大 | 打开任务管理器查看显存占用 | 降低分辨率、减少 batch_size、或开启低显存模式 |
| 显存溢出(Out of Memory) | 工作流包含多个高分辨率模型 | 查看报错是否出现在特定节点 | 降低分辨率,关闭其他占显存程序,必要时改用集成显卡布局为 GPU |
| 图中出现大量伪影或颜色异常 | cfg 过高或 sampler 不匹配 | 尝试修改 KSampler 参数 | 降低 cfg 到 5-7,更换 sampler 为euler_a或dpmpp_2m |
| 图生图时形状变化太大 | denoise 过高 | 查看节点传入的重绘幅度 | 降低 denoise 到 0.3-0.6 |
| 视频生成结果抖动剧烈 | 帧间一致性不足 | 检查 AnimateDiff 或视频模型参数 | 调整运动强度、上下文长度、或改用更高质量的视频模型 |
| 下载工作流后打开全是红色报错 | 缺少自定义节点或模型 | 逐个查看红色节点提示 | 先装节点包,再下载对应模型,按工作流原作者的说明放置 |
| API 提交任务后无响应 | 服务未启动或端口错误 | 使用浏览器访问http://127.0.0.1:8188 | 确认 ComfyUI 正常运行;检查防火墙是否拦截 API 请求 |
新手最需要注意的是:不要在缺少自定义节点的情况下强行运行别人分享的工作流。先安装 ComfyUI Manager,再用它来查询和安装缺失组件,能省掉一半的报错时间。
9. 实践建议与学习方向
9.1 不要一上来就搭“大而全”的视频工作流
正确路线是:先跑通文生图,再接入 LoRA 和 ControlNet,最后尝试视频生成。每一步都要先复制一个可用的示例,再改动参数,最后再自己从零搭建。复制、运行、拆解、重建,是学习 ComfyUI 最快的路径。
9.2 善于收藏工作流,但也要会拆工作流
看到网上别人分享的工作流,不要直接下载运行后就走。你可以把它看作“别人写好的代码”,先跑通,再逐个节点看它做了什么。这能帮你理解优秀工作流的设计思路,也能帮你积累自己的节点库。
9.3 注意模型版权和内容安全边界
使用本地模型时,要注意模型的许可协议。部分模型仅限研究用途,商用需要单独授权。生成视频和图像时,也应注意内容合规,尤其是在公开平台发布或用于商业项目时,需要确认素材授权和生成内容的使用边界。
9.4 下一步值得深入的方向
- 自定义节点开发:如果你会 Python,可以试着写一个简单节点,理解 ComfyUI 的执行机制。这会让你的工作流能力提升一个档次。
- 多模型协同工作流:把多个不同功能的模型串联在一个工作流里,比如先用 SDXL 生成人物,再用修复模型放大,最后用视频模型做成动态画面。
- API 与自动化集成:把 ComfyUI 作为一个生成服务接入业务系统,通过脚本批量提交任务、管理输出文件。
- 家庭服务器部署:如果有多张显卡或一台闲置服务器,可以研究远程调用和任务排队,让不同设备协同工作。
ComfyUI 的学习曲线确实存在,但它几乎会把 AI 视觉创作的所有控制权交到你手里。从“照着别人的工作流跑”到“搭建自己的生产链路”,这个过程中积累的节点理解、参数调优和问题排查能力,才是真正值钱的东西。建议你先从跑通默认工作流开始,然后下载一个你感兴趣的风格 LoRA,加进你的工作流里,看看画面发生了什么变化。这一步走通之后,ComfyUI 的大门就正式为你打开了。