用 JSON 驯服 AI 生图:一次实验报告

一、起因:看到一篇有意思的文章

最近读到 fofr.ai 的 JSON 提示词教程,核心观点是:

用 JSON 结构化提示词,能让 AI 生图更精确、更可重复。

听起来很美好。但真的有用吗?

作为一个经常被 AI 生图气到抓狂的人,我决定实际测试一下。


二、实验设计

测试场景:

为一款日式 RPG 游戏生成主角立绘

  • 需求:黑色长发祭司,神社背景,黄昏光线

  • 风格:动漫水彩

  • 用途:游戏角色设计

对比方法:

  1. 方法A:自然语言提示词(我平时的写法)

  2. 方法B:JSON 结构化提示词(按 fofr 的方法)

评估标准:

  • 命中率(符合需求的图片占比)

  • 耗时

  • 可调整性(想改某个细节有多容易)


三、实验结果

方法A:自然语言(惨败)

我的提示词:

"A female shrine priest with long black hair, wearing traditional outfit, standing at a shrine during sunset"

结果:

  • 生成数量:100 张

  • 可用数量:5 张

  • 命中率:5%

  • 耗时:2 小时

实际生成效果(其中一张):

An image to describe post

用自然语言生成的结果:虽然有些元素对了,但整体效果和预期有较大差距

失败原因:

  • 前 10 张:头发是黑的,但不是短发就是双马尾

  • 第 20 张:总算长发了,但场景跑到森林里了

  • 第 35 张:神社有了,但主角变成金发

  • 第 42 张:所有元素都对了,但光线是正午大太阳(不是我要的黄昏金光)

问题根源:

每个词都是模糊的。"长发"到底多长?"sunset"是什么时间、什么色温?AI 每次理解都不同,就像投骰子。

方法B:JSON 结构化(改善明显)

参考 fofr 的方法,我把需求拆解成 4 个字段:

{
  "subject": "female shrine priest with long black hair, white miko outfit with red hakama, holding wooden staff",
  "style": "anime watercolor",
  "mood": "peaceful and sacred",
  "lighting": "golden_hour side_light"
}

结果:

  • 生成数量:10 张

  • 可用数量:8 张

  • 命中率:80%

  • 耗时:15 分钟

实际生成效果(其中一张):

An image to describe post


用 JSON 结构化提示词生成的结果:精确控制了光照、氛围、细节

对比一下:

左边(自然语言):光线、氛围、细节都不够精确
右边(JSON):每个参数都被锁定,结果更接近预期

改善原因:

  • golden_hour 比 "sunset" 精确(日落前1小时,暖金色)

  • side_light 锁定了光线方向(不是顶光也不是背光)

  • mood: "peaceful and sacred" 影响了色调和细节密度

数据对比:

  • 命中率提升:16 倍(5% → 80%)

  • 时间效率提升:8 倍(120 分钟 → 15 分钟)

  • 生成配额节省:90%


四、深入理解:为什么 JSON 有效?

问题的本质:自然语言太模糊了

你有没有想过,为什么你写得那么详细,AI 还是理解错?

因为每个形容词都是模糊的。

"日式 RPG 风格"——是《最终幻想》那种欧式奇幻混日式?还是《塞尔达传说》的卡通渲染?或者《女神异闻录》的都市暗黑风?1000 个人心里有 1000 种"日式 RPG"。

"长发"——及腰?披肩?还是到小腿的超长发?有刘海吗?直发还是卷发?扎起来还是散开?

"黄昏"——几点?夏天的黄昏还是冬天的?是橙红色的火烧云,还是淡紫色的暮光?

每一个形容词,都是一次投骰子。

An image to describe post


左边是模糊的自然语言(混乱),右边是结构化的 JSON(有序)

一个更要命的误区:详细 ≠ 精确

很多人以为"写得够详细就能精确"。

错了。

这就像你去咖啡店点单,说:"给我来杯好喝的咖啡,不要太苦,也不要太淡,温度适中,最好有点奶味但别太腻。"

