AIGC 进入商业生产后,最难解决的并不是"如何生成一张更漂亮的图",而是"如何证明这张图满足了需求,并且下一次修改不会破坏已经确认的事实"。设计团队需要的是一套类似软件发布工程的视觉资产流程:先写清楚视觉合同,再生成可复现的基线;任何修改都以差异补丁提交,局部变化必须有边界;最终交付要附带尺寸、颜色、文本、版本和审计证据。资产质量工程(AQE)在这里承担的是合同求值、缺陷回归和发布门禁,而不是单纯的画面打分。
本文提出一种不同于传统 Prompt 教程的实施框架:把商业级 AIGC 资产看成一个可构建、可测试、可回滚的发布候选。Midjourney V6/V6.1、Flux.1 Dev、SDXL ControlNet Inpaint 和 Photoshop 各自承担不同阶段,但它们都通过统一的资产合同协作。Vary Region 不只是"局部重绘"按钮,而是对差异补丁的执行器;Zoom Out 与 Pan 不只是扩图工具,而是坐标系统中的画布迁移;Upscale 2x/4x 不只是放大,而是输出构建链中的高频细节阶段。
一、从"生成结果"到"视觉合同":商业交付为什么需要可执行规格

1.1 商业 Brief 缺少机器可执行的边界
传统 Brief 往往写着"高级、清爽、突出产品、适合社交媒体传播"。这些词对设计师有启发,对流水线却没有边界。机器无法根据"高级"判断是否允许改变瓶身比例,也无法根据"突出产品"计算标题和产品轮廓之间的最小距离。结果是每一轮修改都重新解释一次需求,最后出现"设计师认为符合、品牌方认为不符合、工程系统无法说明差异"的三方争议。
视觉合同(Visual Contract)要把 Brief 拆成四类字段:事实字段、可变字段、空间字段和输出字段。事实字段包括 SKU、品牌色、角色身份、包装文字和产品轮廓;可变字段包括背景纹理、光尘、雾气和装饰元素;空间字段包括主体锚点、文字安全区、禁裁区和出血区;输出字段包括像素、DPI、色彩空间、文件格式和命名规则。
1.2 视觉合同的最小结构
一个可落地的合同可以用 YAML 表示。它不是为了让设计师填写复杂表单,而是为了让每个动作都知道哪些内容必须保持不变:
yaml
asset: grapefruit-soda-campaign
facts:
sku: GS-330
label_text: 青柚苏打
brand_color: "#74B84A"
lock_regions: [bottle_outline, cap, barcode, legal_copy]
variables:
background: studio_gray
droplets: medium
layout:
anchor: [0.52, 0.56]
copy_safe_zone: [0.06, 0.08, 0.32, 0.28]
crop_forbidden: [bottle_outline, barcode]
outputs:
- ratio: 1:1
width: 2400
height: 2400
color: sRGB
- ratio: 9:16
width: 2160
height: 3840
color: sRGB
合同中最重要的不是字段数量,而是字段的可验证性。label_text 可以由 OCR 检查,brand_color 可以由色差检查,lock_regions 可以由掩码和像素差检查,copy_safe_zone 可以由版面碰撞检查。对于"氛围高级"这类主观目标,可以保留为人工评审标签,但不能把它当作唯一的自动门禁。
1.3 事实、推断与装饰必须分层
生成模型会把事实和装饰混在同一个视觉场中。瓶身上的数字本来是商业事实,水珠数量则是装饰推断;角色面部是身份事实,背景中的路灯则是环境元素。如果不分层,后续 Upscale 或局部重绘可能在不知不觉中改变数字、眼睛高光和徽标。
建议在资产元数据中明确三种信任等级:immutable 表示不允许模型重新解释;reviewable 表示可以生成,但必须经过人工或规则复核;decorative 表示允许在预算范围内变化。这样,视觉质量工程不仅检查"像不像",还检查"哪些地方有权变化"。
1.4 交付判定应该是合同求值
可以把一次验收看成合同求值函数:
text
accept(asset) = fact_pass
∧ layout_pass
∧ output_pass
∧ evidence_complete
fact_pass 检查文本、颜色、主体身份和锁定区;layout_pass 检查画幅、锚点和安全区;output_pass 检查像素、DPI、色彩和格式;evidence_complete 检查 Prompt、动作、父版本、结果哈希和验收记录是否齐全。任何一项为假,资产只能停留在候选状态,不能进入发布目录。
二、资产基线与差异补丁:让 Prompt 不再覆盖已验收事实

