SenseNova-Vision 出的图和描述对不上 / 该改提示还是改推理参数?

文章导读
SenseNova-Vision 出的图和描述对不上时,通常不要一上来就同时改提示词和采样参数,那样两边的效果会互相盖住。比较稳的顺序是:先把除提示词以外的所有变量钉死,再把提示拆成主体、风格、约束三类成分,每轮只动一项,把产物落到同一个目录里,最后把生成的图重新送回理解链路做一次回读比对。验证方式是看同一 seed 下改动一项后的输出差异是否可复现;边界是当等价措辞和不同 seed 都无法改变结
📋 目录
  1. Ⅰ 先固定除提示词以外的所有变量
  2. Ⅱ 把提示拆成主体、风格、约束三类成分
  3. Ⅲ 做两轮生成并把产物归到同一目录
  4. Ⅳ 在理解链路上回问一遍生成结果
  5. Ⅴ 判断这是提示问题还是能力边界
A A

SenseNova-Vision 出的图和描述对不上时,通常不要一上来就同时改提示词和采样参数,那样两边的效果会互相盖住。比较稳的顺序是:先把除提示词以外的所有变量钉死,再把提示拆成主体、风格、约束三类成分,每轮只动一项,把产物落到同一个目录里,最后把生成的图重新送回理解链路做一次回读比对。验证方式是看同一 seed 下改动一项后的输出差异是否可复现;边界是当等价措辞和不同 seed 都无法改变结果时,问题很可能不在提示层。

图和描述对不上,先分清是提示写法、输入条件还是采样参数在起作用。做法是固定随机种子、尺寸、步数、采样器与引导强度,把提示按主体、风格、约束拆开做单变量对比,产物和参数记录一起归档,再用理解链路回读生成图做人工比对。适用场景是同一段描述多次生成结果差别大。若换过几种等价措辞、换过 seed 仍复现同类错误,或回读描述与图本身一致,就应停手,这多半是模型当前的能力边界。

先固定除提示词以外的所有变量

这一层的目的很单纯:排除参数漂移造成的假象。很多时候“图不对题”并不是提示的问题,而是这次跑了 30 步、上次跑了 50 步,或者宽高比变了、引导强度被默认值带走了。下面这些项建议显式写进配置,而不是依赖接口默认值:随机种子、输出宽高或比例、采样步数、采样器、引导强度(有的接口叫 cfg 或 scale)、负向提示、批量大小、模型或权重版本、输入图的前处理方式(缩放、裁剪)。

固定方式是把它们整体序列化成一个配置文件,和产物放在同一目录,方便事后反推。下面是通用骨架,字段名按你实际用的接口替换即可:

# gen_config.json —— 除 prompt 外,本轮全部视为固定项
{
  "model": "<vision-model-id>",
  "seed": 123456,
  "width": 1024,
  "height": 1024,
  "steps": 30,
  "sampler": "<sampler-name>",
  "guidance": 4.0,
  "negative_prompt": "",
  "batch": 1,
  "output_dir": "runs/run01"
}

需要单独说明的是 seed:如果你怀疑“同一段描述多次结果差别大”本身来自随机性,就把 seed 也当成一个待测变量单独实验,而不是在对比提示措辞时顺手换掉它。

把提示拆成主体、风格、约束三类成分

提示词不改则已,改就要能对应到一种成分,否则改完之后说不清是哪句话起了作用。可以先把提示切成三类:主体(画什么、数量、动作、位置关系)、风格(材质、光线、镜头、画风)、约束(不要出现什么、构图限制、画面内文字)。基线记为 p0,然后每次只加一类:

  • p1 = p0 + 主体补充,例如把“一只猫”改成“两只猫并排”,观察对象数量和相对位置是否变化;
  • p2 = p0 + 风格词,例如加入“柔和侧光、浅景深”,观察色调、材质和景深是否变化;
  • p3 = p0 + 负向约束,例如“不要出现其他动物”,观察画面里是否仍然混入多余对象。

观察的重点是“哪一部分变了”:主体类改动通常影响对象数量与位置关系,风格类改动影响光线、质感与构图氛围,约束类改动影响画面中是否出现被排除的元素。如果改了主体词而输出只有色调在变,说明提示中该词没有被有效承载,这时再考虑是不是参数或理解环节的问题。

做两轮生成并把产物归到同一目录

