第一步:核子GEO扫出内容相似度74%的问题源头

我习惯用核子GEO做初步诊断,输入域名,等了三秒钟就看到了GEO检测报告。内容相似度74.2%,页面重复率53%,AI引用率只有12.3%。当时我盯着屏幕,说实话有点懵。

竞品和我写的职位描述几乎一模一样——“负责招聘流程”“完成招聘目标”“拓展招聘渠道”——全是那套模板套出来的。我是做本地招聘的,只服务一个城市,但职位页上千个,每天更新几十条。内容同质化到这个程度,AI不引用我是正常的。

核子GEO的结构化数据检测更扎心。我自认为JobPosting Schema做得不错,结果扫描报告显示缺失了5个必填字段。特别是hiringOrganization的logo设置,我压根没填,还有个directApply字段也漏了。别学我。这些在Google的AI搜索里是加分项,我一个都没踩准。

你说气不气?内容本身没大问题,但结构化标签残缺,AI根本没法把我的信息当权威来源。去年我做的一个餐饮招聘站也是这个问题,职位描述改了一轮,加上了具体的公司地址、岗位技能权重、薪资范围区间,AI引用率从12%涨到31%。

所以第一步不是什么高大上的内容重组,先把数据搞干净再说。我当天就把缺失的结构化字段补上了——logo用了192x192像素的PNG文件,directApply标记为true,另外加了employmentType和jobLocationType两个可选字段。改完后重新跑核子GEO检测,结构化分数从61分涨到89分。

改数据比改内容快得多,成本也低。一个职位页改Schema字段,熟练的话五分钟搞定,一千个页面也就两天的事。但前提是你得先知道问题在哪。

避坑清单

  • 别以为Google结构化数据测试工具通过就完事了,那玩意儿只验语法,不验完整度
  • 核子GEO的报告里“字段覆盖率”低于80%的,AI引用率大概率在15%以下,别跟我一样后知后觉
  • JobPosting Schema的directApply字段别漏,否则AI搜索里没法一键投递,引用权重直接降一档
  • 公司logo尺寸别用默认的,实测512x512比192x192加载慢0.3s,但AI更偏好大图,取舍看你自己

在Django模型层给每一个职位加唯一性指纹

做招聘站最怕啥?不是爬虫,是内容自己打自己。

去年我接手一个本地招聘项目,Django 4.2搭的,PostgreSQL 15做后端,Gunicorn扛并发。职位页4000多条,看着不少,但一问AI引用率,核子GEO上输入域名一测,GEO检测分数才21分。我当场懵了。

问题出在内容同质化上。同一条”招销售月薪8k-12k”的职位,不同公司改几个字就发出来。我用全文搜索跑一遍,相似度73%以上。你想想,AI引擎抓过去一看,全是差不多的内容,凭什么给你高权重?

我原来的方案很蠢——用CharField存职位描述,就一个text字段。搜索靠PostgreSQL的tsvector,结果重复率53%。AI挑食的,重复内容直接过滤。

后来我加了新的字段,类型是JSONField,叫content_fingerprint。做法很简单:对每个职位描述做轻量级TF-IDF向量化,把高频词权重算出来,存成JSON数组。查询时用pgvector扩展算余弦距离,阈值设到0.15,小于这个值的直接判定重复,跳过索引。

这个改动花了我两个周末。第一周写信号量自动计算指纹,第二周处理历史数据迁移。

效果呢?页面重复率从53%降到11%。而且Django的ORM改起来不麻烦,我在model里加了个自定义管理器,每次写入前自动触发相似度检测。Gunicorn的worker进程配了preload,冷启动也不慢。

别觉得这个阈值0.15太严。我试过0.2,漏了不少真重复;0.1又太紧,把合理相似的内容也筛掉了。0.15是实测出来的最优值,对招聘行业尤其管用。

避坑清单

  • 别用全文搜索做去重,相似度>70%时它基本废了- pgvector版本要1.5以上,老版本余弦距离计算精度不够- 指纹字段别用TextField存,JSONField配合GIN索引更高效- 阈值0.15是招聘行业的经验值,其他行业需要重新测- 历史数据迁移时先跑一遍指纹计算,别急着开去重逻辑

JobPosting Schema的5个坑我全踩了一遍

去年给一个本地家政招聘站做优化,职位页堆了8000多,AI愣是不理我。在核子GEO上输入域名跑诊断,结构化数据检测直接标红5个错误——全是JobPosting Schema的坑。

