跳到主要内容
26.9% 这个数字,比省下来的那一千美元重要得多

26.9% 这个数字,比省下来的那一千美元重要得多

abanana
abanana

· 阅读约 6 分钟

上周三凌晨刷到一篇(arXiv:2610.29052,归在 cs.CL,顺手标了 cs.AI、cs.IR、cs.LG),本来是想看看省成本的路子,结果被一个 26.9% 别住了。

现在有一类判定,给定证据、一个问题、一组固定选项,要的不是一段话,而是每个选项的概率。论文里管这个叫 typed decision,接口叫 System 1——不生成文本再解析,直接读语言模型输出的 logits,或者在隐藏状态上接一个小的预测头,一次前向传播出结果。这套思路因为商业系统 Jev 流行起来,之后陆续有几份开源复现。这篇是他们拿这套模式做的两件事。

第一件是内部工具:从约 14.8 万条智能体编程会话里筛出能用的训练语料。原来的做法是调前沿大模型来评判,跑一次大约 1000 美元。

卡住我的是这儿。作者拿新跑的双评判做对照,比对范围很关键:只在两名评判模型自己先给出相同结论的那部分会话里比。结果,前沿模型当初存下来的标签,跟这次的新鲜共识对上的只有 26.9%。

我的理解是:如果你手上有一批“某年某月用某模型打的标”,那批标基本可以当成没人复核过的缓存。不是模型变笨了,是当时打标这个动作根本没有对照物,跑完就入库,谁也没回头验。而验证之所以没人做,恰恰因为重跑太贵——一次一千美元的东西,你不会为了“看看上次对不对”再跑一遍。

这篇真正值钱的地方,在我看来不是省钱,是让“再跑一次”便宜到能随手做。

替代方案不复杂,拆开看就三层:参数冻结的主干、额外接上的 rank-16 LoRA、一个指针头。三个类型化问题,一次前向传播回答完:

hidden = backbone(tokens)        # 主干冻结,不训练
h      = lora(hidden, r=16)      # 只训适配器
logits = pointer_head(h)         # 指针头直接指到选项上
probs  = softmax(logits[cands])  # 出概率,不生成文本

指针头这里我一开始没搞懂为什么单独拎出来,直接读输出层那几个字母 token 的 logit 不就行了。后来才想明白——选项不一定只有一个 token,读输出层等于把选项的措辞绑死在 prompt 上,换个问法就得重调;指针头把“选哪个”从“怎么问”里拆出来了。这段我也是翻回去看了两遍才理清的,不确定自己理解得完全对,但至少能解释他们后面那个消融为什么那么做。

成本大概这个量级:

前沿评判器   全量 148,000 条,跑一次      ≈ $1,000
自托管方案   1,000 条 / 单卡 / 约 3 分钟  ≈ $0.06
             → 折算约为前者的 1%

另外,所有会话数据不出机构,对他们那个场景可能比钱更要紧。

前半篇到这儿就够了。我更想说的是后半篇,那部分我不太认同。

论文第二部分去碰公开 benchmark,把 Eikos 那套迁到 1B、2B、35B 三个主干上,数据集约 2.5 万条判定,读的是经 LoRA 适配之后冻结的输出层。JevBench 111 道公开难题上,他们单种子训练的 35B 拿到 79.3%,商业参考系统是 73.0%。

这个对比不能直接读。作者自己写了,开发过程中参考过这些题;两者差异未校正 p 值 0.12,做了 Holm–Bonferroni 校正之后“领先五个开源系统”——注意领先的是开源系统,跟商业系统那一栏是“差异不显著”。另外 2B 超过全部四个 kev 检查点这件事,放在 111 道题上,我很难判断它意味着什么。

让我把这一节看完的,是两个附加数字。

一个是消融:只训练输出层里那 26 个字母行,没有可检测的收益。也就是说,前面那套增益不是“教会了模型认字母”,是别处在起作用——具体哪一处,论文没讲透,我也没看出来。

另一个更值得记:用后续版本的数据集重新训练之后,2B 在难题档上的准确率变化达 11.7 个百分点。同一个模型、同一批题,只是数据集的版本号换了。11.7 个点,比排行榜上 79.3 和 73.0 之间那 6.3 个点大得多。

这条我记下来了,下次应该用得上:小规模评测的分辨能力,大概就这个量级。你在一百来道题上看到的排名变动,先当噪声处理比较稳妥。

我原本的判断是“这种小 benchmark 的排名别当真”,写到这儿想再往前推一步——不是排名不可信,是这类评测根本测不出它被拿来测的那个东西。111 道题,单种子,开发时还看过题,产出的数字却要跟商业系统比高低。作者在正文里老实写了这些限制,这部分比数字本身更值得读;不少同类论文只在 appendix 提一句。

回到我自己的用法,我打算这么改:

  1. 手上任何一批“AI 打的标”,先抽 200 条出来,用当前最强的模型跑两遍,换 prompt 措辞但不换模型,看两次自己一致多少。
  2. 再拿两次都一致的那部分子集,去比对旧标签的一致率。如果我这边也掉到三四成,那批标就该重打,而不是继续往上叠新数据。
  3. 重打的时候存结构化的概率,不存成解析出来的一句话——后面想换阈值、想复核,都不用再跑一遍模型。

💡 小技巧就在第 1 步,换措辞不换模型,测的是你自己这条流水线的稳定性,不是模型之间的差异。

{"sid": "...", "q1": {"yes": 0.93, "no": 0.07},
                  "q2": {"yes": 0.61, "no": 0.39},
                  "q3": {"err": 0.88, "ok": 0.12}}

第 3 步是我自己加的,论文里没有这么建议。但按上面那个 26.9% 的教训,标签存成从自然语言里解析出来的布尔值,等于把复核的路又堵死一次。

划重点:第一,评判器的价值不在便宜,在于便宜到你能跑第二次,有第二次才有对照;第二,缓存下来的模型标签要当负债看,抽查一致率比标签数量重要;第三,小 benchmark 上几个点的差距,先跟 11.7 个百分点那个数字对照一下再下结论。这篇就记到这里,你可以挑一批自己打过标的旧数据,抽两百条复现一遍,看看一致率是多少,欢迎回来留言,我一起补一条笔记。

abanana
abanana

把自己踩过的坑整理成一篇能复现的笔记,写给三个月前的自己看。

查看主页 →