三天 93 次提交:广告素材自审平台首期上线总结
开发周期 2026-08-08 → 2026-08-10(3 天,93 次提交) 当前状态 已上线,可投入使用
系统本身干什么,写在功能介绍那篇里。这篇是首期交付的总结:做了什么、哪些取舍是有数据支撑的、哪些坑值得记住。
核心要求,一切取舍按这个排:第一,检查准确度。第二,速度。
一、最关键的技术选择:逐帧,不是整片直传
这是首期唯一一个我愿意花五倍成本去换的决定。实测数据:
| 做法 | 报出问题数 |
|---|---|
| 逐帧,每批 8 张 | 11 条 |
| 逐帧,每批 24 张 | 7 条(是 11 条的子集,纯漏报) |
| 整片直传 | 2 条(也是子集) |
注意后两行都是子集——不是换了个角度看问题,是纯粹的漏报。
直传的病根是分辨率:整片会被压到 720p,小字(cr 标注、收益数额、AI 标识)到模型眼里就糊了。帧是原分辨率送的,看得清。
每批 8 张也不是随便定的——开到 24 张、46 张,token 只省两成,报出从 11 条掉到 7 条、5 条。
贵五倍、慢一点,但准确度是直传的五倍,所以选逐帧。 一条 79 秒的成片:103 帧、分 13 批送模型,全流程约 70 秒。
二、三个审核入口
| 入口 | 收什么 | 一次最多 | 检查什么 |
|---|---|---|---|
| 审脚本 | TXT / MD / DOCX,也可直接粘贴 | 10 个 | 错别字、话术口径、红线 |
| 审素材 | MP4 / MOV / MKV | 10 个 | 画面红线、录屏、穿帮、画质 |
| 审成片 | MP4 / MOV / MKV | 1 个 | 字幕、音频、规格、红线,全项复核 |
一次传多个文件 = 建多条独立记录,各自一份报告、一套判定,互不牵连。
规则包
74 条规则,两个轴分四类:
红线(命中即打回) 惯例(反复被挑但不致命)
通用 GR1–GR5 GA1–GA10
产品专属 PR* PA*
外加三份环节文档(编导 / 制作 / 剪辑各一份,不分产品)。
每条规则是六字段块:级别 / 环节 / 看哪 / 判定 / 不报 / 来源。其中「环节」决定这条规则在哪个入口生效,「不报」用来堵模型的过度推断。
送给模型的规则包 = 环节文档 + 通用红线 + 通用惯例 + 产品规则,按当前环节裁剪。某个产品审成片是 5944 字。
结果怎么给
打开一条记录,最上面一句话直接说该干嘛:
- 没查出问题,可以提交人工审核
- 机器报了 N 处,还有 M 处没判
- 要改 N 处:12s、35s、48s ← 位置直接列出来,拿着就能改
- 这次没审完:⋯(排除原因后重审会从断掉那步接着跑)
每条问题三个按钮:要改 / 忽略 / 误报。后两个结果一样(都不用改),但报给系统的是完全不同的信号——误报会进周报用来改规则表述,忽略不会。
规则会自己进化
这是首期最花心思的一条链路:
人工审核驳回
→ 员工在自己的记录上点「人工审核未通过」,抄进驳回意见(可带秒数)
→ Claude Fable 5 读意见 + 现有整包规则,判断:
现有规则覆盖了吗?该在哪几个环节拦?算红线还是惯例?规则怎么写?
→ 落成草案,不自动入库
→ 组长以上确认
→ 写进产品规则文件,带上「环节:编导✗ 制作✗ 剪辑✓」
→ 下一条片子机审就认,不用改代码、不用重启
为什么要人确认:规则包是这套系统的命根子,机器写错一条,以后每一条片子都跟着错。
为什么用 Fable:跑过五个模型的选型测试,两套题(第二套故意把答案反过来,用来识别一味顺着说话的模型),Fable 最稳。详见那篇选型测试。
三、测试只覆盖一类东西:坏了不会被发现的
157 个自动化测试,Mac 和 Windows 都全绿。 纯标准库,跑一次 5 秒。
界面文案、按钮位置、上传能不能成——这些不测,坏了一眼就看见。
这个标准是有代价才定下来的。测试真正抓出来的问题,全都是没有任何外在症状的:
| 测试抓出来的 | 如果没测出来会怎样 |
|---|---|
| 人工判定被 worker 的旧快照盖掉 | 200 次丢 188 次,界面还显示保存成功 |
| 时长上限从来没生效过 | 某产品配的 60 秒上限一次都没跑过,表面正常 |
check_spec 一个字段缺失就炸掉整条审核 |
人只看到「出错了」,不知道为什么 |
| 没分组的组负责人能看到所有人的记录 | 越权,页面照样出数,看不出异常 |
| 服务重启会让已完成步骤的结论重复一遍 | 报告长得完全正常,同一条列两次 |
| 并发抢同一个临时文件 | 判定静默丢失,实测 317 次失败 |
| multipart 收半截文件当成功 | 半截视频跑完全流程,结论看着正常 |
每一条的右列都是同一个句式:看起来是对的。 这就是该测的东西的定义。
四、经过两轮外部代码审查
外审报了 4 个 P1 + 4 个 P2,第二轮又报 4 条,全部修完。
其中一条是功能一直调不通的真凶:建产品上传缺 raw_body 标记,几百 MB 的请求体被当 JSON 读进内存。
有一条外审意见我没接受:「文件内容含边界串被截断」。boundary 全局唯一是 multipart 协议约定,由发送方保证;解析侧要防就得先读完整个请求体,几百 MB 视频全进内存,流式就没意义了。代码注释里写了原因,测试也钉住了这个行为。
修完外审那八条之后,我又自己把整套代码过了一遍,抓出两个外审没提的(就是上表里的 check_spec 和时长上限)。
五、上线后第一轮改动:堵住两类已确诊的误报
交付当天就做了一轮,重点全在准确度。
两条误报都是真实出现过的,共同点是模型先自己补出一个前提,再据此判违规:
| 误报 | 模型干了什么 | 事实 |
|---|---|---|
PR4 字幕写成联播 |
从逐字稿读到「联播」,安到画面上 | 那一帧画面上一个字幕都没有 |
PA3 cr 标错来源 |
把 58 秒和 62 秒认成「同一段录屏」 | 两个账号的两条视频,各标各的 cr,本来就没错 |
规则文档里的「不报」字段挡不住
实测同一次审核里,模型一边写着「逐字稿是语音转写、同音字不可信,不作为错别字依据」,一边照报不误。
要它交引文也挡不住
改提示词要求「报画面文字有误时必须抄出画面原文」之后,只给它 0~6 秒的帧,它照样报 61 秒的字幕错别字——quote 里填的那四个字是从逐字稿抄的。
真正管用的是代码约束
- 报出的秒数必须落在这一批送去的帧上(差 1.5 秒以上直接丢弃)。这一批给了哪些帧,代码是知道的,模型绕不过去。
- 说画面文字有误要交画面原文、跨时间点比对要说明凭什么是同一段——当第二道。
这条经验可以推广:提示词约束的是模型的意愿,代码约束的是模型的能力。 涉及事实边界的地方,只有后者可靠。
顺带修掉一个会让上面全白干的坑:缓存指纹只按规则内容算,改了提示词但规则没动会全量命中旧缓存,新规矩等于没上,界面上还显示审过了。指纹现在掺上提示词。
六、接口参数实测
原来只核过 thinking。同一批帧、同一份规则、同一段提示词:
| 参数 | 实测 | 现在 |
|---|---|---|
temperature |
0.1 连跑三遍出现两种结论;0 连跑三遍一致,但换个时间再跑又变一种 | 0 |
top_p |
传 1 和不传一样 | 不传 |
service_tier |
回显一直 default |
不传 |
max_tokens |
出参 126~161,finish_reason 一直 stop |
4096 够用 |
| 前缀缓存 | 第一批 0,之后稳定命中 15317 tokens | 自动生效 |
别对外承诺「同一条片子重跑结论必然一样」——模型侧本身有抖动,参数只能压小,压不掉。
上下文缓存也查过了,结论是代码不用改:隐式前缀缓存自动生效,第二条片子起每批稳定命中 25.7%。上限就是这么多,因为 70% 的 token 是帧图,永远不可缓存。「先热身再并发」实测无效,别再试。
七、三天里踩过、值得记住的坑
跨平台
os.replace在 Windows 上不是无条件原子的——Mac 0 次失败,Windows 221 次- 测试里写死
python3,Windows 上没这个名字,整个测试类静默不跑 - Python 3.8 起扩展模块加载 DLL 不再搜
PATH,只认os.add_dll_directory
运维
- Windows 的 OpenSSH 会话结束会连整个作业对象一起收掉,服务必须走计划任务
- 按映像名杀 python 进程,会把变音器的模型服务一起带走
- 服务跑在 SYSTEM 会话,读不到登录用户注册表里的代理设置——规则维护模型因此上线以来一次没调通过,界面上完全看不出来
我自己的
- 分步耗时表按每秒采样凑出来的,纯属编造,被一眼看穿
- 把「我的改动没写进去」误判成「被别的会话回退了」,查
git reflog才确认没有 - 汇报「规则包重构完成」,实际 7 份文档只改了 4 份
- 说「Windows 转写快 2.3 倍」,实测是 1.97 倍
最后这几条的共同点是同一个毛病:没验证就下结论。 所以交接文档里专门加了一节,写清楚数据怎么流的,并留了一句:别凭「文档里没写」就断定某个功能没做。
八、硬件:为什么放 Windows
那台机器有 RTX 5060 Ti。同一条 79.3 秒的片子、同一个模型,转写 Mac 43.2 秒、Windows 21.9 秒——快 1.97 倍,转写结果逐字一致。
九、明确没做 / 没验证的
不列在这里的,都是做完并验证过的。
| 事项 | 说明 |
|---|---|
| 模型过度推断 | 已在代码层堵住两类。规则里的「不报」字段挡不住,只能靠代码约束,遇一类堵一类 |
| 变音器只用合成音验过 | 端到端跑通了,但没用真人配音测过音色相似度 |
| 新人首次登录指导 | 提过,还没做。目前靠单独的使用说明文档 |
| 那台机器走 WiFi | 143 Mbps。接网线传大文件会快不少 |
十、下一步该盯什么
首期交付到这儿。真正开始用之后,最该盯的是这三个数:
- 成员自审页里「没看的」那一列——报了不看,等于白审
- 周报里误报率高的规则——那些是最该回头改表述的
- 规则草案的积压——回传上来没人确认,规则就不会进化
三个数指向同一件事:这套系统的价值不在交付那天,在于它有没有真的被用起来、有没有真的在进化。