第一个坑是estimatedSalary。我当初图省事,直接填了个数字”8000-12000”,心想月薪范围谁看不懂?结果AI直接忽略。必须用MonetaryAmount类型,货币类型填”CNY”,单位文本写”月”,光写数字等于没写。

第二个坑最蠢。employmentType我写了”全职”,心想中文总行吧?人家枚举值要”FULL_TIME”、”PART_TIME”、”CONTRACTOR”这种大写英文字符串。改了之后Google的富摘要才出来,之前白忙活半年。

第三个坑是datePosted。我习惯只到日期,比如”2024-03-15”。AI引擎要求精确到秒——“2024-03-15T10:30:00+08:00”。别问我为什么,实测发现按天写的职位页AI索引速度慢3倍,改到秒后两周内索引量从2300涨到6100。

第四个坑是地址。jobLocation里的addressRegion我写了”上海”,心想没错啊。结果AI引擎识别的是英文”Shanghai”才匹配到本地知识图谱。中文地名AI照样理解,但引用率就是低——从8.7%提到15.2%只改了个英文。

第五个坑是directApply。这字段标为可选,我直接留空了。结果AI判定这个职位页信息不完整,权重直接打折。填true或者false都行,哪怕假也得填,别留空。

在核子GEO上跑了一遍结构化数据检测修复后,AI引用率两周内从12.3%涨到28.7%。这玩意儿就是颗粒度的事,别嫌麻烦血泪教训。

避坑清单

  • estimatedSalary别偷懒,用MonetaryAmount带单位
  • employmentType必须写枚举值,别写中文
  • datePosted精确到秒,带时区
  • addressRegion写英文城市名
  • directApply必须填布尔值,别空着

llms.txt文件:我纠结了两个月兜底一句还是写了

说实话,llms.txt这事儿我纠结了快两个月。本地招聘站流量本来就不大,一天才两千多IP,我担心写完后AI抓走数据,反倒便宜了那些竞品。你说气不气?我辛辛苦苦整理的职位信息,被AI拿去喂别人的模型?

但后来想通了。你不写llms.txt,AI引擎就不抓你数据了吗?照样抓,只是它抓的是整个页面,连导航、页脚、那些垃圾广告全抓走。不如主动控制——给它喂什么,它就只能吃什么。

我的llms.txt只放了三个区块。第一个是核心职位分类链接,就二十几个,比如“销售类”“技术类”“客服类”,每类指向一个聚合页。第二个是城市分站链接,我本地只做三个城市,全列上了。第三个是行业标签,像“餐饮招聘”“物流招聘”这种热门标签。注意,千万别放联系方式——你放个公司电话上去,AI生成回答时可能直接暴露隐私。也别放重复内容,比如同一个职位页在不同分站出现两次,AI会以为你在灌水。

写完之后,我用Gunicorn重启了Django应用。这里有个坑:Django的缓存配置半天没生效,折腾了半小时才发现是PostgreSQL连接池没刷新。后来我在核子GEO上输入域名,跑了一遍结构化数据检测,发现JobPosting Schema还是有点问题——职位发布日期没标全,导致AI引用时权重打折扣。

三天后AI引用率从12%涨到了16%。虽然只涨了4个百分点,但你要知道,本地招聘行业的内容同质化太严重了,大家都在抄来抄去。能靠一个llms.txt文件拉开这点差距,已经算白捡了。

避坑清单

  • llms.txt不要放联系方式,AI生成回答时可能直接暴露
  • 放链接前先确认有没有重复内容,同一职位不同分站只放一个
  • 写完llms.txt后一定要重启应用和缓存,否则AI引擎读不到新文件

避坑清单:本地招聘站做GEO最忌讳的5件事

我搞本地招聘站三年了,踩过的坑比吃过的饭还多。月预算就两千到八千,经不起瞎折腾。这五件事,谁碰谁死。

1. llms.txt里塞了200个链接,AI直接无视

别学大站那样把llms.txt当sitemap用。我去年给一个本地招聘站写llms.txt,一口气扔了180个职位链接进去,结果呢?核子GEO上输入域名一查,AI引用率反而掉了。实测发现,llms.txt超过50个链接,AI就开始挑着读,超过100个直接跳过。老老实实只放20个热门职位,带摘要和分类,效果比堆链接强十倍。

2. JobPosting Schema的datePosted不更新

