ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

GEO 实战指南:用 robots.txt 和 llms.txt 让 AI 搜索引用你的网站

GEO 实战指南:用 robots.txt 和 llms.txt 让 AI 搜索引用你的网站

1. 先搞清楚 GEO 到底在解决什么问题

1.1 从 SEO 到 GEO:搜索入口变了,规则也变了

过去十几年,大家做网站流量基本围绕一个核心逻辑:让搜索引擎爬虫抓取页面、建立索引、然后根据关键词相关性给出排名。这套玩法叫 SEO,从业者研究的是标题标签、外链、关键词密度、页面加载速度这些东西。但从 2023 年开始,搜索的入口发生了肉眼可见的迁移——越来越多的用户不再打开传统搜索框,而是直接问 AI。

你问 AI 一个问题,它不会给你十条蓝色链接让你自己点,它会直接给你一段整合过的答案。这个变化对网站运营者来说意味着什么?意味着你的网站可能内容质量很高、传统搜索排名也不错,但 AI 在生成答案时压根没引用你。流量就这么悄无声息地流失了。

GEO 这个概念就是在这个背景下被提出来的。它的全称是 Generative Engine Optimization,中文一般叫“生成式引擎优化”。和 SEO 最大的区别在于:SEO 的目标是“让搜索引擎把我的页面排到前面”,GEO 的目标是“让 AI 在生成答案时引用我的内容作为依据”。前者争的是排名位置,后者争的是被引用权。

这两个目标的实现路径完全不同。SEO 时代你堆关键词、买外链可能还有效,但 AI 模型在生成答案时,它看重的是内容的可信度、结构清晰度、语义完整度,以及你的网站是否对 AI 爬虫友好。你关键词堆得再多,AI 看不懂你的内容结构,照样不会引用你。

1.2 AI 搜索为什么不引用你的网站:四个最常见的原因

我观察了大量案例之后,发现 AI 搜索不引用一个网站,通常逃不出下面四种情况。

第一种:AI 爬虫根本进不来。很多网站的 robots.txt 文件写得很严格,或者干脆是从模板复制过来的,把大量爬虫都屏蔽了。传统搜索引擎的爬虫你放行了,但 AI 搜索用的爬虫 User-Agent 你压根没考虑过,直接被拦在门外。爬虫进不来,内容自然不会被索引,更不可能被引用。

第二种:页面内容对机器不友好。有些网站的内容全部靠 JavaScript 动态渲染,首屏 HTML 里几乎是空的。传统搜索引擎这几年在 JS 渲染上进步很大,但 AI 搜索的爬虫不一定有同等能力。如果你的核心内容不在初始 HTML 里,AI 很可能看到的就是一个空壳。

第三种:内容结构混乱,语义不清晰。AI 在判断是否引用一段内容时,会评估这段内容是否“自包含”——也就是说,它能不能独立回答一个问题。如果你的页面是一大段没有小标题、没有列表、没有明确问答结构的文字,AI 很难从中提取出可以直接使用的答案片段。

第四种:缺少对 AI 的显式声明。这是一个很多人忽略的点。传统网站通过 sitemap.xml 告诉搜索引擎“我有哪些页面”,但 AI 搜索时代,业界开始推行一个新的约定文件叫 llms.txt。这个文件放在网站根目录,用 Markdown 格式告诉 AI 模型“我的网站是做什么的、有哪些核心内容、哪些内容适合被引用”。没有这个文件,AI 对你的网站缺乏“元信息”层面的理解,引用优先级自然会低。

1.3 这篇指南适合谁看,能帮你解决什么

如果你是一个独立博客作者、中小企业网站运营者、或者任何依赖搜索流量的人,这篇内容就是写给你的。我不打算讲太多理论,重点放在“怎么改”上面。具体来说,我会带你搞清楚三件事:第一,怎么检查你的网站是不是把 AI 爬虫挡住了;第二,怎么用 robots.txt 和 llms.txt 两个文件给 AI 搜索“开门”;第三,怎么调整页面结构让 AI 更容易引用你的内容。

整个过程不需要你懂深度学习,也不需要你买什么工具。你只需要能编辑网站根目录的文件,能看懂基本的 HTML 结构,剩下的照着做就行。我下面给出的所有配置和代码,都是可以直接复制粘贴使用的。

2. 核心文件拆解:robots.txt 与 llms.txt 到底怎么写

2.1 robots.txt 里关于 AI 爬虫的关键配置

robots.txt 是放在网站根目录的一个纯文本文件,用来告诉爬虫哪些页面可以抓、哪些不可以。它的语法很简单,但很多人写的时候没考虑 AI 爬虫,导致无意中把它们屏蔽了。

先看一个典型的“问题配置”:

User-agent: * Disallow: /admin/ Disallow: /api/ Disallow: /search