对比要有可查的实物,不能凭记忆。建议文件名能反推当次参数,格式类似:{prompt_tag}_seed{seed}_{宽}x{高}_st{步数}_g{引导强度}_{序号}.png。同一轮实验全部写进一个目录,并附加一份 manifest,一行对应一次生成。

# batch_gen.py —— 通用骨架,gen_once 按你的实际 SDK 或 HTTP 接口替换
import json, hashlib, pathlib

RUN = pathlib.Path("runs/run01"); RUN.mkdir(parents=True, exist_ok=True)
BASE = json.load(open("gen_config.json", encoding="utf-8"))

prompts = {
    "p0": "一只橘猫坐在木桌上",
    "p1_subject": "两只橘猫并排坐在木桌上",
    "p2_style": "一只橘猫坐在木桌上,柔和侧光,浅景深",
    "p3_negative": "一只橘猫坐在木桌上,不要出现其他动物",
}

manifest = open(RUN / "manifest.jsonl", "a", encoding="utf-8")
for tag, text in prompts.items():
    cfg = dict(BASE); cfg["prompt"] = text
    img = gen_once(**cfg)                      # 返回图片 bytes
    name = f"{tag}_seed{cfg['seed']}_{cfg['width']}x{cfg['height']}_st{cfg['steps']}_g{cfg['guidance']}_01.png"
    (RUN / name).write_bytes(img)
    manifest.write(json.dumps({
        "file": name, "tag": tag,
        "prompt_sha1": hashlib.sha1(text.encode()).hexdigest()[:10],
        "prompt": text,
        **{k: cfg[k] for k in ("seed", "width", "height", "steps", "sampler", "guidance")}
    }, ensure_ascii=False) + "\n")

跑完第一轮后,如果你确实要比较随机性,再固定提示、换一组 seed 跑第二轮,产物放进 runs/run02。两轮的目录名不同,但文件名规则一致,看文件名就能还原当次参数。

SenseNova-Vision 出的图和描述对不上 / 该改提示还是改推理参数?

在理解链路上回问一遍生成结果

这一步是把“生成”和“理解”接成闭环:把生成的图重新送进理解链路,让它只描述看到的画面,不要补充推测,并要求结构化输出。回读阶段建议把温度调到接近 0,降低描述本身的抖动。

# 回读:按实际 SDK 或 HTTP 字段替换
resp = vision_chat(
    image="runs/run01/p0_seed123456_1024x1024_st30_g4.0_01.png",
    prompt=("只描述图中实际可见的内容,不要推测。按字段输出 JSON:"
            '{"subject":"","count":0,"position":"","color":"","style":"","forbidden_present":[]}'),
    temperature=0
)
print(resp)

把回读结果和原提示并排放进一张对照表,人工逐行比对。字段可以这样定:

字段填什么
prompt_tagp0 / p1_subject / p2_style / p3_negative
提示成分主体 / 风格 / 约束
期望值本次改动后应该出现的变化
回读描述理解链路输出的 JSON 字段
是否一致一致 / 缺失 / 多余 / 位置错 / 风格偏
差异归类措辞问题 / 输入条件问题 / 采样参数问题 / 疑似能力边界

如果回读描述和你的肉眼判断基本一致,说明理解环节是可信的,差异出在生成侧;如果回读本身就和图明显不符,那要先怀疑回读的提示或图像预处理,别急着回头改生成提示。

判断这是提示问题还是能力边界

下面这些信号通常指向提示问题,值得继续改措辞:同一 seed 下换一种等价说法,输出稳定地朝期望方向移动;把约束改写成明确的否定句后,多余元素减少;主体缺失只在特定词序下出现,调整语序即可恢复;提示过长时压缩到关键成分反而更稳。

下面这些信号则更可能属于模型当前的能力边界,建议停手:换过三到五种语义等价的措辞,结果几乎不动;改步数、换 seed 后仍复现同一类结构性错误(比如固定的数量错、固定的位置关系错);回读描述与生成图一致,说明模型“看到”的就是这个样子,不是描述环节出了偏差;同一提示在不同尺寸下出现同一种空间关系错误。这时候继续叠词、堆负向提示,通常只是把采样推向另一种不稳定,而不是解决问题,更实际的做法是调整输入条件(换参考图、拆成多步生成)或接受当前边界。

整条链路走完后,你手里应该有一份带参数的 manifest、一组同目录的产物、一张回读对照表。只要这三样在,下次再出图和描述对不上的情况,就能直接说清是哪一层的问题,而不是在提示和参数之间来回猜。