2.1 基线是第一张合格的"事实快照"
第一次生成的目标不是一步得到终案,而是找到一张可以作为基线的图。基线选择应优先考虑事实稳定性:商品轮廓是否完整、人物身份是否可信、主光源是否明确、构图是否有足够可扩展空间。背景是否足够华丽反而是次要因素,因为背景可以通过后续动作替换或扩展。
基线建立后,系统为它计算内容哈希、感知哈希、区域哈希和合同版本。内容哈希用于判断文件是否被替换,感知哈希用于检测意外的大范围变化,区域哈希用于锁定商品、文字和角色脸部。后续任何动作都引用基线或其子版本,不能直接覆盖原文件。
2.2 差异补丁的四个组成部分
把一次修改写成差异补丁,比重新写一条完整 Prompt 更容易复核。一个补丁包括:意图、作用域、保留项和验收项。
json
{
"patch_id": "p-008",
"base_revision": 12,
"intent": "remove duplicated fingers from the right hand",
"scope": {"type": "mask", "bbox": [812, 430, 190, 260], "feather": 24},
"preserve": ["bottle_outline", "label_color", "table_shadow"],
"acceptance": ["five_distinct_fingers", "no_cap_warp", "light_direction_unchanged"]
}
补丁的 scope 决定模型可以在哪里改变,preserve 决定哪些区域要与父版本比较,acceptance 决定候选结果能否继续向下游传播。对于同一缺陷,可以提交多个补丁候选,但每个候选都必须从同一个父版本开始,这样才不会把不可解释的变化叠加在一起。
2.3 Prompt Delta 比完整 Prompt 更适合迭代
在差异补丁中,Prompt 只描述变化关系,不重复已冻结的风格和主体描述。例如修复一只手,应写"右手握住杯柄,食指位于杯盖后方,保持瓶身轮廓",而不是重新描述"高级商业摄影、柔和光线、灰色背景、青柚气泡水瓶"。完整 Prompt 容易触发模型重新解释背景、镜头和产品;Prompt Delta 则把变化面压缩到业务真正关心的部分。
这并不意味着风格信息完全丢弃。系统可以将风格词、参考图和 Seed 放入父版本的能力快照,作为隐式上下文;差异补丁只显式声明增量。若供应商接口不支持这种结构,就由中继层负责把父版本上下文与 Delta 编译成请求,同时在日志中保存编译前后的字段集合。
2.4 基于三向差异的候选筛选
传统图像对比只问"新图和旧图差多少"。商业验收还要问"新图是否更接近合同"。因此候选筛选至少应计算三种差异:父版本差异、合同事实差异和目标补丁差异。
| 差异类型 | 主要问题 | 典型指标 | 处理方式 |
|---|---|---|---|
| 父版本差异 | 是否误伤已通过区域 | 区域 SSIM、边缘位移 | 超阈值直接淘汰 |
| 合同事实差异 | SKU、颜色、身份是否漂移 | OCR、Lab 色差、特征距离 | 进入人工复核 |
| 补丁目标差异 | 缺陷是否真正被修好 | 结构检测、掩码内评分 | 低于门槛继续迭代 |
一个候选即使补丁目标差异变好,只要父版本差异超过锁定区阈值,也不能接受。这个规则会牺牲一部分"看起来更漂亮"的候选,却能显著减少商业返工,因为已验收事实不会被新一轮生成悄悄替换。
2.5 Seed 只能作为锚点,不能代替版本治理
Seed 有助于在相近条件下获得风格和构图的连续性,但它不是版本控制系统。模型服务的采样器、参考图解析、动作接口和默认参数都可能发生变化,即使 Seed 相同,也不能保证像素级一致。工程系统应把 Seed 当作父版本的一个参数快照,同时记录模型别名、适配器版本、动作类型、掩码坐标和提交时间。
当设计师要求"回到上一版",系统应恢复整个能力快照和资产对象,而不是只恢复一个 Seed。这样才能区分"重新生成一个相似候选"和"恢复当时已经验收的具体文件"。
三、结构缺陷的证据驱动修复:Vary Region 与 Latent Inpainting 的边界治理

