1. 从两个名字说起:FLUX.1 Kontext 与 FLUX.1 Krea 到底在解决什么问题
第一次看到 FLUX.1 Kontext 和 FLUX.1 Krea 这两个名字,很多人会下意识觉得它们只是同一个底模的两个微调版本,换汤不换药。但真正上手跑过一轮之后你会发现,这两个模型的设计目标其实分得很开:一个偏向"理解上下文再生成",一个偏向"把画面质感和审美拉满"。如果你只把它们当成"又一个文生图模型",那基本等于买了个单反只用自动挡。
先把定位说清楚。FLUX.1 系列本身是一套基于Flow Matching训练、采用DiT(Diffusion Transformer)架构的图像生成模型家族。而 Kontext 和 Krea 是在这个底座上针对不同能力方向做出来的变体。Kontext 这个词本身暗示了"上下文"——它强调的是模型对输入语义、参考图、编辑指令之间关系的把握能力,典型场景是图像编辑、局部重绘、指令跟随式的修改。Krea 则更偏向生成质量与风格表现,追求的是"一次出图就能用"的成片感,在光影、材质、细节密度上做了明显倾斜。
为什么这两个方向值得单独拆开讲?因为在实际项目里,你遇到的从来不是"生成一张图"这么简单的问题。更多时候是:用户上传一张产品图,要求"把背景换成纯白、保留阴影、把logo位置右移一点"——这是 Kontext 的活;或者"给我生成一张有电影感、逆光、浅景深的人像"——这是 Krea 更擅长的。搞混了用途,你会觉得模型"不好用",其实是选错了工具。
这篇文章我打算从底层原理一路讲到实操取舍,把 Transformer、Flow Matching、DiT、单流 DiT 这些热搜词背后的东西讲透,同时给出我自己在跑这两个模型时踩过的坑和总结出来的参数经验。不管你是刚接触扩散模型的新手,还是已经调过 Stable Diffusion 系列想迁移过来的老手,都能从中找到能直接抄作业的部分。
提示:本文涉及的所有原理讲解都服务于"怎么用好这两个模型"这个目标,不会为了讲原理而讲原理。如果你只想要参数表,可以直接跳到第 4 节,但我建议至少把第 2、3 节看完,否则参数调起来是盲调。
2. Transformer 是怎么一步步变成图像生成主力的
2.1 从"预测正弦数据"理解 Transformer 的本质
网上讲 Transformer 的文章多如牛毛,但大部分一上来就是 QKV、多头注意力,新手看完还是不知道它到底在干嘛。我习惯用一个特别朴素的例子切入:用 Transformer 预测正弦数据。
假设你有一串按时间排列的数值,比如 sin(0)、sin(0.1)、sin(0.2)……你想让模型根据前 10 个数预测第 11 个。这件事用 RNN 也能做,但 RNN 有个毛病:它必须一个接一个地算,前面算完才能算后面,长序列上还容易"忘事"。Transformer 的做法完全不同——它一次性看到全部 10 个数,然后让每个数去"问"其他所有数:"你跟我关系大不大?"这个"问"的过程就是注意力机制。
具体来说,每个输入会被映射成三个向量:Query(我在找什么)、Key(我是什么)、Value(我能提供什么信息)。第 11 个位置的 Query 会和前 10 个位置的 Key 分别做点积,得到 10 个相关性分数,softmax 归一化后作为权重,对 10 个 Value 加权求和。结果就是:模型自动学会了"离得近的几个数更重要"或者"周期性位置更重要"这类规律。
这个例子的价值在于,它把 Transformer 的核心——用注意力动态决定信息聚合权重——讲得明明白白。图像生成里的 Transformer 干的是同一件事,只不过"数"变成了图像 patch,"预测下一个数"变成了"预测下一步该去掉多少噪声"。
2.2 Vision Transformer 与 Swin Transformer:把图像塞进 Transformer
图像和序列最大的区别是:图像是二维的、有空间结构的。Vision Transformer(ViT)的处理方式非常暴力——把图像切成固定大小的 patch(比如 16×16),每个 patch 拉平成一个向量,加上位置编码,然后当成一个序列丢进 Transformer。就这么简单,但效果出奇地好,前提是数据量够大。
ViT 的问题也很明显:注意力是全局的,一张 1024×1024 的图切成 16×16 的 patch 就是 4096 个 token,两两做注意力就是 4096² 的矩阵,显存直接爆炸。于是有了Swin Transformer,它的思路是"分层 + 窗口":在小窗口内做注意力,窗口之间再通过移位(shifted window)建立跨窗口连接,同时像 CNN 一样逐层下采样。这样计算量从平方级降到接近线性,还能捕捉多尺度特征。
对 FLUX.1 这类模型来说,Swin 那套分层思想的影响是深远的——现代 DiT 架构虽然不直接用 Swin,但"局部注意力 + 全局信息传递"的设计哲学是一脉相承的。理解这一点,你才能明白为什么 FLUX.1 能在保持高分辨率的同时把显存控制在可接受范围。
2.3 轻量 Transformer 与视觉 Transformer 的工程取舍
热搜里还有"轻量 transformer""视觉 transformer"这些词,背后其实是同一个工程焦虑:注意力太贵了。业界的应对手段大致有这么几类:
- 降低 token 数量:patch 切大一点,或者用卷积先下采样。
- 稀疏注意力:只让每个 token 关注一部分 token,而不是全部。
- 线性注意力:用核函数近似 softmax,把复杂度从 O(n²) 降到 O(n)。
- 混合架构:卷积负责局部,注意力负责全局,各干各擅长的。
FLUX.1 的 DiT 主干在这些取舍上做了自己的选择,具体细节官方没有完全公开,但从实际推理表现看,它在 token 效率和生成质量之间找到了一个不错的平衡点。这也是为什么它比早期一些纯 ViT 扩散模型跑起来更快、更省显存。
3. Flow Matching 与 DiT:FLUX.1 的发动机和底盘
3.1 Flow Matching 到底比传统扩散"顺"在哪
传统扩散模型(DDPM 那一套)的思路是:逐步加噪声把图像变成纯噪声,再学着逐步去噪还原。这个过程是随机的、弯曲的,去噪路径像一条蜿蜒的山路,需要走很多步才能到终点。
Flow Matching换了个思路:它不学"每一步去多少噪",而是学一个速度场——在任意时刻、任意位置,告诉你要往哪个方向、以多快的速度移动,才能从噪声流向真实图像。理想情况下,这条路径是一条相对直的线。路径越直,需要的采样步数就越少,生成速度就越快。
打个比方:传统扩散像是让你在一片雾里摸索着下山,每一步都得重新判断方向;Flow Matching 像是给你画了一条相对清晰的下山路线,你顺着走就行。这就是为什么 FLUX.1 能在较少步数下出好图——它的"路线"设计得更直。
这里有个关键概念叫Rectified Flow,可以理解为 Flow Matching 的一种具体实现,它通过迭代"拉直"路径来进一步减少采样步数。你在调 FLUX.1 时看到的步数设置(比如 20 步、28 步),本质上就是在控制沿这条路径走多少步。
3.2 DiT:把 U-Net 换成 Transformer 之后发生了什么
早期的扩散模型(包括 Stable Diffusion 1.x/2.x)用的是U-Net作为去噪主干。U-Net 是卷积架构,擅长处理局部特征,通过下采样-上采样和跳跃连接来兼顾全局与局部。它很有效,但有个天花板:卷积的感受野是有限的,要捕捉长距离依赖得靠堆层数。
DiT(Diffusion Transformer)直接把 U-Net 换成了 Transformer。好处是注意力天然具备全局视野,图像里"左上角的物体"和"右下角的物体"之间的关系可以被直接建模。坏处是计算量和显存开销上去了,所以 DiT 通常配合前面说的那些效率优化手段一起用。
从 SD 迁移到 FLUX.1 的人最直观的感受就是:提示词跟随能力明显变强了。你写"一个穿红衣服的人站在蓝色房子前,房子左边有一棵树",U-Net 时代经常丢三落四,DiT 时代这种情况少很多。原因就在于全局注意力让模型能同时"看到"提示词里的所有约束。
3.3 单流 DiT 与双流 DiT 的区别
这是理解 FLUX.1 架构的一个关键点。所谓双流 DiT,是指图像 token 和文本 token 各自走各自的注意力流,只在特定层做交互;单流 DiT则是把图像 token 和文本 token 拼在一起,放进同一个注意力计算里。
FLUX.1 采用的是混合策略:前面若干层用双流(各自处理,保留模态特性),后面若干层用单流(拼接融合,强化跨模态对齐)。这个设计很聪明——前期让文本和图像各自把自身特征提纯,后期再深度融合,既保证了效率又保证了对齐质量。
为什么这个细节值得讲?因为它直接解释了 Kontext 为什么擅长"指令跟随式编辑"。单流部分的深度融合让文本指令能精确地作用到图像的对应区域,你让它"把左边的猫换成狗",它不会把右边的猫也改了。
| 架构维度 | 双流 DiT | 单流 DiT | FLUX.1 混合方案 |
|---|---|---|---|
| 文本-图像交互 | 分层交互,较弱 | 全程融合,较强 | 前双流后单流,兼顾 |
| 计算开销 | 较低 | 较高 | 中等 |
| 指令跟随精度 | 一般 | 高 | 高 |
| 模态特征保留 | 好 | 一般 | 好 |
4. Kontext 与 Krea 的能力边界与选型逻辑
4.1 Kontext:上下文理解与指令式编辑的实战表现
Kontext 的核心卖点是"理解上下文"。这里的上下文不只是文本提示词,还包括你提供的参考图、编辑区域、以及多轮对话式的修改意图。实际用下来,它最让我惊喜的场景有三个:
第一是局部替换。给一张室内图,说"把沙发换成皮质深棕色款",它能保持房间其他部分几乎不变,只改沙发区域。这背后是模型对"哪些像素属于沙发"的隐式理解,以及对"皮质深棕色"这个材质描述的准确映射。
第二是风格迁移式编辑。上传一张草图,说"转成水彩风格",它不会像传统 img2img 那样把结构也糊掉,而是保留线条结构只换渲染方式。
第三是文字渲染。FLUX.1 系列在图像内文字生成上本来就强,Kontext 在编辑场景下也能保持文字的可读性和位置合理性,这对做海报、banner 的人来说是刚需。
但 Kontext 也有边界。它对大幅度结构改变的支持一般——你让它"把这个人变成侧脸",它往往会保留正面轮廓只做微调。想要大改结构,还是得回到文生图或者配合 ControlNet 类工具。
4.2 Krea:审美取向与成片质量的取舍
Krea 走的是另一条路。它不太强调"听懂复杂指令",而是把力气花在出图的第一眼观感上。我做过一组对比测试:同样的提示词"黄昏海边,一个女孩的背影,电影感",Krea 出的图在光影层次、肤色过渡、背景虚化上明显更"高级",而基础 FLUX.1 出的图更"平"。
这种差异来自训练数据的审美筛选和后期微调。Krea 的训练集明显偏向摄影级、电影级的素材,模型学到的不只是"画得像",还有"画得好看"。代价是它在某些需要严格遵循指令的场景下会"自作主张"——比如你要求"纯白背景",它可能给你一个带微妙渐变的米白,因为它觉得那样更好看。
所以选型逻辑很清晰:
- 需要精确控制、局部编辑、指令跟随:选 Kontext。
- 需要快速出成片、追求审美上限:选 Krea。
- 需要两者兼顾:Kontext 打底做结构控制,Krea 做风格参考或后期重绘。
4.3 一张表看清两个模型的适用场景
| 场景 | 推荐模型 | 理由 |
|---|---|---|
| 产品图背景替换 | Kontext | 局部编辑精度高,保留主体 |
| 电商主图批量生成 | Krea | 出图即用,审美稳定 |
| 插画草图上色 | Kontext | 结构保持能力强 |
| 电影感概念图 | Krea | 光影和氛围表现突出 |
| 图像内文字修改 | Kontext | 文字区域定位准 |
| 社交媒体配图 | Krea | 第一眼吸引力强 |
| 多轮迭代修改 | Kontext | 上下文记忆好 |
5. 上手实操:从环境到出图的完整链路
5.1 环境准备里最容易被忽略的三件事
第一件是显存。FLUX.1 系列参数量不小,FP16 推理下建议至少 16GB 显存起步,24GB 会更从容。如果你只有 8GB 或 12GB,别硬扛,直接上量化版本(FP8 或 GGUF 量化),画质损失在可接受范围内。
第二件是精度设置。很多人默认用 FP32,结果速度慢一半还爆显存。实际推理用 FP16 或 BF16 就够了,BF16 在数值稳定性上更好,推荐优先。
第三件是文本编码器。FLUX.1 用的是双文本编码器(CLIP + T5),T5 那部分很吃显存。如果你的显存紧张,可以只加载 CLIP 部分,代价是对复杂长提示词的理解会下降。
注意:量化版本虽然省显存,但不同量化方案对画质的影响差异很大。我实测下来,FP8 基本无损,4-bit 量化在细节纹理上会有肉眼可见的损失,尤其是毛发和织物。
5.2 提示词写法:DiT 架构下的新习惯
从 U-Net 迁移过来的人,提示词习惯要改。U-Net 时代大家习惯堆关键词:"masterpiece, best quality, 8k, highly detailed",因为模型对自然语言理解弱,得靠关键词加权。DiT 架构下这套打法收益很低,甚至有害——堆砌的形容词会互相干扰。
正确的做法是用自然语言描述场景,像给画师下brief一样:
一个穿着米色风衣的中年男人站在雨后的东京街头, 霓虹灯倒映在湿漉漉的柏油路面上,浅景深,背景虚化, 冷色调,电影感,35mm 镜头视角这种写法在 FLUX.1 上的效果远好于关键词堆砌。原因是 T5 编码器本身就是在自然语言上训练的,它能理解句子结构和语义关系,你给它句子它才能发挥。
另外,负面提示词在 FLUX.1 上的作用比 SD 弱很多。Flow Matching 的训练方式决定了它对负面提示的响应不如传统扩散敏感。与其花力气写负面词,不如把正面描述写清楚。
5.3 关键参数:步数、引导系数、种子
步数(steps):FLUX.1 在 20-30 步就能出很好的结果,超过 40 步收益递减。Kontext 做编辑时建议 28 步左右,Krea 追求质感可以用 30-35 步。步数太低(低于 15)会出现结构不完整。
引导系数(guidance scale):这个参数控制模型"多听提示词的话"。FLUX.1 的推荐范围是 3.5-5.0,比 SD 的 7-12 低很多。设太高会导致画面过饱和、构图僵硬;设太低则提示词跟随变弱。Kontext 做精确编辑时可以适当调高到 5-6,Krea 追求自然感可以降到 3.5-4。
种子(seed):调试阶段固定种子,方便对比参数效果。定稿后换种子多跑几张挑最好的。这里有个小技巧:找到一张满意的图后,用它的种子做微调(改提示词、改引导系数),往往能在这个"审美邻域"里找到更好的结果。
| 参数 | Kontext 推荐 | Krea 推荐 | 说明 |
|---|---|---|---|
| 步数 | 28 | 30-35 | 低于 15 结构易崩 |
| 引导系数 | 5.0-6.0 | 3.5-4.0 | 越高越"听话"但越僵 |
| 精度 | BF16 | BF16 | 显存紧张用 FP8 |
| 采样器 | Euler | Euler | Flow Matching 适配 |
5.4 我踩过的三个坑
坑一:拿 SD 的 LoRA 直接往 FLUX.1 上套。架构都不一样,根本加载不了。FLUX.1 有自己的 LoRA 生态,别混用。
坑二:以为步数越高越好。我曾经把步数拉到 80,结果画面出现了过度平滑的"塑料感",细节反而丢了。Flow Matching 的路径本来就直,走太多步等于在原地打转。
坑三:忽略分辨率对齐。FLUX.1 对输入分辨率有偏好,不是随便什么尺寸都行。用非标准尺寸会导致构图偏移或边缘伪影。建议用模型训练时的标准分辨率或其整数倍。
6. 把原理用起来:几个能直接复现的进阶玩法
6.1 用 Kontext 做多轮迭代编辑
Kontext 的上下文能力支持多轮修改,但很多人不知道怎么组织。我的做法是:每一轮只改一个变量。第一轮改背景,第二轮改主体材质,第三轮调光影。每轮之间保存中间结果,方便回退。
具体操作上,把上一轮的输出作为下一轮的输入参考图,提示词里明确说"保持其他部分不变,只修改XXX"。这样模型能准确锁定修改区域,避免"改一处动全身"。
6.2 用 Krea 做风格锚点再迁移
Krea 出图好看,但控制力弱。我的组合玩法是:先用 Krea 生成一张风格满意的图,把它作为风格参考,再用 Kontext 在保持这个风格的前提下做具体内容调整。这样既有 Krea 的审美,又有 Kontext 的控制。
6.3 分辨率与批次的工程权衡
批量生成时,分辨率和批次大小是一对矛盾。我的经验是:先低分辨率批量出构图,再挑中的高分辨率精修。低分辨率下跑 8 张的成本可能和单张高分辨率差不多,但你能快速筛选出构图好的种子,再针对性精修,整体效率高很多。
另外,批次大小不要设太大。FLUX.1 在批次超过 4 时,显存占用增长不是线性的,而且批次内不同样本的质量会互相影响(注意力计算共享导致)。建议批次控制在 1-4。
7. 关于这两个模型,我最后想说的几点体会
跑了一段时间 Kontext 和 Krea 之后,我最大的感受是:模型能力越强,越考验使用者的判断力。以前模型笨,你得靠技巧弥补;现在模型聪明了,你反而要克制自己"过度干预"的冲动。很多新手拿到 FLUX.1 后疯狂堆参数、堆提示词,结果还不如默认设置出的图好。
另一个体会是,理解原理真的能省很多试错时间。知道 Flow Matching 路径是直的,你就不会盲目加步数;知道 DiT 是全局注意力,你就知道提示词要写成完整句子而不是关键词;知道 Kontext 是混合双流单流架构,你就明白它为什么擅长局部编辑。这些不是玄学,是有据可循的工程逻辑。
如果你刚开始接触,我的建议是:先用默认参数把两个模型各跑 20 张图,建立直观感受;然后针对你最常用的场景,固定种子做参数对比实验;最后再去看原理,你会发现之前很多"玄学"现象都有了合理解释。这个顺序比一上来啃论文要高效得多。
至于后续还能怎么扩展,Kontext 和 Krea 的组合玩法其实还有很多没挖透,比如把 Krea 当风格库、Kontext 当编辑器,搭一套半自动的内容生产流水线。这块我还在试,等跑通了再单独写一篇。