← 回到书架纸上留痕 · 文档阅读

测试手册

多模态模型破甲与回归测试 Playbook

将多模态模型调试中的提示词定位、结构化补丁、确定性兜底与回归测试沉淀成可迁移的工程方法。

阅读
9 min
来源
pdf
分类
模型工程
页数
5
原文件
查看 / 下载 PDF
  • 多模态
  • 回归测试
  • Prompt
  • 工程

从这里开始,慢慢读。

这是从公开 PDF 提取并重新排版的阅读版本;复杂版式、图片与原始分页仍可通过原文件查看。

1

Silvite Translate Lab · Model Prompt Armor & Regression Playbook

Page 1

多模态模型“破甲”与回归测试

Model Prompt Armor & Regression Playbook

Silvite Translate Lab · mimo-v2.5 漫画模式排序修复实战沉淀

目标

把这次被实测验证有效的提示词技术与测试方法论,沉淀成可迁移的模型接入模板。

核心结论

单靠自然语言规则无法稳定收敛;需要组合“提示词定位 + 结构化补丁 + 代码确定性兜底 + 回归测

试”。

来源:docs/model-prompt-armor-and-regression-playbook.md

2

Silvite Translate Lab · Model Prompt Armor & Regression Playbook

Page 2

速览:这份Playbook 解决什么

这份文档来自 Silvite Translate Lab 的真实多模态调试过程。目标不是追求“神 Prompt”,而是建立一套可复用

的工程方法:先识别模型的稳定失败模式,再把语义依赖结构化,由代码执行确定性约束,并用机器判定的回归

测试防止过拟合与误判。

问题本质

模型空间先验、规则服从与输出格式都可能成为故障源,不能把所有失败都归因于“模

型没理解”。

最高收益

把规则写进对应 schema 字段描述;用 id + reply_to/depends_on 把语义依赖显式

化。

代码职责 验证结构、执行依赖约束、确定性渲染与 fallback;代码不猜语义。

测试原则 机器判定 + 原始响应留痕 + 对照组 + N 次批次统计;单次 PASS 不算收敛。

“ ”一、问题背景:为什么要破甲

任务:让多模态模型输出“真实阅读顺序”的结构化漫画 segments(panel / order / speaker / type),而不是

按 OCR 空间顺序平铺。

  • 空间先验极强:同侧多个气泡按空间连读,语义关系被忽略;实测约 50% 概率把“回应”排到“质疑”之前。
  • 抽象规则执行力差:写了“必须检查问答关系”,模型确认理解,但生成时可能不执行。
  • 规则过度服从:硬规则过强会在别的样本上过矫正,例如把质疑句提前到一切之前。
  • 自洽的错误:错误输出内部也能自圆其说,事后仅靠“再强调一次”很难解决。

结论:单靠自然语言规则无法稳定收敛(实测约 50% 正确率天花板),必须组合提示词定位、结构化补丁和代

码确定性兜底。

  • 破甲技术清单(按实测效果排序)
  • 1 规则写进 schema 字段描述 [5/5]

把硬规则嵌入 JSON schema 对应字段的说明,而不是单独成段。模型在生成该字段的瞬间会读到它。

"order": "全局真实阅读顺序,从 1 开始递增。硬规则:回应永远排在它所回应的句子之后,即使回应的气泡在画面上

更靠右或更靠下;质疑句若本身是对前句(解释/致歉)的回应,也仍须排在该句之后"

实测对比:同样的话写在正文 bullet 里 adherence 约 50%;写进字段 description 后明显提升。

模板:每条硬规则都问一句“这条规则在生成哪个字段时最该被想起?”,把规则塞进那个字段的 description。

  • 2 结构化补丁:模型声明依赖,代码强制执行 [5/5]

把抽象语义变成显式结构:给每个元素分配 id,用 reply_to 声明“我在回应谁”,代码只执行声明。

若 A.reply_to = B.id,则 order(A) > order(B);违反时交换两者 order。

3

Silvite Translate Lab · Model Prompt Armor & Regression Playbook

Page 3

这是把“模型猜语义”变成“模型声明语义 + 代码执行声明”。声明正确时可以得到确定性执行;声明方向错仍

是残留缺陷。

模板:任何“X 必须在 Y 之后”的需求,优先设计成 id + depends_on/reply_to 字段,再由代码做拓扑修正。

  • 3 可证伪的不变量检查 [4/5]

“请检查对话连贯性”太模糊;“如果出现可检测的异常形态,则执行确定动作”更有效。

悬空检查:若排序结果以未获回应的问句/质疑句收尾,几乎总是排错了;把在语义上回应它的陈述句移到质疑之后。

模板:领域常识尽量写成“异常形态 + 确定动作”。异常必须能从输出直接判定,动作必须具体。

  • 4 表面线索启发式 [4/5]

把需要语用推理的判断降维成模型可直接执行的表面模式,例如词形、标点、关键词复现。

词语回声:回应句常复现被回应句的关键词,例如“为什么”->“因为”,“真的吗?”->“是真的”。当问句与含其关

键词的陈述句并存时,问句应在前。

  • 5 WRONG -> RIGHT 对比例 [4/5]

给出一个与真实失败拓扑相似、但文本不同的小例子,同时明确标注错误链与正确链。

错误:对不起 -> 今天是真的 -> 真的吗?

正确:对不起 -> 真的吗? -> 今天是真的

  • 6 证据优先级链 [3/5]

模型会抓错信号,需要显式给出权重顺序,并把容易误导的信号压到最低。