3.1 先证明缺陷存在,再决定重绘范围
手部、包装、饰品和文字问题容易被主观感受放大。修复前应先保存缺陷证据:原图裁剪、标注框、缺陷类别、影响区域和 Brief 对照。证据不需要很复杂,但必须让第二位设计师能够独立判断"为什么要改"。
例如,手部问题可以记录为 hand.extra_digit,并附带指骨检测结果;标签问题记录为 text.ocr_mismatch,附带预期字符和识别字符;包装边缘问题记录为 silhouette.break,附带轮廓差异图。缺陷分类越具体,后续动作越容易选择,也越容易统计某个模型适配器的弱点。
3.2 Vary Region 的掩码应遵循"核心、过渡、锁定"
Vary Region 局部重绘不是简单地把问题涂黑。核心区覆盖缺陷本体;过渡区让新旧内容在颜色、纹理和光照上连续;锁定区则作为不可变参照。掩码太小,模型缺乏上下文;掩码太大,已验收区域会被重新采样。
设原图为 I,候选生成结果为 G,软掩码为 M,最终合成可以表达为:
text
I' = M ⊙ G + (1 - M) ⊙ I
真正的重绘发生在隐空间,像素掩码会经过编码器降采样。因此,羽化半径不应只按照屏幕上的像素感觉设置,而要考虑输出尺寸和隐空间步长。企业系统不需要假装能够控制所有隐变量,但必须记录掩码坐标、羽化参数、父版本和 Prompt Delta,让结果可追溯。
3.3 手部修复的证据链
一个可审计的手部修复链路如下:
- 保存原始裁剪图和手部缺陷标签。
- 生成手掌、手指、腕部和袖口的辅助标注。
- 将指尖错误划入核心区,将腕部和袖口划入过渡区。
- 锁定瓶身、桌面投影和主要高光。
- 只提交"握持关系"的 Prompt Delta。
- 对候选执行指节数量、遮挡关系和肤色连续性检查。
示例补丁可以写成:
text
defect: right_hand.extra_digit
delta: natural right-hand grip, five distinct fingers,
index finger behind cap rim, thumb below label
preserve: bottle silhouette, cap color, table shadow, upper-left light
reject: fused fingers, duplicated joints, melted cap, plastic skin
如果候选手部结构正确但瓶盖被拉伸,候选必须拒绝;如果结构正确但肤色边界有轻微色差,可以扩大过渡区或交给 Photoshop 做颜色匹配。不能因为"主要问题修好了"就放过锁定区的回归。
3.4 LOGO、条码和法律文本的处理边界
AI 可以帮助生成标签纸张、压纹和反射,但不能成为品牌字形、条码和法律文本的唯一来源。Vary Region 的更稳妥用法是把变形文字清理成与材质一致的空白区域,再用 Photoshop 或矢量工具叠加真实字形。
验收时要同时检查字符序列、基线、透视和色彩。OCR 通过不代表商业交付通过,因为 OCR 可能把近似字符识别为正确文本;还要进行人工放大检查,确认字距、笔画粗细和反射覆盖顺序。条码和序列号应从原始资产或数据库重新渲染,不能依赖 AI 超分恢复。
3.5 当 Vary Region 失败时的降级路线
Vary Region 连续失败时,问题可能不是 Prompt,而是缺陷区域需要更强的结构控制。可以按以下顺序降级:先缩小掩码并增加上下文;再固定参考图和父版本能力快照;随后切换到 SDXL ControlNet Inpaint,使用边缘、深度或姿态控制;最后在 Photoshop 中进行人工合成和色彩匹配。
降级不是"换一个工具继续抽卡",而是更换控制变量。每次切换都要记录原因,例如"模型无法保持包装透视"或"掩码边缘出现重复纹理"。这样,项目结束后才能知道哪类缺陷值得沉淀成模板或自动检测器。
四、画幅编排的坐标系统:Pan/Zoom Out 如何服务模板化发布

