尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

用JSON提示词掌控Nano Banana 2:结构化图像生成实战

用JSON提示词掌控Nano Banana 2:结构化图像生成实战 很多人第一次接触 Nano Banana 2 时注意力都被“生成效果惊人”吸引住了。真正自己上手之后才发现提示词写不好模型照样给你“自由发挥”想要一只戴贝雷帽的乌鸦它给你画成戴帽子的猫指定了方形构图它交出一张横版海报。问题的根源不在于模型不够聪明而在于我们给模型的指令太“散文”——没有结构自然就没有约束。这篇文章要讲的核心是用 JSON 提示词JSON Prompt来掌握 Nano Banana 2 这类图像生成模型。把提示词从一段自然语言改写成一份结构清晰的 JSON 对象让模型像执行配置一样执行你的想法。读完你会明白Nano Banana 2 为什么对 JSON 提示词更友好JSON 提示词到底应该怎么设计以及如何用 Python 在真实代码里跑通“JSON 提示 → 图片落盘”的完整链路。内容会分为三部分概念解释、环境搭建、代码实操。最后会给出常见问题排查表和生产环境建议。无论你是大模型应用开发者、Agent 工程师还是想用图像模型做自动化内容的工作者这篇文章都值得收藏。1. 这篇文章真正要解决的问题生成式图像模型进入新阶段之后竞争焦点已经从“能不能生成”变成了“能不能控制”。Nano Banana 2 代表的正是 Gemini 图像生成方向的最新迭代它延续了可对话、可编辑、可渲染文字等能力但如果你只用自然语言提示很快会遇到几个典型痛点。第一多约束冲突。一句自然语言里同时包含主体、构图、风格、光线、比例、负面要求模型往往会选择性执行。它倾向于抓“名词”和“形容词”却经常丢掉“比例”“视角”这样的结构性描述。这让“我想要一张 16:9 的海报主体是猫头鹰油画风格背景虚化”这类需求变成了一场赌博。第二程序化调用困难。假设你要做一个批量生成封面的服务需要不同标题对应不同风格。用字符串模板拼接自然语言既难维护也难校验。万一拼接出语法不通的句子模型输出质量立刻下降而且你很难定位是哪个变量出了问题。第三调试成本高。自然语言提示失败了你很难判断是哪个词引发了问题。到底是“水彩”没生效还是“方形构图”的表述有歧义你只能逐字试错一次次浪费 API 调用额度。JSON 提示词把这些问题转换成可编程的字段prompt负责内容aspect_ratio负责比例style负责风格。每个字段独立存在可校验、可复用、可组合。这就是为什么“用 JSON 提示掌握模型”不是炫技而是一种工程化的必然选择。2. Nano Banana 2 与 JSON 提示词的核心概念2.1 怎么理解 Nano Banana 2先解释一下背景。Google 在 2025 年 I/O 大会上展示过一个代号叫 Nano Banana 的图像生成原型底层模型就是 Gemini 2.5 Flash Image。它的特点是原生多模态能够在多轮对话中编辑图片、生成带文字的图片并且能接受很复杂的指令。当时最出圈的案例是“Find Waldo”模型会在图片里定位某个人物并用结构化 JSON 返回位置信息。Nano Banana 2 可以理解为这个方向上的后续迭代。社区叫它“2”未必代表官方命名但可以确定的是它更强调对结构化指令的理解。换句话说你越是把需求结构化它越能给出稳定输出。这个特性让 JSON 提示词从“锦上添花”变成了“核心玩法”。需要提醒的是不同地区的 API 可用模型和版本命名可能不同。本文提到的gemini-2.5-flash-image是一个典型模型 ID实际使用请以官方文档和你的账号可用列表为准。2.2 什么是 JSON 提示词JSON 提示词就是把原本用一句自然语言表达的生成需求改写成一个 JSON 对象。举个例子。自然语言版本生成一张方形图片画的是一只戴着贝雷帽的乌鸦停在树枝上水彩风格。JSON 提示词版本{ prompt: A cute crow wearing a tiny beret, standing on a branch, aspect_ratio: 1:1, style: watercolor }这两个版本最大的差异不是“格式”而是“指令的边界”。自然语言里“方形”和“水彩”是形容词模型需要自己判断它们的重要程度。在 JSON 里aspect_ratio和style是独立字段模型在训练中已经建立了“这些字段对应具体的图像控制参数”的映射因此执行起来更直接。2.3 自然语言提示词与 JSON 提示词对比我在多人协作项目里观察到的规律是自然语言提示适合探索JSON 提示适合生产。对比维度自然语言提示JSON 提示词表达自由度高中但够用语义歧义明显较低程序化复用需要模板拼接本身就是数据结构多约束控制模型自行取舍字段级控制自动化校验很难可用 JSON Schema错误定位靠猜测字段缺失可定位创作灵感适合自由发散适合固定模板这并不是说所有场景都要用 JSON。如果你只是想随手画一个脑洞图自然语言更自由。但如果目标是批量、稳定、可维护地生成图片JSON 提示词明显更合适。2.4 为什么 Nano Banana 2 对 JSON 提示词这么友好有三个层面的原因。第一Gemini 系列从设计之初就强调结构化输出。无论是文本模型还是图像模型都支持返回 JSON 格式的结构化结果。这意味着模型内部对 JSON 语法的理解能力是统一的。当你在图像生成请求里给它一段 JSON它不会当普通文本处理而是会尝试解析成“任务参数”。第二Nano Banana 2 的强项是多模态推理。它不仅能理解图像还能理解图像背后的关系。JSON 字段之间的逻辑关系对它是透明的。比如personality字段可以控制角色性格people_in_image可以指定图片里有哪些人物这种字段级控制能力天然适合 JSON 表达。第三从产品演进看图像生成模型正在从“对话工具”变成“Agent 的视觉器官”。Agent 之间交换任务参数最通用的格式就是 JSON。模型如果无法理解结构化指令就无法嵌入自动化链路。这也是“Nano Banana 2 JSON 提示”成为热门组合的根本原因。3. 环境准备与前置条件在写代码之前先准备好运行环境。整体依赖不多只要满足以下条件即可。运行环境Python 3.9 及以上版本能访问 Gemini API 的网络环境Google AI Studio 或 Google Cloud 控制台创建的 API Key安装依赖推荐使用 Python 官方 SDKgoogle-genai一条命令完成安装pip install -U google-genai安装完成后检查版本python -c import google.genai; print(google.genai.__version__)设置 API Key建议通过环境变量注入不要写死在代码里。在 Linux/macOS 上export GEMINI_API_KEY你的API Key在 Windows PowerShell 上$env:GEMINI_API_KEY你的API Key模型选择图像生成相关的模型 ID 可能因地区和账号略有不同。通常可以使用gemini-2.5-flash-image或通过client.models.list()查询当前账号可用的模型列表查询代码from google import genai import os client genai.Client(api_keyos.environ[GEMINI_API_KEY]) for model in client.models.list(): if image in model.name.lower(): print(model.name)如果列表为空或请求失败优先检查 API Key 权限和网络连通性。4. 核心流程拆解如何设计 JSON 提示词设计 JSON 提示词的流程可以参考软件工程里的“接口设计”思路。你正在给一个视觉模型定义接口参数而不是在“聊天”。4.1 第一步明确任务的最小闭环先回答一个问题这次生成我要解决什么比如“做一张文章封面”“生成一个产品概念图”“修复一张老照片”。目标越单一JSON 字段越简单模型越不会跑偏。如果目标复杂比如“既要指定人物又要指定场景还要指定光线”那就进一步拆分成多个子任务。不要试图在一个 JSON 对象里塞下所有需求模型很可能顾此失彼。4.2 第二步拆解控制维度把需求拆成模型能理解的控制项。常见控制维度包括prompt核心画面描述aspect_ratio宽高比如1:1、16:9、4:3style整体画风如watercolor、cyberpunk、oil paintingpersonality角色或主体的性格特质negative_prompt不希望出现的内容如果官方接口支持否则放进 prompt 描述拆分的标准是如果某两个描述可能在模型心中产生冲突就拆成两个字段如果一个描述必须整体生效就放在同一个字段里。举个例子“一个穿红色衣服的女孩在雪地里笑”并不是好拆分因为“红色衣服”“雪地”“笑”是三个不同维度它们之间没有冲突但如果你把“红色”和“雪地”混在同一个字段里模型可能把雪的色调也渲染成偏红。这时把outfit_color、environment、expression分开会更可控。4.3 第三步用 JSON Schema 约束提示词结构如果只是单次调用JSON 提示词随手写即可。但要在工程里复用最好先定义 JSON Schema。{ $schema: http://json-schema.org/draft-07/schema#, type: object, properties: { prompt: { type: string }, aspect_ratio: { type: string, enum: [1:1, 16:9, 4:3, 3:2] }, style: { type: string }, negative_prompt: { type: string } }, required: [prompt], additionalProperties: false }这样做的价值有两个第一提前拦截不符合预期的任务第二生成提示词时不容易出现字段拼写错误。即使你不在代码里真正引入 JSON Schema 校验库也可以把这份文档当作团队协作的契约。4.4 第四步构造请求并发起调用把 JSON 转成字符串传给模型。这里有一个常见误区不要把 JSON 对象直接print成 Python 字典传入contents而要用json.dumps(..., ensure_asciiFalse)转成字符串。模型阅读的是文本形式的 JSON不是内存对象。如果你直接传入字典SDK 可能会把它序列化成另一种结构导致模型理解的字段名发生变化。稳妥的做法是先用一个独立的函数统一做“任务对象 → JSON 字符串”的转换。4.5 第五步解析并验证输出拿到模型响应后先检查generated_images是否存在再检查图像字节长度最后落盘。如果要继续编辑可以把图像字节传给下一轮请求。整个过程可以抽象成一个“参数进文件出”的流水线。5. 完整示例与代码实现下面给出三个可以直接运行的完整示例。示例的意图是覆盖“单次生成”“多轮编辑”“批量生产”三种常见场景。5.1 示例一单次 JSON 提示生成图片from google import genai import os client genai.Client(api_keyos.environ[GEMINI_API_KEY]) prompt { prompt: A cute crow wearing a tiny beret, standing on a branch, soft pastel colors, aspect_ratio: 1:1, style: watercolor } response client.models.generate_content( modelgemini-2.5-flash-image, contentsprompt, ) image_bytes response.generated_images[0].image.image_bytes with open(crow.png, wb) as f: f.write(image_bytes) print(保存成功crow.png)关键逻辑说明prompt是一个多行字符串直接包含 JSON。generate_content的contents参数接收的是文本。generated_images[0].image.image_bytes是图片的原始字节可以直接写文件。运行后当前目录会出现一个crow.png文件。如果生成成功文件大小应该在几十 KB 到几百 KB 之间。5.2 示例二多轮编辑保持上下文Nano Banana 2 的一个核心能力是“边聊边改”。第一轮先生成图第二轮把图和新 JSON 提示一起传给模型。from google import genai from google.genai import types client genai.Client(api_keyos.environ[GEMINI_API_KEY]) model gemini-2.5-flash-image # 第一轮按 JSON 提示生成原图 first_prompt { prompt: A small coffee shop on a rainy street, aspect_ratio: 16:9, time_of_day: evening } response1 client.models.generate_content( modelmodel, contentsfirst_prompt, ) first_image_bytes response1.generated_images[0].image.image_bytes # 第二轮携带原图继续给 JSON 修改指令 parts [ types.Part.from_bytes( datafirst_image_bytes, mime_typeimage/png, ), types.Part.from_text( text { modification: Add a yellow neon sign that says COFFEE, keep_everything_else: true } ), ] response2 client.models.generate_content(modelmodel, contentsparts) with open(coffee_shop_edited.png, wb) as f: f.write(response2.generated_images[0].image.image_bytes) print(编辑完成coffee_shop_edited.png)这段代码展示了 JSON 提示词在图像编辑场景下的用法。modification字段描述要改什么keep_everything_else告诉模型保持其他内容不变。这种字段设计能让多轮编辑更可控。实际项目中你完全可以把第一轮保存的图片字节放在对象存储里第二轮从存储读取再传入模型。图片的输入不一定必须来自上一轮生成结果。5.3 示例三批量生成结构化任务管理实际项目中经常需要批量生成。可以把多个任务放在一个 JSON 数组里逐条执行并记录任务 ID。import json from google import genai client genai.Client(api_keyos.environ[GEMINI_API_KEY]) tasks [ { id: crow, prompt: a crow wearing a tiny beret, aspect_ratio: 1:1, style: watercolor }, { id: owl, prompt: a wise owl reading a book in a library, aspect_ratio: 4:3, style: oil painting }, { id: fox, prompt: a fox running through snow at sunset, aspect_ratio: 16:9, style: photorealistic } ] for task in tasks: response client.models.generate_content( modelgemini-2.5-flash-image, contentsjson.dumps(task, ensure_asciiFalse), ) image_bytes response.generated_images[0].image.image_bytes output_path f{task[id]}.png with open(output_path, wb) as f: f.write(image_bytes) print(f生成完成{output_path})这段代码的工程价值在于任务列表是纯 JSON可以来自配置文件、数据库或上游系统。每个任务的id用于追踪和命名输出文件。便于增加重试、并发和失败记录逻辑。如果任务数量很大建议用asyncio或线程池做并发。但要注意并发过高会触发 API 的速率限制需要根据官方配额做调整。6. 运行结果与效果验证运行示例三后预期当前目录下出现三个文件crow.png、owl.png、fox.png。每个文件的尺寸和内容应该与任务中的aspect_ratio、style和prompt基本一致。验证步骤第一步检查文件是否生成。ls -lh *.png如果看到文件大小为 0 或不存在说明请求可能失败或响应中没有图片。第二步查看图片尺寸。用 Python 的 Pillow 库检查pip install pillowfrom PIL import Image for name in [crow.png, owl.png, fox.png]: img Image.open(name) print(name, img.size)
返回列表