店员能做出你想要的吗?可能。但更可能的是——你喝到的和想象中差了十万八千里。

对比一下这个:"中杯美式,少冰,不加糖,额外加一份浓缩。"

哪个更能让你得到想要的结果?

An image to describe post

精确的指令 vs 模糊的描述

JSON 为什么有效?

这里是关键认知:

自然语言是给人用的,JSON 是给 AI 用的。

AI 模型的训练数据里,有海量的 JSON 格式内容——配置文件、API 响应、数据库记录、代码片段。它见过无数次 "lighting": "golden_hour" 精确对应什么视觉效果。

用 JSON 提示词,就像用 AI 的母语跟它说话。理解偏差直线下降。

而且,JSON 不是编程。它就是填表格。

你不需要会写代码,只需要知道该填什么。


五、核心发现:4个字段就够了

fofr 的文章提到很多字段,但实际测试下来,这4个最关键

An image to describe post


Subject、Style、Mood、Lighting 构成了控制画面的核心要素

1. Subject - 主体

画什么。可以简单("cat")或详细(嵌套结构控制发型、服装、姿势)

基础写法:

{
  "subject": "female priest"
}

详细写法:

{
  "subject": {
    "character": "female priest",
    "hair": "long black hair, straight, waist-length",
    "clothing": "traditional white shrine maiden outfit with red hakama",
    "accessories": "wooden staff with paper talismans",
    "pose": "standing upright, staff in right hand"
  }
}

常见结构:

  • 人物:demographics(年龄、性别)、face、hair、body、pose、attire

  • 动物:species、breed、age、pose

  • 物体:type、material、condition、placement

  • 场景:location、time、weather

2. Style - 风格

决定画面看起来像什么:

常用类型:

  1. 艺术风格:watercolor(水彩)、oil painting(油画)、anime(动漫)、pixel art(像素)

  2. 技术风格:photorealistic(照片级)、3D render(三维渲染)、sketch(素描)

  3. 时代风格:retro 80s、art nouveau、cyberpunk

混合写法:

{
  "style": "anime watercolor with soft edges"
}

你可以组合多个风格词,但有两个避坑原则:

  • 不要超过 3 个(太多会互相冲突)

  • 确保它们不矛盾(比如"photorealistic anime"就很矛盾)

3. Mood - 氛围

画面的情绪和感觉。这个很容易被忽略,但影响巨大。

常用词:

  • peaceful(平和的)

  • energetic(有活力的)

  • mysterious(神秘的)

  • dramatic(戏剧化的)

  • melancholic(忧郁的)

  • nostalgic(怀旧的)

组合技巧:

2-3 个词就够了,多了反而乱。

{
  "mood": "peaceful and nostalgic"
}

实际影响:

Mood 会直接影响:

  • 色调(暖色 vs. 冷色)

  • 光线柔和度

  • 细节密度(戏剧化的画面通常细节更多)

  • 对比度

4. Lighting - 光照

最重要的字段。

光照决定画面 80% 的氛围。同样场景,换个光照,完全是两张图。

时间光照:

  • dawn:黎明,冷调蓝紫色

  • golden_hour:黄金时刻(日出后 1 小时 / 日落前 1 小时),温暖金色

  • noon:正午,强烈顶光,高对比

  • dusk:黄昏,橙红色

  • night:夜晚,低光照

  • blue_hour:蓝调时刻(日落后 20 分钟),深蓝紫色

光源类型:

  • sunlight:自然阳光

  • neon:霓虹灯(赛博朋克必备)

  • candlelight:烛光

  • moonlight:月光

  • studio_light:影棚灯光

方向:

  • front_light:正面光(平面感强)

  • back_light:背光(轮廓光,戏剧感)

  • side_light:侧光(立体感强)

  • top_light:顶光(神秘感)

速查:

  • 想要温暖感?→ golden_hour + front_light

  • 想要冷峻感?→ blue_hour + side_light

  • 想要戏剧感?→ dusk + back_light


六、实验:光照的威力

为了验证 lighting 的影响,我做了个对比实验:

An image to describe post