4.1 从裁切思维转向画布坐标
多端适配的核心不是把一张图裁成四种比例,而是把主体、文字和背景放入一个可计算坐标系。原图定义为父画布,主体包围盒、标题框、CTA 区域、禁裁区和出血区都使用归一化坐标保存。目标画幅生成后,再将这些坐标映射到新画布。
设原图尺寸为 (W,H),目标比例为 r_t。若保持高度不变,目标宽度为:
text
W_t = H × r_t
ΔW = max(0, W_t - W)
Pan 负责将 ΔW 分配到某一侧或两侧;Zoom Out 负责重新计算镜头距离,让主体在新画布中保持合同规定的占比。两者的输入不应是"向左一点"这种模糊指令,而应是边界、锚点和目标尺寸。
4.2 主体锚点与文字安全区
广告模板通常比原图更关心文字区域。规划动作时,先放置标题、价格、按钮和平台标识,再确定主体位置。主体锚点 (x_a,y_a) 经过平移后,需要满足不能进入禁裁区,同时不能与文案框产生碰撞:
text
x'_a = x_a + Δx
y'_a = y_a + Δy
subject_bbox ∩ text_bbox = ∅
subject_bbox ∩ crop_forbidden = ∅
对于游戏海报,角色脸部、武器尖端和装备徽标通常属于禁裁区;对于电商主图,瓶身轮廓、条码和容量信息属于禁裁区。设计系统应把这些区域写入模板,而不是靠每张图临时判断。
4.3 Zoom Out 的主体尺度控制
Zoom Out 的价值不是单纯得到更多背景,而是在扩大画布时重新建立主体与镜头的关系。若主体原本占画布高度的 72%,直接扩展上下边界会让主体显得过大;若先 Zoom Out 过度,主体又会缩成无法阅读的缩略图。因此动作规划需要给出目标占比范围,例如主体高度保持在 45%~55%。
在工程实现中,可将主体包围盒作为硬约束,将背景边界作为软约束。候选结果先检查主体尺寸和锚点,再检查新增区域的纹理和光照。如果主体比例正确但扩展背景出现接缝,应优先使用局部重绘修复边界,而不是再次改变镜头距离。
4.4 Pan 的方向选择与内容优先级
Pan 方向不是由空白面积决定,而是由内容优先级决定。若右侧已经有产品卖点,向左扩展可能比向右扩展更安全;若人物武器伸向左侧,向右扩展可以避免裁切尖端;若天空和地面纹理不同,竖版应把更多扩展预算给纹理更容易延续的一侧。
可以定义一个简单的方向评分:
text
score(direction) = safe_area
- λ1 * subject_shift
- λ2 * texture_risk
- λ3 * copy_collision
规划器计算左右、上下候选方案,设计师确认后再提交模型。这样做的好处是画幅适配从"试几个按钮"变成"先比较方案,再执行渲染"。
4.5 外绘连续性与多端一致性
外绘区域必须延续原图的噪声、光源、透视和材质。边界两侧可以分别取带状区域,比较颜色均值、梯度方向、边缘密度和频谱能量。若原背景具有明显水平纹理,新区域出现随机方向纹理,即使肉眼第一眼看不出,也会在大尺寸广告中暴露。
多端一致性还包括主体身份、品牌色和光照方向。4:5、1:1 和 9:16 不需要像素相同,但应该共享同一个合格父版本。不能从一个竖版失败分支继续扩展横版,否则一个画幅的缺陷会成为另一个画幅的隐形基线。
4.6 画幅模板的回归测试
每个模板都应配一组回归样本,覆盖主体偏左、主体居中、复杂背景、浅色背景和带人物手部的资产。输入同一份视觉合同,检查生成结果是否满足主体占比、文字安全区、禁裁区和输出尺寸。模板修改后,先在回归样本上运行,再允许进入实际活动。
模板回归的重点不是要求所有结果相同,而是确保不发生结构性退化。例如,标题安全区不能突然与主体重叠,竖版主体不能被压到顶部,Pan 后的品牌色不能漂移。将这些条件写成规则,能够显著降低多端发布时的人工排查成本。
五、超分与色彩输出的可重复构建:Upscale 2x/4x 的证据链

