逐页 QA 硬约束:让校验不可跳过,质量才有保障
校验可被跳过时,缺陷就会逃逸
在调优一个多 agent PPT 生成流水线时,我遇到一个特别典型的缺陷。
跑 bench 用例 bench / 2603,最终 PPTX 的第 10 页出现元素重叠。回头查发现:这一页在生成时跳过了 QA 校验,没有产出 QA 产物。校验没拦,缺陷就一路流到了最终 PPTX。
问题不是」校验规则写错了」,而是」校验根本没跑」。本质是:校验是可选项时,它就一定会被跳过。只要存在跳过的可能,压力一大、用例一多,总会有页漏掉。
这跟」测试可跳过」是同一个道理:一个测试如果可以不跑,它在 CI 里就等于不存在。要让校验真正保障质量,它必须是硬约束,不是可选项。
逐页 QA 硬约束闭环
解法是把校验做成逐页闭环,且 QA 产物是硬约束:
flowchart TD
A[生成单页HTML] --> B[QA校验]
B -->|通过| C[下一页]
B -->|失败| D[定位问题]
D --> E[修复HTML]
E --> B
C --> A三个要点:
- 每一页都要跑 QA,产出 QA 产物,没有例外。没有 QA 产物的页,就是缺陷逃逸点。
- QA 是硬约束,不是参考项。参考项给 agent 做上下文建议,校验项是产物必须满足的条件。这两类必须分清,混在一起会让 agent 无所适从。
- 失败必须回修再校验,通过才进下一页。闭环不能断在」失败」这一步。
为什么是逐页,而不是全部生成完再统一校验?因为逐页闭环能把缺陷限制在单页范围内,定位快、回修成本低。全部生成完再校验,缺陷之间的相互影响会让定位变得困难。
从两个真实案例看闭环怎么运作
闭环跑了几个真实用例,这两个最能说明问题。
案例一:<p> 元素不能有 border。
Slide 4 QA 失败,报错:<p> 元素不能有 border,需要把 p.insight 改为 div.insight。
修复思路:
- 把 insight 外层从
<p>换成<div>,border 放在<div>上。 - insight 文本仍用
<p>包裹(<p>不带 border,合规)。 - 同步更新 global.css 里的选择器。
改完 QA 通过,继续下一页。
案例二:文本框距底部边缘太近。
Slide 10 QA 失败,报错:文本框距底部边缘 0.45」,小于阈值 0.5」。
修复:调整布局,减少间距让内容上移,确保底部留出足够空间。改完 QA 通过。
这两个案例的共同点:QA 报的是 具体、可定位 的问题(哪个元素、哪个尺寸),不是」这页有问题」。校验规则越具体,agent 回修越快。模糊的校验(」布局不好看」)没法自动化;具体的校验(」<p> 不能有 border」」底部留白 < 0.5」」)能直接 grep、能直接修。
这周还从这些失败里提炼出一个更前置的需求:HTML 书写规范要前置。与其等 QA 失败再回来改标签,不如在 designer 生成 HTML 时就约束允许 / 禁止的标签和属性。校验是兜底,规范是源头,两头都要抓。
本周其他工程产出
除了 QA 硬约束,本周还做了这些,各点到为止:
- 一体机部署:服务器代理 + 连网后跑通 ppt skill,完成答辩。工程落地最后一公里。
- 渲染层问题清单:截断(卡片不校验最终长度)、覆盖(纯色覆盖字样)、字体(渲染失败)、公式溢出(文本框未留余量)。
- reader 降级:图片理解直接截断,不耗时长爬。
- diff 纯净审计:每次 diff 纯净 → 局部纯净审计 → 全局纯净,不事后补救。
- 并行子 agent:快速读上下文 + 任务隔离防幻觉,不只是快,更是隔离。
- 允许 agent 犯错:犯错时即时给提示纠正,比追求一次做对更现实,关键是反馈闭环要快。
参考资料
- Fail Fast — Martin Fowler:尽早暴露问题,比延后处理成本低得多。逐页 QA 就是 fail fast 在生成流水线上的落地。
- ShiftLeft — Martin Fowler:把质量检查左移到开发早期,对应」HTML 书写规范前置」的思路。
- Google Testing Blog — Test Sizes:把测试按范围分级,对应」参考项与校验项分类」的思路。