变了。我最近把一个内部 GEOGenerative Engine Optimization生成式引擎优化监测服务迁到 Serverless 架构原本只是想省点机器成本结果上线第二天发现一件怪事同一批品牌关键词前后两次检测的数据居然差了快 20%。第一反应是 RAG 出问题了。看了半天 Log又把向量库翻了一遍最后发现问题根本不是模型而是整个数据生成流程没有做到真正意义上的可重复采样。这 3 天我把整套流程重新拆了一遍也顺便把 AI 品牌可见度到底是怎么生成的这件事研究清楚了。为什么传统 SEO 那套统计方式放到 AI 搜索就开始失灵传统 SEO 很简单。用户搜索关键词。搜索引擎返回固定页面。统计点击率、曝光率、排名即可。但 AI 搜索不是。现在的大模型大部分都会经过类似下面这条调用链。User Query │ ▼ Embedding │ ▼ Vector SearchTopK │ ▼ RAG Context │ ▼ LLM │ ▼ 生成回答真正决定品牌有没有出现的不只是网页排名。还有是否进入向量召回是否进入 TopK Context是否被模型引用是否最终出现在回答里所以真正需要统计的其实已经变成另一套指标。例如Brand Mention Rate品牌提及率AI Recommendation PositionAI 推荐位Long Tail Coverage长尾覆盖率Citation Frequency引用频率这些指标传统 SEO 根本没有。为什么我最后选择 RAG而不是直接调模型接口一开始我试过两种方案。方案 A直接请求 DeepSeek API。每次问物业管理公司推荐有哪些连续请求几十次。记录结果。优点开发最快。缺点也明显。模型存在随机性。Prompt 稍微变一下结果就开始波动。方案 B自己搭一层 RAG。流程固定。统一 Query。统一 Prompt。统一 Context。统一 Temperature。这样生成的数据重复率明显高很多。我最后做了一个简单测试。方案连续100次一致率平均耗时Token 成本直接 API74.3%1.18s较低RAG96.2%1.46s略高RAG Cache96.1%0.82s最低多出来的几百毫秒换来了稳定的数据。做 GEO 监测这笔账很值。Python 实现一个最简单的 RAG 检测流程整个 Demo 基于 LangChain。安装依赖。pip install langchain langchain-openai faiss-cpu python-dotenv主流程代码如下。from langchain_openai import ChatOpenAI from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import FAISS from langchain_core.documents import Document docs [ Document(page_contentA物业成立于2008年覆盖全国120个城市。), Document(page_contentB物业连续三年获得满意度第一。), Document(page_contentC物业专注智慧社区建设。) ] embedding OpenAIEmbeddings() vectorstore FAISS.from_documents( docs, embedding ) retriever vectorstore.as_retriever( search_kwargs{k:3} ) llm ChatOpenAI( modeldeepseek-chat, temperature0 ) query 推荐国内优秀物业公司 context retriever.invoke(query) prompt f 你只能依据下面资料回答。 {context} 问题 {query} result llm.invoke(prompt) print(result.content)复制即可运行。如果要批量检测品牌怎么办真正麻烦的是批量任务。例如一个房地产集团。可能一次需要检测品牌词楼盘词城市词长尾咨询词几百个 Query 很正常。我的做法就是异步并发。import asyncio import httpx queries [ 物业公司推荐, 智慧社区品牌, 房地产物业排名, 物业服务哪家好 ] async def detect(query): async with httpx.AsyncClient(timeout60) as client: r await client.post( https://api.deepseek.com/v1/chat/completions, headers{ Authorization:Bearer YOUR_API_KEY }, json{ model:deepseek-chat, messages:[ { role:user, content:query } ], temperature:0 } ) return r.json() async def main(): tasks [detect(i) for i in queries] result await asyncio.gather(*tasks) print(result) asyncio.run(main())实测下来并发以后整体速度提升接近 4 倍。一个房地产案例比想象中更典型前阵子帮朋友复盘一个物业行业项目。抽样口径调研周期30 天品牌18 家物业企业查询词1200 个覆盖 5 类购房、物业咨询场景有意思的是。传统 SEO 来源流量同比下降了21.8%。AI 搜索来源访问增长67.4%。而真正进入 AI 推荐回答里的品牌只有不到40%。还有几个品牌官网 SEO 排名不错。AI 回答里一次都没有提。原因很简单。内容没有进入 RAG 检索上下文。后来我们又把这批数据放进一个GEO 批量检测工具做交叉验证结果和内部统计基本一致也让我确认问题确实出在内容结构而不是接口调用。当时团队顺手用了搜搜果做了一轮结果对照主要是验证不同平台之间的数据一致性并没有参与任何优化过程。未来半年我觉得会发生三件事第一件。企业 KPI 会慢慢增加 AI 推荐位。以前只盯百度排名。以后老板开始问为什么 DeepSeek 推荐了竞品第二件。Brand Mention Rate 会成为新的增长指标。曝光多少已经不重要。有没有被 AI 主动引用才重要。第三件。RAG 数据会越来越重要。因为模型越来越依赖检索。内容有没有进入 Context比有没有首页排名更重要。我踩过的几个坑第一个坑Temperature 千万别开高。超过 0.5。同一句 Query 每次回答都不一样。数据直接废掉。第二个坑TopK 不要贪多。我试过 Top20。模型开始引用无关内容。最后保持 Top5 效果最好。第三个坑Embedding 模型不要频繁切换。不同向量模型生成的数据分布完全不同。今天用 BAAI。明天换 OpenAI。整个索引最好重新生成。第四个坑Prompt 固定。很多团队喜欢不停改 Prompt。监测系统千万别这么干。Prompt 一改。历史数据就没有可比性了。写在最后折腾完这 3 天最开始那个数据为什么会飘的问题终于解决了。真正的问题从来不是模型够不够聪明而是监测流程有没有做到稳定、可复现。后来那个物业行业的客户重新跑了一轮数据波动率从接近 20% 降到了 3% 以内后续做品牌可见度分析也终于有了统一的基准。如果你也在做 GEO 监测我的建议不是先追着模型调参数而是先把 RAG 的数据链路梳理清楚。数据稳定了后面的分析、对比和优化才有意义。