5.1 超分阶段也需要输入合同
放大前应明确哪些区域允许生成细节,哪些区域必须保持事实不变。皮肤纹理、布料纤维和背景颗粒可以允许模型补全;条码、商标、序列号、药品剂量和角色徽标则必须来自原始素材或人工图层。否则,Upscale 越成功,错误细节越容易被误认为真实。
生成式超分可以抽象为从低分辨率观测 y 估计高分辨率图 x:
text
y = D(x) + n
x_hat = argmin_x ||D(x)-y||² + λR(x)
其中 D 是降采样算子,n 是噪声,R(x) 是纹理先验。模型补足的是高概率细节,而不是对原始事实的物理恢复。因此,商业交付要把"视觉真实感"和"事实准确性"分开验收。
5.2 2x、4x 是构建目标,不是固定平台承诺
Midjourney V6/V6.1 的公开工作流更常见的是 Subtle 或 Creative 2x 级别的细化。本文中的 Upscale 4x 应理解为企业输出管线的目标倍率,可以由链式 2x、供应商动作、专用超分模型和 Photoshop 高质量重采样共同完成,不应假设所有平台都提供一个固定的 4x 按钮。
例如,原图为 1024×1024,目标输出为 2400×2400。直接一次放大可能把噪声和伪文字一并放大。更稳妥的构建链是:先完成结构验收;再进行保守的 2x 细化;然后使用专用超分补齐目标尺寸;最后由 Photoshop 处理色彩、文字和局部锐化。每个阶段都保留中间文件和参数快照。
5.3 局部锐度与画质一致性
商业批次中,最明显的问题往往不是单张图模糊,而是同一组图的锐度不一致。可以用局部拉普拉斯方差估计锐度,用边缘密度估计纹理复杂度,并与同批资产中位数比较。若一张图的玻璃反射过锐、另一张图的标签边缘发糊,就会产生"不是同一个品牌"的感觉。
画质一致性还要关注色彩和噪声。模型补出的新纹理可能比原图更干净,导致扩展区域像贴上去的;也可能出现局部噪声过重,压缩后形成脏块。输出前应统一锐化半径、降噪强度和压缩质量,同时保存原始母版,避免在网页压缩版本上继续编辑。
5.4 印刷级 DPI 与真实尺寸
DPI 是像素与物理尺寸的换算关系,不等于模型真的恢复了细节。假设印刷边长为 20 cm、目标 300 DPI,则像素需求约为:
text
pixels = 20 / 2.54 × 300 ≈ 2362
输出前必须在实际尺寸下观察细线、字形和产品边缘。对于户外喷绘,还要根据观看距离调整锐化策略;盲目追求更高像素会把模型幻觉变成更清晰的错误。RGB 母版、CMYK 印刷版和网页压缩版应该独立保存,并记录 ICC 配置、转换时间和处理软件版本。
5.5 Photoshop 的收口职责
Photoshop 结合工作流不是对 AI 结果的否定,而是把确定性的内容交给确定性的工具。文字、条码、法律文本、色彩校正、出血、图层命名和局部蒙版都应在 Photoshop 或矢量工具中完成。AI 超分负责纹理和像素,人工工具负责事实和版式。
当 AI 生成了看似合理但无法核实的细节时,应将其放在可替换图层,并在交付前明确哪些细节是生成推断。高价值产品可以保留"模型层、修复层、文字层、色彩层、发布层"五级结构,方便后续按照不同媒体重新导出。
六、企业级渲染中继:customId、能力快照与证据包的 REST/WebSocket 封装

