ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

从零搭建本地AI设计工作流:ComfyUI+Ollama实现免费批量出图

2026/9/1 5:35:06 拓冰建站 浏览量
从零搭建本地AI设计工作流:ComfyUI+Ollama实现免费批量出图 先说结论这套工作流的核心不是某个神奇插件而是一整套可以完全跑在本地、按次生成不花积分、也不依赖云端配额的设计流程。它包含图像生成、提示词优化、批量出图、自动后处理四个模块我用它完成了大量海报草稿、头像素材和短视频分镜的前期探索。下面我会从架构思路、环境搭建、代码实现到避坑清单完整写一遍内容偏工程实践新手也能照着搭。当设计需求变成高频动作后很多人会越来越依赖 AI 出图。早期我也用过在线平台但用着用着就发现几个绕不开的问题免费额度有限生成几次就提示要升级排队高峰期出图速度不稳定上传的参考图和提示词还涉及隐私。更重要的是在线工具的“黑盒”属性让流程很难复现同一组参数换一个时段可能结果完全不同。于是我开始尝试把整个出图流程搬回本地经过一段时间的磨合最终沉淀出了这套工作流整体体验已经完全可以替代不少在线服务。1. 为什么要打造一套本地AI设计工作流1.1 在线AI设计工具的痛点在线 AI 绘画工具的优点是开箱即用注册完账号就能动手但实际投入到工作流中时痛点也相当明显。首先绝大多数平台采用“credits”或“积分”模式每次生成都扣点数。很多平台在注册时会赠送一些 credits但如果要批量生成、多次调试参数这些额度消耗得非常快。第二个痛点是流程不可控。在线平台通常只提供“输入提示词、点生成、看结果”的交互内部用了什么模型、什么采样器、多少步数用户很难干预。对于设计工作来说我们需要精确控制风格、尺寸、随机种子、负面提示词甚至需要固定某个 LoRA 来控制画面元素。在线平台很难提供这么细粒度的控制。第三个痛点是安全和隐私。设计稿、品牌素材、人物形象等都属于敏感资产把它们上传到第三方服务器意味着要面临数据留存、泄露和合规风险。如果是企业项目尤其是涉及未公开产品、客户资料和内部品牌规范的内容使用本地工作流会规避很多麻烦。1.2 本地工作流的整体架构这套本地 AI 设计工作流从下到上分成四层。第一层是硬件层主要是显卡、内存和磁盘。图像生成是一个典型的并行计算任务NVIDIA GPU 的 CUDA 生态最成熟如果你使用的是 A 卡或纯 CPU 环境也能跑只是速度会慢很多。对于大多数入门场景6GB 以上显存的显卡是比较舒服的起点8GB 显存可以体验大部分常见模型12GB 以上可以做更高分辨率或训练 LoRA。第二层是推理引擎层这里我选择 ComfyUI。它和 Stable Diffusion WebUI 一样都是本地 AI 绘画工具但 ComfyUI 最大的特点是用节点图来描述整个生成流程。这种设计非常底层也很灵活你甚至可以把每一步计算过程都拆开看。刚开始接触节点图会觉得复杂但一旦你理解了输入输出链路就能组合出非常多的工作流。第三层是模型层包括基础模型Checkpoint、LoRA、ControlNet、VAE 和提示词辅助模型。基础模型定义了整体画风和底子LoRA 可以控制特定角色或者物品特征ControlNet 能通过线稿、深度图、姿态图来约束构图。所有模型文件都存放在本地目录里你可以自由切换组合。第四层是自动化层是一些 Python 脚本和配置文件。它们负责批量调用 ComfyUI 的 API把写好的提示词批量丢给生成引擎再将结果按规则保存到指定目录。这一层让“设计工作流”从“手动点按钮”变成“半自动流水线”。1.3 免费与可控的边界这里的“免费”不是指硬件和电费为零而是指没有按张数计费、没有账号订阅、没有额度限制。模型文件和软件本身大多是开源的你下载一次模型后本地生成多少次都不需要额外付费。不过需要注意部分模型协议是非商业用途如果是企业商用项目需要提前确认模型的 License。可控性则体现在三个维度第一你可以完整保存工作流定义随时复现同一张图的生成过程第二你可以看到节点之间的参数传递而不是面对一个黑盒第三你可以离线运行不用把数据交给服务商。想实现完全离线只需要在安装依赖和下载模型时联网之后运行时断开网线也可以。2. 环境准备与硬件说明2.1 硬件与操作系统要求我在 Windows 和 Linux 两种系统上分别跑过这套工作流。Windows 的优点是驱动和图形界面友好适合绝大多数设计师Linux 更适合部署在服务器或 NAS 上长期跑批量任务。硬件方面可以用下面这张表做参考配置项入门建议舒适配置说明显卡NVIDIA GTX 1660 6GBNVIDIA RTX 3060 12GB 及以上显存越大能跑的模型和分辨率越高内存16GB32GB加载模型时内存占用不可忽略磁盘30GB 空闲100GB 以上空闲模型文件常见为 2GB 到 7GB 不等CPU4 核8 核及以上负责数据预处理和调度影响较小如果你不满足硬件条件也可以先用 CPU 模式跑通流程验证代码和脚本没问题后再换到有 GPU 的机器上。重点是把整个工程跑通而不是一开始就追求高分辨率。2.2 安装Python、Git与显卡驱动ComfyUI 基于 Python 运行所以需要准备 Python 3.10 或 3.11 环境。版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。安装 Python 时建议勾选 “Add Python to PATH”这样命令行可以直接调用 python 命令。Git 用于下载 ComfyUI 源码和部分自定义节点。如果对 Git 不熟也可以直接到官方仓库下载压缩包但后续更新会比较麻烦。显卡驱动方面NVIDIA 用户需要安装较新的 Game Ready 或 Studio 驱动然后在终端执行 nvidia-smi确认驱动能识别显卡。如果打算用 GPU 加速还需要安装对应版本的 PyTorch。ComfyUI 的 requirements.txt 默认会安装适合大多数环境的 PyTorch但如果你需要更精细的 CUDA 版本控制可以到 PyTorch 官网选择对应命令。安装完成后建议在 Python 环境里执行下面的命令验证 GPU 是否可用import torch print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else CPU Only)如果输出True和显卡型号说明 GPU 环境正常如果输出False就检查驱动版本和 PyTorch 的 CUDA 版本。2.3 安装ComfyUIComfyUI 是一个开源项目目录结构清晰安装过程不复杂。以下命令适用于 Linux 和 macOSWindows 用户可以在 Git Bash 或 WSL 中执行也可以在 PowerShell 中手动下载源码后执行同样命令。git clone https://github.com/comfyanonymous/ComfyUI.git cd ComfyUI python -m venv venv source venv/bin/activate # Windows 下使用 venv\Scripts\activate pip install -r requirements.txt依赖安装完成后用下面的命令启动python main.py看到类似Starting server的日志后浏览器访问http://127.0.0.1:8188就可以打开 ComfyUI 的节点编辑界面。如果你希望在局域网内其他设备访问可以把启动命令改成python main.py --listen 0.0.0.0 --port 8188但需要注意打开局域网访问意味着其他设备也能调用你的生成接口在没有鉴权的情况下建议不要直接暴露到公网。2.4 下载基础模型ComfyUI 启动后是空壳还需要模型文件才能生成图像。基础模型Checkpoint放在models/checkpoints目录下常见的 Stable Diffusion 系列模型、社区训练的大模型都支持。模型体积通常为 2GB 到 7GB首次下载时需要足够的磁盘空间。下载方式根据来源不同差异较大如果下载源不稳定建议使用支持断点续传的下载工具或者通过可信的离线渠道拷贝。这里不推荐破解或盗版渠道尽量选择模型作者发布的官方页面。模型文件放置完毕后在 ComfyUI 界面刷新节点列表就能在Load Checkpoint节点里看到对应名称。对于刚入门的用户我建议先只放一个基础模型不要一次性塞几十个 LoRA否则排查问题时很难定位是哪部分造成的异常。3. 从零搭建第一条文生图工作流3.1 理解ComfyUI的核心概念ComfyUI 的每个节点都对应一类计算任务。以最简文生图为例你至少需要以下节点Load Checkpoint加载基础模型并输出模型、CLIP、VAE 三组数据。CLIP Text Encode把提示词编码成模型能理解的向量正向提示词和负向提示词各一个节点。Empty Latent Image创建一张空白的潜空间图像定义生成尺寸和批次数量。KSampler执行采样循环是扩散模型的核心步骤。VAE Decode把潜空间数据解码成像素级图像。Save Image将结果保存到输出目录。理解 ComfyUI 的节点图可以从“数据流”的角度去想模型数据从Load Checkpoint流出一路分到采样器提示词通过 CLIP 编码后也进采样器采样器消耗这些输入输出潜空间图像潜空间图像再经过 VAE 解码变成普通图片最后保存到磁盘。3.2 最小工作流的API结构虽然可以在网页里拖拽节点但为了批量化和自动化我更推荐通过 ComfyUI 的 API 接口来提交工作流。ComfyUI 会把网页上的节点图自动转换成 JSON 结构最终以prompt字段形式发送到本地接口。这个 JSON 结构其实就是一个包含多个节点的字典。下面是一个最小文生图工作流的 Python 字典可以直接在脚本中使用workflow { 1: { class_type: CheckpointLoaderSimple, inputs: { ckpt_name: model.safetensors } }, 2: { class_type: CLIPTextEncode, inputs: { text: a cute corgi, sitting on grass, soft lighting, high quality, clip: [1, 1] } }, 3: { class_type: CLIPTextEncode, inputs: { text: blurry, low quality, distorted, watermark, clip: [1, 1] } }, 4: { class_type: EmptyLatentImage, inputs: { width: 512, height: 512, batch_size: 1 } }, 5: { class_type: KSampler, inputs: { seed: 42, steps: 20, cfg: 7.0, sampler_name: euler, scheduler: normal, denoise: 1.0, 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: { images: [6, 0], filename_prefix: local_ai_design } } }注意这里的节点编号“1”到“7”只是脚本里的自定义索引传给 ComfyUI 后用字符串标识即可。ckpt_name要和你放在models/checkpoints目录下的模型文件名完全一致。3.3 用Python调用本地工作流ComfyUI 启动后会开启一个本地 HTTP 服务默认地址是http://127.0.0.1:8188。我们可以用 Python 的requests库把上面的工作流字典提交上去。先安装依赖pip install requests pillow然后写一个通用的生成函数import json import time import requests import urllib.parse COMFYUI_HOST 127.0.0.1:8188 def generate_image(workflow, save_pathoutput.png): # 1. 提交工作流 resp requests.post( fhttp://{COMFYUI_HOST}/prompt, json{prompt: workflow} ) resp.raise_for_status() prompt_id resp.json().get(prompt_id) # 2. 轮询等待生成完成 while True: history requests.get( fhttp://{COMFYUI_HOST}/history/{prompt_id} ).json() if prompt_id in history: break time.sleep(1) # 3. 从历史记录中取出本地文件名 item history[prompt_id] outputs item.get(outputs, {}) for node_id, node_output in outputs.items(): for image in node_output.get(images, []): filename image[filename] subfolder image.get(subfolder, ) img_type image.get(type, output) # 4. 组装下载地址并保存 query urllib.parse.urlencode({ filename: filename, subfolder: subfolder, type: img_type }) img_resp requests.get( fhttp://{COMFYUI_HOST}/view?{query} ) img_resp.raise_for_status() with open(save_path, wb) as f: f.write(img_resp.content) return save_path raise RuntimeError(生成失败未找到输出图片)这个函数做三件事提交工作流、等待任务完成、下载图片。如果你的工作流里包含多个保存节点可以通过node_id区分不同输出代码可以继续扩展。3.4 运行与验证把上面的代码组合成下面这个示例if __name__ __main__: output_path generate_image(workflow, test_output.png) print(f图片已保存到: {output_path})启动 ComfyUI 后运行脚本。第一次生成一般会比较慢因为需要把模型加载到显存。之后如果再提交任务模型已经驻留在显存中速度会明显提升。如果一切正常当前目录下会出现test_output.png这张图就是本地 AI 设计工作流产出的第一张图。到这里你已经搭建出了最核心的生成链路。接下来要做的是让工作流更贴合设计场景而不是每次都手动去改 Python 字典里的提示词。4. 加入本地大模型让提示词自动优化4.1 为什么需要提示词助手提示词对生成结果的影响极大。写提示词时设计师往往需要把脑海中比较抽象的画面转换成英文风格词、质量词、负面词。这个过程很耗时而且不同模型的提示词敏感度不同。为了解决这个问题我在工作流里加入了一层“提示词助手”它由本地运行的 LLM 完成。与在线聊天平台不同本地运行的提示词助手不会把项目需求上传到外部服务器也比较容易嵌入到脚本里。如果你熟悉 Ollama可以直接通过它的 HTTP API 调用本地模型如果你已经在使用 Dify、n8n 这类工作流平台也可以把提示词优化看作一个智能体节点由它输出结构化结果后交给下游的 ComfyUI 执行。从整体结构看这套提示词优化链路是原始设计需求 → 本地 LLM → 结构化提示词 → ComfyUI 文生图 → 结果图片。这样做的好处是你只需要用自然语言描述“一个坐在草地上的柯基侧光电影感”优化器会帮你转换成更符合模型偏好的提示词。4.2 接入Ollama本地模型Ollama 是当前比较方便的本地 LLM 运行工具之一。安装完成后通过下面命令启动服务并拉取模型ollama pull qwen2.5:7b ollama serve模型名称以你本地实际拉取到的为准我这边用qwen2.5:7b举例。接下来在 Python 中调用 Ollama 的生成接口import requests OLLAMA_URL http://127.0.0.1:11434/api/generate def optimize_prompt(design_requirement, style_hintphotorealistic): prompt_text f 你是一名资深视觉设计师请把下面的设计需求改写成适合 Stable Diffusion 的图像生成提示词。 要求 1. 使用英文单词或短语按重要程度排序 2. 包含主体、环境、光线、镜头、画质关键词 3. 同时在最后输出负面提示词以 NEGATIVE: 开头 4. 不要输出多余解释。 设计需求{design_requirement} 风格建议{style_hint} resp requests.post( OLLAMA_URL, json{ model: qwen2.5:7b, prompt: prompt_text, stream: False, temperature: 0.7 }, timeout120 ) resp.raise_for_status() return resp.json()[response].strip()这里有一个容易踩坑的地方Ollama 接口返回的response是长文本里面可能包含NEGATIVE:和换行。我们需要写一个解析函数把正负提示词拆开。def parse_prompt(raw_text): lines raw_text.replace(, ,).split(\n) positive_parts [] negative_parts [] is_negative False for line in lines: line line.strip() if not line: continue if line.upper().startswith(NEGATIVE): is_negative True continue if is_negative: negative_parts.append(line) else: positive_parts.append(line) return , .join(positive_parts), , .join(negative_parts)解析时要注意大小写和标点。不同模型的输出格式可能不一致建议提前跑一次样例确认分隔符是否符合预期。4.3 把优化后的提示词送进ComfyUI有了优化后的提示词接下来要把它填进之前的workflow字典。由于CLIPTextEncode节点里的text字段是普通字符串我们可以直接替换。def make_workflow(positive, negative, seed100, ckptmodel.safetensors): return { 1: { class_type: CheckpointLoaderSimple, inputs: {ckpt_name: ckpt} }, 2: { class_type: CLIPTextEncode, inputs: { text: positive, clip: [1, 1] } }, 3: { class_type: CLIPTextEncode, inputs: { text: negative, clip: [1, 1] } }, 4: { class_type: EmptyLatentImage, inputs: {width: 512, height: 512, batch_size: 1} }, 5: { class_type: KSampler, inputs: { seed: seed, steps: 20, cfg: 7.0, sampler_name: euler, scheduler: normal, denoise: 1.0, 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: {images: [6, 0], filename_prefix: ai_design} } }在实际使用中我会把design_requirement放在一个 CSV 或 JSON 文件里循环调用optimize_prompt再调用generate_image。这样就能批量从“一句话设计需求”到“成图”整个过程几乎不用打开浏览器。5. 批量生成与自动化后处理5.1 批量任务管理设计工作流真正产生价值是在需要生成大量候选方案的场景。假设你要为一个活动设计 30 张不同风格的配图手动去写提示词、点生成会累到崩溃。更合理的方式是建立一个任务清单文件用脚本统一处理。我习惯用 JSON 文件维护任务[ { id: poster_01, design_requirement: 夏日饮品海报柠檬气泡水玻璃杯水珠明亮背景, style_hint: commercial photography, width: 768, height: 1024 }, { id: poster_02, design_requirement: 科技感舞台背景蓝色光线抽象粒子未来风格, style_hint: cyberpunk, width: 1024, height: 768 } ]然后写一个批量执行脚本import json from pathlib import Path def run_batch(task_file): tasks json.loads(Path(task_file).read_text(encodingutf-8)) for task in tasks: raw_prompt optimize_prompt(task[design_requirement], task[style_hint]) positive, negative parse_prompt(raw_prompt) wf make_workflow( positivepositive, negativenegative, seedtask.get(seed, 42), ckptmodel.safetensors ) save_dir Path(output) / task[id] save_dir.mkdir(parentsTrue, exist_okTrue) save_path save_dir / base.png generate_image(wf, str(save_path)) print(f完成: {task[id]})批量执行脚本需要注意两点一是任务量较大时要控制间隔避免短时间提交过多任务导致显存溢出二是要记录每次的 seed 和提示词方便后续复现。建议每个任务都保存一份meta.json把参数写进去这样即使一个月后也能还原当时的生成逻辑。5.2 自动保存与文件命名在工程化的工作流里文件命名尽量不要用默认的00001.png这种流水号因为它无法反映出图片内容和生成参数。我常用的命名格式是{任务ID}_{风格}_{seed}.png比如poster_01_photorealistic_42.png。这样放在文件夹里一眼就能看出是哪批任务、什么风格、随机种子是多少。如果需要在同一任务下生成多张候选图可以在文件名末尾继续追加序号。自动保存的代码可以继续封装def generate_and_save(task, extra_tag, seedNone): if seed is None: seed int(time.time() * 1000) % 100000 raw_prompt optimize_prompt(task[design_requirement], task[style_hint]) positive, negative parse_prompt(raw_prompt) wf make_workflow(positive, negative, seedseed, ckptmodel.safetensors) save_dir Path(output) / task[id] save_dir.mkdir(parentsTrue, exist_okTrue) style_slug task[style_hint].replace( , _) filename f{task[id]}_{style_slug}_{seed}{extra_tag}.png save_path save_dir / filename generate_image(wf, str(save_path)) meta_path save_dir / f{filename}.meta.json meta_path.write_text( json.dumps({ task_id: task[id], style: task[style_hint], seed: seed, positive: positive, negative: negative }, ensure_asciiFalse, indent2), encodingutf-8 ) return save_path5.3 图片裁剪、加水印与拼接生成完图片后通常还需要做后处理。比如批量生成的封面图需要统一尺寸内部预览需要把多张候选图拼成一张对比图如果是发到社交平台需要批量加水印。下面是一个简单的后处理函数基于 Pillow 实现批量裁剪和水印from PIL import Image, ImageDraw, ImageFont def add_watermark(image_path, output_path, watermark_textLOCAL AI): img Image.open(image_path).convert(RGB) width, height img.size draw ImageDraw.Draw(img) # 如果系统没有对应字体可以换成其他已有字体路径 try: font ImageFont.truetype(arial.ttf, int(height * 0.03)) except Exception: font ImageFont.load_default() text_width draw.textlength(watermark_text, fontfont) x width - text_width - 20 y height - int(height * 0.03) - 20 draw.text((x, y), watermark_text, fill(255, 255, 255), fontfont) img.save(output_path, quality95)拼接多张图时可以用两列网格def create_grid(image_paths, grid_size(2, 3), output_pathgrid.png): thumbnails [ Image.open(p).convert(RGB).resize((512, 512)) for p in image_paths ] cols, rows grid_size canvas Image.new(RGB, (cols * 512, rows * 512), (255, 255, 255)) for idx, thumb in enumerate(thumbnails): if idx cols * rows: break x (idx % cols) * 512 y (idx // cols) * 512 canvas.paste(thumb, (x, y)) canvas.save(output_path)把这个函数放在批量任务后面每次生成完一批图会自动生成一张对比总览图。我习惯叫它“预览图”这样不用打开十几个文件就能快速浏览效果。6. 常见问题与排查思路6.1 安装与启动阶段问题现象常见原因解决思路python命令找不到Python 未加入 PATH安装时勾选 Add Python to PATH或手动配置环境变量启动时端口被占用8188 端口已被其他程序使用结束时先关闭旧进程或使用--port 8189换端口导入 torch 报错PyTorch 安装版本与 CUDA 不匹配执行python -c import torch; print(torch.__version__)确认版本重新按官方命令安装浏览器打不开界面服务可能未启动成功检查终端日志确认出现Starting server字样后再访问安装阶段的坑大多集中在 Python 环境和 CUDA 版本上。如果运行pip install -r requirements.txt时网络不稳定可以考虑使用国内 pip 镜像源这属于常规操作通过-i参数指定即可。6.2 生成阶段生成阶段最容易出的问题有两类黑图/灰图和显存不足。黑图或灰图通常是 VAE 或模型权重精度问题。检查一下VAEDecode节点的输入是否真的来自Load Checkpoint的第二路输出以及你是否用了正确的模型文件。如果模型文件下载不完整也可能造成异常结果可以比对模型文件的 SHA256 或文件大小。显存不足时ComfyUI 日志会提示类似OutOfMemoryError的信息。解决思路是降低分辨率、减小 batch_size或者在启动命令中添加--lowvram参数来启用低显存模式。如果还是不够可以换一个更小的基座模型。需要注意的是--lowvram会把部分模型反复在显存和内存之间搬运速度会下降但能避免直接崩溃。问题现象常见原因解决思路生成黑图VAE 连接错误或模型文件损坏检查节点连线重新下载模型并校验文件显存溢出分辨率或 batch_size 过大降低分辨率、减小 batch_size使用--lowvram每次生成结果完全一样seed 固定导致手动修改 seed或使用随机 seed生成图像模糊步数太少或 CFG 不匹配增加 steps调整 cfg 到 5.5 到 8 之间6.3 节点与依赖缺失很多从社区下载的工作流会包含自定义节点比如 ControlNet 辅助、动态提示词、图像放大等。使用这类工作流时如果遇到Missing nodes或Please install missing packages的报错不要急着硬跑。这里需要解释一个常见误解ComfyUI 的自定义节点本质上是额外写的 Python 模块。报错提示“缺失节点”说明当前环境没有对应插件提示“请安装缺失的包”则说明插件代码可能已经存在但 Python 依赖包没装完。前者要到节点管理器中安装后者通常需要进入对应插件目录或项目根目录执行pip install -r requirements.txt。如果你用的是 ComfyUI Manager可以在界面里统一搜索和安装缺失节点。没有装 Manager 的话只能手动从节点作者仓库下载放进custom_nodes目录。安装完自定义节点后需要重启 ComfyUI有些节点还要求重启 Python 内核否则新节点不会出现在界面中。7. 最佳实践与工程建议7.1 目录规划与命名规范本地工作流的目录如果乱后期维护会很痛苦。我推荐下面的目录结构ai-design-workflow/ ├── ComfyUI/ │ ├── models/ │ │ ├── checkpoints/ │ │ ├── loras/ │ │ ├── vae/ │ │ └── controlnet/ │ ├── custom_nodes/ │ └── output/ ├── scripts/ │ ├── generate.py │ ├── optimize_prompt.py │ └── postprocess.py ├── tasks/ │ └── batch_tasks.json └── logs/tasks目录存放设计任务清单scripts目录存放自动化代码output目录按任务 ID 分子目录。命名上建议统一使用小写字母和下划线避免文件名里出现空格和中文因为部分工具对中文文件名兼容性不好。7.2 提示词资产沉淀我见过很多设计师使用 AI 绘画时想到什么写什么完全没有积累。时间长了会发现每次生成都像在碰运气。比较推荐的做法是建立一个“提示词模板库”把过去成功的正负提示词按风格分类保存例如photorealistic/ ├── product.txt ├── portrait.txt └── landscape.txt cyberpunk/ ├── city.txt └── character.txt模板文件可以采用下面的格式POSITIVE: masterpiece, best quality, {subject}, {environment}, soft lighting, detailed NEGATIVE: lowres, bad anatomy, bad hands, missing fingers, watermark, logo, blurry在 Python 脚本里读取模板时用format填充占位符with open(templates/photorealistic/product.txt) as f: content f.read() positive_template content.split(NEGATIVE:)[0].strip() negative_template content.split(NEGATIVE:)[1].strip() positive positive_template.format( subjectlemon soda, environmenton the table with water drops )通过模板库可以把个人风格沉淀下来后续即使换了模型也能快速调整。7.3 安全边界与数据管理安全是一个很容易被忽略的话题。第一是模型安全网上流传的模型文件鱼龙混杂部分恶意模型可能在生成时执行额外代码。所以尽量从可信渠道下载并在运行前校验文件哈希。第二是接口安全ComfyUI 默认没有鉴权如果开启了--listen 0.0.0.0不等于可以挂到公网。建议只在可信内网使用或者通过反向代理增加认证。第三是数据备份模型本身可以重新下载但生成的设计稿、配置和任务清单需要定期备份。输出目录可以纳入 Git 管理但注意模型文件不要放进 Git 仓库体积太大容易拖慢仓库。7.4 从图像生成本地工作流延伸当你已经熟悉 ComfyUI 的节点和 API 后可以把这套思路迁移到其他自动化场景。比如用 Python 脚本把 Markdown 设计文档转为批量任务、用本地大模型总结用户输入、再用 ComfyUI 出图或者把 n8n 这类自动化工具接到本地接口让机器人自动接收任务并返回图片。你会发现“工作流”这个词并不只属于某个单一工具而是一种把输入、处理、输出链路自动化的思路。我在做短视频分镜和漫画初稿时也用到了类似的流程先写分镜脚本再让本地 LLM 提取每镜的关键元素最后批量丢给 ComfyUI 生成底图。ComfyUI 的优势是可以把生成结果继续接入 ControlNet 等后处理链做到构图可控而不只是“抽卡式”出图。8. 写在最后这套本地 AI 设计工作流核心思路是把“AI 出图”从一次性操作升级成可批量、可复现、可扩展的工程链路。你不需要很复杂的代码功底只要理解节点数据流和 API 调用就能在这套框架上继续加节点、加模型、加自动化模块。建议你拿到文章后先把最小的文生图脚本跑通再逐步加入提示词优化、批处理和图片后处理。遇到问题不要堆功能按日志和错误信息一层层拆解。本地运行并不意味着“什么都不用管”它需要你花一点时间维护模型、依赖和目录结构。但换来的回报也很直接没有额度焦虑没有数据上传风险所有生成过程都在你的掌控之内。下一阶段你可以继续研究 ControlNet 做构图控制、LoRA 定制风格或者把 ComfyUI 接入聊天机器人实现“对话式出图”。希望这篇文章能帮你迈出从“在线体验”到“本地工程化”的第一步。