做 GEO 工具最容易走的一条捷径,是把判断交给大模型:把页面喂进去,让它给个分,再让它列出问题清单。输出看起来很专业,格式整齐,用词准确。

这条路我们没有走,原因不是技术偏好,是它不能用来验收。

为什么评分不能交给大模型

有研究把五个模型配置成确定性模式,在八项常见任务上各跑十轮。结果是准确率在自然发生的多轮之间最大波动达到 15%,最好与最差之间的差距最大到 70%,没有一个模型能在所有任务上稳定复现,更不用说输出完全相同的字符串。研究者还提到这种不确定性与计算资源的使用方式有关,短期内不会消失。

另一项研究显示,在同一任务上仅改变提示词格式这类不改变语义的设计选择,准确率差距最大可达 76 个百分点,而且把模型做大、增加示例、做指令微调都没有消除这种敏感性。

15%配置为确定性的模型在多轮之间的准确率最大波动Atil 等 2024
70%同一实验里最好与最差表现之间的最大差距Atil 等 2024
76仅改变提示词格式造成的准确率差距上限,以百分点计Sclar 等 2024

把这些数字放到一份交付给客户的报告上看:这个月七十二分,下个月六十八分,中间什么都没改。客户问为什么降了,答不出来。更糟的情况是什么都没改却升了,于是上个月的结论也站不住。

分数要能当作验收依据,前提是它可复现。模型给不了这个前提。

规则判定长什么样

规则是纯函数。输入是页面内容与它的上下文,输出三样东西:规则编号、判定结果、证据。

证据这一项是关键。判定「首屏正文不在服务端返回的 HTML 里」时,证据是取下来的那份源码片段;判定「标记与可见内容不一致」时,证据是标记里的条数和页面上的条数。客户问起某一项为什么不合格,有东西可以摊开看。

规则之间互不依赖,各自可以单独测试。新增一条规则要带测试用例,改动已有规则要说明影响范围。这套约束让任何一次判定都能回溯到具体代码。

环节用固定规则用大模型理由
站点可抓取性判定是否结论必须可复现
结构化数据校验是否有明确规范可依
内容缺口判定是否要进前后对比
问题集生成否是需要语言多样性
答案里的品牌识别规则为主模糊抽取时用边界情况需兜底
修复建议与内容草稿否是产出由人审
归因解释的措辞否是不改变判定结果

分界线其实很清楚:会进入对比和验收的数字,一律走规则;只作为文本产出、后面有人审的,可以走模型。

「不适用」为什么必须是第三态

早期版本里规则只有通过和不通过两个结果,很快就出了问题。

一个没有线下门店的企业,被判「缺少营业时间声明」为不通过。一个单语站点,被判「缺少多语言标注」为不通过。这些判定技术上没错,但它们把不相关的项算成了失分,分数因此失去意义。

所以条件性规则必须能输出第三种结果:这一项在当前情况下不适用。不适用既不计入通过,也不计入不通过,而是从分母里移出去。

这件事看起来是细节,实际影响很大。没有第三态的评分体系会系统性地低估那些业务形态简单的站点,而低估带来的后果是客户不信这个分数。

引用怎么数:只收正文标注的来源

这是我们和一些同行口径不同的地方,值得说明。

有些平台在给出答案的同时会展示一串参考网页,那是本次检索的候选池。候选池里出现自己的域名,只说明被检索到了,不说明答案用了它。

把候选池的出现次数当成引用次数来统计,引用率会明显虚高,而且虚高幅度在不同问题之间差异很大。我们的口径是只统计正文里真实标注的来源,候选池单独记为一个辅助指标。

支撑这个选择的还有另一组数据。审核多个生成式搜索引擎的研究发现,答案中平均只有 51.5% 的句子能被其引用完整支撑,引用确实支撑其所在句子的比例是 74.5%。也就是说即便是正文里标注的引用,也有四分之一左右对不上。在这种准确率水平下,再把候选池算进来,统计出来的东西就离事实太远了。

答案引擎这个词条里对候选池与正文引用的区别有更严格的界定。

为什么每题要测多次

因为单次结果不构成证据。前面那组波动数据已经说明了原因。

实务上的做法是每题重复多次,记录分布而不是单值,并且把联网与不联网作为两组条件分别记录。两组的变化速度不同,混成一个平均值会互相抵消。

还有一条纪律:原始答案全文必须留存。只存标签的表格在复测阶段什么都说明不了,因为需要比对的是两段话的具体差异。

发布必须经过人

生成的内容在写入任何对外位置之前,状态必须是已确认,没有跳过选项,也没有批量自动发布的路径。

这一条经常被问为什么不自动化。原因是生成环节用的是模型,而模型会在事实空缺处补出看起来合理的数字。一个编造的数字发出去,损害的不是那一页,是整站的可信度,而可信度正是这项服务要积累的东西。

托管站也一样。页面由我们自己渲染,不代表可以跳过审核。

中文带来的一处额外设计

品牌名在答案里的识别,中文和英文不是同一个难度。

英文可以靠词边界切分,「Nike」不会误匹配到别的词里去。中文没有词边界,只能做子串匹配,于是单字或者极短的品牌名会大面积误命中。一个只有一个字的品牌名,在「无法」「无论」「毫无」这类日常词里到处出现,统计出来的提及率可以虚高到完全不能用的程度。

处理方式是两道卡。写入侧校验品牌名长度,过短的直接拒绝并说明原因;检测侧对短名称走单独的匹配逻辑,要求上下文满足额外条件才算命中。

这一类问题在英文为主的工具里不会暴露,所以照搬国外方案时容易整段漏掉。同理还有若干处:基于英文停用词的过滤、靠语种检测拦截非英文站点的逻辑、按空格计词数的长度判定。这些在中文语境里要么失效,要么会把正常站点挡在外面。

这套做法的代价

要把代价说清楚,否则上面那些听起来像是只有好处。

覆盖面有限。规则只能判定定义过的情况,遇到没见过的形态就标不适用,而模型兜底理论上覆盖更广。

迭代更慢。新增一类判定要写规则、写测试、确认影响范围,比改一段提示词慢得多。

分数更保守。严格的引用口径和不适用第三态都让数字比宽松口径更低。

这三项代价换来的是同一件事:判定可复现、可解释、可追责。愿意付这个代价的理由写在大乐GEO 的方法那一页。

参考来源