6.1 中继层的职责不是简单转发
原生视觉接口通常是异步任务系统:提交后返回排队标识,结果通过轮询、回调或 WebSocket 到达。浏览器里的"局部修复"和"扩展画布"按钮,实际上需要携带父版本、掩码、目标尺寸、权限和预算。若直接让浏览器调用供应商接口,就会暴露密钥,也无法可靠处理重复提交、乱序回调和跨租户访问。
中继层应承担四项职责:把视觉合同编译为供应商请求;把供应商状态映射为内部状态;把结果和证据写入不可变存储;把质量门禁结果反馈给设计系统。它还要保存请求前后的字段集合,以便在模型或适配器升级后解释行为变化。
在企业级视觉资产渲染中继中,前端可以把 customId 解析为可视化动作,但必须先经过能力校验和证据关联。对于集成动作句柄解析、任务编排和高精渲染的资产处理节点,例如 https://178.nz/yinc,中继层可以把局部修复或画幅扩展请求转化为带有父版本、掩码坐标和目标倍率的任务,再提交到异步队列。该地址在这里仅表示架构中的适配节点,具体能力仍由当前接口契约和权限配置决定。
6.2 customId 是短期能力,不是可逆参数
customId 应当被当作不透明、可能过期、带权限边界的 capability handle。它不应被假设为可逆地包含 Prompt、Seed 或原图地址。中继层收到句柄后,应验证租户、资产父节点、动作白名单、能力版本和过期时间;句柄失效时返回 CAPABILITY_EXPIRED,重新从最近的合格版本申请动作能力。
推荐的内部任务结构如下:
json
{
"asset_id": "asset-42",
"parent_revision": 12,
"action": "VARY_REGION",
"capability_ref": "opaque-handle-fingerprint",
"mask": {"x": 812, "y": 430, "w": 190, "h": 260, "feather": 24},
"prompt_delta": "repair right hand grip; preserve bottle silhouette",
"contract_version": "visual-contract-3",
"idempotency_key": "tenant-a:asset-42:revision-12:patch-008"
}
日志只保留句柄指纹、动作类型、资产版本、状态和耗时,不保留完整句柄或未经脱敏的 Prompt。这样既可以做问题定位,也不会把供应商能力句柄变成长期可重放的秘密。
6.3 证据包的内容
每个候选资产都应生成一个证据包,至少包含:输入图片哈希、父版本、视觉合同版本、Prompt Delta、掩码预览、供应商能力快照、请求参数摘要、结果哈希、质量指标、人工评审记录和最终输出清单。
证据包不是为了增加文档工作,而是为了回答四个问题:这张图从哪里来;哪些地方被允许变化;为什么这个结果被接受;发布后能否重新定位问题。若缺少其中任何一项,几天后即使找到图片,也很难判断它是否来自正确的父版本。
6.4 REST 与 WebSocket 的一致性
REST 负责提交动作、获取快照和下载证据包,WebSocket 负责推送状态变化。每个事件必须包含资产标识、版本号、动作标识、事件序号和时间戳。客户端不能只相信最后一条消息,而要根据事件序号判断是否乱序或丢失。
Evidence Store Render Provider Task Queue Relay API Design UI Evidence Store Render Provider Task Queue Relay API Design UI #mermaid-svg-XcCRsGgeaHVzMM00{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-XcCRsGgeaHVzMM00 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-XcCRsGgeaHVzMM00 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-XcCRsGgeaHVzMM00 .error-icon{fill:#552222;}#mermaid-svg-XcCRsGgeaHVzMM00 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XcCRsGgeaHVzMM00 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-XcCRsGgeaHVzMM00 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XcCRsGgeaHVzMM00 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XcCRsGgeaHVzMM00 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-XcCRsGgeaHVzMM00 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XcCRsGgeaHVzMM00 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XcCRsGgeaHVzMM00 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XcCRsGgeaHVzMM00 .marker.cross{stroke:#333333;}#mermaid-svg-XcCRsGgeaHVzMM00 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XcCRsGgeaHVzMM00 p{margin:0;}#mermaid-svg-XcCRsGgeaHVzMM00 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-XcCRsGgeaHVzMM00 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-XcCRsGgeaHVzMM00 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-XcCRsGgeaHVzMM00 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-XcCRsGgeaHVzMM00 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-XcCRsGgeaHVzMM00 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-XcCRsGgeaHVzMM00 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-XcCRsGgeaHVzMM00 .sequenceNumber{fill:white;}#mermaid-svg-XcCRsGgeaHVzMM00 #sequencenumber{fill:#333;}#mermaid-svg-XcCRsGgeaHVzMM00 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-XcCRsGgeaHVzMM00 .messageText{fill:#333;stroke:none;}#mermaid-svg-XcCRsGgeaHVzMM00 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-XcCRsGgeaHVzMM00 .labelText,#mermaid-svg-XcCRsGgeaHVzMM00 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-XcCRsGgeaHVzMM00 .loopText,#mermaid-svg-XcCRsGgeaHVzMM00 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-XcCRsGgeaHVzMM00 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-XcCRsGgeaHVzMM00 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-XcCRsGgeaHVzMM00 .noteText,#mermaid-svg-XcCRsGgeaHVzMM00 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-XcCRsGgeaHVzMM00 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-XcCRsGgeaHVzMM00 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-XcCRsGgeaHVzMM00 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-XcCRsGgeaHVzMM00 .actorPopupMenu{position:absolute;}#mermaid-svg-XcCRsGgeaHVzMM00 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-XcCRsGgeaHVzMM00 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-XcCRsGgeaHVzMM00 .actor-man circle,#mermaid-svg-XcCRsGgeaHVzMM00 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-XcCRsGgeaHVzMM00 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} submit patch + parent revisionvalidate contract and capabilitypersist idempotent jobdispatch provider actionasync status / result callbacksave artifact and evidence bundleordered WebSocket event
若浏览器断线,重连后先通过 REST 拉取最新快照,再继续接收 WebSocket 事件。若结果已落库但推送失败,任务仍然保持成功;若结果未完成持久化,则不能向客户端发送可交付状态。
6.5 Action IR 与供应商适配器
为了避免在业务代码中散落 Midjourney 字段,前端动作应先编译为统一的 Action IR。IR 只描述业务意图和约束:op=pan、方向、目标像素、锁定区域、文字安全区和质量门槛。适配器再把它转换成具体供应商所需的按钮、组件、控制图或采样参数。
text
ActionIR
├─ VARY_REGION: mask + prompt_delta + lock_regions
├─ PAN: direction + extension_pixels + topology_constraints
├─ ZOOM: target_subject_ratio + camera_delta
├─ UPSCALE: target_pixels + detail_policy
└─ REROLL: parent_revision + new_seed_policy
对 Flux.1 Dev、SDXL ControlNet Inpaint 和 Photoshop Generative Fill,可以使用不同适配器执行同一个 IR。这样更换模型时,业务合同和质量门禁不需要重写,只需更新能力快照和参数映射。
6.6 失败分类、幂等与回放
中继层至少要区分能力过期、参数不兼容、供应商限流、任务超时、结果损坏和质量不合格。能力过期需要重新申请句柄;参数不兼容应在本地拒绝;限流错误可以退避;结果损坏需要重新下载或重新执行;质量不合格则创建新的差异补丁。把所有失败都标记为"重试"会导致无效重放和重复扣费。
任务写入时先保存幂等键,供应商回调按任务标识和事件版本去重。回调到达后先校验结果哈希、尺寸和父版本关系,再写入对象存储,最后发送 WebSocket 事件。系统还应提供沙箱回放,用冻结的请求模拟超时、乱序回调、重复通知和部分文件损坏,验证状态最终一致以及证据包完整。
七、商业发布流水线实战:从新品 Campaign 到游戏海报候选版

