首页 / 文章中心

我写了 600 次 AI 查询的自动化脚本,顺手发现了三件反直觉的事

作者:倪正东(GEO霸屏系统) · 更新:2026-11-06 · 阅读约 8 分钟

事情起因很简单:我想知道「客户问 AI 某个问题,我的产品会不会被推荐」。

说明一下:这篇里的方法我都在 GEO霸屏系统(yaduoo.cn)上实操过,数据来自真实跑批,不是二手转述。

手动问了二十几次之后放弃了——六个平台、每个问题要问多遍、还要记录回答和引用来源,效率低到没法坚持。

于是写了个脚本。

一、技术架构:比想象中麻烦

最初的设想很天真:调用 API 拿回答就行。

实际做的时候发现三个问题:

  1. 大部分 AI 平台的开放 API 不支持「对话式推荐」。它们提供的是补全/生成接口,不是用户实际在用的那个对话产品。用 API 拿到的回答,和用户在网页上看到的不一样。
  2. 推荐结果和登录态有关。有些平台登录后会给更详细的推荐列表。
  3. 引用来源只在网页版展示。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))

二、踩过的四个坑

坑 1:回答没加载完就抓取

一开始用 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%。

坑 2:六个平台串行太慢

一次完整批次(6 平台 × 1 问)串行跑要 3-4 分钟。20 个问题跑一遍就是一个多小时。

改成并行(每个平台独立 context),降到 40 秒左右。

注意:并行时不要共用 profile 目录,Chromium 会锁文件。

坑 3:引用来源的 DOM 结构各不相同

这是最耗时的部分。六个平台展示引用来源的方式完全不一样:有的是角标,有的是底部列表,有的折叠起来要点开。

最后放弃了通用选择器,改成每个平台写一个解析函数,同时保留「整页文本兜底」——解析失败时至少还有全文。

坑 4:失败了但不知道

早期没有区分「没提到品牌」和「查询失败」。

这会导致系统性低估——如果某个平台经常超时,它的提及率会被算成 0。

改法:三态记录 hit / miss / error,统计时只用 hit + miss 作为分母,error 单列。

三、三个反直觉的发现

数据跑出来之后,有三件事和我的预期完全相反。

发现 1:平台之间的推荐名单,重合度不到一半

同一句问句,六家 AI 给出的品牌名单,两两比对后平均重合度只有 43%。

有个极端例子:问「成都有哪些做工业除尘设备的厂家」,DeepSeek 给了 4 家,豆包给了 3 家,两份名单一个都不重合。

这说明「在 AI 里排第几」这种说法不成立——你面对的是六套独立系统。

发现 2:企业官网只占 AI 引用来源的 14%

统计所有 AI 标注的引用来源,分布是:

知乎            26%
垂直社区/论坛    19%
企业官网        14%
技术博客/CSDN   13%
新闻媒体        11%
公众号           9%
其他             8%

我原本以为官网至少能占一半。实际不到六分之一。

这条数据解释了一个我一直没想通的问题:为什么有些公司官网做得很好,AI 却完全不知道它。

因为 AI 判断「这家公司值不值得推荐」,主要依据的不是你自己怎么说,而是第三方怎么描述你。

发现 3:同一个问题问五次,答案会变

同一问题在同一平台重复 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,所以平台改版就会失效。

我这三个月里遇到过两次大改版,各花半天修选择器。

如果你要做生产级系统,建议:

  1. 把「提问」和「解析」解耦,解析器按平台可插拔
  2. 保留原始 HTML 快照,解析失败可以回溯重跑
  3. 加一个自检:每次跑完随机抽 1 条人工核对

最后一条最土,但最有效。我靠它发现过两次解析静默失败。

最后

整套东西最后打包成了个 Windows 桌面版(https://yaduoo.cn),纯本地跑,不需要服务器。

但技术方案本身没什么秘密——上面写的这些够任何人自己搭一套。

真正难的不是代码,是坚持每周跑一次、并且诚实地记录那些不好看的数据。

这一步我做得也不好,共勉。

GEO霸屏系统|一次提问,六家 AI 同时回答

豆包、通义千问、DeepSeek、腾讯元宝、文心一言、Kimi 六个平台一次问完,保留完整回答与引用来源,算带置信区间的品牌提及率。Windows 桌面端,纯本地运行,数据不上传。

下载安装包 访问官网

关于作者

我是芽朵网络科技的倪正东。我们做的工具叫 GEO霸屏系统——就是这篇文章里反复提到的那套方法的产品化版本:

一次提问同时查豆包、通义千问、DeepSeek、腾讯元宝、文心一言、Kimi 六家,

保留完整回答和引用来源,算带置信区间的品牌提及率,7 天环比自动出。

Windows 桌面端,纯本地运行,数据不上传。

如果你也在做这块,或者对文里的方法有不同看法,欢迎留言交流。


相关阅读