同样的场景,不同的光照,完全不同的氛围

实验设计:

同一个角色(神社祭司),只改变 lighting 参数。

技术说明:

为了保证角色一致性,我用了 reference image 技术:

  1. 先生成1张基准图

  2. 用它作为参考生成其他3张变体

  3. 告诉 AI:"保持角色和构图,只改变光照"

(这是实际操作中的关键技巧,下文会详细说明)

结果:

1. Golden Hour + Side Light(温暖感)

An image to describe post


"lighting": { "time": "golden_hour", "direction": "side_light" }

2. Blue Hour + Side Light(冷峻感)

An image to describe post


"lighting": { "time": "blue_hour", "direction": "side_light" }

3. Dusk + Back Light(戏剧感)

An image to describe post


"lighting": { "time": "dusk", "direction": "back_light" }

4. Noon + Top Light(强对比)

An image to describe post


"lighting": { "time": "noon", "direction": "top_light" }

结论:

光照真的能主导画面 80% 的氛围。同样的角色和场景,只改一个参数,效果完全不同。


七、实战案例:三个不同场景

为了测试 JSON 的通用性,我又测试了另外两个完全不同的场景:

案例 1:游戏角色立绘

基础版(推荐新手):

{
  "subject": "female shrine priest with long black hair, white miko outfit with red hakama, holding wooden staff",
  "style": "anime watercolor",
  "mood": "peaceful and sacred",
  "lighting": "golden_hour side_light"
}

基础版已经够用。需要更精细控制时,再用嵌套结构的进阶版。

进阶版(需要更多控制时):

{
  "subject": {
    "character": "female shrine priest",
    "hair": "long straight black hair, waist-length",
    "clothing": "white shrine maiden outfit with red hakama pants",
    "accessories": "wooden staff with paper talismans",
    "pose": "standing confidently, staff in right hand"
  },
  "style": "anime with soft watercolor texture",
  "mood": "peaceful and sacred",
  "lighting": {
    "time": "golden_hour",
    "type": "sunlight",
    "direction": "side_light",
    "details": "warm golden light filtering through torii gate"
  },
  "background": {
    "setting": "traditional Japanese shrine",
    "elements": "red torii gate, stone lanterns, cherry blossom petals",
    "depth": "shallow focus, background slightly blurred"
  }
}

**效果:**你会得到一个光线温暖、氛围神圣、细节精确的神社祭司立绘。黄昏的金色光线从侧面照射,穿过鸟居,在人物身上形成柔和的阴影。背景微微虚化,突出主体。

对比自然语言版本:
"A female shrine priest with long black hair, wearing traditional outfit, standing at a shrine during sunset"

看出差别了吗?JSON 版本把"sunset"具体到了"golden_hour"(黄昏前 1 小时),把光线方向定为"side_light"(侧光),把氛围定为"peaceful and sacred"。每一个细节都被锁定。


案例 2:赛博朋克街景

{
  "subject": {
    "main": "rain-soaked cyberpunk street",
    "elements": "neon signs, street vendors, hovering vehicles"
  },
  "style": "photorealistic with cinematic color grading",
  "mood": "mysterious and energetic",
  "lighting": {
    "time": "night",
    "type": "neon",
    "colors": ["pink", "cyan", "purple"],
    "details": "reflections on wet pavement, strong color contrast"
  },
  "composition": {
    "angle": "low angle, looking up at buildings",
    "rule": "leading lines from street converging to vanishing point"
  },
  "weather": "light rain, mist"
}

**效果:**你会得到一个《银翼杀手 2049》风格的街景——雨后的路面反射着霓虹灯光,粉色、青色、紫色的灯光形成强烈对比。低角度仰拍,街道延伸到远处的消失点,建筑高耸入云。薄雾和细雨增加了神秘感。

An image to describe post


用 JSON 精确控制霓虹灯颜色(pink/cyan/purple)、机位(low angle)、天气(light rain)

为什么有效?

  • lighting.colors 直接指定了霓虹灯的颜色

  • composition.angle 锁定了机位

  • weather 增加了氛围细节