7.1 新品 Campaign 的视觉合同
假设项目是青柚气泡水新品 Campaign,需要 1:1 商品主图、4:5 信息流图和 9:16 手机开屏图。合同规定:瓶身轮廓、瓶盖颜色、品牌色、SKU、条码和产品名称不可改变;背景灰度、气泡数量和水珠分布可以变化;所有画幅必须为 sRGB,主图长边不低于 2400px,印刷版另行转换 CMYK。
初始 Prompt 只承担构图和光照:
text
commercial product photo of a grapefruit sparkling water bottle,
light gray studio table, upper-left softbox, clean copy space,
realistic condensation, centered product, restrained shadow,
no extra bottles, no warped packaging, no readable fake label text
从多个候选中选择瓶身结构最稳定的一张作为 revision=1,而不是选择背景最复杂的一张。系统随后计算锁定区哈希和合同快照,并把文字交由 Photoshop 矢量层处理。
7.2 通过差异补丁修复结构问题
质检发现右手食指与瓶盖粘连,标签副标题出现伪文字。团队提交两个相互独立的补丁:p-hand-01 只修改手部,p-label-01 只清理标签材质。两个补丁都从 revision=1 分叉,分别生成候选,不互相覆盖。
手部补丁使用 Vary Region,核心区覆盖指尖,过渡区覆盖腕部和袖口,锁定瓶身轮廓和桌面阴影。标签补丁将文字区域变成空白纸张,再由 Photoshop 写入真实字形。候选筛选同时检查手指结构、瓶身轮廓、品牌色和光照方向。只有所有合同字段通过,才合并为 revision=2。
7.3 为三种画幅生成候选发布版
1:1 主图直接进入细节增强;4:5 信息流图向上 Pan,为卖点文字释放空间;9:16 开屏图先 Zoom Out 保持瓶身占比,再向下扩展桌面和投影。每一个画幅都有独立的发布候选编号和证据包,但共享 revision=2 的主体事实。
画幅动作完成后,系统检查文字框碰撞、主体占比、禁裁区和边界连续性。若竖版扩展区域出现明显接缝,只对边界提交新的局部补丁,不回退到未修复的初图。
7.4 游戏海报的角色身份保护
游戏海报要求角色站在雨夜港口,横版用于官网头图,竖版用于手机宣传图。角色面部、发型、服装徽标和武器不能改变;港口灯带、雨幕和地面积水可以重建;标题和发布日期由 Photoshop 完成。
初图验收发现武器尖端被雾气吞掉,右肩护甲与披风边界模糊,横版标题空间不足。修复顺序是:先用 Vary Region 修武器和护甲,再用 Pan 扩展标题区,随后用 Zoom Out 和 Pan 生成竖版,最后执行目标倍率的 Upscale 4x 构建链。
武器掩码不能覆盖角色手臂和身体轮廓,Prompt Delta 只描述金属刃口、雨滴方向和冷色轮廓光。若超分后徽标出现伪纹理,则将徽标区域重新锁定,并从 Upscale 前版本生成新的输出候选。
7.5 发布候选与最终门禁
当所有画幅生成后,项目不会直接把文件放进发布目录,而是创建 Release Candidate。候选需要通过机器门禁和人工门禁:
| 门禁 | 检查内容 | 失败处理 |
|---|---|---|
| 合同门禁 | SKU、颜色、角色身份、锁定区 | 返回差异补丁阶段 |
| 结构门禁 | 手部、轮廓、透视、遮挡 | Vary Region 或人工修复 |
| 版式门禁 | 主体占比、文字安全区、禁裁区 | 重新规划 Pan/Zoom |
| 输出门禁 | 像素、DPI、色彩、格式、命名 | 重新构建输出 |
| 证据门禁 | 父版本、参数、哈希、评审记录 | 阻止发布 |
发布清单记录最终版本、动作摘要、验收人、时间戳和输出哈希。任何临时替换都必须生成新的候选,不能覆盖已归档版本。这样,Campaign 结束后仍然可以回答每张资产的来源、变化和验收依据。
八、标准化之后:从个人技巧到视觉资产 CI/CD

