前言

大家好,我是一凡。AI 生图发展到今天,论单张质量已经相当能打了。但做内容的人都知道——一致性才是真正的难题。

我之前做一个漫画系列,主角需要每张图都长一个样。结果呢?今天生成一张帅脸,明天改个 prompt 再跑,出来完全就是另一个人。尝试了几十次 prompt 微调,效果都很随机。后来决定用 LoRA 来解决这个问题。

这篇文章把整个过程拆开来讲,从样本准备到训练参数,再到 API 调用的坑,希望能帮到有同样需求的同学。

LoRA 是什么,为什么用它

LoRA(Low-Rank Adaptation)最早是 NLP 领域的微调方法,后来被引入到图像生成模型里。它的核心思路很简单:用少量图片训练一个轻量级的权重矩阵,记录特定人物或风格的特征。出图的时候加载这个权重,AI 就知道"这个人的脸长这样"。

相比全量微调,LoRA 的优势很明显:

  • 训练速度快:在你自己的电脑上,用一张消费级显卡,跑一两个小时就能出结果
  • 文件体积小:一个 LoRA 文件通常几十 MB,存储和加载都很方便
  • 即插即用:不影响原模型的任何能力,加载就生效,不加载就不生效
  • 可组合:同一张图可以叠加多个 LoRA(比如一个人物 LoRA + 一个风格 LoRA)

我选的是 Flux 模型 + Replicate 平台来训练和部署,流程相对标准化,下面一步步说。

第一步:样本准备(决定成败)

这句话我说在前面——训练 LoRA 的上限 80% 由样本质量决定。模型再强,数据烂也白搭。

选什么样的照片

第一次训练的时候,我 Google 了 30 多张照片,什么角度都有就扔进去了。结果出来的 LoRA 效果非常糟糕——五官位置是对的,但整体感觉就是"像又不像",AI 把不同角度的特征混在一起,生成了一个"平均脸"。

第二次我只用了 12 张,但每张都严格筛选。我总结的筛选标准如下:

标准说明为什么重要
正面为主正脸或微侧(30°以内)特征信息最多,模型最容易学习
光线均匀避免阴阳脸、强背光阴影会干扰五官特征的提取
画面占比大人脸占画面的 60% 以上像素级信息越丰富,特征越精确
表情自然微笑或中性表情夸张表情会把肌肉变形当成特征学进去
清晰度够不低于 1024×1024模糊照片只会让模型学到噪点
背景简单纯色或虚化背景避免模型把背景元素当成特征

样本数量多少合适

我的经验:12-15 张高质量 > 50 张杂图

太少(< 8 张)的话特征覆盖不全,AI 容易过拟合,换个角度就不像了。太多(> 30 张)而且质量参差不齐的话,模型会学到大量噪声,反而降低一致性。

如果你只有少量照片(比如 5-6 张),可以用数据增强来扩充:小幅旋转、水平翻转、轻微裁剪。但别用滤镜或调色,那会引入新的干扰。

照片预处理

拿到照片后,我还会做两步处理:

  1. 裁剪统一比例:所有照片裁成 1:1 正方形,人物居中,眼睛位于画面上 1/3 处附近
  2. 去背景(可选):用 Rembg、Remove.bg 之类的工具去背景。这能防止模型把背景色或物体(比如你背后的书架、墙上的画)当成人物特征的一部分

我对比例做过对比测试:同样一组照片,1:1 剪裁版训练的 LoRA,在生成不同构图时的稳定性明显优于随机比例版。

第二步:训练参数详解

训练时的参数配置直接影响 LoRA 的效果。下面是我试过的几组参数和实际效果对比。

关键参数

秩(Rank / r)

秩决定了 LoRA 的学习容量,值越大能学到的细节越多,但文件也越大,且有更高的过拟合风险。

  • r=16:适合简单的人物特征,训练快,文件约 20MB
  • r=32:我常用的值,平衡了细节和泛化能力,文件约 40MB
  • r=64:细节最丰富,但需要更多样本且更容易过拟合,文件约 80MB

