我们如何评分:23 项检查,以及为什么有些权重更高

百分制的分数是一种主张,而大多数这类主张无从证伪:给你一个数字,背后没有方法,上面没有版本,事后也没法判断是你的网站变了还是工具变了。

我们的分数由五个加权维度下的 23 项检查构成,全部写在一个文件里:packages/engine/src/scorer.js。下面说明每一部分衡量什么、值多少分,以及它不能告诉你什么。

五个维度

可访问性 —— 30%,3 项检查。 机器能不能读到这个页面。没有 JavaScript 时正文是否存在,正文是否出现在 HTML 靠前的位置,页面是否小到可以整份抓下来。这是最重的维度,因为爬虫如果只拿到一个空壳,其余一切都只是装饰。

AI 可发现性 —— 25%,6 项检查。 AI 客户端能不能进来、进来后找不找得到路:有没有 robots.txt,它是否放行 AI 搜索机器人,有没有站点地图,站点是否响应 Accept: text/markdown,有没有 llms.txt,有没有声明 Content-Signal。

结构化数据 —— 20%,5 项检查。 Schema.org/JSON-LD、Open Graph、meta description、规范 URL,以及 <html> 上的 lang。这部分告诉机器这个页面是什么,而不是它说了什么。

语义化 HTML —— 15%,5 项检查。 标题层级、<article><main>、语义元素与 div 的比例、真正在描述内容的替代文本、div 的嵌套深度。抽取程序正是靠这些来判断页面的哪些部分才是页面本身。

内容效率 —— 10%,4 项检查。 从 HTML 转成 Markdown 的 token 削减比例、内容与噪声之比、页面重量、内联样式。也就是你发出去的东西里有多少是内容。

为什么不是每项都一样重

每项检查在权重旁边还带着一个证据等级,而权重正是由这个等级决定的:

  • 已证实 —— 模型厂商自己有文档说明,或有实测证明。23 项中的 3 项。
  • 合理 —— 推理站得住脚,与抽取流程的工作方式一致,但没有任何厂商确认过。23 项中的 13 项。
  • 推测 —— 这个约定确实存在,业界也相信它,但没人证明过有机器人真的在读。23 项中的 7 项。

一路算到最终分数,这意味着 100 分里大约 32 分落在已证实的检查上,51 分在合理的检查上,17 分在推测性的检查上。

已证实的三项是:页面不依赖 JavaScript 就能渲染,robots.txt 放行 AI 搜索机器人,页面带有 Schema.org 标记。第一项是这个领域证据最扎实的信号,因为主流 AI 爬虫没有一个执行 JavaScript。第二项是整张表里唯一真正的闸门:拦住搜索机器人,你在那个助手里就是不存在。

另一端是 llms.txt 和 Content-Signal。它们被大量域名提供着,却没有任何厂商确认读取,Google 还明确表示 llms.txt 没有任何作用。我们仍然给它们打分——没有证据并不等于证明无效——但每项只占其维度的 10%,而不是 llms.txt 当初的 20%。内容效率这个维度从头到尾都是推测:检索流程会在模型看到任何东西之前先跑一遍 Readability 式的抽取,所以精简的 HTML 换来的好处大概比业界想象的少。

这次重新配重就是评分标准的第 2 版。在 v1 里,「无需 JavaScript 即可渲染」只值最终分数的 6%,而从没有任何厂商提过的 token 削减却值 10%:表上证据最扎实的一项,权重反而低于一个猜测。

评分标准带着版本号

评分器导出 RUBRIC_VERSION,目前是 2。v1 是 2026 年 2 月的初始权重,v2 是 2026 年 7 月按证据做的重新配重。

没有这个号码,分数就无法复现。你跑一次分析,得到 90。半年后再跑,得到 85。是你的网站退步了,还是我们悄悄挪动了球门?一张不写明用什么尺子量的证书,就是一个谁也核不了的数字。

这个错误我们真的上线过。版本号存在于评分器中,也随结果对象一起传递,却从来没有写进数据库——于是排行榜把一堆分数排在一起,却不知道它们是不是用同一把尺子量出来的,v1 的记录压在 v2 的记录上面,仿佛这种比较有意义。

迁移脚本 007_add_rubric_version_to_analyses.js 加上了这一列,并把所有已有记录的默认值设为 1。这个默认值不是猜的:表里所有记录都早于 v2,所以 1 就是事实。它还为 (rubric_version, score) 建了索引,好让排名可以限定在同一套标准内。真正要紧的是时机——它必须在第一条 v2 分析写入之前落地,否则新记录会默默声称自己是 v1。

我们刻意不评的东西

一个页面,而不是整个站点。 一次分析只读一个 URL。robots.txt、站点地图和 llms.txt 是全站范围的,其余全都只属于那一个页面。一个做得好的页面即使所在站点整体薄弱,也照样拿高分,这是对的。

模型究竟拿你做了什么。 我们看不到 ChatGPT 有没有引用你,看不到 Claude 是不是用你的页面拼出了答案,也看不到有没有人提到你。这些事从外部谁也看不到。每一项检查衡量的都是你提供了什么,而不是别人拿它做了什么。

爬虫是不是真的进来了。 当我们伪装成 AI 机器人去探测,robots.txt 说欢迎,边缘却把我们挡了回来,我们并不知道一个通过验证的爬虫会遇到哪一边。这一项的上限被压在 60 分——是有保留的通过,而不是不及格——具体发生了什么由详情文字说明。用数字表达「不知道」是很糟糕的做法。

这里没有任何一项在检查你写的东西好不好。高分是一个不错的先验:机器读得到这个页面,也分得清它是什么。它不是被引用的承诺。

我们也把它用在自己身上

agentready.md 得 94/100。这个数字是从数据库里读出来的——我们对自己域名最近一次分析的结果,并链接到它的证书——而不是写死在模板里。它变,页面就跟着变。没有分析记录时,页面宁可什么都不显示,也不摆一个过期的数字。

它掉过分。有几个月,我们的源站对 /robots.txt 返回 404,而 Cloudflare 托管的 Content Signals Policy 在边缘用 200 回应,内容是一份我们从没写过的文件。我们自己的评分器读到那个 200,给了我们通过。等我们修好源站、关掉那份托管文件后,分数从 93 掉到 90。低的那个才是诚实的:那三分量的是 Cloudflare 的文件,不是我们的。

分数是怎么算出来的 · 其他站点得多少分