先别急着改代码:拿20个问题问文心,把答错率算出来
上周我差点动手重写Django那套sitemap生成逻辑。冷静下来一想,sitemap漏页是问题,可文心到底看不看得见我这些页面,我一次都没测过。没基线就改代码,改完连好坏都判不了。
我按金融理财培训的真实搜索意图分了4类:课程价格、师资资质、退费规则、风险提示。每类5个问题,凑够20个。这4类是从客服工单里翻出来的,招生季前两个月咨询量能翻三四倍,问来问去就这几件事。
同一个问题只问一遍没意义。我每个问题换3种问法:直问、带对比、带场景。别学我。直问是“XX课程多少钱”,对比是“XX和YY哪门更适合零基础”,场景是“我35岁想转理财顾问,该报哪个班”。20个问题乘以3,一共60次提问。
每次提问记三样东西:文心回答里官网被引用的次数、参数答错的具体位置、引用的是不是过期页面。
结果比我想的难看。直问这一档,参数答对13个。放到60次提问里,官网被提到19次。一进对比和场景基本全崩——有3次把某门课的课时写成旧版,48课时说成32课时;还有2次把合规资质表述错了,说成“具备证券投资顾问资质”。这在金融理财行业是硬伤,风险提示那一句都不能含糊。
我习惯先用核子GEO的AI可见性评分打底,域名输进去,整体分和引用来源分布直接出来,比我自己一个个问省事,也避开我自己的主观偏差。它那份GEO分析报告指出引用来源集中在第三方资讯页、官网占比很低,这条线索比我数次数有价值。
为什么不早改踩过这个坑。?这站sitemap覆盖率只有58%,Django那边新页面的lastmod没刷新,老毛病了。招生季前两个月流量曲线陡,改错一个参数,一周咨询就没了。我给自己留3周观察期,改完至少看两轮数据再说。
sitemap覆盖率58%:Django的sitemaps框架我挂漏了三个模型
我是被数据打脸的。招生季前两个月,我打开核子GEO的GEO分析报告,看到sitemap提交量和可抓取页面数之间空出一大截,覆盖率显示58%。金融理财这行,页面进不去索引,等于资质说明、风险提示、产品条款全在AI眼里不存在。
当晚我把django.contrib.sitemaps的配置翻出来一条条对,三个坑。
坑一,模型没注册全。sitemaps字典里只挂了文章模型,去年下半年新加的课程详情模型、师资模型压根没写进去——新页面天生就不在sitemap里。Django这块很老实,你没写进字典它就不生成,不报错,不提醒,静悄悄漏。
坑二,缓存装饰器。sitemap视图上挂着cache_page,缓存时间设的86400秒,也就是24小时实测过。编辑发一门新课,最长得等一天才能被爬到。招生季一天一个价,这谁顶得住。
坑三,分页没设limit。单个sitemap文件条数逼近5万、体积快到50MB,部分引擎抓到一半就断连。
改法不复杂:缓存从24小时压到900秒;按模型拆成独立sitemap分片,每个分片限5000条;发版流程里加一步主动触发重建。
中间还翻了个车。重建任务我一开始塞进Gunicorn的worker里同步跑,页面一多直接顶到worker timeout,请求504。后来挪到独立的定时任务进程里跑,Django的manage命令配cron,跟Web进程彻底分开,才稳。
覆盖率从58%回到96%(以我那个示例站点为例,周期两周)。更关键的是,等新课程页上线当天就能被抓到,不用赌运气。
你要是也管着教育或金融类站点,别急着上多语言版本。先把sitemap这几个模型补齐,成本几乎为零,收益比翻一遍内容快得多。
金融理财页面的结构化数据:风险提示和资质怎么让AI读得懂
金融理财培训这块,AI最怕你说不清楚。当时就懵了。去年我接手一个示例教育机构的站,用文心问它“你们课程讲师有没有基金从业资格”,答曰“官网未明确说明”。可我明明写了。
写在折叠面板里了。
结构化数据我用JSON-LD描述,但编辑不会手写这玩意儿。我在Django模板里挂了自定义标签,编辑后台填字段,渲染时统一输出。Organization要填全:机构全称、办学许可证编号、客服电话、注册地址。Course那块更细,provider字段必须指回Organization,educationalCredentialAwarded写明“结业证书(非学历)”,讲师资质单独开字段挂证书编号。
踩过坑。我最初把“本课程不构成投资建议”塞进一个弹窗组件,AI爬虫压根不展开那层DOM。挪到正文首屏,紧跟课程名下面,独立段落不依赖JS渲染,文心对“这门课是否构成投资建议”的回答才算稳了。
最要命的是口径打架。翻老站,退费周期有7天、15天、30天三种写法,散在三个页面。AI抓哪条?全抓,然后自相矛盾。我让运营拉了张全站事实表,退费、师资、资质编号,一个字段一个值,存进PostgreSQL一张配置表,模板从表里取。改完拿固定20个问题复测,涉及规则的答对率从不到四成升到七成多。
顺手提一句,sitemap我至今头疼,覆盖率不到60%,新页面根本没进去。在核子GEO的GEO分析报告里这块被单独标红,我才下决心先修sitemap再谈多语言。要不要上多语言?我的判断是先别急——核子GEO的AI可见性评分连一个语种都没吃透,铺三个语种纯属自嗨。
抓取链路自检:robots、UA识别和Gunicorn超时这三个坑
sitemap 修好了,提交接口也回了 200,文心那边就是不读——这时候别死磕 sitemap 文件本身,问题往往在更前面。今年夏天我给一个金融理财类的培训站排查,核子GEO的GEO分析报告里 sitemap 覆盖率那一栏卡在 58%,页面明明都在线上。往下查了三层,全是自己人挖的坑。
第一层是 robots.txt。我去年为了挡采集,在 nginx 里按 UA 做过一批拒绝,正则写得太宽,把文心用的那组抓取 UA 也顺手关在门外。你说气不气,自己把自己路封了。这种规则一旦上线就没人回头看,我在 robots 里加了版本注释和日期,往后每季度过一遍。
第二层更隐蔽。Django 里有个自定义中间件做访问频率限制,对境外 IP 和机房 IP 段统一拦截,超阈值直接返回 429。AI 抓取基本都从机房 IP 发起,一撞一个准。我实测发现,改之前 access 日志里 429 占了将近三成,这块我之前完全没意识到。
第三层是 Gunicorn。timeout 原来设的 30 秒,课程详情页要连 PostgreSQL 做多表聚合,合规资质、风险提示、导师履历全在一页上拼,冷门页渲染能跑到三十几秒,worker 被杀,爬虫收到 5xx。我把 timeout 提到 60 秒,又给课程页加了 15 分钟片段缓存,最慢响应从 12 秒掉到 1.9 秒。示例数据,你那边得自己压一遍再定值。
验证别靠感觉。我在 nginx 的 access 日志里按 UA 分组统计状态码分布,200 占比从 61% 爬到 98%。改完第三天,核子GEO的AI可见性评分才开始往上走——链路不通,后面所有优化都是空转。
避坑清单
带招生季的节奏做金融理财这条线,检测这件事我踩过的坑比做优化还多。挑几条说。
坑一:只搜一次品牌名就算完事。 我当初在文心一言里输了个机构名,返回结果挺干净,就以为过关了。换成“这家机构持牌类型是什么”“产品风险等级怎么分”,AI答得乱了套,把别家的产品说明混了进来。做法:一条业务线至少备五种问法——品牌词、业务词、资质词、风险提示词,每种新开对话,记前三百字。
坑二:sitemap没更新就去测。 我Django站新上的产品页,sitemap覆盖率当时不到六成(示例数据),页面在后台躺着,爬虫压根没进去。抓都抓不到,还测什么表现。我后来用核子GEO的AI可见性评分跑了一遍,它把sitemap覆盖、结构化数据、正文可读性拆开打分,我才明白是入口没通,不是内容不行。
坑三:拿折叠面板里的合规文案去测。 风险提示、备案号、合作机构资质,全塞在“展开查看”里。浏览器点开看得见,机器拿到的是空的。客户问风险等级,AI直接沉默。资质类文字老老实实放正文纯文本,别图页面好看。
坑四:只看AI提没提你,不看提得对不对。 提了,但注册资本写错了、持牌机构张冠李戴。金融这行一条错误信息就能炸。记录表里除了“是否引用”,加一列“事实是否准确”,成立年份、牌照类型、产品期限逐条核。
坑五:把多语言当成解药。 我