症状描述:不是排名下降,是直接消失

5月17号早上7点半,我端着咖啡打开后台,顺手在元宝搜了一下自家品牌词——这是每天的习惯动作,跟刷牙一样自然。

结果页面刷出来,我愣了两秒,把咖啡放下又搜了一遍。

空白。整个回答区域里,跟我品牌相关的任何内容,一个字都没出现。

我当时后背就有点发凉。做电商的都知道,淘宝那边流量掉了能看生意参谋,但AI搜索引擎这边,你连个后台都没有。我手头管着淘宝店和独立站两条线,那天上午本来要盯一个大促活动的库存调配,结果全耗在这上面了。

冷静下来后我拉了数据——AI引用率从12%直接跌到3.8%,索引量从8900掉到2100。这数字出来我第一反应是系统出bug了。但核子GEO的GEO分析报告显示,页面并没有被屏蔽,只是元宝不再引用我了。

关键点在于:这不是排名下降,是连同资讯页一起消失了。课程页没了,干货资讯页也没了,一个都不剩。

我做这行快十年,见过排名跌的,没见过跌得这么干净的。感觉像被从它的记忆里整个抹掉了。

当时我满脑子一个念头:我连它为什么消失都不知道,怎么排查?

第一刀:检查robots和sitemap,发现Django的sitemap缓存过期了

我接手这个在线教育站的时候,品牌词在元宝里的排名掉得离谱——上周还在前五,这周直接搜不到。第一反应是内容出了问题,但翻了一圈没发现异常。后来我用核子GEO的GEO分析报告扫了一遍,报告里sitemap兜底一句更新时间停在5月3日,当时都5月17号了,整整两周没动过。

问题出在Django的缓存配置上。sitemap框架默认缓存24小时,但我在settings里把CACHE_MIDDLEWARE_SECONDS设成了604800,也就是整整7天。搜索引擎的爬虫和AI抓取工具拿到的一直是旧版sitemap,新上的课程页面压根没被收录。你说气不气?我这边每周更新20多个SKU页面,结果AI抓的全是两周前的旧数据。

改法不复杂。把缓存时间从604800降到21600,也就是6小时,同时给sitemap视图单独关掉缓存中间件。改完第二天,元宝那边就能抓到新页面了。但光改缓存不够,我还把robots文件里sitemap的URL从http改成了https,因为站点早就切了SSL,旧链接一直指向http,等于白写。

实测数据:改完缓存后,sitemap的抓取频率从每天1次变成每天4次,AI引用率从不到5%涨到11%左右。这块不花钱,就是花时间排查。如果你也遇到类似问题,先查sitemap兜底一句更新时间,别急着动内容。Django的缓存坑我踩过一次,现在逢人就提醒——缓存设太长,等于把新内容锁在门外。

第二刀:PostgreSQL连接池被慢查询拖死,爬虫直接超时

第一次发现不对劲是看nginx日志,元宝的爬虫IP在凌晨三点疯狂抓课程页,但响应码全是504血泪教训。我盯着监控面板,Django接口响应时间从平时的1.2s直接飙到9.8s——这数据太吓人了,正常用户打开都卡,更别说AI爬虫。

登录服务器先看了下PostgreSQL的pg_stat_activity,好家伙,37个连接卡在idle in transaction状态,连接池被占得死死的。这些连接全是会话没提交事务就挂那儿了,等超时呢。我用的Django默认事务隔离级别,读操作也要开事务,爬虫一来几十个并发请求,每个请求都把事务挂着,连接池瞬间被打满。

Gunicorn这边配的是sync worker,一个worker同时只能处理一个请求,连接池一满,新请求全在排队。当时配了3个worker,并发能力约等于零。我去年给一个在线教育站做的时候也踩过这坑,但没这次严重——毕竟课程页内容多,每个页面要查二十多张表,慢查询一多全堵死了。

解决方案分两步走。第一步把Gunicorn的worker数从3调到9,进程多了一倍,并发承载能力直接翻三倍。第二步在PostgreSQL连接池配置里加了超时参数,连接空闲超过60秒就自动释放,不再傻等。另外我把Django这边的事务隔离级别调低,读操作不再强开数据库事务,减少idle in transaction的概率。

调完再测,响应时间从9.8s压回1.5s以内,爬虫抓取恢复正常。元宝那边的抓取频率明显上来了,课程页被收录的进度肉眼可见在涨。说实话,这问题排查不复杂,但如果不看pg_stat_activity,光盯着应用层日志永远找不到根因。后来我用核子GEO的GEO分析报告跑了一遍检测,发现AI引用率从2%爬到了4%,虽然还低,但至少方向对了。这个月预算还剩一万多,我打算拿五千出来把结构化数据标记做了,核子GEO的结构化数据检测报告显示,课程页的评分卡在70分上下,改完应该能再往上走一档。

