规则整理模型选型测试:五个模型、两套题、16 道
结论
规则维护这一步用 anthropic/claude-fable-5。
五个模型、两套题、共 16 道,Fable 判断题 8/10 与 GPT 并列最高,且是唯一机械项零扣分的 (开放词、字段完整、看哪单选,16 道全干净)。在最难的归纳题上表现最好,「不报」字段 (专门堵过度推断的那个)写得最实。
备选 openai/gpt-5.6-sol:并列 8/10,但慢,且有一处开放词没清、「来源」字段两套都填错。
豆包 doubao-seed-evolving 留着干查重、覆盖判断这类判断题——稳、快、格式好,就是不会归纳。
deepseek-v4-flash 这一步不能用:见下面「致命项」。
一、为什么要做这个测试
规则包是这套系统的核心资产。回传进来的是人写的大白话,要变成模型能准确执行的规则块, 中间那步改写由模型来做。这一步写歪一条,往后每条片子都跟着错。
同时用户提了要求:以后要能自己设置用哪个模型,「设置哪个模型,这一套逻辑和操作流程都不变」。 那就得先知道各家在这活上什么水平。
二、测试设计
八个维度
对应规则维护流程里模型要干的全部活:
| 题 | 对应流程里的哪一步 | 类型 |
|---|---|---|
| A 红线原文规范化 | 建包第 2 步:客户红线原文拆条 | 出规则块 |
| B 历史记录归纳 | 建包第 3 步:历史审核记录归纳惯例 | 出规则块 |
| C 环节判断 | 规则块的「环节」字段 | JSON |
| D 覆盖判断 | 反馈进来先问「规则包里已经有了吗」 | JSON |
| E 查重 | 入库前 | JSON |
| F 冲突检测 | 入库前,跟查重不是一回事 | JSON |
| G 改表述不新增 | 误报高的规则怎么修 | 出规则块 |
| H 值不值得立规则 | 无关反馈会不会硬编 | JSON |
两套题,判断题答案全部反过来
第一套素材用平台 A,第二套用平台 B,都是仓里的真实红线原文(本文示例已做脱敏改写)。
关键设计:第一套 D/E/F/H 的正确答案是「是/是/是/否」,一个见啥都点头的模型也能拿高分。 第二套改成「否/否/否/是」,专治这个。
实际抓到了:Opus 在第二套 E 题把「他站 App 图标」判成跟「平台自家 logo」重复—— 看见 logo 两个字就归堆。只有反着出题才照得出来。
打分
机械项自动打分,判断项人看原文。机械项包括:
- 六个字段齐不齐
- 「看哪」是不是单选(不许写斜杠)
- 判定字段里有没有开放词(等、相关、其他、适当、尽量)
- JSON 能不能解析、枚举值对不对
判断题按标准答案逐字段比对,expect 写在题目里。
三、五家的接入,和踩到的坑
| 家 | 型号 | 走哪 | 关思考链的参数 | 代理 |
|---|---|---|---|---|
| 豆包 | doubao-seed-evolving |
火山方舟 | thinking: {"type":"disabled"} |
必须绕过 |
| DeepSeek | deepseek-v4-flash |
官方 API | reasoning_effort: "none" |
必须绕过 |
| GPT | openai/gpt-5.6-sol |
OpenRouter | reasoning: {"effort":"low"} |
必须走 |
| Opus | anthropic/claude-opus-5 |
OpenRouter | 同上 | 必须走 |
| Fable | anthropic/claude-fable-5 |
OpenRouter | 同上 | 必须走 |
统一 temperature 0.1、max_tokens 4096、同一份系统提示词和题干。
坑 1:DeepSeek 的思考链也是默认开着的
跟豆包一模一样。不关的话第一道题:36.8 秒、4096 token 全烧在思考上、content 返回空字符串,
看着像模型罢工。关掉后同一道题 3.5 秒。
关掉的验证方法:usage 里连 reasoning_tokens 字段都不再出现。
reasoning_effort: "none" 和 thinking: {"type":"disabled"} 两个都有效。
这已经是第二次栽在「思考链默认开」上了(第一次是豆包,导致老系统一条片子跑 400 多秒)。 以后接任何新模型,第一件事就是打一次 usage 看 reasoning token。
坑 2:代理方向相反
OpenRouter 不走系统代理直接 403:This model is not available in your region,
所有 openai/ 和 anthropic/ 型号都挡。方舟和 DeepSeek 反过来,走代理会被掐。
所以按家分开设 proxy 开关。
坑 3:codex CLI 走不通
本机装了 codex,凭据也在,但平台二进制丢了(vendor/…/codex ENOENT),--help 都跑不起来。
所以 GPT 那家改从 OpenRouter 转。本机没有 OPENAI_API_KEY。
坑 4:子 agent 跑出来的结果不能跟 API 比
Claude 两家一开始是用子 agent 跑的,但那样外面裹着 Claude Code 的系统提示词、 思考强度跟会话走,跟手动调 API 的三家不是一个条件。后来全改成走 OpenRouter, 五家同一个脚本同一套打分。
(子 agent 那批答卷留在 子agent答卷备份/,不计入成绩。)
四、结果
| 一A | 一B | 一C | 一D | 一E | 一F | 一G | 一H | 二A | 二B | 二C | 二D | 二E | 二F | 二G | 二H | 判断题 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| fable | 6条 | 2条 | ❌ | ✅ | ✅ | ✅ | 1条 | ✅ | 12条 | 3条 | ❌ | ✅ | ✅ | ✅ | 1条 | ✅ | 8/10 |
| gpt-5.6-sol | 14条 | 2条 | ❌ | ✅ | ✅ | ✅ | 1条 | ✅ | 11条 | 3条 | ❌ | ✅ | ✅ | ✅ | 1条 | ✅ | 8/10 |
| opus-5 | 7条 | 3条 | ❌ | ✅ | ✅ | ✅ | 1条 | ✅ | 12条 | 3条 | ❌ | ✅ | ❌ | ✅ | 1条 | ✅ | 7/10 |
| 豆包 | 11条 | 8条 | ❌ | ✅ | ✅ | ✅ | 1条 | ✅ | 12条 | 7条 | ❌ | ✅ | ✅ | ❌ | 1条 | ✅ | 7/10 |
| DeepSeek | 7条 | 8条 | ❌ | ❌ | ✅ | ✅ | 1条 | ✅ | 12条 | 5条 | ❌ | ✅ | ✅ | ❌ | 1条 | ❌ | 5/10 |
B 题(归纳)是分水岭
题目给一堆零散批注,要求归纳成规则块,且只收反复出现的,一次性的不要收。
| 一套 | 二套 | 干了什么 | |
|---|---|---|---|
| fable / gpt | 2 条 | 3 条 | 真归纳:把同类合并,一次性的丢掉 |
| opus | 3 条 | 3 条 | 同上,稍碎 |
| 豆包 | 8 条 | 7 条 | 抄成流水账,一次性的也立成规则 |
| DeepSeek | 8 条 | 5 条 | 同上 |
第二套 11 条批注里,反复出现的是「字幕断句」(3)、「字幕过长/双行」(3)、「BGM 盖口播」(3); 一次性的是「BGM 全程没停」「口播太小」「结尾转场生硬」。Fable 出 3 条,全是反复项, 一次性的全丢,还正确判断出「字幕太长一行放不下」和「双行字幕」是同一件事。
Fable 的「不报」字段写得最实
这个字段是专门堵过度推断的,别家大多填「无」:
## A20 落版页竞品设备特征露出
判定:落版页画面中出现竞品机型、竞品边框、竞品外壳、竞品 logo 中任意一项的,报。
不报:落版页展示的产品本身即为广告主商品的,不报。
## A21 结尾黑屏
判定:视频结尾出现黑屏画面的(包括仅一帧、仅局部区域如右下角黑屏),报。
不报:广告主要求以黑底作为落版设计底色的,不报。
致命项:DeepSeek
① 第一套 G 题把方向写反了。 题干明说「正确的写法是:连播、月度、合集」,它写成:
「联播」写成「连播」是错的,应写「联播」
规范第 1 条专门写了「方向写死」,题干也直接给了答案,还是写反。这条规则要是入了库, 往后每条片子都会把写对的字幕报成错别字——正是这套规范要防的那个 bug。
② 反复不守输出格式。
- 二套 H 题:
action要求三选一,它填了整句「新增规则:短剧片单录屏中,海报不得被字幕遮挡…」 - 一套 D 题:
rule_id要求只填编号,它填「A7 CR 版权标注」
程序按枚举值和 ID 匹配,这两种都会直接挂。
五、测出来的规范漏洞(比选型更值钱)
① C 题五家 0/5,是题目和规范的问题,不是模型的问题
十次全错,错法高度一致。三个原因:
- 「能在越早的环节拦住越好」被一致理解成「只填最早那个」。 这句话现在就在真实提示词里用着,必须改成「所有成立的环节都填」。
- 标准答案本身有错。「不得出现平台 logo」原本期望三个环节都成立, 但脚本阶段只有文字、没有 logo,五家答「制作+剪辑」是对的。
- 规范里从头到尾没解释三个环节各自能看到什么,只在 C 题里单独给了。
② 开放词扫描误伤
「不能出现其他品牌 logo」里的「其他品牌」是个完整意思,不是开放词,被扫描器报了四次。 检测要排掉「其他品牌」「其他平台」「其他 App」这类固定搭配。
③ 「来源」字段没给封闭清单
GPT 两套都填成「回传」,实际一套该是「历史审核记录」、一套该是「客户红线文档」。 要给死枚举。
④ 「负面」这类限定词会在拆条时丢
第一套 A 题原文是「经济/民生负面(春运、物价、就业)不做」。
GPT 拆成四条独立规则:出现春运信息就报、出现物价信息就报……「负面」这个限定被拆丢了,
从「负面才报」变成「提到就报」。Opus 也犯。规范里要加一条:拆条时限定词跟着走。
⑤ 规范里少了「处置手段不写进判定」的反例
第一套豆包把原文的「可全面打码」读成了「未做全面打码的报」——把手段变成了硬要求。 规范第 7、8 条虽然写了,但没给例子,压不住。
⑥ 「一条只管一件事」和「拆完自查不许拆重」互相拉扯
豆包第一套拆出 11 条,其中 3 处重复(R1-7/R1-8、R1-3/R1-10、R1-4/R1-11); GPT 拆出 14 条,把「新闻类滚屏中出现领导人慰问」合进了慰问那条,没另立,更对。 规范要说清:同一件事在不同载体上出现,算一条,不拆。
六、复现
脚本在 scratchpad(不入仓,是一次性验证工具):
scratchpad/
规则整理对比测试.py 第一套题 + 五家接入 + 打分器
题库2.py 第二套题(借用第一套的跑批和打分)
评分.py 从答卷文件重算五家总分
题目/ 八道题落成的文件
规则整理测试结果/ 第一套答卷
规则整理测试结果2/ 第二套答卷
子agent答卷备份/ 废弃的子 agent 版本,不计成绩
跑法:
python3 规则整理对比测试.py both # 五家跑第一套
python3 规则整理对比测试.py fable,gpt # 只跑指定几家
python3 题库2.py both # 五家跑第二套
python3 评分.py # 五家两套总分
别读 汇总.json——每跑一次就被覆盖一次,只剩最后一批模型。评分.py 是从答卷文件重算的。
key 全部从环境变量读,不落盘、不进仓。
七、这次没做的
- 规范漏洞还没补。 六处都记在上面,补完应该再跑第三轮验证—— 如果补完五家差距明显缩小,就证明规范到位后模型确实能随便换。
- 没测多模态。 真实流程里改写规则要看证据帧,这次八道题全是纯文字。 Fable 能不能看图、看得准不准,接的时候要单独测。
- 没测长上下文。 真实调用要带整份规则包(6000 字上下)+ 过往批准/驳回样例, 比测试题长得多。规则包变长之后各家会不会开始漏读,没验。
- 每家只跑了一遍。 温度 0.1 不是 0,同一道题重跑结果会有出入。 分差小的两家(fable vs gpt,都是 8/10)之间的排序,严格说样本量不够。