案例 3:产品渲染

{
  "subject": {
    "product": "wireless earbuds",
    "material": "matte white plastic with metallic accents",
    "placement": "floating on clean surface"
  },
  "style": "3D render, minimalist",
  "mood": "clean and modern",
  "lighting": {
    "type": "studio_light",
    "setup": "three-point lighting",
    "details": "soft shadows, rim light on edges"
  },
  "background": {
    "color": "gradient from light gray to white",
    "texture": "smooth, no distractions"
  },
  "technical": {
    "focus": "razor sharp",
    "depth_of_field": "infinite"
  }
}

**效果:**专业级产品渲染图,耳机悬浮在干净的背景上,三点布光创造柔和阴影,边缘有高光勾勒轮廓。背景是从浅灰到白色的渐变,完全不抢主体风头。

An image to describe post


三点布光 + 无限景深 + 干净背景,专业级产品图一次生成

关键点:

  • lighting.setup: "three-point lighting" 直接调用了摄影界的标准布光方案

  • technical.depth_of_field: "infinite" 确保整个产品都清晰

  • background.texture: "smooth, no distractions" 避免了背景杂乱


八、意外发现:一致性是个坑

实验中遇到的问题:

当我想生成"同一角色的多个版本"时,发现即使用完全相同的 JSON,AI 每次生成的角色都略有不同(长相、姿势、细节)。

这是 AI 的随机性。fofr 的文章里没有强调这一点。

保持角色一致性:进阶技巧

现实情况:

即使用完全相同的 JSON,AI 每次生成的角色细节都会略有不同。这是 AI 的随机性。

如果你需要"同一角色的多个版本"(比如不同光照、不同表情),有两个办法:

方法1:固定 seed(随机种子)

{
  "subject": "cat",
  "style": "watercolor",
  "mood": "peaceful",
  "seed": 12345  // 这个数字固定住
}

改变 mood 或 lighting,但 seed 保持不变,角色会相对一致。

支持情况:

  • Midjourney:用 --seed 12345

  • ComfyUI / Automatic1111:在界面设置 seed

  • DALL-E:不支持(无法固定 seed)

局限:

  • 只能保证"相对一致",不是100%相同

  • 改变参数太多时,seed 也会失效

方法2:使用参考图(最稳定)

这是我生成演示图用的方法:

步骤:

  1. 先生成1张满意的基准图

  2. 在工具中上传这张图作为参考(或用图片URL)

  3. 写 prompt:"保持参考图中的角色、姿势、构图,只改变 lighting 为 blue_hour"

支持情况:

  • Midjourney:用 图片URL + prompt

  • DALL-E(ChatGPT):上传图片,说"保持这个角色,改变..."

  • ComfyUI:用 ControlNet 或 img2img 节点

效果:

  • 这是最稳定的方法

  • 角色外观、姿势高度一致

  • 我演示的神社祭司和猫咪就是这样生成的

什么时候需要一致性?

不需要:

  • 你只是想快速生成一张图

  • 每次生成的差异无所谓

需要:

  • 做角色设计(多个表情/姿势的同一角色)

  • 做教程演示(展示参数对比)

  • 做品牌素材(保持视觉统一)

新手建议:

先不用管一致性,专注于用 JSON 控制单张图的效果。等熟练了,再探索 seed 和参考图。


九、补充实验:Mood 氛围控制

用最简单的模板,我又做了个 Mood 参数的对比实验:

基准模板:

{
  "subject": "cat",
  "style": "watercolor",
  "mood": "peaceful",
  "lighting": "soft_morning_light"
}

只改变 mood 参数,看看差异:

Peaceful(平和)

An image to describe post

Mysterious(神秘)

An image to describe post

Dramatic(戏剧化)

An image to describe post

结论:

主体相同,风格相同,只改 mood,氛围完全不同。这就是 JSON 的魅力。


十、进阶字段:80% 的情况不需要

基础 4 字段(subject / style / mood / lighting)能解决 80% 的场景。但如果你想更精确控制,还有这些:

