Stable Diffusion 提示词生成 Stable Diffusion 提示词生成 LLM:Python 环境配置
如果你需要一个 Stable Diffusion 提示词生成 LLM 将几个词扩展为结构完整的提示词,只需一个文本模型和约三十行 Python 代码。该模型以文本形式生成提示词;它不渲染图片,因此你仍需将结果通过 SDXL 或你使用的其他图像工具进行处理。


要点
- LLM 仅生成文本。将其输出输入到你自己的 SDXL、ComfyUI 或 Automatic1111 设置中。
- JSON 模式返回你可以无需正则表达式解析的正向提示词和负向提示词。
- 一次扩展成本低于 $0.0001,因此 1,000 个提示词的成本约为 $0.09。
- 保持提示词简洁:SDXL 的文本编码器仅读取每个块的前 77 个 token。
LLM 能做什么和不能做什么
图像模型对密集、具体的提示词反应良好:主体、场景、镜头、光照、媒介、情绪以及要避免的事物列表。大多数人输入三个词,得到的结果平淡无奇。LLM 通过获取你的简短想法并以一致的格式编写长版本,填补了这一差距。
明确分工。该服务是一个 纯文本 API。它不生成图像、音频或视频,也没有嵌入或微调功能。它位于你的图像流水线之前,编写流水线读取的指令。它是一个 OpenAI 兼容的接口,服务于来自独立提供商的一个开放权重模型,而非任何图像模型厂商的产品。
该模型经过调整,可在合法成人使用中无内容审查地回答,这对艺术家和游戏开发者很重要,因为他们的主题(恐怖、虚构暴力、成熟主题)在其他地方会被屏蔽。涉及未成年人的性内容是硬性限制,永远不会生成。
步骤 1:获取密钥并测试一次调用
使用 Google 或电子邮件和密码注册,然后打开 API 密钥页面。一键试用增加 $0.50 的额度,有效期 7 天且无需绑卡。正如成本部分所示,这足以进行数千次提示词扩展。
使用 curl 检查一切是否正常工作:
curl https://api.sdxlapi.com/v1/chat/completions \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"messages": [
{"role": "system", "content": "You write Stable Diffusion prompts."},
{"role": "user", "content": "lighthouse in a storm"}
]
}'
一旦更改基础 URL 和密钥,任何 OpenAI SDK 均可使用。详细信息请参阅 文档。
步骤 2:提供稳定输出的系统提示词
系统提示词是质量的来源。告诉模型目标格式、元素顺序、长度限制以及要省略的内容。以下是一个作为起点的良好版本:
你将简短的图像创意转化为 SDXL 的提示词。编写一个 40 到 60 个词的正向提示词:首先是主体,然后是场景、构图、光照、媒介或风格,以及情绪。使用逗号分隔的短语,不要使用完整句子。然后编写最多 15 个短语的反向提示词。不要在图片中添加文字、水印或字幕。返回包含 "prompt" 和 "negative" 键的 JSON。
字数限制很重要。SDXL 的 CLIP 文本编码器以 77 个 token 的块读取提示词,超过此限制的内容要么被截断,要么由你 UI 中的分块功能处理。目标为 40 到 60 词,使大多数提示词位于一个块内,并将最重要的细节放在前面。
使用低到中等温度(0.7 到 0.9),以保持风格一致,但同一想法的两次运行会有所不同。如果需要相同的输出进行测试,请传递固定的 seed。
步骤 3:Python 脚本
此脚本从列表中读取想法,请求 JSON,并打印提示词对。它使用官方 OpenAI Python 包,但基础 URL 已更改。
import json
from openai import OpenAI
client = OpenAI(base_url="https://api.sdxlapi.com/v1", api_key="YOUR_KEY")
SYSTEM = (
"You turn short image ideas into prompts for SDXL. Write one positive "
"prompt of 40 to 60 words: subject, setting, composition, lighting, "
"medium or style, mood, as comma-separated phrases. Then a negative "
"prompt of up to 15 short phrases. Return JSON with keys "
"'prompt' and 'negative'."
)
def expand(idea: str) -> dict:
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": SYSTEM},
{"role": "user", "content": idea},
],
response_format={"type": "json_object"},
temperature=0.8,
max_tokens=400,
)
return json.loads(resp.choices[0].message.content)
for idea in ["lighthouse in a storm", "abandoned greenhouse at dawn"]:
result = expand(idea)
print(idea, "->", result["prompt"])
print("negative:", result["negative"], "\n")
JSON 模式(response_format 为 json_object)使回复易于解析。在生产环境中,仍应将 json.loads 包裹在 try 块中,如果失败则重试一次,因为在 max_tokens 处截断的长回复可能会在对象中间结束。
步骤 4:将提示词发送给你的图像工具
输出是纯字符串,因此任何前端都可以使用它。在本地安装 Automatic1111 或 ComfyUI 的情况下,将这两个字段发布到其 API。对于遍历创意 CSV 的脚本,将结果写入文件,并将它们作为批处理加入队列。
- 将想法、提示词和负向提示词一起保存,以便将良好的图像追溯回产生它的指令。
- 当你希望系列具有匹配的外观时,从你自己的列表中添加风格行("cinematic photograph"、"ink illustration")作为用户消息中的额外字段。
- 保留一个简短的有效提示词库,并将其中两三个作为示例输入系统提示词。少样本示例比形容词更可靠地引导风格。
对于角色扮演或游戏项目,相同的模式可以展示故事中的场景,LLM 将最后几段转化为视觉描述。文本角色扮演场景一文涵盖了故事方面。
常见问题及解决方法
在几乎每个提示词生成器项目中都会出现一些问题。
模型添加评论
以 “这是你的提示词” 开头的回复会破坏管道。JSON 模式可消除大部分此类问题。如果你使用纯文本,请指定 "仅输出提示词,不要前缀",并添加一个你绝不想看到的停止序列。
每个提示词看起来都一样
低温度和严格模板给出统一的结果。将温度提高到 1.0,改变你传入的风格行,或要求三个替代方案并选择一个。惩罚(frequency_penalty、presence_penalty)会透传,可以打破重复短语。
提示词对图像模型来说太长
在系统提示词中设置硬性字数限制,并在代码中检查长度。手动截断会丢失最后的细节,这些通常是最不重要的,但最好让模型一开始就写短。
你遇到了 429
你每分钟或同时发送的请求过多。等待几秒后重试;响应可能包含 Retry-After: 5。具有 4 到 8 个工作线程的小线程池的批处理保持在单个密钥的限制内。
1,000 次提示词的成本
定价为每 1M 输入 token $0.15,每 1M 输出 token $0.50。典型的扩展发送约 150 个 token 的系统提示词加上 15 个 token 的想法,即 170 个 token 输入,接收约 120 个 token 的 JSON。
- 输入:170 × $0.15 / 1M = $0.0000255。
- 输出:120 × $0.50 / 1M = $0.00006。
- 每次提示词:约 $0.0000855。
- 1,000 次提示词:约 $0.0855,或 $0.09。
对于更长的系统提示词或少样本示例,向上取整。如果你添加 600 个 token 的示例,输入变为 770 个 token,1,000 次提示词的输入成本约为 $0.1155,输出成本为 $0.06,总计约 $0.18。无论如何,$0.50 的试用足以覆盖数千次扩展。失败的请求不收费,且预付额度永不过期;请参阅 定价页面 进行充值($20 到 $500,通过加密货币)。
更多指南
问答
LLM 能直接生成 Stable Diffusion 图像吗?
不能。它只生成文本。你将提示词传递给 SDXL、ComfyUI、Automatic1111 或你运行的其他图像工具。
SDXL 提示词应该多长?
大约 40 到 60 个词效果最好,关键细节放在前面,因为文本编码器以 77-token 为单位读取。
它会拒绝成熟或黑暗主题吗?
该模型经过调整,可在合法成人使用中无内容审查地回答。不会生成涉及未成年人的内容。
我应该发送哪个模型名称?
将 uncensored 作为模型 ID 发送,使用基础 URL https://api.sdxlapi.com/v1 并将你的密钥作为 Bearer token。
我可以并行运行多个提示词吗?
完整密钥允许 8 个并发请求和每分钟 300 个;试用密钥允许 2 个和每分钟 60 个。429 响应表示等待并重试。
只差一张表单,即可获得密钥
创建账户,复制密钥,更改基础 URL。这就是全部设置。