我用 r=32 效果最好。如果样本只有 8-10 张,建议用 r=16。

学习率(Learning Rate)

这是最容易出问题的参数,试错的成本最高。

  • 1e-4(0.0001):默认值,训练速度适中,适合大多数情况
  • 3e-4(0.0003):训练更快,但容易 loss 爆炸
  • 5e-5(0.00005):更保守,训练更慢但更稳定

我在 Replicate 上用默认的学习率就可以,但如果你用 Kohya 或 Diffusers 自己训练,建议从 1e-4 开始,观察 loss 曲线。如果 loss 下降太快(每步降 0.1 以上),说明学习率偏高了。

训练步数(Steps)

步数 = 训练图片数 × 重复次数 × 轮数 / 批次大小

拿我的配置举例:

  • 12 张图片,每张重复 10 次
  • 训练轮数(epochs):20
  • 批次大小(batch size):4

总步数 = 12 × 10 × 20 / 4 = 600 步

对于 Flux 模型,400-800 步是比较合理的范围。超过 1000 步容易过拟合——具体表现是训练样本里的人像得很准,但换个角度、换个光线就崩了。

分辨率

Flux 原生支持 1024×1024 的训练分辨率,建议和出图分辨率保持一致。如果用 512×512 训练再放大到 1024 出图,细节会有损失。

我的实际训练配置(Replicate)

在 Replicate 上,我用的参数长这样:

input_images: "上传的 12 张照片"
trigger_word: "TOK"
learning_rate: 0.0001
rank: 32
steps: 600
batch_size: 4
resolution: 1024

训练时间大约 45 分钟,费用约 3 美元。

第三步:触发词的选择

触发词是 LoRA 和 prompt 之间的桥梁。训练时指定一个"暗号",出图时在 prompt 里带上它,LoRA 才会被激活。

怎么选触发词

推荐格式:三个大写字母,比如 TOKPXLCHR

原因很简单:自然语言里很少出现三个连续大写字母的组合,模型不容易混淆。如果你用 person 或者 man 这种常见词,LoRA 可能会在不想要的时候也激活。

出图时怎么写 prompt

训练完 LoRA 后,出图的 prompt 结构大概是:

[场景描述], a photo of TOK, [细节修饰], [风格限定]

举个例子,我要生成一个在咖啡馆里喝咖啡的角色:

a cozy cafe interior, natural lighting, a photo of TOK, wearing a casual sweater, smiling, shot on Kodak Portra 400, cinematic

别忘了把触发词放在合理的语法位置——a photo of TOK 这个句式在 Flux 上的表现是最稳定的。

控制强度:如果你的 LoRA 效果太强或太弱,可以在 API 调用时调整 LoRA 权重(scale)。默认是 1.0,范围 0.5-1.5。想弱化就降到 0.7-0.8,想更明显就提到 1.2-1.3。

第四步:API 调用的正确姿势

LoRA 训练好之后,下一个问题是怎么用。这里有一个很容易踩的坑。

版本 ID 才是正解

很多平台支持两种方式引用 LoRA:

  1. 版本 ID 引用:推荐。模型发布后得到一个不变的版本 ID,随时可靠调用
  2. lora_weights URL 参数:不推荐。CDN 生成的临时链接有时效性,几小时到两天后就会 404

我第一次用的是 URL 方式,第二天出图发现全失败了。排查了大半天,从网络问题到账户余额挨个检查,最后发现是链接过期了。非常崩溃。

正确的调用方式(Replicate 示例):

curl -s -X POST \
  https://api.replicate.com/v1/models/用户名/模型名:版本ID/predictions \
  -H "Authorization: Bearer $REPLICATE_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "input": {
      "prompt": "a photo of TOK, cinematic lighting, portrait",
      "num_outputs": 1,
      "guidance_scale": 3.5,
      "num_inference_steps": 28
    }
  }'

其他关键出图参数

