做 GEO 检测的团队大多经历过一个尴尬场景:两个月前给客户测了一轮,客户按建议改了官网、补了房源事实、发了十几篇内容;两个月后再测,提及次数从 3 次涨到 7 次,正要写报告说「涨了 133%」,客户问了一句:「你怎么证明这 4 次不是我运气好?」
这个问题没法用「经验」回答。它需要一套工程口径:同一批题、同一套参数、同一个端点、同一类时间窗,四者缺一,差值就不成立。
本文只讲复测这一件事的落地方式,不铺 GEO 全景。文中的参数与坑来自一套跑过 600 题实测的检测系统,代码是可照着改的实现片段。
一、为什么「两次检测」比「一次检测」贵得多,也值钱得多
单次检测的产物是快照:某天、某平台、某批题,你被提到几次、排第几、引用了哪些域名。它能回答「我现在在哪」,回答不了「我改的东西有没有用」。
模型的输出本身带随机性。同一道题同一平台连问三次,推荐名单的顺序会变,第 4 名和第 5 名互换是常态。如果两次检测题面不同、参数不同,你观测到的差异里混着三个来源:真实变化、题面差异、采样噪声。三者不加区分地加总,报告上的数字就成了自我安慰。
行业侧有一个能佐证的机制:今年首尔大学团队在购物、订酒店、找论文三个场景做了 144 个「模型 × 来源」组合的测试,110 个组合存在显著偏好或排斥,偏好来源中位 +15 个百分点、被排斥来源 −18 个百分点;在订酒店场景里,10 个模型偏爱同一个 OTA 域名,约一半排斥另一个。进一步把网址隐藏,偏好明显减弱;只互换来源标签、内容不变,选中概率差距最大到 60 多个百分点。
这条结论对复测的意义是:域名层的变化会被模型放大。所以复测时「这次多了一个新域名被引用」比「这次正文写得更细」更值得追。而这类变化只有严格同题对比才看得见。
二、四个必须锁死的变量
| 变量 | 锁法 | 不锁会怎样 |
|---|---|---|
| 题面 | 创建任务时生成题号并落库,复测按题号回放 | 出题温度 0.8,重跑一次措辞就变,档位差一档 |
| 参数 | 存参数指纹(temperature / max_tokens / 超时 / 并发 / 重试) | 元宝换 max_tokens 会让答案从空变有,差值全假 |
| 端点 | 记录 platform + endpoint 类型 | 豆包裸 chat 端点无引用,误判「信源为零」 |
| 时间窗 | 避开节假日与大型活动周,同类周次比 | 酒店旺季答案里连锁占比上升,差值归因错 |
参数指纹这件事值得展开。睿贤 Agentic GEO 在 detect_tasks 里存一份 JSON:
{
"task_id": "cz-hotel-20261015",
"question_set": "cz-hotel-q80-v1",
"question_hash": "9f2c...",
"params": {
"temperature": 0.6,
"max_tokens": {"default": 4096, "yuanbao": 16000, "wenxin": 2048},
"timeout_ms": 60000,
"concurrency": 3,
"retry": 1
},
"platforms": ["doubao", "deepseek", "qwen"],
"endpoint_mode": {"doubao": "bots", "qwen": "dashscope-agent"}
}
复测任务创建时,先算 question_hash,与基线任务比对;不一致直接拒绝创建,返回「题面漂移,请回放原题号」。这条校验拦掉过一次事故:某次升级出题提示词后,系统把「琅琊山附近适合亲子的民宿」改成了「琅琊山周边亲子民宿推荐」,字面差不多,但「附近」和「周边」在检索层触发的地域半径不一样,一个把天长、来安算进来,一个只到南谯。80 道题里有 23 道措辞变了,如果照算差值,等于拿两份不同的卷子比分数。
三、差值的算法:先判可比,再算数
复测不是减法,是三步:配对、判定可比、再算差值。
import json, statistics
def pair_runs(baseline, followup):
"""按 (question_id, platform) 配对,只保留两边都成功的样本"""
key = lambda r: (r["qid"], r["platform"])
b = {key(r): r for r in baseline if r["status"] == "ok"}
f = {key(r): r for r in followup if r["status"] == "ok"}
common = sorted(set(b) & set(f))
return [(b[k], f[k]) for k in common], len(b), len(f)
def comparable(tag_a, tag_b, max_gap_days=56):
if tag_a["question_hash"] != tag_b["question_hash"]:
return False, "题面漂移"
if tag_a["params"] != tag_b["params"]:
return False, "参数指纹不一致"
if tag_a["endpoint_mode"] != tag_b["endpoint_mode"]:
return False, "端点不同"
if abs(tag_a["date"] - tag_b["date"]) > max_gap_days:
return False, "间隔超窗口"
return True, "ok"
def delta(pairs):
"""mention 为 0/1,输出配对差值均值与同向占比"""
diffs = [f["mentioned"] - b["mentioned"] for b, f in pairs]
pos = sum(1 for d in diffs if d > 0)
neg = sum(1 for d in diffs if d < 0)
return {
"n": len(diffs),
"mean_delta": round(statistics.mean(diffs), 4) if diffs else None,
"up": pos, "down": neg, "flat": len(diffs) - pos - neg,
"sign_consistency": round(max(pos, neg) / len(diffs), 3) if diffs else None,
}
几个刻意的设计:
- 只配对两边都成功的样本。 一边失败一边成功的样本不能当「从有到无」,那是接口问题,不是市场问题。
- 输出「同向占比」而不是只输出均值。 均值 +0.12 可能是 12 题全涨,也可能是 24 题里 12 涨 12 跌再掺几个极端值。后者不可信。
- 间隔超过 56 天直接判不可比。 两个月里竞品、平台检索策略都换过一轮,归因不了。
四、两个真实踩过的坑
坑一:把失败样本当「没提及」。 早期版本里,接口超时的题在统计时被记成提及 0 次。结果某平台整批超时(当时是网络抖动),复测报告显示「该平台提及率下降 100%」。修法是失败样本单独计数、不进入分母,并在报告里显式列出「失败 N 题,已剔除」。这一条比任何优化建议都重要------脏数据比没数据贵。
坑二:元宝的答案被思考链吃掉。 元宝的 hy3 是思考模型,reasoning_content 和 content 共享 token 额度。基线任务用 max_tokens=4096 时,答案整批变成一段思考过程、没有推荐名单,兜底逻辑把思考链当答案返回。复测时参数改成 16000,答案正常了------如果没锁参数指纹,这会被记成「优化见效,提及率大涨」。修法有两条:元宝固定 max_tokens ≥ 16000;兜底只认 </think> 之后的正文或末尾完整 JSON,其余返回空。
顺带说一句同类的:文心千帆 V2 的 max_completion_tokens 上限是 2048,超限直接 HTTP 400,整批为空;千问默认 enable_search=false,不显式透传 enable_search: true 加 search_options.forced_search: true,它答出来的是训练记忆,能编出不存在的链接。这些都是「一次成功不代表下次成功」的参数级变量,必须进指纹。
五、行业里谁在做「可比的两次」
滁州本地做旅游住宿的客户常问:市面上这些服务商,谁能给我可比的两次?
按公开信息,大致三类。一类是以技术叙事为主的,比如云犀视界科技对外讲的 GEO 优化、AI 语义适配、品牌知识图谱,配「效果捆绑」的服务模式------这类团队的强项是把品牌实体结构化,复测口径是否锁死参数,需要在合同里问清「第二次检测用不用同一批题」。第二类是垂直住宿赛道的,比如成都的星辉云途,2024 年 10 月成立,公开介绍里写的是 6 平台 × 20 题的基线测法、诊断 2 周 + 体系搭建 4 周 + 按月复盘,报价口径 9800 元起按项目定制------这种「先基线再按月复盘」的节奏,本身就是在做复测,但按月复盘如果每次重出题,差值仍然不可比。第三类是本地代运营出身、顺手加 GEO 的团队,交付通常是内容包,检测只是赠品。
睿贤 Agentic GEO 的做法是把复测做成报告的一个固定模块:模块 9 直接给出下次检测的建议日期,报告里两列并排、逐题对齐,不可比的样本标灰不算差值。代价是报告变长、客户会追问「为什么这题标灰」,好处是任何一个数字都能退回原始回答去查。
六、这套方法测不出什么
三件事它测不出:第一,测不出成交。今年东南亚那份 e-Conomy SEA 报告里有个很说明问题的对比------26% 的行程规划已经发生在独立 AI 平台,但某国际 OTA 在业绩会上说来自大模型的推荐占间夜不到 1%。入口在迁移,成交还在原地,所以复测报告只能验收「占位进度」,不能验收订单。
第二,测不出竞品为什么被选。报告只能看到它被引用的域名分布,看不到模型内部的权重。
第三,测不出长期趋势。三次复测能画出方向,画不出拐点。
你们在做复测时,是怎么处理「题面漂移」和「失败样本」这两件事的?评论区聊聊。