规则整理模型选型测试:五个模型、两套题、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.1max_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,是题目和规范的问题,不是模型的问题

十次全错,错法高度一致。三个原因:

  1. 「能在越早的环节拦住越好」被一致理解成「只填最早那个」。 这句话现在就在真实提示词里用着,必须改成「所有成立的环节都填」。
  2. 标准答案本身有错。「不得出现平台 logo」原本期望三个环节都成立, 但脚本阶段只有文字、没有 logo,五家答「制作+剪辑」是对的。
  3. 规范里从头到尾没解释三个环节各自能看到什么,只在 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)之间的排序,严格说样本量不够。