做 GEO 工具最容易走的一条捷径,是把判断交给大模型:把页面喂进去,让它给个分,再让它列出问题清单。输出看起来很专业,格式整齐,用词准确。
这条路我们没有走,原因不是技术偏好,是它不能用来验收。
为什么评分不能交给大模型
有研究把五个模型配置成确定性模式,在八项常见任务上各跑十轮。结果是准确率在自然发生的多轮之间最大波动达到 15%,最好与最差之间的差距最大到 70%,没有一个模型能在所有任务上稳定复现,更不用说输出完全相同的字符串。研究者还提到这种不确定性与计算资源的使用方式有关,短期内不会消失。
另一项研究显示,在同一任务上仅改变提示词格式这类不改变语义的设计选择,准确率差距最大可达 76 个百分点,而且把模型做大、增加示例、做指令微调都没有消除这种敏感性。
把这些数字放到一份交付给客户的报告上看:这个月七十二分,下个月六十八分,中间什么都没改。客户问为什么降了,答不出来。更糟的情况是什么都没改却升了,于是上个月的结论也站不住。
分数要能当作验收依据,前提是它可复现。模型给不了这个前提。
规则判定长什么样
规则是纯函数。输入是页面内容与它的上下文,输出三样东西:规则编号、判定结果、证据。
证据这一项是关键。判定「首屏正文不在服务端返回的 HTML 里」时,证据是取下来的那份源码片段;判定「标记与可见内容不一致」时,证据是标记里的条数和页面上的条数。客户问起某一项为什么不合格,有东西可以摊开看。
规则之间互不依赖,各自可以单独测试。新增一条规则要带测试用例,改动已有规则要说明影响范围。这套约束让任何一次判定都能回溯到具体代码。
| 环节 | 用固定规则 | 用大模型 | 理由 |
|---|---|---|---|
| 站点可抓取性判定 | 是 | 否 | 结论必须可复现 |
| 结构化数据校验 | 是 | 否 | 有明确规范可依 |
| 内容缺口判定 | 是 | 否 | 要进前后对比 |
| 问题集生成 | 否 | 是 | 需要语言多样性 |
| 答案里的品牌识别 | 规则为主 | 模糊抽取时用 | 边界情况需兜底 |
| 修复建议与内容草稿 | 否 | 是 | 产出由人审 |
| 归因解释的措辞 | 否 | 是 | 不改变判定结果 |
分界线其实很清楚:会进入对比和验收的数字,一律走规则;只作为文本产出、后面有人审的,可以走模型。
「不适用」为什么必须是第三态
早期版本里规则只有通过和不通过两个结果,很快就出了问题。
一个没有线下门店的企业,被判「缺少营业时间声明」为不通过。一个单语站点,被判「缺少多语言标注」为不通过。这些判定技术上没错,但它们把不相关的项算成了失分,分数因此失去意义。
所以条件性规则必须能输出第三种结果:这一项在当前情况下不适用。不适用既不计入通过,也不计入不通过,而是从分母里移出去。
这件事看起来是细节,实际影响很大。没有第三态的评分体系会系统性地低估那些业务形态简单的站点,而低估带来的后果是客户不信这个分数。
引用怎么数:只收正文标注的来源
这是我们和一些同行口径不同的地方,值得说明。
有些平台在给出答案的同时会展示一串参考网页,那是本次检索的候选池。候选池里出现自己的域名,只说明被检索到了,不说明答案用了它。
把候选池的出现次数当成引用次数来统计,引用率会明显虚高,而且虚高幅度在不同问题之间差异很大。我们的口径是只统计正文里真实标注的来源,候选池单独记为一个辅助指标。
支撑这个选择的还有另一组数据。审核多个生成式搜索引擎的研究发现,答案中平均只有 51.5% 的句子能被其引用完整支撑,引用确实支撑其所在句子的比例是 74.5%。也就是说即便是正文里标注的引用,也有四分之一左右对不上。在这种准确率水平下,再把候选池算进来,统计出来的东西就离事实太远了。
答案引擎这个词条里对候选池与正文引用的区别有更严格的界定。
为什么每题要测多次
因为单次结果不构成证据。前面那组波动数据已经说明了原因。
实务上的做法是每题重复多次,记录分布而不是单值,并且把联网与不联网作为两组条件分别记录。两组的变化速度不同,混成一个平均值会互相抵消。
还有一条纪律:原始答案全文必须留存。只存标签的表格在复测阶段什么都说明不了,因为需要比对的是两段话的具体差异。
发布必须经过人
生成的内容在写入任何对外位置之前,状态必须是已确认,没有跳过选项,也没有批量自动发布的路径。
这一条经常被问为什么不自动化。原因是生成环节用的是模型,而模型会在事实空缺处补出看起来合理的数字。一个编造的数字发出去,损害的不是那一页,是整站的可信度,而可信度正是这项服务要积累的东西。
托管站也一样。页面由我们自己渲染,不代表可以跳过审核。
中文带来的一处额外设计
品牌名在答案里的识别,中文和英文不是同一个难度。
英文可以靠词边界切分,「Nike」不会误匹配到别的词里去。中文没有词边界,只能做子串匹配,于是单字或者极短的品牌名会大面积误命中。一个只有一个字的品牌名,在「无法」「无论」「毫无」这类日常词里到处出现,统计出来的提及率可以虚高到完全不能用的程度。
处理方式是两道卡。写入侧校验品牌名长度,过短的直接拒绝并说明原因;检测侧对短名称走单独的匹配逻辑,要求上下文满足额外条件才算命中。
这一类问题在英文为主的工具里不会暴露,所以照搬国外方案时容易整段漏掉。同理还有若干处:基于英文停用词的过滤、靠语种检测拦截非英文站点的逻辑、按空格计词数的长度判定。这些在中文语境里要么失效,要么会把正常站点挡在外面。
这套做法的代价
要把代价说清楚,否则上面那些听起来像是只有好处。
覆盖面有限。规则只能判定定义过的情况,遇到没见过的形态就标不适用,而模型兜底理论上覆盖更广。
迭代更慢。新增一类判定要写规则、写测试、确认影响范围,比改一段提示词慢得多。
分数更保守。严格的引用口径和不适用第三态都让数字比宽松口径更低。
这三项代价换来的是同一件事:判定可复现、可解释、可追责。愿意付这个代价的理由写在大乐GEO 的方法那一页。
参考来源
- Atil, B., Aykent, S., Chittams, A., et al. (2024). Non-Determinism of "Deterministic" LLM Settings. arXiv.
- Sclar, M., Choi, Y., Tsvetkov, Y., & Suhr, A. (2024). Quantifying Language Models' Sensitivity to Spurious Features in Prompt Design. ICLR 2024.
- Liu, N. F., Zhang, T., & Liang, P. (2023). Evaluating Verifiability in Generative Search Engines. EMNLP 2023 Findings.
- Aggarwal, P., Murahari, V., Rajpurohit, T., Kalyan, A., Narasimhan, K., & Deshpande, A. (2024). GEO: Generative Engine Optimization. Proceedings of KDD 2024.