手动调提示词是一件很耗神的事。在 ComfyUI 里来回改词、等出图,半天就过去了。所以我折腾了一套自动化流程,把重复劳动交给节点去做。

利用 ComfyUI 的模块化特性,正好可以把繁琐的手工操作固化下来。下面聊聊我踩过的坑和最后的方案,或许能帮你省点时间。
为什么需要自动化
手动操作提示词主要有三个问题:构思一个复杂 prompt 动不动就几分钟;改一个词就要重新跑图,等待渲染、对比,大量时间耗在试错上;而且同样 prompt 在不同模型下效果可能天差地别,没有系统化的参数管理,出图质量很不稳定。核心就是重复劳动多,还强依赖经验。ComfyUI 的节点工作流恰好提供了一个很好的画布来把这些经验固定下来。
核心节点的设计与实现
我设计了三个关键节点,组成提示词助手的骨架。
自动补全与建议:基于历史成功 prompt 或风格库,在输入部分关键词时推荐相关的形容词、场景细节或艺术家风格。内部用了一个词向量模型(比如 Sentence-BERT 的轻量版),计算相似度后返回 Top-N 推荐。在 ComfyUI 里需要继承 Prompt 处理类,额外增加建议输出端口。
风格继承与迁移:给定参考图或风格描述,自动解析成风格化 prompt 片段。这需要集成 BLIP 这类图像描述模型,将参考图转成文本,再通过规则或小型模型转化为'梵高风格'、'赛博朋克'等修饰。节点内部调用模型 API,把结果拼回主 prompt。
参数优化:根据期望的图像属性(比如'更写实'、'更多细节')自动调整 CFG Scale、Steps 等生成参数,同时微调 prompt 本身。我建了一个小型的'prompt-参数-效果'映射库,结合简单的规则引擎,根据输入倾向和内容复杂度输出推荐参数。节点会输出包含优化后 prompt 和参数字典的复合数据。
与 Stable Diffusion API 集成
助手要能直接驱图,就必须跟推理 API 打通。ComfyUI 本身支持 API,我在后台封装了一个客户端,让助手节点可以直接发起请求。下面这个 Python 示例展示了核心逻辑,也加了缓存和性能埋点。
import json
import requests
import time
from typing import Dict, Any, Optional
from dataclasses import dataclass
from functools import lru_cache
@dataclass
class GenerationResult:
"""封装生成结果"""
images: list # 图片数据或路径列表
parameters: Dict[str, Any] # 使用的参数
prompt:
:
():
.server_address = server_address
.base_url =
.session = requests.Session()
() -> []:
url =
:
response = .session.post(url, json=data, timeout=)
response.raise_for_status()
response.json()
requests.exceptions.RequestException e:
()
json.JSONDecodeError e:
()
() -> :
workflow = json.loads(workflow_template)
workflow[][][] = prompt
workflow
() -> [GenerationResult]:
start_time = time.time()
workflow_prep_start = time.time()
workflow = ._get_cached_workflow(prompt, workflow_template)
workflow_prep_time = time.time() - workflow_prep_start
queue_start = time.time()
resp = ._post_json(, {: workflow})
resp resp:
prompt_id = resp[]
queue_time = time.time() - queue_start
images = []
:
history = ._post_json(, {})
history prompt_id history:
data = history[prompt_id]
data[][]:
node_id, node_output data[].items():
node_output:
img node_output[]:
images.append(img[])
data[][]:
()
time.sleep()
total_time = time.time() - start_time
(
)
GenerationResult(
images=images[:batch_size],
parameters={: workflow[][][]},
prompt=prompt
)
():
client = ComfyUIClient()
test_template =
result = client.generate_with_prompt(, test_template)
result
()
__name__ == :
test_comfyui_client_generation()


