口径先钉住:本篇的相关系数是我自己写的脚本算的,不是引用别人的结论。 脚本
probe-academic.py与打分器score.py都在仓库里,可复现。 全文 31 篇文章(六项要件)逐条扫过,判据的反例用例也在仓库里。
我给这个系列写过两把尺子。一把 30 多篇文章都在用,另一把刚写完。
问题是这两把尺子量的是不是同一件事?我一直没验证过。
这一篇是那个验证的结果。结论比我预想的难看:它们基本不相关。
一、两把尺子
尺子 A:score.py(写了很久,CI 里在跑)
五维度,满分 100:
维度 / 分值 / 判什么
- D1 具体物密度 ------ 25 ------ 标题和正文里有多少个「具体物」(数字+量纲、文件路径、行号)
- D2 证据可查性 ------ 20 ------ 有没有「附:本文引用」小节;带「已实跑/已取全文」标记的锚点有几个
- D3 免责边界 ------ 15 ------ 有没有写「本篇不成立的结论」
- D4 平台适配 ------ 12 ------ 四平台变体与封面齐不齐
- D5 结构完整 ------ 20 ------ 正文字数、标题长度、小红书是否超 1000 字
尺子 B:probe-academic.py(刚写,六项要件)
从「一个主张要能扛住不同意它的人」推到单篇文章这一层:
编号 / 要件 / 缺了会怎样
- R1 ------ 相关工作定位 ------ 读者无法判断这是发现还是重复劳动
- R2 ------ 版本锚点 ------ 半年后上游一变,句子静默变错
- R3 ------ 方法可复述 ------ 结论不可再生产,退化成传闻
- R4 ------ 数据/代码可得性 ------ 证据与断言之间没有连接
- R5 ------ 证伪条件 ------ 主张不可检验,只是信念
- R6 ------ 更正/版本历史 ------ 整个历史不可信
这两把尺子看的是完全不同的东西。 D4 测「四平台变体齐不齐」, 而学术文章只有一个规范形态;D5 给 ≥5000 字加分,而学术写作奖励压缩。
但「设计上不同」不等于「实测不相关」。 我得算。
二、算完之后
bash
python3 score.py --json # 逐篇的 D1--D5
python3 probe-academic.py # 逐篇的 R1--R6
# 然后求秩相关
口径必须先钉住 :只用判据写成之前就存在的 30 篇 。 把「按 R1--R6 写出来的文章」再喂回 R1--R6 判据是循环的------ 我按尺子做的布,用同一把尺子量必然满分。冻结样本 n=30。
ini
score.py 总分 vs 学术要件数
皮尔逊 r = +0.203
斯皮尔曼 ρ = +0.295
再剔除 D4(平台适配 12 分) + D5(结构完整 20 分),只留 D1+D2+D3
皮尔逊 r = +0.187
斯匹尔曼 ρ = +0.366
剔掉两个平台维度之后,相关性依然只有 0.37。
而且两个榜单的前五名,交集是空集:
css
score.py 前 5 : post29(87分/0要件) post30(87分/1) post31(82分/1)
post25(77分/2) post26(77分/3)
学术完备度 前 5 : post23(4要件/62分) post17(3/19) post19(3/49)
post20(3/49) post21(3/42)
重合 : 无
score.py 打最高分的那篇,学术要件是 0。 学术要件最高的那篇,score.py 只给了 62 分。
2.1 循环测量会把数字推成什么样
写完本文之后我又算了一次,这次把这两篇也放进去(n=32):
口径 / n / ρ(总分) / ρ(剔平台维度) / 前五交集
- 冻结(判据写成之前的 30 篇) ------ 30 ------ +0.295 ------ +0.366 ------ 空集
- 全样本(含本系列两篇按判据写的) ------ 32 ------ +0.309 ------ +0.382 ------ 空集
ρ 反而上升了一点,完备度前五名的榜首换成了本系列两篇(6/6)。
这个方向值得说清楚:它没有证明「按判据写就能提高相关性」, 只证明了「用自己设计的样本测自己的判据,得到的数字没有意义」。
所以本文第二节只采信冻结口径那组数字。 第二组数字也列出来,是为了让人看见这个偏差有多大------ 一个只报有利数字的实验,和没报数字一样不可信。
三、六项要件全库扫描(冻结口径 n=30)
scss
R1 相关工作定位 1/30 ( 3%) ← 只有 post19
R2 版本锚点 13/30 ( 43%)
R3 方法可复述 14/30 ( 47%)
R4 数据/代码可得性 1/30 ( 3%) ← 只有 post19
R5 证伪条件 12/30 ( 40%)
R6 更正/版本历史 6/30 ( 20%)
平均 1.63/6
两项最低的都只有 3%,而且都只有 post19 命中。
而 post19 恰好就是唯一引用了 4 篇论文的那篇(arXiv:2605.12925、 arXiv:2607.16345、arXiv:2607.17927、arXiv:2607.01793)。
这不是两个独立缺陷,这是一个缺陷的两个投影:没做过学术定位。
四、这个结果说明什么,不说明什么
它不说明 score.py 坏了
score.py 测的是「作为四平台连载帖子写得好不好」。 在这个维度上它是对的------D4/D5 不是 bug,是它履行的另一个合同。
小红书正文硬上限 1000 字、公众号标题硬限 64 字, 这些约束对「四平台连载」是真约束,对学术文档则完全不存在。
所以我没有改 score.py 一个字。
它说明差值本身是信息
差值大的文章 = 传播上很成功、学术上不成立
post29 是最好的例子:87 分,0 件学术要件。
这种文章不是写得不好,是它把一个工程观察包装成了研究结论。 它读起来完全像一篇研究文章:有具体数字、有锚点、有引用节、 有「已实测」标记------但它没有一个可证伪的断言,也没有一处相关工作定位。
这正是「像论文」和「是论文」的区别。而这个区别,score.py 测不出来。
五、两个方法的共线性问题
顺手报一个我在算的时候撞上的事。
score.py 自己的置信度分析里有一条:五个维度之间高度共线 。 D1(具体物密度)与 D2(证据可查性)的相关是 +0.75 , D2 与 D4 是 +0.71。
这意味着加权和基本等价于「D1 和 D2 加起来」, 剩下三个维度对排序的影响很小。
这不致命,但它解释了本文的一个现象:
为什么 score.py 对「学术上不成立」的文章能给高分?
因为一篇写得像研究文章的工程观察,天然就会堆很多具体物(D1 高) 和很多「已实测」标记(D2 高)。它学的是形式,不是内容。
这也是为什么我在这个仓库里坚持另一件事: 每道判据都必须做反向自测------构造一个让它失败的输入。
probe-academic.py 的 18 个正反例、check-academic.py --selftest 的 7 条反向破坏用例,都是这个原则的产物。
而且这套自测当天下午就抓到 5 次判据自身失效,其中三次是我自己犯的:
- 路径写错,导致全部 exit 2 被当成「抓到」
check-workflow.py自己import yaml,被零依赖守卫抓到- 域名不存在返回 SSL 错误,判据却 exit 0
- R6 词根
补测把「C3 要补测试」误判成勘误记录 - R2 正则
[0-9a-f]{7,40}把腾讯云文章 ID (2751800)当成了 commit SHA
第 4、5 条都是写这篇时被抓到的 ------第 5 条是写完 post32 抽验引用时才发现的。 纯数字串在十六进制字符类里合法,所以 7 位以上的文章 ID 全部会被误判成版本锚点。 现在收紧成「必须含至少一个 a-f 字母」,并把这条误报固化成回归用例留在自测里。
词根匹配不看后缀、字符类不排除纯数字------一定会串到日常用语上。 前三次分别是路径写错、自己违反自己的规则、把错误算成成功。
六、这个结论什么情况下是错的
如果两个榜单的前五名有交集,本文的核心结论就错了。 实测交集为空集,且剔掉平台维度后 ρ 仍只有 0.373。
具体地说,以下任一成立则需要修正本文:
score.py的五个维度里其实已经隐含了学术完备度,只是权重太小
(比如 D3「免责边界」实际上承担了 R5「证伪条件」的功能)------ 实测不支持:D3 单独与 R1--R6 总数的相关需要重新算,本文没算这一项, 这是本文的一个已知缺口;
- 相关性低是因为
score.py权重不合理,而不是因为它们量不同的东西------
若是前者,调权重就能解决;本文的立场是它们量不同的东西, 这个立场依赖于「D4/D5 在学术文档里不存在」这个前提;
- 样本 n=30 太小,ρ 的置信区间很宽------
冻结口径下 ρ=+0.295,在 n=30 时显著不为 0,但显著不等于大 , 而本文的论点恰恰是它小到不足以支撑任何实用用途 。 严格说,n=30 的 ρ 置信区间上界仍可能到 0.6 量级, 本文没有做 bootstrap 或 Fisher z 变换来量化这个区间------这是缺口;
七、局限
- 本文只测了「要件齐不齐」,不测「结论对不对」。 一篇六项全中且全错的文章,
拿满分。要件齐 ≠ 结论对,后者靠可证伪性保证,不由判据保证。
score.py的 D2 不验真假。 它只数「已实跑」标记的个数,
不验证标记是否属实。本文另有 verify-anchors.py 补时效性, 实测发现 14 条「同上」类断言读者根本无法点开。
- 相关性不必然意味着因果。 本文只主张「两把尺子不可互相替代」,
不主张「学术要件齐了文章就好」------后者本文没有测,也不打算测。
- 判据只匹配文本痕迹。 一篇文章做到了某件事但没写出来,会被判为没做到。
所有比例都是下界,不是事实。 0/30 说的是「至少这些没写在文里」, 不是「这些文章没做这些事」。
- 本文自己也是被自己的判据测的。 第六节那个缺口------没算 D3 与 R5 的单独相关------
正是本文自己 R5 的体现:我写下了「什么情况下我错」,但我的证伪条件里 有一条我根本没算。
八、复现方法
bash
git clone https://github.com/Ikalus1988/account-ops-workflow
cd computer-use-demo
# 1. 两把尺子各自的原始输出
python3 score.py --json
python3 probe-academic.py
# 2. 判据的可信度(先跑这个,否则后面的数字不可信)
python3 probe-academic.py --selftest # 18 个正反例
python3 check-academic.py --selftest # 8 条反向破坏用例
# 3. 相关系数怎么算的,见本文第四节开头那段 bash
原始数据 :SCORES.md(含五维度共线性与权重敏感性分析)是 score.py --report 自动生成的;要件扫描的逐篇结果由 probe-academic.py 直接打印。 两个脚本都零第三方依赖,可在本仓库 tag v0.1.0-research 对应的提交上复现。
附:本文引用
方法学
- Reliability without Validity: A Systematic, Large-Scale Evaluation of LLM-as-a-Judge Models --- arXiv:2606.19544。21 个 judge、约 541,000 次判断,结论是「judge validation in practice relies on exact-match agreement, a metric that does not correct for chance and systematically overstates discriminative ability」,并测得 kappa 与 exact-match 之间普遍存在 33--41 个百分点的落差。
这一条直接决定了本文的方法:本文报的是斯皮尔曼秩相关而非原始一致率, 并且知道「未校正的一致率会高估三到四个百分点量级」。 没有它,本文会用一个已知有偏的指标去批评别人的指标。
- Correlated Errors in Large Language Models --- arXiv:2506.07962。350+ 模型,测得「models agree 60% of the time when both models err」,且「larger and more accurate models have highly correlated errors, even with distinct architectures and providers」。
这是本文不能说的话的清单:不能说「多个评审一致通过不构成独立验证」是新的。
- How effective are traditional test criteria at detecting bugs in LLM generated code? --- arXiv:2609.09315。5 个 LLM × 4 个 benchmark、6000+ 故障实例,实测检出率「extremely low, often near zero」,归因于测试预言机失效。
本文数据锚点
- 本仓库 tag
v0.1.0-research;score.py与probe-academic.py均为该 tag 时的版本 - 判据自测失败记录见
ACADEMIC-TRANSITION.md§十.6(第四次判据自身失手)