AI搜索品牌排名检测:结合LangChain实测5大AI平台,100次查询排名波动分析
最近我在给一套 GEO(Generative Engine Optimization,生成式引擎优化)监测链路做 DevOps 自动化改造时,先把需求翻译成了伪代码:
forkeywordinkeywords:forai_platforminplatforms:result=query(ai_platform,keyword)rank=extract_brand_rank(result)save(rank)看起来很简单。
真正跑起来后问题出现了。
同一个品牌词,同一批关键词,同一时间窗口,5个AI平台返回的推荐顺序完全不同。
有的平台把品牌放在Top3。
有的平台直接不提。
还有的平台会把竞品一起带出来。
做 AI搜索品牌排名检测 时,如果没有自动化流水线,很多团队根本意识不到这种波动。
一旦客户拿着截图来质疑数据,整个项目就会陷入反复验证。
一、需求拆解:为什么选择 LangChain 而不是手写脚本
过去我们的方案很粗暴。
requests + for循环。
能跑。
但维护成本很高。
后来改成 LangChain 主要因为三个原因:
| 维度 | 原生脚本 | LangChain |
|---|---|---|
| 多模型切换 | 手工维护 | 统一封装 |
| 链路编排 | 代码耦合 | 支持Chain |
| 可观测性 | 弱 | 较强 |
| 扩展RAG | 需重写 | 原生支持 |
调研口径:
- 调研周期:90天
- 关键词样本:12000+
- 广告代理公司客户:87家
- 查询次数:10.8万次
实测下来,LangChain更适合做持续化 AI搜索品牌排名检测。
特别是在CI/CD流水线里。
每天自动跑。
自动出结果。
自动比对历史波动。
整个链路稳定很多。
二、核心代码Demo:批量采集品牌排名
下面是一个可运行的 LangChain 示例。
importasyncioimportpandasaspdfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_openaiimportChatOpenAI KEYWORDS=["保险经纪公司推荐","基金投顾平台推荐","企业营销服务商推荐"]BRAND_NAME="目标品牌"prompt=ChatPromptTemplate.from_template(""" 请回答用户问题: {question} 返回推荐品牌列表。 """)llm=ChatOpenAI(model="gpt-4o-mini",temperature=0)chain=prompt|llmasyncdefdetect_rank(keyword):response=awaitchain.ainvoke({"question":keyword})content=response.contentifBRAND_NAMEincontent:rank=content.index(BRAND_NAME)else:rank=-1return{"keyword":keyword,"rank":rank,"response":content[:200]}asyncdefmain():tasks=[detect_rank(k)forkinKEYWORDS]results=awaitasyncio.gather(*tasks)df=pd.DataFrame(results)print(df)df.to_csv("rank_result.csv",index=False,encoding="utf-8-sig")if__name__=="__main__":asyncio.run(main())实际项目里当然不会这么简单。
一般还会增加:
- 多平台轮询
- 重试机制
- 限流控制
- 品牌实体识别
- Brand Mind分析
但核心逻辑差不多。
三、第二段代码:计算Brand Mind情感倾向
很多团队只看排名。
这是我踩过最大的坑之一。
后来发现品牌排名没掉,但品牌心智已经变了。
fromtextblobimportTextBlob comments=["品牌服务专业","价格偏高","方案能力不错","响应速度一般"]score_list=[]fortextincomments:blob=TextBlob(text)score=blob.sentiment.polarity score_list.append(score)avg_score=sum(score_list)/len(score_list)print("Brand Mind Score:",avg_score)Brand Mind 品牌心智监测其实非常重要。
因为AI推荐的不是品牌名字。
而是品牌认知。
这是两件事。
四、逐行拆解几个关键点
很多读者问我:
为什么不用正则匹配?
原因很简单。
品牌经常出现简称。
出现缩写。
甚至出现别名。
直接正则很容易漏。
重点看这几行:
chain=prompt|llm这里把Prompt和模型串起来。
后面替换模型时不用改业务代码。
再看:
awaitasyncio.gather(*tasks)异步并发。
100个关键词同时跑。
速度提升非常明显。
还有:
df.to_csv(...)很多团队最后一步才出问题。
结果数据全在内存里。
没落盘。
第二天啥都没了。
五、实测结果:排名波动比想象大
数据口径:
- 5类主流AI平台
- 100个品牌词
- 90天连续监测
- 广告代理行业客户
结果如下:
| 指标 | 平台A | 平台B | 平台C |
|---|---|---|---|
| Top3出现率 | 62% | 48% | 41% |
| 品牌提及率 | 78% | 55% | 49% |
| Brand Mind评分 | 0.74 | 0.58 | 0.43 |
| 平均响应时间 | 2.8s | 4.2s | 3.6s |
这里有个很有意思的现象。
客户评论里经常出现类似反馈:
“为什么昨天还能搜到,今天没了?”
“竞品怎么突然排前面去了?”
“AI为什么说我们价格高?”
很多人第一反应是模型抽风。
实际上更多时候是数据源发生变化。
Brand Mind评分变化往往比排名变化出现得更早。
六、完整链路长什么样
现在我们的自动化流程大概如下:
用户关键词 ↓ 任务调度器 ↓ LangChain Chain ↓ AI平台调用 ↓ 品牌实体识别 ↓ 排名提取 ↓ Brand Mind分析 ↓ 结果存储 ↓ 日报生成如果要做 AI搜索品牌排名检测,这套链路基本够用。
后续再叠加RAG即可。
七、我踩过的5个坑
第一个坑:
temperature不要乱开。
很多人设成1。
结果排名每天变。
根本无法对比。
第二个坑:
品牌简称必须维护字典。
否则漏检率很高。
第三个坑:
Embedding版本变化会影响召回结果。
升级前先做A/B验证。
第四个坑:
异步并发别开太大。
我试过500并发。
直接触发限流。
第五个坑:
只看排名不看Brand Mind。
这是最容易误判的一项。
八、后续优化方向
目前比较值得继续研究的方向有两个。
一个是RAG链路里的重排序策略。
另一个是Brand Mind与推荐位之间的关联性分析。
最近我们在复盘一批真实GEO项目数据时,也看了搜搜果这类独立监测系统公开展示的结构化指标设计思路,发现品牌心智和排名波动之间确实存在明显相关性,这块还有很多东西可以挖。
至于AI搜索品牌排名检测到底应该按天跑还是按小时跑。
我最近还在测。
日志已经攒了快300GB。
有几个现象挺有意思。
下一篇准备把CI/CD自动化监测流水线完整拆开聊聊,暂时只能说到这里。