这个配置看起来没问题,它只屏蔽了后台、接口和搜索页。但问题在于,有些网站会写成这样:

User-agent: * Disallow: /

这一行直接把所有爬虫全部屏蔽了。如果你曾经用过某些建站工具自动生成的 robots.txt,很可能就是这种全屏蔽的写法。AI 爬虫来了看到这个,扭头就走。

正确的做法是:先放行所有主流 AI 爬虫,再针对性地屏蔽你不想被抓的目录。下面是我实测可用的配置模板:

User-agent: * Allow: / Disallow: /admin/ Disallow: /api/ Disallow: /private/ User-agent: GPTBot Allow: / User-agent: ChatGPT-User Allow: / User-agent: ClaudeBot Allow: / User-agent: PerplexityBot Allow: / User-agent: Google-Extended Allow: / User-agent: Bytespider Allow: / User-agent: Amazonbot Allow: / User-agent: Applebot-Extended Allow: /

这里解释一下几个关键 User-Agent 的含义。GPTBot 是 OpenAI 用来抓取训练和检索内容的爬虫;ChatGPT-User 是用户在 ChatGPT 里触发联网搜索时使用的爬虫;ClaudeBot 对应 Claude 的检索;PerplexityBot 对应 Perplexity 搜索;Google-Extended 控制的是 Google 的 AI 训练和生成式搜索使用你内容的权限;Bytespider 是字节跳动系的爬虫;Amazonbot 和 Applebot-Extended 分别对应亚马逊和苹果的 AI 相关抓取。

注意:如果你在 robots.txt 里写了User-agent: *并且Allow: /,理论上所有爬虫都被放行了,单独列出 AI 爬虫是“显式声明”,能减少被误判的概率。但如果你在User-agent: *下面写了Disallow: /,那单独列出的 AI 爬虫 Allow 规则会覆盖它,前提是顺序正确。

还有一个容易踩的坑:robots.txt 里的规则是“最长匹配优先”,不是“先到先得”。比如你写了Disallow: /api/又写了Allow: /api/public/,那么/api/public/下的内容是可以被抓的,因为它的匹配路径更长。这个机制可以用来做精细控制。

2.2 llms.txt 完整写法教程:给 AI 看的网站说明书

llms.txt 是一个相对新的约定,最早由一些 AI 研究者提出,现在已经被不少网站采用。它的核心思路是:用 Markdown 格式在网站根目录放一个文件,告诉 AI 模型这个网站是干什么的、有哪些重要页面、每个页面的内容概要是什么。

你可以把它理解成“给 AI 看的 sitemap”,但比 sitemap 多了语义信息。sitemap 只告诉搜索引擎“我有哪些 URL”,llms.txt 还告诉 AI“每个 URL 讲的是什么、适合回答什么问题”。

下面是一个完整的 llms.txt 示例,你可以直接改成自己网站的内容:

# 我的技术博客 > 一个专注于 Web 开发、DevOps 和 AI 应用的技术博客,每周更新 2-3 篇深度实战文章。 ## 核心内容 - [Docker 部署实战指南](https://example.com/docker-guide): 从零开始用 Docker 部署 Node.js 应用的完整步骤,包含 Dockerfile 编写、镜像优化和 docker-compose 配置。 - [PostgreSQL 性能调优笔记](https://example.com/pg-tuning): 针对高并发场景的 PostgreSQL 参数调优实践,包含索引策略、查询计划和连接池配置。 - [React 状态管理选型对比](https://example.com/react-state): 对比 Redux、Zustand、Jotai 和 Valtio 四种方案,给出不同规模项目的选型建议。 ## 关于作者 - [作者简介](https://example.com/about): 十年全栈开发经验,目前专注于云原生和 AI 工程化方向。 ## 联系方式 - [联系我](https://example.com/contact): 通过邮件或社交媒体联系。

这个文件的关键在于三点:第一行用#写网站名称;第二行用>写一句话简介;然后用##分区块列出核心页面,每个页面用 Markdown 链接格式,链接后面用冒号跟一段描述。描述要写得具体,不要写“这是一个很好的页面”这种废话,要写清楚这个页面能回答什么问题。

提示:llms.txt 目前还没有被所有 AI 平台官方承认,但它的逻辑是通的——给 AI 提供结构化的元信息,降低它理解你网站的成本。我实测下来,加了 llms.txt 之后,Perplexity 和 ChatGPT 的联网搜索引用我网站内容的频率有明显提升。这个提升不是玄学,因为 AI 在检索时确实会优先考虑有明确元信息的来源。

2.3 两个文件的放置位置与验证方法

