ComfyUI高级工作流构建:从LoRA集成到ControlNet与双采样放大实战
在 Stable Diffusion 生态中,ComfyUI 以其节点式、可编程的工作流设计,为高级用户和研究者提供了远超 WebUI 的灵活性与控制力。然而,其陡峭的学习曲线和复杂的节点连接逻辑,常常让新手望而却步,也让许多从 WebUI 迁移过来的用户难以发挥其全部潜力。特别是对于 LoRA、ControlNet 等高级功能的集成与调用,ComfyUI 的官方实现方式与社区插件繁多,如何正确、高效地使用它们,并理解其背后的参数逻辑,是提升出图质量和效率的关键。
本文将以一个综合性案例为线索,系统性地拆解 ComfyUI 中几个核心且强大的功能:官方支持的 LoRA 加载、NSFW(Not Safe For Work)内容控制、风格迁移、深度控制以及双采样放大。我们将从零开始,构建一个可运行、可调整的工作流,并深入解释每个节点的作用、参数含义以及连接逻辑。无论你是刚刚接触 ComfyUI,还是希望深化对工作流设计的理解,本文都将提供一个从概念到实践,再到问题排查的完整路径。
1. 理解 ComfyUI 的核心:工作流与节点
在开始构建复杂工作流之前,必须理解 ComfyUI 的基本运作原理。它不是一个“点选即用”的工具,而是一个可视化编程环境。
1.1 节点与连接:数据流的可视化
ComfyUI 中的每个功能单元都是一个“节点”(Node)。节点有输入端口和输出端口。例如,一个“加载模型”节点,其输出是模型数据;一个“CLIP 文本编码”节点,输入是文本和 CLIP 模型,输出是文本的条件张量。通过连线将这些端口连接起来,就构成了一个数据处理“管道”或“工作流”。
所有操作,从读取图片、编码提示词、运行模型采样,到后期处理,都通过节点完成。这种设计的好处是流程完全透明、可定制、可复用。缺点是,你需要清楚地知道数据(如图片、潜空间、条件、模型)是如何在不同节点间流动的。
1.2 工作流文件:保存与分享
你的所有节点和连接关系,最终会保存为一个.json或.png文件,这就是工作流文件。分享工作流就是分享这个文件。在 ComfyUI 管理器中,你可以直接加载他人分享的.png工作流图片,系统会自动解析其中的节点结构。
对于本文将要构建的工作流,理解以下核心数据流至关重要:
- 模型/检查点路径->
Load Checkpoint节点 -> 模型、CLIP、VAE 数据。 - 正面/负面提示词+CLIP 模型->
CLIP Text Encode节点 -> 条件张量。 - 图片->
Load Image节点 -> 图片张量。 - 图片张量+预处理器->
ControlNet Apply节点 -> 附加条件。 - 模型+条件+潜空间->
KSampler节点 -> 生成的潜空间。 - 潜空间+VAE->
VAE Decode节点 -> 最终像素图像。
2. 环境准备与基础工作流搭建
在进入高级功能之前,我们需要一个稳定、可用的 ComfyUI 运行环境,并搭建一个最基础的文生图流程作为起点。
2.1 环境部署方案选择
对于大多数用户,推荐以下两种部署方式:
方案一:使用秋叶大佬的整合包(推荐新手)这是最快捷的方式,集成了 ComfyUI、常用插件、依赖和启动器。
- 从可靠来源(如秋叶的 GitHub 发布页或 B站视频简介)下载最新整合包。
- 解压到不含中文和空格的路径,例如
D:\ComfyUI_windows_portable。 - 双击运行
run_nvidia_gpu.bat(N卡)或相应的启动脚本。 - 启动后,在浏览器中打开
http://127.0.0.1:8188即可访问界面。
方案二:从源码安装(适合开发者或需要深度定制)
- 确保已安装 Python(3.10 或 3.11)和 Git。
- 打开终端,克隆官方仓库:
git clone https://github.com/comfyanonymous/ComfyUI.git cd ComfyUI- 安装依赖:
pip install -r requirements.txt- 下载必要的模型文件(如 Stable Diffusion 1.5 或 SDXL 检查点),放入
ComfyUI/models/checkpoints目录。 - 启动:
python main.py2.2 模型文件目录结构
无论哪种安装方式,模型文件的组织都至关重要。一个清晰的目录结构能避免很多节点找不到模型的错误。
ComfyUI/ ├── models/ │ ├── checkpoints/ # 放置大模型 (.safetensors, .ckpt) │ ├── loras/ # 放置 LoRA 模型 (.safetensors) │ ├── controlnet/ # 放置 ControlNet 模型 (.safetensors, .pth) │ ├── vae/ # 放置 VAE 模型 │ ├── clip/ # 放置 CLIP 模型 │ ├── clip_vision/ # 放置 CLIP Vision 模型(用于IP-Adapter等) │ └── upscale_models/ # 放置超分模型(如ESRGAN) ├── output/ # 生成图片的默认输出目录 ├── input/ # 用于放置输入图片的目录 └── ...请将你下载的各类模型文件放入对应的文件夹。例如,从 Civitai 下载的 LoRA 文件应放入models/loras/。
2.3 构建最简文本生成图像工作流
让我们在 ComfyUI 中手动搭建一个基础流程,这有助于理解后续复杂功能的添加。
- 添加加载检查点节点:在空白处右键 ->
Add Node->Loaders->Load Checkpoint。这个节点负责载入你的基础大模型(如sd_xl_base_1.0.safetensors)。 - 添加提示词编码节点:右键 ->
Add Node->Conditioning->CLIP Text Encode (Prompt)。需要添加两个,一个用于正面提示词(prompt),一个用于负面提示词(negative prompt)。 - 连接 CLIP 模型:将
Load Checkpoint节点的CLIP输出端口,分别连接到两个CLIP Text Encode节点的clip输入端口。 - 添加采样器节点:右键 ->
Add Node->Sampling->KSampler。这是核心生成节点。 - 连接采样器:
- 将
Load Checkpoint节点的MODEL输出连接到KSampler的model输入。 - 将正面
CLIP Text Encode节点的CONDITIONING输出连接到KSampler的positive输入。 - 将负面
CLIP Text Encode节点的CONDITIONING输出连接到KSampler的negative输入。
- 将
- 添加 VAE 解码节点:右键 ->
Add Node->Latent->VAE Decode。 - 连接 VAE 并输出:
- 将
Load Checkpoint节点的VAE输出连接到VAE Decode节点的vae输入。 - 将
KSampler节点的LATENT输出连接到VAE Decode节点的samples输入。
- 将
- 添加保存图像节点:右键 ->
Add Node->Image->Save Image。 - 最终连接:将
VAE Decode节点的IMAGE输出连接到Save Image节点的images输入。
现在,你的工作流应该具备完整的生成链条。在CLIP Text Encode节点中输入提示词(例如“a photo of a cat”),设置好KSampler的参数(如 steps=20, cfg=7, sampler=euler, scheduler=normal),点击“Queue Prompt”即可生成图片并保存到output文件夹。
3. 集成官方 LoRA 与 NSFW 控制
LoRA 是微调大模型、注入特定风格或概念的高效方式。ComfyUI 官方原生支持 LoRA 加载,无需额外插件,但需要正确连接。
3.1 官方 LoRA 加载节点详解
在 ComfyUI 中,LoRA 不是直接加载到模型里,而是通过一个“应用”节点,动态地修改已加载的模型权重。
- 添加 LoRA 加载器节点:右键 ->
Add Node->Loaders->Lora Loader。 - 关键连接:这是最容易出错的一步。
Lora Loader节点需要“包裹”住你的原始模型和 CLIP。- 输入:将之前
Load Checkpoint节点的MODEL输出,连接到Lora Loader节点的model输入。同样,将CLIP输出连接到lora_loader的clip输入。 - 输出:将
Lora Loader节点的MODEL输出,连接到KSampler的model输入(取代之前直接来自Load Checkpoint的连接)。将其CLIP输出连接到CLIP Text Encode节点的clip输入(同样取代原有连接)。
- 输入:将之前
- 参数配置:
lora_name: 点击输入框,会弹出models/loras/目录下的文件列表,选择你的 LoRA 文件(如sd_xl_offset_example.safetensors)。strength_model: 控制 LoRA 对模型权重的强度。通常范围在 0 到 1 之间,1 表示完全应用。对于风格类 LoRA,常用 0.6-0.8;对于人物特征类,可能用到 0.8-1.0。strength_clip: 控制 LoRA 对 CLIP 文本编码器的强度。许多 LoRA 只影响模型,不影响 CLIP,此时可以保持为 1.0 或与strength_model一致。如果 LoRA 专门针对文本编码微调,可以调整此值。
注意:一个工作流中可以串联多个
Lora Loader节点,以实现多个 LoRA 的混合。连接顺序会影响最终效果,后应用的 LoRA 可能会覆盖前者的部分特征。
3.2 NSFW 内容的理解与控制
NSFW 在 AI 绘图中通常指涉及暴力、成人等不适宜公开场合的内容。控制 NSFW 并非通过一个“开关”,而是通过一系列技术手段来引导或限制模型的生成方向。
1. 提示词工程(最直接有效): 在负面提示词(negative prompt)中,明确加入你不希望出现的元素描述。这是最基础且强大的控制方式。
- 通用负面词:
nsfw, nude, naked, ...(具体词汇取决于你想过滤的内容)。 - 风格强化:加入
safe, sfw, family friendly, professional等词,可以强化“安全”的倾向。 - 使用 LoRA:存在专门用于“净化”或导向安全风格的 LoRA 模型,加载它们可以显著降低 NSFW 内容的生成概率。
2. 采样器与参数调整:
cfg scale:分类器自由引导尺度。较高的值(如 10-15)会使生成结果更严格地遵循提示词,包括负面提示词,从而更好地抑制 NSFW 内容。但过高会导致图像过饱和、失真。Sampler:某些采样器可能对提示词更敏感。可以尝试不同的采样器观察效果。
3. 外部过滤与审查: 对于生产环境,生成后的图像需要经过一个独立的内容安全审查接口(如使用基于 CLIP 或专门训练的 NSFW 分类模型)进行过滤。这在 ComfyUI 中可以通过自定义节点或外部 API 调用来实现,但这属于更高级的集成范畴。
工作流集成示例: 假设我们有一个名为pure_style.safetensors的、倾向于生成清新风格的 LoRA,同时想避免成人内容。
- 在基础工作流中插入
Lora Loader节点,加载pure_style.safetensors,强度设为 0.7。 - 在负面提示词编码节点中,输入:
nsfw, nude, sexy, blood, gore, deformed, ugly。 - 设置
KSampler的cfg scale为 9。 这样,我们就组合使用了 LoRA 风格引导、负面提示词排斥和 CFG 强化三种手段来控制输出。
4. 实现风格迁移与深度控制
风格迁移和深度控制是 ComfyUI 结合 ControlNet 等插件所能实现的强大功能。这里我们以 ControlNet 为例,因为它是最成熟、节点支持最完整的方案之一。
4.1 安装 ControlNet 预处理器与模型
首先确保你有 ControlNet 节点。秋叶整合包通常已内置。如果没有,可通过 ComfyUI Manager 安装。
- 点击界面上的 “Manager” 按钮(如果有),或访问
http://127.0.0.1:8188/manager。 - 在 “Install Custom Nodes” 标签页,搜索 “ControlNet”,找到并安装
ComfyUI-Impact-Pack或ComfyUI-ControlNet等包,它们通常包含丰富的 ControlNet 节点。
然后,下载 ControlNet 模型。对于风格迁移,常用t2i-adapter系列或control_v11p_sd15_scribble等;对于深度控制,则需control_v11f1p_sd15_depth或depth-sdxl等。将下载的.safetensors文件放入models/controlnet/目录。
4.2 基于 ControlNet 的风格迁移工作流
风格迁移的核心是使用一张风格图,通过 ControlNet(如风格迁移适配器)来约束生成图像的风格,同时用文本提示词控制内容。
- 添加图像加载节点:右键 ->
Add Node->Loaders->Load Image。加载你的风格参考图。 - 添加 ControlNet 应用节点:右键 ->
Add Node->Conditioning->Apply ControlNet。 - 添加 ControlNet 加载节点:右键 ->
Add Node->Loaders->Load ControlNet Model。选择对应的风格迁移 ControlNet 模型(如t2iadapter_style_sd14v1.pth)。 - 连接节点:
- 将
Load Image节点的IMAGE输出连接到Apply ControlNet节点的image输入。 - 将
Load ControlNet Model节点的CONTROL_NET输出连接到Apply ControlNet节点的control_net输入。 - 关键步骤:将正面
CLIP Text Encode节点的CONDITIONING输出,连接到Apply ControlNet节点的conditioning输入。然后将Apply ControlNet节点的CONDITIONING输出,连接到KSampler节点的positive输入。这样就实现了条件信息的“过桥”。
- 将
- 配置参数:
strength: ControlNet 的强度。对于风格迁移,可能需要较高的值(如 0.8-1.0)来确保风格被充分采纳。start_percent/end_percent: 控制 ControlNet 在生成过程的哪个阶段生效。通常风格迁移需要全程生效,所以设为 0.0 和 1.0。
现在,你的提示词描述内容,生成的图像将尽力匹配风格图的色调、笔触、纹理等风格特征。
4.3 基于深度图的生成控制
深度控制常用于保持输入图像(如一张室内设计图)的几何结构,只替换其内容(如将空房间变成有家具的房间)。
- 准备深度图:你需要一张与目标图像对应的深度图。可以使用
MiDaS或Zoe等深度估计算法从原图生成,或使用 3D 软件渲染。在 ComfyUI 中,可以使用MiDaS或Zoe深度估算节点(在Image->Preprocessors下找到)来自动生成。 - 添加深度图加载节点:使用
Load Image节点加载你的深度图(黑白或彩色表示深度)。 - 添加深度 ControlNet 应用节点:流程与风格迁移类似。
- 添加
Load ControlNet Model,选择深度模型(如control_v11f1p_sd15_depth.safetensors)。 - 添加
Apply ControlNet节点。 - 连接:深度图 ->
Apply ControlNet的image;深度 ControlNet 模型 ->control_net;正面条件 ->conditioning输入;输出 ->KSampler的positive。
- 添加
- 参数配置:
strength: 深度控制强度。通常 0.6-0.9,太高可能导致图像过于僵化,失去创造性。start_percent/end_percent: 深度控制通常在生成早期更重要,可以设置end_percent为 0.6-0.8,让模型在后期有一定自由度。
5. 高级技巧:双采样放大与工作流优化
在获得满意的构图后,低分辨率往往细节不足。双采样放大是一种在生成后提升分辨率并补充细节的有效方法。
5.1 双采样放大原理与节点配置
双采样(Two-Step Upscaling)通常指:先以较低分辨率生成图像(第一步采样),然后以该图像为起点,在更高分辨率下进行第二次采样(第二步采样),同时可能加入微调提示词或使用专门的超分模型。
在 ComfyUI 中,一个常见的双采样工作流如下:
- 第一步:生成低分辨率潜空间。使用我们之前构建的完整流程(含 LoRA、ControlNet等),在
KSampler中设置一个较小的分辨率(如 512x768)。将其LATENT输出连接到一个VAE Decode+Save Image用于预览,同时将其LATENT输出连接到下一步的输入。 - 第二步:潜空间放大。在第一个
KSampler之后,添加一个Latent->Upscale Latent By节点(或使用Latent Upscale节点)。将第一个采样器的LATENT输出连接到此节点的samples输入。设置upscale_method(如nearest-exact,bilinear,lanczos)和width,height(目标分辨率,如 1024x1536)。 - 第三步:高分辨率重绘。添加第二个
KSampler节点。- 将放大后的潜空间(
Upscale Latent By节点的LATENT输出)连接到第二个KSampler的latent_image输入。 - 模型、正面/负面条件可以与第一个采样器共享(直接连线过来)。
- 关键调整:降低第二个采样器的
denoise值(如 0.2-0.4)。这表示在第二步中,只对放大后图像的部分细节进行重绘,而不是完全重新生成,从而保持构图一致并增加细节。 - 可以适当降低
cfg scale和采样步数(steps),因为主体已确定。
- 将放大后的潜空间(
- 第四步:解码并保存。将第二个
KSampler的LATENT输出连接到最终的VAE Decode和Save Image。
5.2 工作流组织与性能优化
当节点越来越多时,工作流会变得杂乱。以下技巧可以提升可维护性:
- 使用节点组:选中多个相关节点,按
Ctrl+G将它们编组,可以折叠、命名、移动整个功能模块。 - 使用注释:右键空白处 ->
Add Sticky Note,可以添加文字注释,说明某个区域的功能。 - 利用 Reroute 节点:当连线过长或交叉时,可以添加
Reroute节点(在节点搜索框中输入)作为中转点,让布线更清晰。 - 模型缓存:对于大型模型,频繁加载会消耗时间。确保你的
Load Checkpoint、Load ControlNet Model、Load LoRA节点在流程中只被调用一次,其输出被多处复用。 - 分辨率与批次大小:在
Empty Latent Image节点或KSampler中设置分辨率。增大batch_size可以一次生成多张图,但会显存占用翻倍。根据你的 GPU 显存量力而行。
6. 常见问题排查与参数调优指南
即使按照教程连接,也可能会遇到各种问题。下面是一些常见故障及其排查思路。
6.1 节点连接与执行错误
| 问题现象 | 可能原因 | 检查与解决 |
|---|---|---|
| 点击“Queue Prompt”后无反应,或提示错误 | 1. 节点连线类型不匹配(如图像连到了潜空间)。 2. 必需的输入端口未连接。 3. 模型文件路径错误或缺失。 | 1. 检查所有连线,确保输出/输入数据类型匹配(悬停在线上看提示)。 2. 检查每个节点的输入端口是否都有连接(红色表示未连接)。 3. 检查控制台或浏览器开发者工具(F12)的 Console 标签页,看是否有具体的文件未找到错误。确认模型文件在正确的 models/子目录下。 |
| 生成结果全黑、全灰或扭曲 | 1. VAE 未正确连接或选择错误。 2. 使用了不兼容的模型/LoRA(如 SD1.5 的 LoRA 用在 SDXL 上)。 3. CFG Scale 过高或过低。 | 1. 确保VAE Decode节点的vae输入连接正确,且来自Load Checkpoint或指定的 VAE 模型。2. 确认基础模型、LoRA、ControlNet 的版本匹配(SD1.5 系列互配,SDXL 系列互配)。 3. 尝试将 CFG Scale 调整到 5-9 的常用范围。 |
| LoRA 或 ControlNet 效果不明显或过强 | 强度参数 (strength,strength_model,strength_clip) 设置不当。 | 1. LoRA: 从 0.5-0.7 开始尝试strength_model。2. ControlNet: 从 0.6-0.8 开始尝试 strength。对于start_percent/end_percent,深度/线稿类控制可以全程(0.0, 1.0),风格类可以尝试(0.0, 0.8)。3. 进行小范围参数测试,每次只调整一个变量。 |
| 双采样放大后图像模糊或细节怪异 | 第二步采样的denoise值设置不当。 | denoise控制重绘强度。值太高(如 0.8)等于几乎重画,可能偏离原图;值太低(如 0.1)则细节补充不足。针对高清修复,0.2-0.4 是常用区间。需要根据具体模型和内容调整。 |
6.2 参数调优速查表
以下参数没有绝对最优值,需要根据模型、主题和个人审美反复试验。
| 参数 | 所在节点 | 常用范围 | 影响说明 |
|---|---|---|---|
| Steps | KSampler | 20-30 | 采样步数。步数越多,细节可能越丰富,但生成越慢。超过一定阈值(如 30)后收益递减。 |
| CFG Scale | KSampler | 5-9 (文生图) 2-5 (图生图/重绘) | 提示词跟随程度。值越高,越贴近提示词,但可能降低图像自然度和多样性。过高会导致颜色过饱和、线条生硬。 |
| Sampler | KSampler | euler, euler_ancestral, dpmpp_2m, dpmpp_2m_sde | 不同采样器有不同特性。euler系列速度快;dpmpp_2m系列通常细节更好。dpmpp_sde系列随机性更强。 |
| Scheduler | KSampler | normal, karras, simple | 调度器影响采样节奏。karras通常能产生更锐利、对比度更高的图像。 |
| Denoise | KSampler (用于图生图/重绘) | 0.2-0.4 (高清修复) 0.5-0.8 (强风格迁移) | 重绘强度。1.0 代表完全忽略输入图像,0.0 代表完全保留。 |
| LoRA Strength | Lora Loader | 0.5-1.0 | LoRA 权重应用强度。建议从 0.7 开始测试。多个 LoRA 叠加时,总强度可能需降低。 |
| ControlNet Strength | Apply ControlNet | 0.6-1.0 | ControlNet 条件强度。需要根据控制类型调整,深度/线稿可高,风格/色彩可中。 |
6.3 高级排查:使用提示词分析
如果效果始终不理想,可以暂时剥离复杂控制,回归基础。
- 只使用基础模型和简单提示词生成,确认模型本身工作正常。
- 逐步添加 LoRA,观察变化是否符合预期。
- 再逐步添加 ControlNet,每次只加一个,确认其单独作用的效果。
- 最后将所有节点组合。这种方法能帮你定位是哪个环节导致了问题。
7. 生产环境建议与扩展方向
当你熟悉了基本工作流后,可以考虑以下优化和扩展,以用于更稳定、更高效的创作或生产流程。
7.1 工作流模板化与 API 调用
对于固定流程,可以将其保存为模板。ComfyUI 支持通过 API 进行调用,这允许你将其集成到自动化脚本或其他应用中。
- 将调试好的工作流保存为
.json文件。 - 研究 ComfyUI 的 API 文档(通常位于
http://127.0.0.1:8188/docs),了解如何通过 HTTP POST 请求,传递提示词、种子等参数,并触发工作流执行。 - 你可以编写 Python 脚本,动态修改工作流
.json中的特定节点参数,然后通过 API 提交,实现批量化、参数化的生成。
7.2 性能与资源管理
- 显存优化:使用
--lowvram或--medvram命令行参数启动 ComfyUI,可以在显存不足时尝试优化。但可能会降低速度。 - 模型卸载:在
KSampler节点后,可以添加Model Unloading相关节点(如有),及时释放显存,这在处理多步复杂工作流时有用。 - 使用 TAESD:对于快速预览,可以使用 TAESD 解码器(一种轻量级 VAE),它能极大加快潜空间到图像的解码速度,虽然会损失一些细节。
7.3 探索更多节点与插件
ComfyUI 的生态非常活跃。通过 ComfyUI Manager,你可以探索和安装无数社区插件,实现:
- 面部修复与高清修复:如
FaceDetailer节点。 - 多 ControlNet 融合:同时应用深度、线稿、姿态等多个控制条件。
- 区域提示词控制:使用
Regional Prompter等插件,为图像的不同区域指定不同的提示词。 - 工作流条件逻辑:实现基于生成结果的判断和分支流程。
构建复杂工作流的关键在于耐心和模块化思维。将大目标拆解为“加载模型”、“编码提示词”、“应用控制条件”、“生成”、“后处理”等独立模块,逐一实现和测试,最后将它们像拼图一样组合起来。每一次成功的生成和每一次对问题的排查,都会让你对 Stable Diffusion 的生成机制和 ComfyUI 的强大控制力有更深的理解。
