想象你走进一家高档餐厅,对服务员说:“我要一道山间日出的风景菜,清冷雪景风格,细节丰富。”服务员飞快记下要点,传到后厨;后厨从塞满毛坯食材的仓库里取出半成品,主厨一勺一勺去掉杂质、调味成型,装盘后由服务员端上桌。这一整套“点菜—传单—备料—烹饪—装盘—上菜”的流程,和 AI 文生图引擎 Stable Diffusion 的工作方式惊人地相似:你输入的提示词是菜单,文本编码器是传菜员,潜空间是半成品仓库,去噪网络是主厨,最后的解码器负责装盘。本文就把这条链路从头到尾拆给你看,让每个环节都变成你能看懂、能调优的生活常识。
掌握文生图全流程,你就能在出图翻车时精准定位“是菜单、火候还是锅的问题”,把 AI 作图从玄学变成可复现的工程能力。这是 AIGC 创作者与算法工程师的必备基本功。
目录
可视化演示
展示CLIP文本编码、采样调度策略、UNet去噪机制与后处理优化全流程,点击步骤切换不同阶段
本节配有交互动效(进入视口后自动加载,约 3KB)。
提示词与CLIP编码 提示词分词为token序列 CLIP文本编码器提取语义 生成条件向量嵌入表示 条件引导图像生成方向 c=CLIP(prompt) CLIP将提示词编码为条件向量引导生成
提示词编写:菜单写得越清楚,厨师越好发挥
去餐厅点菜,只说“随便来点吃的”,和写清楚“要一道以雪山为主体、清晨日出光晕、水彩风格、细节丰富、不要人物”的订单,结果天差地别。AI 出图也一样——提示词是发给模型的“点菜单”,它直接决定画面里出现什么、以什么风格呈现、要避开什么。写提示词从来不是玄学,而是一门可以练习的“点菜话术”。
提示词看似是自然语言,但在 Stable Diffusion 里,它会被文本编码器拆成机器能懂的语义向量。社区经过大量实践,总结出一套稳定模板:正向提示词由四类关键词拼接而成——主体、风格、光影细节、质量词;负面提示词则是反向排除,告诉模型“我不想要什么”。两者一起构成了完整的菜单。
1. 主体:画面里最核心的对象,比如“雪山”“少女”“机械龙”,它决定了整张图的骨架与构图重点。
2. 风格:决定画面的美术调性,如水彩、赛博朋克、吉卜力,是“这道菜属于哪个菜系”。
3. 光影细节:补充光线、质感、环境氛围,让画面从“平”变“立体”。
4. 质量词:如 masterpiece、best quality,相当于给菜品加上“米其林摆盘”的通用加分项。
5. 负面词:用减号排除多余手指、模糊、水印等内容,是菜单上的“忌口栏”。
菜单的写法是可以练的。拿同一道“菜”反复微调措辞,你会慢慢摸清哪些词模型最“听得懂”,哪些词只会让服务员犯迷糊。记住:好厨师也需要好菜单,好图从一句清晰的提示词开始。
$$\displaystyle \text{Prompt} = \text{主体} \oplus \text{风格} \oplus \text{光影细节} \oplus \text{质量词} \ominus \text{负面词}$$
模型加载:炉灶、传菜员、装盘师,一个都不能少
一道菜要顺利出锅,厨房得备齐三样:理解订单的传菜员、掌勺的主厨、负责摆盘的装盘师。Stable Diffusion 的模型仓库也是这样一套“厨房班子”。如果你只下载了某个底模却缺了组件,就像只有炉灶没有锅铲,图是永远出不来的。
这套班子由三大组件构成:CLIP 文本编码器负责把提示词翻译成语义向量;UNet 去噪网络是真正“掌勺”的主厨,在潜空间里反复去噪;VAE 变分自编码器则负责压缩与还原图像。我们平时下载的 checkpoint 底模,通常已经把这三个组件打包在一起,选对底模就等于选对了厨房的整体风格。
1. CLIP 传菜员:把提示词映射为语义向量,让模型“听懂”你点了什么菜。
2. UNet 主厨:在潜空间中逐轮预测噪声并去除,是生成过程真正的执行者。
3. VAE 装盘师:把压缩后的潜变量还原成肉眼可见的像素图。
除了底模,还要考虑环境配置:显存够不够、用 fp16 还是 fp32、要不要加载 LoRA 和 embeddings 作为“特色调料”。厨房一旦备齐,后面的流程就顺理成章了。
$$\displaystyle M = \{ \text{CLIP}, \text{UNet}, \text{VAE} \}$$
参数设置:火候、份量与初始食材
菜单写好、厨房备齐,接下来主厨要拧几个旋钮:多大的火、炒多久、下多少料。这些旋钮在文生图里就是采样参数——它们不改变“菜系”,却直接决定成品质量。新手最容易犯的错,就是一上来狂拉参数,结果把一锅好菜炒糊了。
核心参数有四个:采样步数(烹饪时长,通常 20-30 步性价比最高)、引导系数 CFG(主厨听菜单话的程度)、图像尺寸(菜品大小,512×512 是默认基准)、随机种子(初始食材的摆放方式,决定了构图的起点)。其中引导系数最值得展开:它控制模型“有多听话”。
> 高清放大就是给图像宽高同时乘上一个放大倍数:512×512 放大 2 倍变成 1024×1024,像素数量变为原来的 4 倍。1. 放大倍数:f_scale 表示放大的倍率,2 表示边长翻倍,4 表示边长变四倍。$$f_{\text{scale}}$$2. 宽度同步:原始宽度乘上倍数得到输出宽度,保持画面比例不变。$$W_{\text{out}} = f_{\text{scale}} \times W_{\text{in}}$$3. 高度同步:高度同样乘上倍数,保证宽高比一致,画面不被拉伸变形。$$H_{\text{out}} = f_{\text{scale}} \times H_{\text{in}}$$摆盘讲究适度。放大倍数过高,细节会被"脑补"得过度平滑,反而失真。专业的创作流程,通常把后处理看成流水线的最后一环:批量放大、批量修图、统一筛选,让整条"餐厅流水线"高效运转。$$\displaystyle \hat{\epsilon} = \epsilon_u + s \cdot (\epsilon_c - \epsilon_u)$$$$ > 引导系数 s 越大,模型越严格按照提示词执行,但太大也会导致颜色过饱和、细节崩坏——就像主厨太用力讨好顾客,把菜炒焦了。 #### 逐字解析 1. **无条件预测**:不参考提示词时模型"自由发挥"预测的噪声,相当于没人点菜时厨师随手做的菜。 $$\epsilon_u$$2. **条件预测**:参考提示词后模型预测的噪声,是"照着菜单做"的结果。 $$\epsilon_c$$3. **方向偏差**:两者相减得到"听从菜单"的方向,表示提示词对生成的影响力度。 $$\epsilon_c - \epsilon_u$$4. **引导强度**:用 s 放大这个偏差再加回自由预测,s 越大,画面越贴提示词。 $$s \cdot (\epsilon_c - \epsilon_u)$$ 火候是一门平衡的艺术。步数太少菜不熟,太多菜太烂;引导系数太高画面发腻,太低提示词形同虚设。理解了这些旋钮的物理含义,你就不再是盲目乱调,而是带着目的去"尝菜"。 ### 采样生成:主厨的一勺一勺来 真正的烹饪开始了。主厨端出的不是一块成型的牛排,而是一锅"毛坯食材"——在潜空间里,这锅毛坯就是一张纯噪声图,什么内容都没有。它的任务,是通过几十次"去噪",把藏在噪声里的画面一点点显影出来,像暗房里的照片逐渐浮现轮廓。 这个过程叫采样:从初始噪声出发,UNet 每轮预测出"应该刮掉多少噪",然后按公式更新潜变量,循环往复。每一步都让画面清晰一点:先出大轮廓,再出细节纹理。步数越多,轮廓到细节的过渡越精细,但超过一定步数后收益递减。
> 这是反向去噪的"核心菜谱":从当前带噪的半成品里刮掉预测出的噪声,再做一次缩放,最后加一点随机扰动,就得到了更清晰的一步。 #### 逐字解析 1. **当前潜变量**:z_t 表示第 t 步时潜空间里的半成品,它带着噪声,是上一轮去噪留下的状态。 $$z_t$$2. **噪声预测项**:括号里的部分表示本次要"刮掉"的噪声,UNet 负责预测它藏在哪。 $$\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}} \epsilon_\theta$$3. **缩放系数**:去掉预测噪声后,整体除以根号 alpha_t 做一次收缩,保证每步方差稳定。 $$\frac{1}{\sqrt{\alpha_t}}$$4. **随机扰动项**:最后加上一个小随机噪声 sigma_t xi,让采样保留随机性,画面不至于死板。 $$\sigma_t \xi$$ 一勺一勺地调味,一锅毛坯食材渐渐有了形状。这个过程是在潜空间里完成的——画布只有 64×64,比最终图片小得多,所以计算量可控。采样器选择(如 Euler、DPM++)则像是不同的翻锅手法,味道见仁见智。 ### VAE 解码:把半成品装盘上桌 主厨辛辛苦苦在厨房后台(潜空间)炒好的菜,顾客是看不见的——那只是一堆压缩过的半成品数据。要让菜真正端上桌,需要装盘师把半成品"展开"成完整的像素图。这位装盘师就是 VAE 解码器。 为什么要在潜空间里做菜?因为 512×512 的彩色图有近 80 万个像素,直接算太慢。VAE 编码器先把图压缩成 64×64 的潜变量,只有原来的 1/64 大小,主厨在这个小画布上快速迭代;最后再由解码器把成品还原成高清像素图。
> VAE 让生成过程在 8 倍压缩的小画布上进行:编码器负责压缩、解码器负责还原。压缩率越高,计算越快,但还原质量也越考验解码器的功力。 #### 逐字解析 1. **编码器**:把像素图 x 压缩成潜变量 z_0,相当于把整道菜收进小小的保鲜盒。 $$z_0 = \mathcal{E}(x)$$2. **解码器**:把去噪完成的潜变量 z_0 还原为像素图 x_hat,相当于开盒装盘。 $$\hat{x} = \mathcal{D}(z_0)$$3. **压缩倍率**:512 的边长压缩为 64,每边缩小 8 倍,面积缩小 8×8=64 倍。 $$64 = \frac{512}{8}$$ 装盘师的水平直接决定上桌颜值。底模和 VAE 不匹配时,还原出来的图就会发灰、偏色——就像装盘师手抖把酱汁打翻了。所以很多进阶玩家会单独下载精调过的 VAE 模型,让"装盘"更漂亮。 ### 后处理优化:摆盘与点缀 菜端上桌了,但离"完美出片"还差最后一步:摆盘与点缀。直接生成的图分辨率往往有限,细节也可能有小瑕疵。后处理阶段就像在盘边画几笔酱汁、撒上香料碎,让整道菜更上镜。 最常用的后处理手段三种:高清放大(超分模型把图放大 2 倍甚至 4 倍,补出更多细节)、局部重绘(用蒙版框住不满意的部位重新生成)、批量流程(把固定模板套用到大量图上,自动化产出)。其中高清放大是最基础的"摆盘"动作。
问题排查:菜品翻车的诊断手册
再熟练的厨房也有翻车的时候:菜炒焦了、颜色发灰、上菜太慢。文生图也一样。好消息是,只要理解了全流程的每个环节,翻车原因就能像诊断手册一样逐条排查,而不是瞎猜。
常见的翻车场景对应各自的“病灶”:崩图(多手指、五官扭曲)多半是提示词内部冲突或模型不擅长该题材;灰图(画面发灰、对比度低)往往指向采样步数过低或 VAE 不匹配;出图慢则要检查显存占用、采样器效率、是否用了过大的放大倍数。其中“灰图”可以用一个简单的统计量来诊断——图像的标准差。
1. 像素均值:先算出整张图所有像素的平均亮度 mu,作为画面的基准线。
2. 离差平方:每个像素减去均值后取平方,把偏离基准线的程度变成正数。
3. 平均再开方:对平方和求平均后开根号,得到标准差,反映画面整体的对比度。
排查问题就像看诊断手册:先问“菜单写了什么”,再问“火候对不对”,最后问“锅和装盘有没有问题”。按这个顺序逐环节检查,大部分翻车都能在几分钟内定位并修复。学会了这套诊断思路,你就不再是碰运气的食客,而是能掌控后厨的老板。
$$\displaystyle \sigma(x) = \sqrt{\frac{1}{n}\sum_{i=1}^{n} (x_i - \mu)^2}$$
AI 应用场景
电商产品图批量生成
阶段:提示词编写 + 后处理优化
解决的问题:电商运营需要为数百个商品生成统一风格的场景图,传统拍摄成本高、周期长。通过把商品名、场景、风格抽成模板化的提示词,再配合批量流程,可以实现“一条流水线出上百张图”。
具体案例:某家居品牌用固定模板“产品名+奶油风客厅+柔光+高清”,为 300 个 SKU 自动生成白底与场景两套素材,再通过高清放大统一输出到 1024×1024,上架效率提升 5 倍。
游戏原画概念设计
阶段:参数设置 + 采样生成 + 局部重绘
解决的问题:原画师在概念阶段需要快速探索多种风格与构图,传统手绘一张草图要数小时。用 AI 生成多个候选再局部重绘,能大幅缩短“找感觉”的时间。
具体案例:某独立游戏团队用提示词“废墟城市+黄昏+概念设计”出 20 张候选图,选定后把不满意的手部与武器区域用蒙版局部重绘,最后高清放大作为氛围参考图,整个流程从 3 天压缩到半天。
短视频封面流水线
阶段:问题排查 + 批量流程
解决的问题:短视频团队每天要产出多张封面图,人工逐张调试既慢又容易翻车。把常用参数和提示词固化为“配方”,配合灰图、崩图的自动排查脚本,能稳定批量出图。
具体案例:某知识类账号把提示词模板设为“主讲人+科技感背景+大字标题区”,用固定种子配合步数 25、引导系数 7 的成熟参数,每天自动生成 30 张封面候选,再由编辑人工精选,封面点击率提升 18%。
Python 演示
# -*- coding: utf-8 -*-# 文生图完整流程迷你模拟: 用 16x16 灰度图演示 提示词 -> 加噪 -> 去噪 -> 出图import numpy as np class TextToImagePipeline: """在内存中模拟 Stable Diffusion 文生图主干流程""" def __init__(self, size=16, seed=42): self.size = size self._rng = np.random.default_rng(seed) self._vector = np.zeros(6) self._target = np.zeros((size, size)) def encode_prompt(self, words): """文本编码器: 把提示词映射为 6 维语义向量""" vocab = ['山', '水', '日', '月', '林', '雪'] for w in words: if w in vocab: self._vector[vocab.index(w)] += 1.0 self._vector /= max(self._vector.sum(), 1e-6) return self._vector def decode_vector_to_image(self): """语义向量 -> 目标灰度图 (真实场景由训练好的底模决定)""" v = self._vector for i in range(self.size): for j in range(self.size): base = (i + j) / (self.size * 2) self._target[i, j] = base * (0.4 + 0.6 * v[i % len(v)]) return self._target def add_noise(self, img, t): """前向加噪: 原图与高斯噪声按 alpha 混合""" alpha = 1.0 - 0.9 * t noise = self._rng.normal(0, 1, img.shape) return np.sqrt(alpha) * img + np.sqrt(1 - alpha) * noise def denoise_step(self, z_t, t, guidance): """反向去噪一步: 去掉噪声并朝语义目标修正 (模拟 UNet + CFG)""" alpha = 1.0 - 0.9 * t est = z_t / np.sqrt(alpha) grad = self._target - est return est + guidance * grad * (1 - alpha) def generate(self, prompt_words, steps=30, guidance=2.0, seed=0): """完整流程: 编码 -> 纯噪声起步 -> 逐步去噪 -> 输出画面""" self._rng = np.random.default_rng(seed) self._vector = np.zeros(6) self.encode_prompt(prompt_words) self.decode_vector_to_image() z_t = self.add_noise(np.zeros((self.size, self.size)), 1.0) for i in range(steps): t = 1.0 - i / steps z_t = np.clip(self.denoise_step(z_t, t, guidance), 0, 1) return z_t if __name__ == '__main__': pipe = TextToImagePipeline(size=16) img = pipe.generate(['山', '日', '雪'], steps=25, guidance=1.5) np.set_printoptions(precision=2, suppress=True) print('= 最终画面 (16x16) =') print(img)
encode_prompt(self, words)模拟文本编码器,把“山、日、雪”等词映射为语义向量。_vector /= max(self._vector.sum(), 1e-6)归一化语义向量,避免某个词权重过大。decode_vector_to_image()模拟底模,把语义向量“翻译”成目标灰度图。add_noise(self, img, t)前向加噪,按时刻 t 混合原图与高斯噪声。denoise_step(self, z_t, t, guidance)反向去噪一步,结合引导系数向目标修正。generate(...)串联完整流程:编码 → 纯噪声起步 → 循环去噪 → 输出。t = 1.0 - i / steps每一步更新噪声强度时刻,模拟逐步“刮噪”。
常见误区
误区我见过很多新手把网上所有好看的标签全复制进提示词,觉得词越多模型越懂我,结果出来的图又乱又脏。
正解提示词就像点菜单,写满十页纸反而让厨师抓不住重点。模型对语义向量的加权是有限的,互相矛盾的词会彼此抵消。正确做法是“少而精”:一个清晰主体+一个统一风格+少量光影和质量词,负面词管好忌口,比堆砌 50 个词更稳定。
为何常见:因为网上教程大量展示“华丽提示词”的成品图,让人误以为词多等于效果好,忽略了这些图背后还经过了反复筛选与参数调试。
误区刚接触文生图时,我总觉得 50 步一定比 20 步清楚,于是每次都拉到 80 步,结果生成慢得离谱。
正解去噪是“先出轮廓、后补细节”的过程,通常在 20-30 步时细节已经收敛。继续加步数,收益趋近于零,甚至可能引入额外的伪影,就像菜炖太久反而烂了。步数应该结合采样器选择,而不是一味求大。
为何常见:因为“多就是好”的直觉在做菜、学习等场景里常成立,但扩散模型的去噪过程有明确的收敛特性,超过阈值后边际收益极低。
误区提示词总是不生效?那我干脆把 CFG 拉到 20,让模型百分百听我的,结果画面又艳又花。
正解CFG 控制的是“条件与无条件预测的偏差放大倍数”。偏差拉得过大,模型会过度补偿,导致颜色过饱和、对比度刺眼、细节出现水彩状伪影。一般 5-9 是甜点区,过高反而让“主厨用力过猛把菜炒焦”。如果提示词不生效,优先检查措辞而非猛拉 CFG。
为何常见:CFG 是新手最容易接触到的“强度”类参数,直觉上强度越大越有效,但忽略了它本质是对一个差值做乘法,放大过头必然失真。
误区我以为把种子记下来,下次就能一模一样地复现那张满意的图,结果换了尺寸或步数后完全变样。
正解种子只决定初始噪声的“长相”,也就是构图起点。后续每一步的去噪都受提示词、步数、CFG、尺寸、采样器共同影响,任何一项改变,迭代路径都会分叉。想复现图,必须把整份“菜谱”都存下来,而不是只记种子。
为何常见:因为很多教程强调“种子是复现的关键”,让初学者误以为它是唯一变量,忽略了种子只是初始状态而非全部输入。
误区第一次生成出灰蒙蒙的图,朋友说是显存不够,我差点就下单买新显卡了。
正解灰图最常见的原因是采样步数过低(画面没“烤熟”)或 VAE 缺失/与底模不匹配,导致潜变量解码异常。前者加步数即可,后者单独下载匹配的 VAE 文件即可修复。真正显存不足的表现是报错或卡死,而不是灰图。用标准差诊断画面对比度,比盲目换硬件靠谱得多。
为何常见:因为灰图看起来像“没渲染完”,容易让人联想到硬件性能不足;而且社区里“换显卡解千愁”的玩笑话流传太广,掩盖了真正的软件层原因。
面试题
Q1. 使用 Stable Diffusion 文生图时,最应该先做好的第一步是什么?
- A.精心编写并调试提示词← 正确答案
- B.立即增大采样步数
- C.把图像尺寸调大一倍
- D.直接更换随机种子
答案:A。提示词是整个流程的“菜单”,决定画面内容与风格的基调,其他参数属于“火候”层面的优化。菜单没写好,步数再多、种子再换,也难出理想效果。
Q2. 文本编码器(如 CLIP)在文生图中的核心作用是什么?
- A.把提示词转成机器可读的语义向量← 正确答案
- B.直接把文字画成最终的图像
- C.负责给图片添加高斯噪声
- D.把图像压缩成小尺寸潜变量
答案:A。CLIP 相当于“传菜员”,把自然语言菜单翻译成语义向量交给 UNet。画图是 UNet 的活,加噪和压缩是前向过程与 VAE 的活,都与文本编码器无关。
Q3. 512×512 的图片在潜空间中被压缩为 64×64,压缩倍率如何计算?
- A.每边压缩 8 倍,面积压缩 64 倍← 正确答案
- B.每边压缩 4 倍,面积压缩 8 倍
- C.每边压缩 8 倍,面积压缩 16 倍
- D.每边压缩 16 倍,面积压缩 8 倍
答案:A。512 除以 64 得 8,每边缩小 8 倍;面积等于边长乘积,8×8=64,所以面积压缩 64 倍。这也是 VAE 能把计算量大幅降低的原因。
Q4. 当 CFG 引导系数设置过高时,最容易出现的现象是什么?
- A.画面颜色过饱和且细节崩坏← 正确答案
- B.图片会完全变成纯黑色
- C.生成速度变得异常缓慢
- D.提示词完全不起任何作用
答案:A。CFG 是对条件与无条件预测的差值做乘法,系数过大时偏差被过度放大,画面会像“用力过猛”一样出现高饱和、对比度刺眼和伪影。速度由步数和模型决定,与 CFG 无关。
Q5. 随机种子(seed)在文生图中真正决定的是什么?
- A.初始噪声以及由它衍生的构图布局← 正确答案
- B.每次生成的文字内容
- C.提示词里词语的排列顺序
- D.采样过程执行的总步数
答案:A。种子是随机数生成器的起点,决定了初始噪声的形态,而初始噪声影响后续去噪的构图路径。提示词内容、步数等都不由种子控制。
Q6. 生成灰图时,首先应该排查的方向是什么?
- A.采样步数过低或 VAE 不匹配← 正确答案
- B.显卡显存的物理容量
- C.提示词中英文的大小写
- D.电脑操作系统的版本版本
答案:A。灰图本质是潜变量没有正确还原为高对比度像素图,常见原因是步数太少没“烤熟”,或 VAE 与底模不匹配。显存不足通常表现为报错而非灰图。
Q7. 反向去噪公式中的 z_t 表示的是什么?
- A.当前时刻带噪的潜空间变量← 正确答案
- B.最终输出的高清像素图像
- C.提示词转换后的语义向量
- D.模型训练时的损失函数
答案:A。z_t 是第 t 次迭代时潜空间里的“半成品”,带着噪声,是上一轮去噪留下的状态。最终像素图是 VAE 解码 z_0 的输出,语义向量由文本编码器产生。
Q8. 下列哪些属于 Stable Diffusion 的三大核心组件?
- A.文本编码器 CLIP← 正确答案
- B.UNet 去噪网络← 正确答案
- C.VAE 变分自编码器← 正确答案
- D.注意力分类器
答案:ABC。三大组件是“传菜员”CLIP、“主厨”UNet、“装盘师”VAE,三者协作完成文生图。注意力分类器并不存在,属于干扰项。
Q9. 出图后的后处理阶段,常用的优化手段有哪些?
- A.高清放大与超分修复← 正确答案
- B.局部重绘修改细节← 正确答案
- C.提高模型训练轮次
- D.批量出图并自动筛选← 正确答案
答案:ABD。后处理是“摆盘点缀”环节:高清放大提分辨率、局部重绘修瑕疵、批量流程提效率。提高训练轮次属于模型训练范畴,与单次生成的后续处理无关。
Q10. 关于采样步数与采样过程,下列说法正确的有哪些?
- A.通常 20-30 步已能取得性价比平衡← 正确答案
- B.步数增加会线性增加生成耗时← 正确答案
- C.步数越多画面必然越清晰好看
- D.步数过少时画面往往不够细腻← 正确答案
答案:ABD。去噪先出轮廓后补细节,20-30 步足够收敛,步数越多耗时越长;超过阈值后收益递减甚至出现伪影,所以 C 的“必然”说法错误。步数过少则细节未及生成,画面粗糙。