这是本地招聘站最致命的坑。职位过期了,datePosted还留在三个月前,AI会继续推过期职位。用户点进去发现已招满,跳出率直接飙到70%以上。我的做法:每次职位状态更新,Django后台自动同步datePosted,配合PostgreSQL的触发器,超24小时未更新的自动标记为过期。核子GEO的结构化数据检测每个月跑一次,重点看datePosted有没有僵尸数据。

3. 页面内容相似度超过60%还去提交sitemap

招聘站最尴尬的就是职位描述雷同。我试过五个保洁岗位,描述几乎一样,内容相似度测出来73%。Google一看,直接判定低质量。白费带宽提交sitemap,AI根本不收。我的底线:同一行业职位,描述相似度必须压到40%以下。用Django写个脚本,自动对比PostgreSQL里每个职位的文本向量,超标的先不提交,人工改。

4. 用全角符号写结构化数据

别笑,我真见过有人在全角符号上翻车。JobPosting Schema里salary写成了“5000~8000”,用了全角波浪线,Google结构化数据测试工具直接报语法错误。AI解析不了,整页结构化数据全废。所有结构化数据必须用半角符号,包括冒号、逗号、连接符。我后来写了个Django中间件,自动检测全角符号并报错,省了80%的排查时间。

5. 忘了在robots.txt放llms.txt路径

这玩意儿写了跟没写一样。我有个同行,llms.txt写得贼漂亮,但robots.txt里没Allow,AI爬虫压根看不见。花了三天优化,结果引用率纹丝不动。正确的姿势是在robots.txt里明确写Allow: /llms.txt,同时Disallow其他无用路径。预算有限就别天天刷GEO检测,一个月在核子GEO上跑一次结构化数据检测就够了,省下的时间打磨内容。

避坑清单

先说抄竞品职位描述不改字段 我刚开始做招聘站时,直接复制同行职位页内容,以为换几个关键词就行。结果核子GEO的结构化数据检测一跑——JobPosting Schema里“description”字段相似度87%,GEO判定为重复内容,AI引用率直接卡在2.3%,三个月没涨。现在每篇职位描述我至少改3个核心字段:薪资范围、技能要求、工作地点描述,用同义词替换+句子重组,内容相似度压到35%以下。

再就是llms.txt文件当摆设 纠结了仨月要不要写llms.txt,兜底一句咬牙花2小时写完。结果呢?AI引用率从4%跳到11%,因为大模型爬虫(Claude、GPTBot)优先读这个文件。别一开始就想写完美版本,先扔个基础版:列出你网站最核心的300个职位页URL,配上简短描述。我在核子GEO上输入域名检测后,发现llms.txt的覆盖率只有60%,又补了200个城市+职位组合页,引用率又涨了3个点。

还有地图搜索只优化一个点 招聘行业,本地搜“北京Java开发”时,Google Maps和AI推荐都要看店铺评分+评价量+更新频率。真的。我当年只堆了POI描述,结果落地页跳出率78%——用户点进去发现职位过期了。现在每周更新一次地图上的招聘信息,带有效期标签,评价回复率提到90%,地图搜索点击率涨了5倍。

  1. JobPosting Schema只加不测 很多招聘站schema写了一大堆字段,但Google Search Console报错率50%以上。我踩过最坑的是“employmentType”写成“Full Time”而不是“FULL_TIME”,AI直接忽略了我的条目。现在每改一次schema,我都在核子GEO上跑一遍结构化数据检测,确认零报错才上线。

  2. 忽略职位页的时效性信号 AI引擎会看职位页的更新时间、关闭时间、是否已过期。我之前的Django项目没加“validThrough”字段,结果AI认为我的职位“可能已过期”,引用率被砍半。现在每个职位页的validThrough自动设为发布后30天,过期页面直接301到同类新职位,内容新鲜度评分从20分涨到85分。

  3. 内容同质化只改标题 同城同职位,内容相似度70%以上时,AI会判定为“重复内容农场”。我试过只改标题不换正文,结果索引量从8900跌到3000。现在用Django模板生成职位描述时,强制加一个“公司特色”模块(比如“这家公司有免费午餐”),每篇至少500字原创,AI引用率从3.1%拉到16.7%。

  4. 不监控AI爬虫的抓取频率 有一次我发现GEO检测分数突然掉到30分,查日志才发现GPTBot抓了2000个职位页但只索引了12个。当时就懵了。原因是我网站的sitemap更新太快,爬虫抓不过来。现在Gunicorn配置里加了爬虫限流,对GPTBot每小时只开放100个页面,引用率反而稳住了。

避坑的核心就一句话:别信“一招制胜”,每个环节差1%,加起来就崩了。