除了 LoRA 的调用方式,出图时的参数也会影响最终效果:

  • guidance_scale(引导比例):默认 3.5,建议范围 2.5-5.0。值越大,prompt 对生成的约束越强,但太高会让图片看起来过饱和、不自然。LoRA 出图建议 3.0-4.0
  • num_inference_steps(推理步数):Flux 推荐 28 步。步数太少细节不足,太多(超过 50)边际收益递减
  • seed(随机种子):找到好的种子后记下来,下次用同样的 seed + prompt 可以复现类似的构图

批量出图的技巧

如果需要生成一批风格统一的图片,我会这么做:

  1. 先跑 5-10 张测试图,调整 prompt 和参数
  2. 锁定一个表现最好的 seed 区间
  3. 用固定 prompt + 不同的 seed 批量生成,挑出最满意的

这样做比每次都调整 prompt 更高效,系列作品的风格也更统一。

第五步:效果评估与迭代

训练完第一版 LoRA 后,不要急着直接用。我习惯做一个系统的评估。

评估维度

  1. 正脸一致性:生成 10 张不同场景的正脸图,看五官是否一致
  2. 侧脸还原度:生成 10 张 30°-90° 侧脸图,看侧脸轮廓是否和原人物一致
  3. 表情泛化:生成微笑、严肃、惊讶等不同表情,看表情变化是否自然
  4. 风格迁移:叠加不同的风格 prompt(水墨、CG、写实),看 LoRA 特征是否还在

常见问题与调整

问题原因解决方案
人物长得像但不够精准样本不够或 r 值偏小增加样本到 15-20 张,或 r 升到 64
不同 prompt 下人物长相不一致过拟合,模型只记住了训练样本的角度减少步数到 400,或降低学习率
人物特征太弱,像没加载 LoRA触发词权重不够或 LoRA scale 太低检查 prompt 是否包含触发词,scale 提到 1.2
背景出现奇怪的人工痕迹样本背景太复杂,模型学进去了用去背景工具处理样本后重新训练
人物皮肤质感差训练样本分辨率不够确保所有样本不低于 1024×1024

成本分析

最后聊一下钱的问题。

训练成本

  • Replicate 训练一次:约 $2-5(取决于步数和分辨率)
  • 本地训练(RTX 4090):电费成本约 $0.5-1,但需要自己搭环境
  • Kohya / Diffusers + 云 GPU:按小时计费,$0.5-2/小时

推理成本

每次生成图片约 $0.05(Replicate 价格)。如果大批量出图(比如 100 张),成本约 $5。

对比 Midjourney

Midjourney 标准计划 $10/月,按年付约 $8/月。如果你每个月生成超过 200 张,Midjourney 更划算。但如果只做特定的角色项目,按需付费的 LoRA + Replicate 方案在低成本下更有优势。而且 LoRA 能做到的角色一致性,Midjourney 靠 prompt 很难达到。

适合做什么 / 不适合做什么

适合的场景:

  • 漫画或小说系列插图,主角需要每张保持一致
  • 品牌 IP 形象设计,同一个角色出现在不同物料里
  • 产品图批量生成——同一产品在不同场景、不同角度下展示
  • 个性化头像生成:用自己的照片训练 LoRA,生成多种风格的头像
  • 电商场景:模特换装、不同背景的商品展示

不太适合的场景:

  • 一次性的单图需求——训练 LoRA 需要投入时间和成本,只跑一两张图不划算
  • 需要极高精度的商业肖像——LoRA 会有微小的形变,比真人实拍还是有差距
  • 目标人物只有 1-2 张低质量照片——样本实在太少,LoRA 巧妇难为无米之炊

总结

回看整个流程,最核心的三件事:

  1. 样本质量决定了上限——花时间筛选和预处理照片,是回报率最高的投入
  2. 训练参数影响泛化能力——步数、学习率、秩这三个参数要多试几组,找到适合你样本的组合
  3. API 调用用版本 ID——不要用临时 URL,血的教训

LoRA 不是万能药,但在"生成一致角色"这件事上,它是我目前用过的最实用的方案。如果你也在做需要角色统一的内容项目,花几个小时训练一个 LoRA,后面能省下大把重复调 prompt 的时间。

有什么问题欢迎留言交流。

——一凡