8.1 视觉资产也需要持续集成
当视觉合同、差异补丁和证据包稳定后,团队可以像维护软件一样维护资产流水线。每次修改模型适配器、默认 Prompt、画幅模板或超分策略,都先运行固定样本集。测试不仅检查生成结果,还检查锁定区像素差异、OCR、色差、主体占比、事件状态和证据完整性。
视觉 CI 的最小流程如下:
text
Contract Check
↓
Baseline Render
↓
Patch Regression
↓
Layout Regression
↓
Upscale and Output Check
↓
Evidence Bundle Check
↓
Release Candidate
如果某个模型升级后整体画质提高,但品牌色漂移或文字误伤率增加,流水线应该阻止发布,并指出具体失败门禁。团队不再凭一张"效果更好"的样片决定是否升级。
8.2 能力快照与版本化模型声明
Midjourney V6、V6.1 或其他供应商能力不应直接写成不可变事实。系统要记录模型别名、接口版本、动作能力、默认参数和适配器版本。对于 Upscale 4x,应记录它是链式 2x、供应商动作还是外部超分完成的,以免后续人员误以为某个平台永远存在同名按钮。
能力快照使回归测试更可靠:同一个视觉合同可以在不同适配器上运行,系统比较的是合同通过率、误伤率、延迟和成本,而不是只比较某一次图片。模型可以更换,验收协议不能失去连续性。
8.3 资产谱系与权限治理
商业资产需要记录父子关系、项目、租户、版权来源和发布状态。设计师可以查看自己项目的候选节点,品牌负责人可以审核锁定字段,工程人员可以查看任务状态和错误分类,但不应默认拥有原始素材的全部下载权限。对象存储、缓存和预览地址都要按租户和资产版本隔离。
对于包含人物肖像、未发布产品或客户资料的资产,日志应只保留脱敏指纹和元数据,避免把完整 Prompt、原图 URL 或个人信息写入普通日志。证据包可以加密归档,按项目生命周期设置访问和保留策略。
8.4 未来的商业 AIGC 交付形态
未来的视觉生产不会只依赖一个模型,而会由多个专长适配器组成:一个模型负责构图探索,一个模型负责局部结构修复,一个模型负责深度或姿态控制,Photoshop 负责事实层和版式层,发布系统负责输出和审计。真正的竞争力不是某一次生成的惊艳程度,而是团队能否在复杂约束下稳定地产出大量一致资产。

视觉合同提供需求边界,差异补丁控制变化范围,证据包保证过程可解释,Release Candidate 保证最终发布可回滚。Vary Region、Zoom Out、Pan、Reroll 和 Upscale 2x/4x 因此不再是孤立按钮,而是视觉资产 CI/CD 中可以被测试、被计量、被替换的构建步骤。
当系统能够回答"哪些事实不可变""这次补丁改了哪里""为什么这个候选被接受""如果供应商回调乱序如何恢复""最终文件是否满足印刷与投放规范",AIGC 就从个人经验进入了企业可治理的生产阶段。创意依然由设计师决定,但交付不再依赖运气,而是依赖一套可重复、可审计、可持续改进的工程协议。