回应语义关系 > 问答关系 > 质疑/辩解关系 > 气泡尾巴归属 > 画格视觉流 > 阅读方向 > speaker 是否交替(最低权

重参考)

  • 7 软信号框定,硬规则只留给可证伪项 [3/5]

有反例的信号不能写成硬排序规则,只能作为“触发复核”的软信号。

同一说话人连续多个气泡时,不自动改序;只触发连贯性复核。若两句本身确实连续,必须保留同 speaker 连续。

  • 8 已知残留缺陷
  • 声明方向错:模型偶尔把依赖方向写反;代码无法在不猜语义的前提下纠正。
  • 互为 reply_to:可能出现 A.reply_to=B 且 B.reply_to=A。代码侧应对无序对只执行一次,并优先执行“被违

反”的那条约束。

  • 上游波动:偶发空响应(约 1/10,重试即可);偶发把整个 JSON 双重编码塞进 translation 字段,需要代码

解包防御。

4

Silvite Translate Lab · Model Prompt Armor & Regression Playbook

Page 4

  • 已验证无效/ 反效果的做法

做法 结果

长篇抽象规则堆 system prompt ~50% 天花板;继续堆更多条也不涨

降低 temperature(0.3 -> 0.1)+ 精简指令 更差:出现过矫正,质疑被提前到一切之前

“两人轮流说话”硬规则 真实漫画存在合法连续同角色;且实测不稳定

事后重复强调同一规则 无效;错误输出内部可自洽

复杂 responsive class 复用同一套 DOM 前端侧同构教训:可读性与布局稳定性下降

  • 回归测试模板
  • 1 机器判定,不靠人眼

写 verdict 脚本:断言相对顺序、断言不变量、断言格式,并输出一行 JSON PASS/FAIL。人眼查看 CJK 日志容易

误判,机器判定才适合稳定回归。

{"verdict":"PASS","orders":{"a":3,"b":4,"c":5,"d":6},"envInDialogue":false,"labels":true}

  • 2 对照组防过拟合(必须)

对照 目的

同角色连续两句确实合理的样本 防止修复把合法连续强行重排

最简问答样本 防止基础能力被新规则破坏

与主样本同拓扑但不同文本 验证修复是模式级的,不是样本级的

合成样本可行:SVG 画气泡 / 人物 / 尾巴 -> sharp 转 PNG。画完必须先人眼检查渲染,再送测。

  • 3 稳定度用批次说话

单次 PASS 可能只是运气。每轮改动后同输入运行 N>=3-4 次并报告正确率;正确率低于 3/4 视为未收敛,继续迭

代或降级为“已知不稳定”。

  • 4 原始响应留痕

verdict 脚本同时把 raw response 追加写入 jsonl。失败分类需要依赖原始日志;本次关键发现(互为 reply_to、

双重编码、方向反写)都来自原始响应,而不是最终 UI。

  • 5 失败模式分类表

失败模式 现象 归属

空间翻转 同侧气泡连读,回应排在质疑前 模型默认行为

过矫正 质疑被提到一切之前 规则过强 / temperature

方向反写 reply_to 指错对象 模型声明错误,代码不可救

互为 reply_to A<->B 互相声明 代码需配对去重 + 违反者优先

空响应 上游偶发 重试

5

Silvite Translate Lab · Model Prompt Armor & Regression Playbook

Page 5

双重编码 JSON 塞进 translation 字符串 代码解包

order 缺失 / 为 0 环境文字 order=0 代码回退到数组原序

  • 6 职责边界:最终收口

模型:看图、分结构、判语义、声明依赖(id/reply_to)、给初版 order。

代码:验证结构、执行声明约束、确定性渲染、fallback。

原则:代码不猜语义,模型不负责最终排版稳定性。

  • 迁移到其他模型/ 任务的检查单
  • 需求里所有“必须 X 在 Y 前” -> 能否改成 id + 依赖字段 + 代码拓扑执行?
  • 每条硬规则 -> 有没有反例?有反例的降级为软信号。
  • 每条硬规则 -> 它在生成哪个字段时最该被想起?塞进那个字段的 schema description。
  • 领域语感点 -> 能否降维成表面模式(词形 / 标点 / 复现)?
  • 写一个 WRONG -> RIGHT 对比例,拓扑贴近真实失败案例。
  • 列证据优先级链,显式压制最误导的信号。
  • 写至少 3 个对照样本(含一个“修复不能破坏”的反例)。
  • verdict 脚本 + raw 留痕 + N 次批次,报正确率,不报单次。
  • 代码兜底链:结构执行 -> fallback 到模型自由输出 -> 错误态;任何结构失败都不能导致空结果。

附:建议的模型接入分层

以下分层是对本文方法的结构化呈现,用于迁移时快速定位“应该改哪一层”。内容均来自本文职责边界与回归方法。

层 职责

Core / Mode Prompt 描述任务目标与风格,不承担模型特定怪癖

Provider-specific Rules 只放该模型已验证的行为修正,避免把旧模型病历迁移到新

模型

Schema Contract 在字段生成点放硬规则;优先显式依赖字段

Output Normalizer / Parser 处理空响应、双重编码、格式漂移等协议层异常

Deterministic Code 执行依赖约束、排序、渲染与 fallback

Regression Harness 机器 verdict、raw 留痕、控制组、批次稳定度

一句话收口:先把模型的“稳定失败模式”变成可观察、可证伪的结构,再决定由 Prompt、Schema、

Parser 还是代码接管。