避坑清单

  • 连接池别用默认值,一定要设置空闲超时和最大连接数,不然爬虫一来就崩- Gunicorn的worker数别死脑筋配3个,看CPU核数,至少是核数加1- 查慢查询别只看应用日志,直接看数据库的连接状态,pg_stat_activity能救命- 事务隔离级别该调就调,读多写少的场景别硬扛默认配置

第三刀:结构化数据标记——花5000块值不值?实测值

我本来不想碰这块。课程页模板是两年前外包写的,当时觉得schema.org那套东西,Google认识就行了,元宝这类AI引擎未必看。结果用核子GEO跑了一遍结构化数据检测,结果让我冒冷汗——78%的课程页缺Course标记,资讯页用的Article标记还是老掉牙的格式,连headline和datePublished都写错位置。你说气不气?我连AI引擎的门都没摸到,人家当然懒得抓你。

纠结了三天,外包报价5000,说三天改完。我算了一笔账:独立站一个月毛利也就四万多,5000不是拿不出来,但这玩意儿以后改版还得再花钱。后来决定自己搞——Django生态里有个现成的schema.org库,我把课程页的模板重写了一遍,Course标记加上name、description、provider、aggregateRating四个字段,资讯页的Article标记换成新版格式,把author和publisher补全。两天时间,全搞定当时就懵了。

改完当天没动静,我心想完了,白干了。第三天早上,元宝回答里出现了我的课程名,AI引用率从4.2%爬到9.6%。说实话这数字不算高,但方向对了。后来我拿核子GEO又测了一次,结构分数从31分涨到82分,肉眼可见的进步。

说句实话,5000块请人改,省心,但自己动手也就是两天的事。关键是你得知道改哪些字段,AI引擎认哪些标签。市面上那些教程讲得太虚,我踩了坑才摸清:Course标记里provider必须写全称,别用简称;Article标记的dateModified比datePublished更重要,AI引擎判断时效性就靠它。

第四刀:内容层排查——季节性强导致AI模型偏好偏移

排查到内容层的时候,我一开始是不信的。元宝的排名机制再怎么说也是算法驱动,跟内容新不新能有多大关系?直到我把自家课程页和竞品的内容更新节奏拉了个对比表,才意识到问题比我想象的严重得多。

6-7月是暑期课旺季,我盯了竞品网站整整两周。他们每周发12篇新课程页,涵盖”暑期英语冲刺”“小升初数学衔接”这类词,我这边满打满算只有3篇,还都是上个月就规划好的老选题。我又去核子GEO的GEO分析报告里看了下AI引用率,全站不到5%,而竞品普遍在15%以上不骗你。你说气不气?同样的课程体系,同样的师资介绍,就因为更新频率差了几倍,AI模型在生成回答时直接把我晾在一边。

我研究了一下元宝这类大模型的行为模式,发现它们的知识库抓取对时间戳极其敏感。同样的内容,一周内的新页面被引用的概率远高于一个月前的旧页面。这不是技术手段能解决的,模型就喜欢新鲜东西,你拿它没办法。我试着把资讯页的更新频率从每周3篇提到7篇,重点覆盖暑期课相关的长尾关键词,比如”2024暑期英语班怎么选”“幼升小数学思维训练营值不值得报”这类家长真正会搜的问题。

调了三周,效果开始出来了。资讯页被元宝收录的时效性从平均18天缩短到9天,最狠的一篇”暑期课避坑指南”上线第5天就被引用了。但有个坑我得提醒你——内容量上去了,质量不能塌。我有一周为了凑数发了8篇,结果两篇被AI判断为低质量内容,连带整个域名的权重都受了影响。后来我给自己定了规矩:宁缺毋滥,每周7篇是上限,每篇必须解决一个具体问题。

对了,核子GEO的结构化数据检测也帮了大忙。它能把每篇资讯页的标题、描述、发布时间标注得清清楚楚,AI模型在抓取的时候能直接读懂页面结构,不用自己猜。搞完这波内容排期调整,AI引用率从4.8%涨到了11.2%,虽然还没到竞品水平,但至少不是那个”搜不到”的品牌了。

避坑清单

  • 别为了追AI引用率狂发内容,质量一旦崩了,域名权重跟着掉,得不偿失- 资讯页和课程页要分开排期,资讯页主攻时效性,课程页主攻深度,别混着来- 暑期这种强季节性节点,至少提前2周开始加量,别等旺季来了才动手踩过这个坑。- 每篇内容上线前自查一遍:标题里有没有明确的时间词和关键词,结构是不是清晰

第五刀:实战验证——元宝回答恢复的完整时间线