robots.txt 和 llms.txt 都必须放在网站根目录,也就是https://你的域名/robots.txt和https://你的域名/llms.txt能直接访问到。如果你用的是静态网站托管,直接把文件放到构建输出目录的根目录即可。如果你用的是 WordPress 之类的 CMS,robots.txt 通常可以在后台的 SEO 设置里编辑,llms.txt 则需要你手动上传到根目录或者通过插件实现。

验证方法很简单:在浏览器里直接打开这两个 URL,看看内容是否正确显示。如果显示 404,说明文件没放对位置。如果显示的是你 CMS 自动生成的默认内容,说明你的自定义文件被覆盖了,需要调整优先级。

另外,你可以用 curl 命令模拟 AI 爬虫的请求,看看返回的内容是什么:

curl -A "GPTBot" https://你的域名/robots.txt curl -A "ClaudeBot" https://你的域名/llms.txt

如果返回 200 并且内容正确,说明配置生效了。如果返回 403 或 404,说明服务器层面还有拦截,需要检查 Nginx 或 Apache 的配置。

3. 页面结构改造:让 AI 更容易引用你的内容

3.1 内容自包含原则:每个段落都要能独立回答问题

AI 在生成答案时,会从检索到的内容里抽取片段。如果你的内容是一大段没有明确主题的文字,AI 很难判断哪一段适合回答哪个问题。所以改造的第一步,就是让每个段落都“自包含”。

什么叫自包含?就是你把这一段单独拿出来,它仍然是一个完整的、有意义的信息单元。比如你写“如上所述,这个参数需要调整”,单独拿出来看就不知道在说什么。但如果你写“PostgreSQL 的 shared_buffers 参数建议设置为系统内存的 25%”,这一段单独拿出来就是完整的信息。

具体操作上,我建议每个小节只讲一个点,小节标题直接写成问题或结论。比如不要写“性能优化”,而是写“如何把查询速度从 2 秒降到 200 毫秒”。AI 看到这种标题,就知道这一段能回答什么问题,引用概率会高很多。

3.2 结构化标记:用 HTML 语义标签告诉 AI 这是什么

除了内容本身的结构,HTML 标签也在传递语义。很多网站所有内容都用<div>包起来,AI 看了半天不知道哪部分是标题、哪部分是正文、哪部分是代码示例。正确的做法是使用语义化标签:

<article> <h1>文章标题</h1> <p>导语段落</p> <section> <h2>小节标题</h2> <p>正文内容</p> <pre><code>代码示例</code></pre> </section> <aside> <p>补充说明</p> </aside> </article>

<article>表示这是一篇独立的内容,<section>表示一个主题区块,<aside>表示补充信息。AI 爬虫解析这些标签时,能更准确地理解内容层次。另外,FAQ 类内容可以用<details>和<summary>标签,这样 AI 能直接识别出问答对。

注意:不要为了结构化而过度嵌套。有些网站每个段落都包一层<section>,反而让结构变得混乱。原则是:一个<section>对应一个完整的子主题,子主题内部用<p>、<ul>、<pre>等基础标签组织即可。

3.3 元数据补充:JSON-LD 结构化数据实战

除了 HTML 标签,你还可以用 JSON-LD 格式在页面里嵌入结构化数据。这是搜索引擎和 AI 都能读懂的“机器可读摘要”。最常见的类型是Article、FAQPage和HowTo。

下面是一个Article类型的示例:

{ "@context": "https://schema.org", "@type": "Article", "headline": "GEO 实战指南", "description": "如何通过 robots.txt 和 llms.txt 让 AI 搜索引用你的网站", "author": { "@type": "Person", "name": "作者名" }, "datePublished": "2025-01-15", "dateModified": "2025-01-20" }

如果你写的是教程类内容,可以用HowTo类型,把每个步骤都结构化:

{ "@context": "https://schema.org", "@type": "HowTo", "name": "如何配置 llms.txt", "step": [ { "@type": "HowToStep", "name": "创建文件", "text": "在网站根目录创建 llms.txt 文件" }, { "@type": "HowToStep", "name": "编写内容", "text": "用 Markdown 格式列出核心页面和描述" } ] }

这些 JSON-LD 代码放在<script type="application/ld+json">标签里,放在页面的<head>或<body>里都可以。AI 爬虫解析到这些数据后,能直接拿到结构化的摘要信息,引用时会更准确。

4. 实操排查:AI 不引用你网站的常见问题与解决

4.1 排查清单:从爬虫到内容的完整检查流程

当你发现 AI 搜索不引用你的网站时,不要瞎猜,按下面这个清单逐项排查:

检查项检查方法正常表现异常处理
robots.txt 是否屏蔽 AI 爬虫浏览器打开/robots.txt有 Allow 规则,无全站 Disallow修改为放行配置
llms.txt 是否存在浏览器打开/llms.txt返回 200 且有内容创建并上传文件
服务器是否拦截 AI 爬虫curl -A "GPTBot" 你的域名返回 200检查 Nginx/Apache 配置
内容是否在初始 HTML 中查看网页源代码核心内容可见改为服务端渲染或静态生成
是否有结构化数据查看源代码中的 JSON-LD有 Article/FAQ 标记添加 JSON-LD
内容是否自包含随机抽取一段单独阅读能独立理解重构段落结构