构图相关:

  • composition_rule: "rule of thirds"(三分法)、"golden ratio"(黄金比例)

  • camera_angle: "bird's eye view"(鸟瞰)、"worm's eye view"(虫视)

  • focal_length: "24mm wide angle"(广角)、"85mm portrait"(人像镜头)

细节控制:

  • color_palette: ["#FF6B6B", "#4ECDC4", "#FFE66D"](直接用十六进制色值)

  • weather: "fog", "snow", "storm"

  • season: "autumn", "spring"

技术参数:

  • aspect_ratio: "16:9", "1:1", "9:16"

  • detail_level: "high detail", "minimalist"

  • texture: "rough", "glossy", "matte"

元数据:

  • negative_prompt: 列出你不想要的元素

  • seed: 固定随机种子,重现相同结果

什么时候用?

只有在基础 4 字段无法满足需求时再加。贪多嚼不烂。


十一、实战建议

新手起步

  1. 从4个基础字段开始(subject / style / mood / lighting)

  2. 用简单版本,不要一上来就嵌套复杂结构

  3. 先不用管"一致性",专注于单张图的效果

  4. 多生成,对比参数变化带来的效果差异

进阶控制

  • 需要更多细节时,才用嵌套结构

  • 需要角色一致时,用 seed 或 reference image

  • 根据需求逐步加字段(composition / weather / background)

  • 不要贪多,基础4个解决80%的场景

工具选择

工具:

模板库:

社区:


十二、常见问题排查

Q1:我复制了 JSON,工具说"格式错误"

  • 检查 JSON 格式:括号配对、引号成对、逗号位置

  • 用在线工具验证:JSONLint

  • 有些工具不直接支持 JSON,需要转成自然语言(让 ChatGPT 帮你转)

Q2:生成的图完全不对,跟我想要的差很远

  • 先简化:只用4个基础字段,去掉所有嵌套

  • 检查字段值是否准确(比如 golden_hour 拼写正确吗?)

  • 换个工具试试(Midjourney / DALL-E / Flux 理解能力不同)

Q3:我想要的元素总是不出现

  • 把最重要的元素放在 subject 最前面

  • 用 negative_prompt 排除干扰:"negative_prompt": ["forest", "short hair"]

  • 生成多张,挑选最接近的

Q4:风格/氛围跟预期不一样

  • 把 style 改得更具体:"anime" → "Studio Ghibli anime style"

  • 组合多个 mood:"peaceful and nostalgic"

  • 参考别人的 prompt,看他们怎么描述

Q5:每次生成的角色都不一样,怎么办?

  • 这是正常的,AI 有随机性

  • 如需一致性,看上面的"保持角色一致性"章节

  • 用 seed 或 reference image

Q6:哪些工具真正支持 JSON?

  • 原生支持:Midjourney(直接粘贴)、Claude(理解结构)

  • 间接支持:DALL-E(需转成自然语言,但理解结构化描述)

  • 需要插件:ComfyUI / Automatic1111(需自定义节点)

还是不行?

  • 把你的 JSON 和生成结果发到社区求助

  • Reddit r/StableDiffusion 和 Midjourney Discord 都很活跃


十三、结论

JSON 提示词真的有用吗?

有用。 我的测试数据:命中率从 5% 提升到 80%,时间节省 8 倍。

但没有想象中那么简单:

  • 一致性需要额外技巧(seed / reference image)

  • 不同工具支持程度不同

  • 需要实践找到适合自己的写法

  • 80%命中率取决于具体场景和需求

核心价值不是"一定成功",而是:

  • 可重复性:同样的 JSON,结果相对一致

  • 可调整性:想改某个细节?直接改对应字段,不用重新描述整个场景

  • 可理解性:看别人的 JSON,能快速理解每个参数的作用

给新手的建议:

  1. 从最简单的4字段模板开始

  2. 别被复杂嵌套吓到,基础版够用

  3. 多实验,对比参数变化

  4. 遇到问题去社区求助

5 分钟上手,效果天差地别。试试看,把你的结果发在评论区。