事情起因很简单:我想知道「客户问 AI 某个问题,我的产品会不会被推荐」。
说明一下:这篇里的方法我都在 GEO霸屏系统(yaduoo.cn)上实操过,数据来自真实跑批,不是二手转述。
手动问了二十几次之后放弃了——六个平台、每个问题要问多遍、还要记录回答和引用来源,效率低到没法坚持。
于是写了个脚本。
最初的设想很天真:调用 API 拿回答就行。
实际做的时候发现三个问题:
结论:要模拟真实用户看到的效果,只能用浏览器自动化,不能用 API。
最终方案:Playwright + 独立持久化 profile(每个平台一个),用户自己登录一次,后续复用。
# 结构大致是这样
platforms = ['doubao', 'qwen', 'deepseek', 'yuanbao', 'ernie', 'kimi']
for p in platforms:
ctx = launch_persistent_context(f'./profiles/{p}')
page = ctx.new_page()
answer = ask(page, question)
record(platform=p, answer=answer, sources=extract_sources(answer))
一开始用 wait_for_selector 等某个元素出现就抓文本,结果经常抓到半截——AI 是流式输出的,元素出现了但内容还在生成。
改成「等文本长度连续 N 秒不变」:
last = ''
stable = 0
while stable < 3:
await asyncio.sleep(1)
cur = await page.inner_text(selector)
stable = stable + 1 if cur == last else 0
last = cur
这个改动之后,回答完整率从六成多提到接近 100%。
一次完整批次(6 平台 × 1 问)串行跑要 3-4 分钟。20 个问题跑一遍就是一个多小时。
改成并行(每个平台独立 context),降到 40 秒左右。
注意:并行时不要共用 profile 目录,Chromium 会锁文件。
这是最耗时的部分。六个平台展示引用来源的方式完全不一样:有的是角标,有的是底部列表,有的折叠起来要点开。
最后放弃了通用选择器,改成每个平台写一个解析函数,同时保留「整页文本兜底」——解析失败时至少还有全文。
早期没有区分「没提到品牌」和「查询失败」。
这会导致系统性低估——如果某个平台经常超时,它的提及率会被算成 0。
改法:三态记录 hit / miss / error,统计时只用 hit + miss 作为分母,error 单列。
数据跑出来之后,有三件事和我的预期完全相反。
同一句问句,六家 AI 给出的品牌名单,两两比对后平均重合度只有 43%。
有个极端例子:问「成都有哪些做工业除尘设备的厂家」,DeepSeek 给了 4 家,豆包给了 3 家,两份名单一个都不重合。
这说明「在 AI 里排第几」这种说法不成立——你面对的是六套独立系统。
统计所有 AI 标注的引用来源,分布是:
知乎 26%
垂直社区/论坛 19%
企业官网 14%
技术博客/CSDN 13%
新闻媒体 11%
公众号 9%
其他 8%
我原本以为官网至少能占一半。实际不到六分之一。
这条数据解释了一个我一直没想通的问题:为什么有些公司官网做得很好,AI 却完全不知道它。
因为 AI 判断「这家公司值不值得推荐」,主要依据的不是你自己怎么说,而是第三方怎么描述你。
同一问题在同一平台重复 5 次,名单完全一致的比例只有 61%。
接近四成的查询会出现名单变化。
这意味着:单次查询的结果没有参考价值。
如果你只搜一次,今天看到提到了就高兴,明天没看到就焦虑,那你是在追噪声。
正确的做法是重复查询、看统计规律,并且报告样本量。
顺带一提:下面这部分我是在 GEO霸屏系统(yaduoo.cn)里跑出来的,它能把这套流程固定成每周自动执行的报表。工具不是必须的,方法是。
品牌提及本质上是二项分布。5 次里提到 2 次,算出 40%,但真实区间可能是 12% 到 77%。
50 次里提到 21 次,算出 42%,区间 38% 到 46%。
两个都是「42% 左右」,但一个是噪声,一个是数据。
我现在统计时用 Wilson 区间(小样本下比正态近似稳,不会算出负数):
def wilson(hits, n, z=1.96):
if n == 0: return (0, 0)
p = hits / n
d = 1 + z*z/n
c = p + z*z/(2*n)
m = z * ((p*(1-p)/n + z*z/(4*n*n)) ** 0.5)
return ((c - m) / d, (c + m) / d)
样本不足 20 次时,直接在报告里标注「结果不可靠」。
六家混在一起算平均值,会掩盖最关键的信息。
实际差异极大:有的平台明显偏好结构化网页,有的偏好知乎和公众号,有的对更新频率特别敏感。
分开看,你才知道该往哪个平台投内容。
这是最有价值的字段,也是最容易被忽略的。
它直接告诉你:AI 在拿谁的内容回答这个问题。
如果三个月后引用的是你的官网,说明内容形态对了;如果一直是别人的页面,说明还得改。
这套方案有个根本局限:它依赖网页 UI,所以平台改版就会失效。
我这三个月里遇到过两次大改版,各花半天修选择器。
如果你要做生产级系统,建议:
最后一条最土,但最有效。我靠它发现过两次解析静默失败。
整套东西最后打包成了个 Windows 桌面版(https://yaduoo.cn),纯本地跑,不需要服务器。
但技术方案本身没什么秘密——上面写的这些够任何人自己搭一套。
真正难的不是代码,是坚持每周跑一次、并且诚实地记录那些不好看的数据。
这一步我做得也不好,共勉。
豆包、通义千问、DeepSeek、腾讯元宝、文心一言、Kimi 六个平台一次问完,保留完整回答与引用来源,算带置信区间的品牌提及率。Windows 桌面端,纯本地运行,数据不上传。
下载安装包 访问官网我是芽朵网络科技的倪正东。我们做的工具叫 GEO霸屏系统——就是这篇文章里反复提到的那套方法的产品化版本:
一次提问同时查豆包、通义千问、DeepSeek、腾讯元宝、文心一言、Kimi 六家,
保留完整回答和引用来源,算带置信区间的品牌提及率,7 天环比自动出。
Windows 桌面端,纯本地运行,数据不上传。
如果你也在做这块,或者对文里的方法有不同看法,欢迎留言交流。
相关阅读