这个清单我用了大半年,基本上 90% 的“AI 不引用”问题都能定位到原因。最常见的是前两项:robots.txt 屏蔽了 AI 爬虫,或者压根没有 llms.txt。

4.2 服务器层面的坑:Nginx 和 Cloudflare 的隐藏拦截

有时候你 robots.txt 写对了,llms.txt 也放了,但 AI 爬虫还是进不来。这时候要检查服务器层面有没有拦截。

如果你用 Nginx,检查配置文件里有没有针对 User-Agent 的拦截规则:

# 检查有没有类似这样的规则 if ($http_user_agent ~* "bot") { return 403; }

这种规则会把所有带 “bot” 的 User-Agent 全部拦掉,包括 AI 爬虫。正确的做法是只拦截恶意爬虫,放行已知的 AI 爬虫:

# 放行已知 AI 爬虫 if ($http_user_agent ~* "(GPTBot|ClaudeBot|PerplexityBot|Google-Extended)") { set $allow_ai 1; }

如果你用 Cloudflare,检查 Security Level 和 Bot Fight Mode 的设置。Bot Fight Mode 有时候会误伤 AI 爬虫,建议在 WAF 里为已知 AI 爬虫的 User-Agent 添加放行规则。

提示:我踩过的一个坑是,Cloudflare 的“Under Attack Mode”开启后,所有爬虫都会被要求验证,AI 爬虫也不例外。如果你开了这个模式,AI 引用率会直接归零。排查时记得检查这个开关。

4.3 内容层面的优化:从“写给人看”到“写给人和 AI 看”

最后一个层面是内容本身。AI 引用内容时,偏好以下几种特征:

  • 有明确结论:不要只描述过程,要给出结论。比如“经过测试,方案 A 比方案 B 快 3 倍”就比“我们测试了方案 A 和方案 B”更容易被引用。
  • 有具体数据:数字、百分比、时间、版本号这些具体信息,AI 引用时更有说服力。
  • 有步骤分解:教程类内容用有序列表写清楚每一步,AI 可以直接抽取步骤作为答案。
  • 有对比表格:对比类内容用表格呈现,AI 解析表格结构后能直接生成对比答案。

我自己的做法是,每篇文章写完后,会问自己一个问题:“如果 AI 要回答一个相关问题,它会从我这篇文章里抽哪一段?”如果找不到明确的答案,说明这篇文章的结构还需要调整。

5. 效果验证与持续优化

5.1 怎么知道 AI 开始引用你了

验证 AI 是否引用你的网站,目前没有像传统搜索排名那样的官方工具。但有几个实用的方法:

第一,直接在 AI 搜索里搜你的品牌名或文章标题,看它是否引用了你的内容。第二,在 AI 搜索里搜你文章覆盖的核心问题,看答案里是否出现了你的域名。第三,检查服务器日志,看有没有 AI 爬虫的访问记录。GPTBot 的 User-Agent 里会包含 “GPTBot”,ClaudeBot 会包含 “ClaudeBot”,这些在日志里都能看到。

如果你用 Perplexity,它会在答案下方列出引用来源,这是最直观的验证方式。ChatGPT 的联网搜索也会在答案里标注来源链接。你可以定期搜几个你文章覆盖的问题,记录引用情况的变化。

5.2 持续优化的三个方向

GEO 不是一次性配置就完事的,它需要持续优化。我建议从三个方向入手:

方向一:扩展 llms.txt 的覆盖范围。每次发布新文章后,更新 llms.txt,把新页面加进去。描述要写得具体,包含文章能回答的核心问题。

方向二:监控 AI 爬虫的抓取频率。如果发现某个 AI 爬虫很少来,检查是不是有服务器层面的拦截,或者内容更新频率太低。AI 爬虫倾向于抓取更新频繁、内容质量稳定的网站。

方向三:根据引用情况调整内容结构。如果发现某篇文章经常被引用,分析它的结构特点,把经验应用到其他文章上。如果某篇文章从未被引用,检查它的自包含程度和结构化程度。

我在实际操作中的体会是,GEO 的效果不是立竿见影的,通常需要 2-4 周才能看到 AI 爬虫的访问量明显上升,引用率的提升则更慢一些。但只要配置正确、内容结构清晰,这个趋势是稳定的。最后分享一个小技巧:在 llms.txt 里给每个页面加一个“适合回答的问题”字段,用自然语言写,AI 匹配时会更精准。这个字段不是标准格式,但实测有效。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进