2026 年,用户问"推荐个 XX",第一反应越来越是问 ChatGPT / Perplexity,不是搜 Google。如果你的站没被 AI 引擎引用,等于在新入口里隐身。
我这边 Hugo 站 900+ 篇文章,去年做了 GEO 改造,想让 AI 引擎抓得动、愿意引。过程踩了 3 个坑,最要命那个 CF 托管 robots.txt 覆盖的问题,折腾一整天才定位。这篇把全链路复盘,给静态站友一份可复现的清单。
TL;DR
- GEO 不只是"加个 llms.txt"。真正决定 AI 引擎引不引用你的是:AI 爬虫白名单、结构化 Schema、内容可提取度。llms.txt 是辅助。
- Cloudflare 托管 robots.txt 会覆盖你
static/robots.txt,不先在 CF 后台关托管,改 2 天都不生效。- 2026 行业实测(500M+ LLM bot 流量样本):AI 爬虫绝大多数不抓
/llms.txt,直接爬 HTML。所以别指望它提排名。- Hugo 静态站生成
llms.txt+llms-full.txt走模板,不手工维护,一次配好长期受益。- 旧文不改 lastmod(
enableGitInfo不开),改某篇时单独手写lastmod,比开全局自动改更干净。
GEO 和 SEO 到底差在哪?
传统 SEO 目标:Google 排名靠前,用户点蓝链进你站。
GEO(Generative Engine Optimization)目标:让 LLM 在回答用户问题时引用你、摘你、转述你。用户不一定进你站,但你的内容进了 AI 答案。
机制差异很关键:
| 维度 | 传统 SEO | GEO |
|---|---|---|
| 抓取方 | Googlebot 为主 | GPTBot / ClaudeBot / PerplexityBot / OAI-SearchBot / Google-Extended 等 |
| 索引方式 | 传统倒排索引 | RAG 检索 + 生成 |
| 内容消费 | 用户读整页 | LLM 抽段落进上下文 |
| 可见度信号 | 排名位 | 引用率 / 提及率 / 答案采纳 |
RAG 决定了一件事:LLM 提取信息靠结构化。散在段落的数字、结论、对比,它抓不到;表格、列表、明确 H2 问句、FAQ 区,它才能抽出来喂生成。这也是我改造时内容层跟着动的核心原因。
第一步:AI 爬虫白名单,CF 托管是个大坑
GEO 前提:AI 爬虫能进你站。靠 robots.txt 显式 allow 这些 agent:
User-agent: GPTBot
Allow: /
User-agent: OAI-SearchBot
Allow: /
User-agent: ClaudeBot
Allow: /
User-agent: PerplexityBot
Allow: /
User-agent: Google-Extended
Allow: /
User-agent: Applebot-Extended
Allow: /
User-agent: Bytespider
Allow: /
User-agent: Amazonbot
Allow: /
User-agent: meta-externalagent
Allow: /
我踩的第一个坑在这。Hugo 站放 static/robots.txt,构建后推到 GitHub Pages,理论上生效。结果抓了 2 天,线上 https://你的域名/robots.txt 还是 Cloudflare 默认版本,不是我的。
定位过程:
# 抓线上 robots.txt,看返回的是谁
curl -s https://softon.top/robots.txt
# 发现是 CF 托管的默认 robots,不是 static/ 那个
原因:Cloudflare 后台开了托管 robots.txt 功能(CF 侧有"托管 robots.txt"配置项),它会优先返回 CF 那份,覆盖你站点静态文件。我在 Hugo 侧怎么改都没用,因为 CF 在 CDN 层先拦截了。
解法:先去 Cloudflare 后台把托管 robots.txt 关掉,然后改 static/robots.txt 才真正生效。
这一步的教训:CDN 层的配置会盖过源站文件。改静态站 robots 不生效,先查 CDN 有没有托管同类资源(robots、sitemap、404 页都可能被 CDN 劫持)。
第二步:llms.txt 和 llms-full.txt,走模板不手写
llms.txt 是 Jeremy Howard 2024 提的拟议标准,给 LLM 一份"站点内容目录"。我做成两层:
llms.txt:站点结构索引(分类 + 说明)llms-full.txt:全站文章列表(标题 + 摘要 + 日期 + 链接),39KB
这两个不手工维护,走 Hugo 模板生成,不然 900 篇文章根本盯不过来。模板读 Site.RegularPages,按分类聚合成 Markdown 列表,构建时一次性吐出到 public/。
一个反直觉的行业实测要摆出来(免得大家高估它):
2026 年 5 月,Limy 分析 5.15 亿次 LLM bot 流量事件:AI 爬虫几乎从不 fetch
/llms.txt。GPTBot、ClaudeBot、PerplexityBot、OAI-SearchBot、Google-Extended 绝大多数直接爬 HTML,跳过 llms.txt。
也就是说,llms.txt 目前不是 GEO 排名因子。期望"加了 llms.txt 就被 ChatGPT 更多引用"会失望。但它仍是低成本的结构化信号,成本近乎 0,配上不亏。真正提可见度的是下面的 Schema 和内容结构。
llms.txt 必须直接放根路径返回 200,不能 301/302 重定向。PerplexityBot 在 /llms.txt 上不跟重定向,重定向 = 文件不存在。CDN 或子域场景用服务端 rewrite,别用客户端可见 redirect。
第三步:Schema 结构化数据,6 类一起上
LLM 提取信息靠 Schema.org 标注。我在 layouts/partials/head/custom.html 加 6 类:
Article:正文BreadcrumbList:面包屑WebPage:页级Person:作者(我)Organization:站点/机构CollectionPage:列表/分类页
落地验证:首页 ld+json count = 1(只有 WebPage),抽一篇正文 /software/... ld+json count = 2(Article + BreadcrumbList + Organization + Person + WebPage)。用 curl 数 application/ld+json 出现次数就能快速校验。
未来文章够多、FAQ 区够密后,再挂 FAQPage schema——那是长期项,不急。
内容层:为什么 H2 要用问句、结论要进表格
改造不止配置层,内容格式也得跟着 LLM 的提取方式调。我给新文章定的规则(已写进工作流):
- TL;DR 必带:AI 引用 80% 直接抄这段,3-5 条,每条能独立成立
- H2 用问句 / 痛点句:“为什么 X 慢”,不写"性能分析"。AI 匹配用户问句靠 H2
- 对比 / 数据进表格或列表:散在段落里的数字 AI 抓不到
- FAQ 区 5-7 个真实问答:每问 1-3 句答完,为未来 FAQPage schema 留结构
- 第一人称立场:“我实测"“我踩过”,AI 引擎爱引有立场的原创,不爱汇总
这些不是玄学,是 RAG 检索的实际行为:它抽"结论"时优先读 TL;DR,抽"为什么"时优先读问句 H2,抽"数据对比"时优先读表格。
第四步:lastmod 要不要开 enableGitInfo?
一个纠结过很久的决策,给静态站友讲清楚:
- 开
enableGitInfo+frontmatter.lastmod:Hugo 按 git commit 自动刷 lastmod - 问题:我 900+ 旧文基本不再改,lastmod 永远 = date,开了反而每次 build 都乱跳日期,生成无意义的"最近修改"信号
结论:不开(方案 R)。旧文不改,lastmod 就是 date,天然对。未来哪天真改了某篇旧文,单独在那篇 TOML 手写 lastmod = "YYYY-MM-DD",比开全局自动干净。
踩坑复盘:定位那天的三个动作
把当天最耗时的坑复盘成可复用 SOP:
坑 1:CF 托管 robots.txt 覆盖静态文件
定位三连:① curl 线上 robots.txt 看返回体;② 对比 CF 后台有没有托管 robots;③ 关托管再改源文件。
坑 2:git 仓分叉误报
我 Hugo 源站的 origin remote 以前错指到 Pages 仓,每次部署都报"分叉”。处理:git remote remove origin,public/.git 的 remote 保留(Pages 部署链路靠它)。以后部署不再误报。
坑 3:public/ 旧主题残留 + 900+ 文章未跟踪
git 仓定格在建站初期(4 个古老 commit),900+ 文章、Stack 主题、新 config 全未跟踪,public/ 一堆旧主题残留。结论:部署链路根本不靠这个仓的 git,靠的是 public/ 里那个仓 force push 到 Pages,所以不深入整理,链路完好就行。别在非关键链路上耗时间。
常见问题
Q1: llms.txt 真的能提升 ChatGPT 引用吗?
A: 目前不能。2026 实测 AI 爬虫大多不抓它,直接爬 HTML。它是低成本结构化信号,配上无害,但别当排名因子指望。
Q2: 我不用 Cloudflare,robots.txt 改了就生效吗?
A: 多数直连 / 其他 CDN 改了就生效。但要确认 CDN 没托管同类文件。最稳的验证:curl 线上/robots.txt 看返回体是不是你的版本。
Q3: llms.txt 放重定向行不行?
A: 不行。必须根路径直接 200。PerplexityBot 不跟 /llms.txt 的重定向,重定向等于文件缺失。CDN 子域用服务端 rewrite。
Q4: Hugo 站怎么自动生成 llms-full.txt?
A: 写个模板遍历 Site.RegularPages,按分类聚合输出"标题 + 摘要 + 日期 + 链接"到 public/llms-full.txt,构建时吐出。不手工维护。
Q5: enableGitInfo 开了 lastmod 乱跳怎么办?
A: 别开。旧文不改的话 lastmod = date 本来就对。真改了某篇,单独在那篇 TOML 手写 lastmod。
Q6: GEO 改造后多久能看到 AI 引用变化?
A: 没有确定周期。爬虫抓取 + 生成模型都滞后。别盯短期引用率,把它当长期基础设施,配置一次长期受益,别当排名速效药。