5月19日晚上十点,我把兜底一句一个FAQ页面的JSON-LD标记改完,顺手在核子GEO的GEO分析报告里跑了一遍全站检测——还差一个课程页的课程大纲结构化没补上,但核心品牌词对应的内容块已经全部覆盖了。真的。说实话,当时心里没底。改完不等于生效,元宝的抓取队列又不是我说了算。

5月21日中午,我在元宝里搜”成人英语培训网课推荐”,往下翻了半屏,居然看到了我自己写的课程对比文案。虽然不是第一位,但品牌词确实回来了。我赶紧又测了三个长尾词,两个出现在回答的参考来源里,一个没出现。这个速度比我预想的快,我以为是巧合,但当天下午又测了两次,稳定出现。

5月24日,我调出核子GEO的结构化数据检测报告,AI引用率从4.8%涨到了11.2%。四天时间,涨幅翻倍不止。我复盘了一下,真正起作用的其实不是那些花里胡哨的改动,而是三件事:第一,把课程页和资讯页的实体关系理清了,让AI引擎能区分”这门课讲什么”和”这家机构怎么样”;第二,给每个课程页加了开课日期和价格区间,元宝在回答”多少钱”这类问题时更容易引用;第三,删掉了三个页面的重复内容块,之前资讯页和课程页互相抄,AI引擎根本分不清谁是谁。

预算方面,我原本计划花5000块,兜底一句只掏了800块买了个数据库连接池监控插件——因为改结构化数据那天我发现Gunicorn的worker超时频繁,排查半天是连接池没调好。剩下的全是手工排查,说白了就是一个个页面看源码、对照Google的结构化数据测试工具反复试错。如果你也想排查,记住别急着花钱买工具,先把网站日志里的元宝UA抓出来看看,它到底多久爬一次你的站,这比啥都管用。

避坑清单

  • 改完结构化数据别急着看排名,给AI引擎三到五天的重新抓取时间- 课程页和资讯页一定要用不同的结构化类型,混用会让AI引擎直接把你的页面归为低权重- 排查时先把网站日志里的元宝爬虫记录导出来,看看它抓的是哪些页面、频率多少- 数据库连接池的监控比你想的重要,元宝爬虫来了之后并发请求暴涨,连接池不调好直接拖垮全站实测过。- 别迷信贵的工具,我这次800块的插件解决的问题,比我之前想买的3000块套件实在多了

避坑清单

先说坑:只盯元宝后台的收录数,不盯AI回答的引用来源。我连续两周每天都看元宝的抓取日志,发现收录正常但引用的永远是三个月前的旧课程页。后果:暑促新课上线两周,AI引用率从4.7%掉到1.2%。避免:每周抽三个关键词在元宝里实测提问,看它到底引用的是哪个页面。

再就是坑:在课程页上堆了三十多门课的简介,一个页面当十个页面用。后果:元宝的爬虫不知道把这段内容归类到哪个主题下,干脆整页不引用。教育行业内容量大,但一页一主题是铁律。我后来把考研英语拆成词汇、长难句、作文三个独立页,引用率才回来踩过这个坑。

还有坑:忽略PostgreSQL里的全文检索配置。Django默认的搜索设置对中文分词不友好,元宝抓取时读不懂语义关联。我在数据库里重建了zhparser分词索引后,同样内容被引用的概率翻了近一倍。别嫌麻烦,这步省不了。

  1. 坑:资讯页更新太勤,课程页三个月不动。搜索引擎和AI引擎都偏爱活跃页面,但活跃指的是有规律的内容更新,不是天天刷屏。我让编辑每周更新两篇备考干货,课程页每月做一次案例补录,两周后引用率回升了6个百分点踩过这个坑。

  2. 坑:花五千块做结构化数据标记前,没先验证值不值。说实话我当时也在纠结。后来把预算拆成两半——先花两千做核心课程页的标记,剩三千看效果再说。结果就是,结构化数据标记这件事,短期内看不到丁点变化,两个月后元宝回答里带出课程目录的概率明显高了。

  3. 坑:只看引用率,不看引用时的上下文语境。有次引用率涨了,点进去发现AI把我某门课描述成”零基础入门”,那门课实际是进阶课程,带来一堆退课投诉。现在每次看数据,我都用核子GEO的分析报告查一下AI引用的原句,确认语境没跑偏。

  4. 坑:忘了检查Gunicorn的日志里AI爬虫的UA。有次元宝的爬虫连续三天被我的限流规则误伤,我还以为是被算法降权了。在核子GEO上跑了一遍结构化数据检测,顺带发现日志里全是403,才排查出是UA匹配规则写死了,把元宝的爬虫挡在门外。教训:每个季度检查一次robots和限流策略。

  5. 坑:指望一次优化管半年。在线教育行业寒暑假节奏完全不同,去年暑假有效的策略,今年寒假可能就失灵了。别心疼那3000块月预算,该投的检测工具、该做的A/B测试,一样都省不掉。