ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

GEO优化实战:用robots.txt和llms.txt让AI搜索引用你的网站 1. 先搞清楚 AI 搜索到底在“看”什么很多人第一次听到 GEO 这个词脑子里蹦出来的是地图定位那套东西。但在 AI 搜索这个语境下GEO 指的是 Generative Engine Optimization翻译过来就是生成式引擎优化。它跟传统 SEO 最大的区别在于搜索引擎给你的是链接列表而 AI 搜索直接给你一段整合过的答案。你的网站能不能被这段答案引用取决于 AI 在生成回答时有没有“看到”你、信不信你、愿不愿意提你。我拿一个实际场景来说明。假设你在做一款开源监控工具的文档站用户在 AI 搜索里问“有没有轻量级的服务器监控方案”。AI 会去抓取它认为相关的页面然后综合出一段回答。如果你的文档站没有被抓取或者被抓取了但内容结构让 AI 无法提取关键信息那你的项目就不会出现在答案里。用户甚至不知道你存在。这就是 GEO 要解决的问题让 AI 搜索在生成答案时优先引用你的内容。这件事适合谁来关注如果你有独立博客、产品文档站、开源项目主页、技术教程站或者你在做内容营销GEO 就是你必须开始重视的东西。它不像传统 SEO 那样堆关键词就行AI 搜索更看重内容的可解析性、结构清晰度和权威信号。下面我会从代码层面拆解为什么 AI 搜索不引用你的网站以及你可以用哪些具体的技术手段去改掉它。1.1 AI 搜索和传统爬虫的本质差异传统搜索引擎爬虫抓取你的页面后主要做两件事建立倒排索引然后根据链接权重和页面信号排序。AI 搜索在此基础上多了一层它需要理解内容语义提取事实性信息然后把这些信息组织成一段连贯的回答。这意味着 AI 对页面的“可读性”要求更高。我打个比方。传统 SEO 像是把你的店开在繁华街道上只要门面够大、招牌够亮路过的人就能看到。GEO 则像是 AI 是一个挑剔的买手它进店之后要看你的商品分类是否清晰、标签是否完整、说明书是否易懂。如果货架乱七八糟它扭头就走去隔壁那家整理得井井有条的店。具体到技术层面AI 搜索在抓取和解析你的网站时会关注以下几个信号robots.txt 是否允许 AI 爬虫访问很多站长为了防传统爬虫把规则写得太严结果把 AI 爬虫也挡在外面了。页面是否有清晰的结构化数据比如 JSON-LD、Schema.org 标记这些能帮 AI 快速理解页面内容。是否存在 llms.txt 文件这是新兴的一个约定专门告诉大语言模型你的网站有哪些核心内容。内容是否以问答形式组织AI 更容易从 QA 结构中提取直接答案。页面加载速度和渲染方式如果内容依赖 JavaScript 动态渲染AI 爬虫可能抓不到。这些信号里robots.txt 和 llms.txt 是最直接、最容易用代码控制的。接下来我会逐一拆解。1.2 为什么你的网站被 AI 搜索“无视”了我见过太多这样的情况一个技术博客写了上百篇高质量文章传统搜索排名也不错但在 AI 搜索里就是查无此人。排查下来原因往往集中在几个地方。第一个常见问题是 robots.txt 把 AI 爬虫全禁了。很多站长在 robots.txt 里写User-agent: * Disallow: /本意是防止某些恶意爬虫结果把所有 AI 爬虫也拒之门外。AI 搜索的爬虫有自己特定的 User-agent比如 GPTBot、ClaudeBot、PerplexityBot 等。如果你的 robots.txt 没有针对这些爬虫做精细控制它们可能根本进不来。第二个问题是页面内容对 AI 不友好。比如你的文章全部用图片展示代码或者关键信息藏在折叠面板里需要点击才能展开。AI 爬虫不会点击它只读 HTML 源码。如果源码里没有这些内容AI 就认为你的页面没有这些信息。第三个问题是缺少 llms.txt。这个文件相当于给 AI 准备的一份“内容地图”。它用 Markdown 格式列出你网站的核心页面和简要描述AI 爬虫读取后能快速定位到最有价值的内容。没有这个文件AI 只能靠通用爬取策略效率低且容易遗漏。第四个问题是内容没有明确的作者和更新时间信号。AI 搜索在生成答案时倾向于引用有明确来源、有更新时间戳的内容。如果你的页面没有这些元信息AI 会认为你的内容可信度不足。2. 用 robots.txt 给 AI 爬虫开一扇门robots.txt 是网站根目录下的一个纯文本文件用来告诉爬虫哪些页面可以抓、哪些不可以。它是最基础的爬虫协议几乎所有正规爬虫都会遵守。对于 GEO 来说robots.txt 是你控制 AI 爬虫访问权限的第一道关卡。2.1 先搞清楚哪些 AI 爬虫需要放行不同的 AI 搜索服务有不同的爬虫标识。我整理了一份常见的 AI 爬虫 User-agent 列表你可以根据自己的需求选择放行哪些爬虫名称User-agent 标识所属服务用途GPTBotGPTBotOpenAI用于训练和检索ChatGPT-UserChatGPT-UserOpenAI用户触发的实时抓取ClaudeBotClaudeBotAnthropic内容检索PerplexityBotPerplexityBotPerplexity搜索索引Google-ExtendedGoogle-ExtendedGoogleAI 训练数据BytespiderBytespider字节跳动AI 训练与检索CCBotCCBotCommon Crawl公开数据集这份列表不是固定的各家服务会不断调整。我的建议是如果你希望自己的内容被 AI 搜索引用至少放行 GPTBot、ClaudeBot、PerplexityBot 这三个。它们是目前主流 AI 搜索的主要抓取来源。2.2 写一份对 AI 友好的 robots.txt下面是一份我实际在用的 robots.txt 配置你可以直接参考# 允许所有传统搜索引擎爬虫 User-agent: Googlebot Allow: / User-agent: Bingbot Allow: / # 允许主流 AI 爬虫访问核心内容 User-agent: GPTBot Allow: / Disallow: /private/ Disallow: /admin/ User-agent: ClaudeBot Allow: / Disallow: /private/ Disallow: /admin/ User-agent: PerplexityBot Allow: / Disallow: /private/ Disallow: /admin/ # 默认规则允许所有爬虫访问公开内容 User-agent: * Allow: / Disallow: /private/ Disallow: /admin/ Disallow: /tmp/这份配置的核心逻辑是公开内容全部放行敏感目录禁止访问。注意Allow: /和Disallow的优先级问题。在 robots.txt 中路径越长匹配越精确。所以Disallow: /private/会覆盖Allow: /对 /private/ 目录的放行。注意不要用Disallow: /来禁止所有爬虫。这等于告诉 AI 搜索“我的网站不存在”。如果你确实有敏感内容用具体的路径来限制而不是一刀切。2.3 验证 robots.txt 是否生效写完 robots.txt 后你需要验证它是否被正确解析。有几个方法直接访问在浏览器打开https://你的域名/robots.txt确认内容正确返回没有 404 或 403。使用爬虫模拟工具很多 SEO 工具提供 robots.txt 测试功能可以模拟特定 User-agent 的抓取行为。查看服务器日志观察 AI 爬虫的访问记录。如果配置正确你应该能看到 GPTBot 或 ClaudeBot 的请求。我踩过的一个坑是robots.txt 文件编码问题。如果你用 Windows 记事本保存可能会带上 BOM 头导致某些爬虫解析失败。建议用 UTF-8 无 BOM 格式保存或者直接用命令行工具生成。# 用 curl 检查 robots.txt 返回状态 curl -I https://你的域名/robots.txt # 查看返回内容 curl https://你的域名/robots.txt如果返回状态码是 200内容也正确那基本没问题。如果返回 404检查文件是否放在了网站根目录。如果返回 403检查服务器权限配置。3. llms.txt给 AI 准备一份内容地图llms.txt 是一个相对较新的约定最早由一些技术社区提出目的是让大语言模型更容易发现和索引网站的核心内容。它的格式很简单一个 Markdown 文件放在网站根目录列出你最重要的页面链接和简要描述。3.1 llms.txt 的完整写法一个标准的 llms.txt 文件长这样# 我的技术博客 这里记录我在后端开发和 DevOps 领域的实践经验每周更新两到三篇深度文章。 ## 核心教程 - [Docker 网络配置详解](https://example.com/docker-network): 从零讲解 Docker 四种网络模式的区别和适用场景 - [Kubernetes 入门实战](https://example.com/k8s-basics): 用 minikube 搭建本地集群的完整步骤 - [PostgreSQL 性能调优](https://example.com/pg-tuning): 慢查询分析和索引优化的十个技巧 ## 工具推荐 - [我的开发环境配置](https://example.com/dev-setup): 终端、编辑器、插件的完整清单 - [常用命令行工具](https://example.com/cli-tools): 提升效率的 20 个 CLI 工具 ## 关于我 - [个人简介](https://example.com/about): 我的技术背景和联系方式这个文件的结构分为三部分标题和描述、核心内容链接、可选的其他信息。AI 爬虫读取后能快速了解你网站的主题和最有价值的页面。3.2 为什么 llms.txt 对 GEO 很重要传统爬虫靠链接关系发现内容AI 爬虫虽然也能这么做但效率不高。llms.txt 相当于你主动给 AI 递了一张名片告诉它“这些是我最好的内容优先看这些”。我实测下来的感受是加了 llms.txt 之后AI 搜索引用我网站内容的频率明显提升。尤其是那些深度教程类文章之前很少被 AI 提及现在经常出现在相关问题的答案里。提示llms.txt 目前还不是官方标准但已经被越来越多的 AI 爬虫支持。即使某些爬虫暂时不读这个文件它也不会对你的网站造成负面影响。所以我的建议是加上它没有坏处。3.3 生成 llms.txt 的自动化方案手动维护 llms.txt 很麻烦尤其是内容更新频繁的网站。我写了一个 Python 脚本从 sitemap 自动生成 llms.txtimport xml.etree.ElementTree as ET import requests from datetime import datetime def fetch_sitemap(url): 抓取 sitemap 并解析 URL 列表 resp requests.get(url, timeout10) resp.raise_for_status() root ET.fromstring(resp.content) ns {sm: http://www.sitemaps.org/schemas/sitemap/0.9} urls [] for url_elem in root.findall(sm:url, ns): loc url_elem.find(sm:loc, ns) lastmod url_elem.find(sm:lastmod, ns) if loc is not None: urls.append({ loc: loc.text, lastmod: lastmod.text if lastmod is not None else }) return urls def generate_llms_txt(urls, output_pathllms.txt): 生成 llms.txt 文件 lines [ # 网站标题, , 一句话描述你的网站定位和内容方向。, , ## 内容列表, ] for item in urls: title item[loc].rstrip(/).split(/)[-1] or 首页 lines.append(f- [{title}]({item[loc]})) lines.append() lines.append(f最后更新{datetime.now().strftime(%Y-%m-%d)}) with open(output_path, w, encodingutf-8) as f: f.write(\n.join(lines)) print(f已生成 {output_path}共 {len(urls)} 条链接) if __name__ __main__: sitemap_url https://你的域名/sitemap.xml urls fetch_sitemap(sitemap_url) generate_llms_txt(urls)这个脚本的逻辑很简单读取 sitemap提取所有 URL然后按格式写入 llms.txt。你可以把它加到 CI/CD 流程里每次部署时自动更新。4. 结构化数据让 AI 一眼看懂你的内容robots.txt 和 llms.txt 解决的是“能不能进来”和“先看什么”的问题。结构化数据解决的是“看懂什么”的问题。AI 爬虫解析页面时如果内容以结构化数据的形式呈现提取效率和准确率都会大幅提升。4.1 Schema.org 标记的实战写法Schema.org 是一套通用的结构化数据词汇表被主流搜索引擎和 AI 爬虫广泛支持。对于技术博客来说最常用的类型是 Article、TechArticle 和 FAQPage。下面是一个 TechArticle 的 JSON-LD 示例{ context: https://schema.org, type: TechArticle, headline: Docker 网络配置详解, description: 从零讲解 Docker 四种网络模式的区别和适用场景, author: { type: Person, name: 你的名字 }, datePublished: 2024-01-15, dateModified: 2024-03-20, publisher: { type: Organization, name: 你的网站名称 }, mainEntityOfPage: { type: WebPage, id: https://example.com/docker-network } }这段代码放在页面的head或body里都可以AI 爬虫会自动识别。关键字段包括 headline、description、author、datePublished 和 dateModified。其中 dateModified 尤其重要AI 搜索倾向于引用更新时间较新的内容。4.2 FAQ 结构化数据的特殊价值AI 搜索最喜欢问答形式的内容。如果你在文章里加入了 FAQ 部分并用 FAQPage 标记被 AI 引用的概率会显著提高。{ context: https://schema.org, type: FAQPage, mainEntity: [ { type: Question, name: Docker 的 bridge 网络和 host 网络有什么区别, acceptedAnswer: { type: Answer, text: bridge 网络为容器创建独立的网络命名空间通过 NAT 与宿主机通信host 网络则直接共享宿主机的网络栈性能更好但隔离性差。 } }, { type: Question, name: 什么时候应该用 overlay 网络, acceptedAnswer: { type: Answer, text: 当你需要跨多台 Docker 主机通信时overlay 网络是首选。它基于 VXLAN 实现适合 Swarm 集群或 Kubernetes 环境。 } } ] }我实测下来加了 FAQPage 标记的文章在 AI 搜索里的曝光率比普通文章高出不少。因为 AI 可以直接从结构化数据里提取问答对不需要自己解析段落。4.3 结构化数据的验证与调试写完结构化数据后一定要验证。Google 提供了 Rich Results Test 工具可以检查 JSON-LD 是否格式正确、字段是否完整。另外你也可以用 curl 直接抓取页面看看 JSON-LD 是否被正确渲染。# 抓取页面并提取 JSON-LD curl -s https://example.com/docker-network | grep -o script typeapplication/ldjson.*/script如果页面是 JavaScript 动态渲染的确保 JSON-LD 在服务端渲染时就输出到 HTML 里而不是等客户端 JS 执行后才插入。AI 爬虫通常不执行 JavaScript。注意结构化数据要如实反映页面内容。如果你标记了 FAQPage 但页面上没有对应的问答内容可能会被判定为作弊反而影响 GEO 效果。5. 内容层面的 GEO 优化技巧技术配置是基础但内容本身的质量和结构才是决定 AI 是否引用的关键。我总结了几个在实际操作中验证有效的技巧。5.1 用问答式标题组织内容AI 搜索在生成答案时会寻找与用户问题最匹配的内容片段。如果你的文章标题和小节标题本身就是问题形式匹配度会更高。比如与其写“Docker 网络模式介绍”不如写“Docker 有哪几种网络模式分别适合什么场景”。后者更接近用户的真实提问方式AI 在检索时更容易命中。我在自己的博客上做过对比测试同一篇教程把 H2 标题从陈述句改成疑问句后AI 搜索带来的流量提升了大约 40%。这个改动成本极低但效果很明显。5.2 在开头直接给出答案AI 搜索倾向于提取页面开头部分的简洁答案。如果你的文章开头绕来绕去AI 可能抓不到重点。我的做法是在文章第一段就用一两句话直接回答标题里的问题然后再展开详细解释。比如这篇关于 GEO 的文章开头就直接说了“GEO 是生成式引擎优化解决的是 AI 搜索引用问题”。这样 AI 在抓取时能立刻提取到核心定义。5.3 保持内容更新频率AI 搜索对内容的时效性有要求。一个两年没更新的页面即使质量很高被引用的概率也会下降。我的建议是对于核心教程类文章每半年回顾一次更新过时的信息然后在页面上更新 dateModified 字段。如果你有大量旧文章可以用脚本批量检查最后更新时间优先更新那些流量下降明显的页面。import os import datetime def check_stale_articles(content_dir, stale_days180): 检查超过指定天数未更新的文章 stale [] for root, dirs, files in os.walk(content_dir): for f in files: if f.endswith(.md): path os.path.join(root, f) mtime os.path.getmtime(path) days_old (datetime.datetime.now() - datetime.datetime.fromtimestamp(mtime)).days if days_old stale_days: stale.append((path, days_old)) stale.sort(keylambda x: x[1], reverseTrue) for path, days in stale: print(f{path} - {days} 天未更新) return stale if __name__ __main__: check_stale_articles(./content)这个脚本会列出所有超过 180 天未更新的 Markdown 文件你可以按优先级逐个处理。6. 常见问题与排查技巧实录在实际操作中我遇到过各种奇怪的问题。这里整理一份速查表方便你快速定位和解决。问题现象可能原因排查方法解决方案AI 搜索完全不引用robots.txt 禁止了 AI 爬虫检查 robots.txt 中是否有 Disallow: /放行 GPTBot、ClaudeBot 等引用了但内容过时页面 dateModified 未更新查看结构化数据中的日期字段更新内容并修改 dateModified引用了错误信息页面内容与结构化数据不一致对比 JSON-LD 和页面实际内容确保结构化数据如实反映内容只有首页被引用内页缺少 llms.txt 或 sitemap检查 llms.txt 是否包含内页链接补充 llms.txt 和 sitemap引用频率突然下降网站改版导致 URL 变化查看服务器日志中的 404 记录设置 301 重定向内容被截断关键信息在 JavaScript 渲染后用 curl 抓取页面查看源码改为服务端渲染或静态生成6.1 一个真实的排查案例上个月有个读者找我说他的技术博客在 AI 搜索里完全搜不到。我让他把 robots.txt 发过来一看就发现问题了User-agent: * Disallow: /他本意是防止某些采集站抓取结果把所有爬虫都禁了。我让他改成User-agent: * Allow: / Disallow: /admin/ Disallow: /api/改完第二天AI 搜索就开始引用他的文章了。这个案例说明robots.txt 的配置直接影响 GEO 效果而且改动成本极低值得优先检查。6.2 另一个常见坑sitemap 未提交sitemap 是告诉爬虫你有哪些页面的标准方式。如果你没有 sitemapAI 爬虫只能靠链接关系慢慢发现你的内容效率很低。确保你的网站有 sitemap.xml并且在 robots.txt 里声明Sitemap: https://你的域名/sitemap.xml如果你用的是静态站点生成器如 Hugo、Hexo、Jekyll通常有插件可以自动生成 sitemap。如果是动态网站可以写个脚本定期生成。6.3 监控 AI 爬虫的访问情况最后分享一个实用技巧在服务器日志里过滤 AI 爬虫的请求观察它们的抓取频率和抓取路径。# 查看 GPTBot 的访问记录 grep GPTBot /var/log/nginx/access.log | tail -50 # 统计各 AI 爬虫的访问次数 grep -E GPTBot|ClaudeBot|PerplexityBot /var/log/nginx/access.log | awk {print $NF} | sort | uniq -c | sort -rn如果某个 AI 爬虫频繁访问但你的内容没有被引用可能是内容质量问题。如果某个爬虫完全不访问检查 robots.txt 是否放行。我个人在实际操作中的体会是GEO 不是一蹴而就的事情它需要持续的内容维护和技术调优。但好消息是大部分技术手段都是一次性配置之后只需要定期检查和更新内容即可。相比于传统 SEO 的链接建设GEO 更依赖内容本身的质量和结构这对认真做内容的站长来说反而是个机会。
返回列表