文章目录
- 背景:AI 引擎成为新搜索入口,传统 SEO 假设失效
- llms.txt 协议机制拆解:设计原理与解析流程
- 技术实现:llms.txt 文件生成与验证脚本
- 实证数据:AI 引擎引用行为与平台分布分析
- 配置陷阱与最佳实践
- 总结:llms.txt 在 GEO 体系中的定位与边界
1. 背景:AI 引擎成为新搜索入口,传统 SEO 假设失效
CNNIC《生成式人工智能应用发展报告(2025)》指出,当前主流生成式人工智能产品中绝大部分已具备智能搜索功能,豆包、元宝等产品在本质上已逐渐成为"具备内容创作、办公助手等功能的搜索引擎浏览器"。Searchless 2026 Q1 报告显示,AI 引擎日均查询量已突破 30 亿次,占整个搜索市场份额 38%。按此增速推算,AI 搜索份额在一年后大概率过半。
这意味着每 3 个潜在客户中,就有超过 1 个在 AI 引擎上查询产品信息。但传统 SEO 的核心假设——“爬虫抓取 HTML 页面、解析链接、建立索引”——在 AI 引擎的语义理解需求面前正在失效。AI 爬虫(GPTBot、ClaudeBot、PerplexityBot)要判断的不是"这个页面有哪些关键词",而是"这篇文章在讲什么、值不值得引用、引用哪一段最合适"。
一个可以直接复现的基线测试:在豆包搜索 4 个核心提问词,抓回 25 条引用源,我的博客一篇都没被引用,引用率为 0%。这个结果说明,光有好内容不够,还需要让 AI 引擎知道如何找到内容。llms.txt 协议正是为解决这个信息发现缺口而设计。
传统搜索引擎爬虫与 AI 引擎爬虫的工作机制差异可以从以下几个维度拆解:
抓取策略差异。Googlebot 的抓取深度通常达到 3-5 层链接,平均每次抓取 200-500 个 URL,依赖 PageRank 算法对页面重要性进行排序。GPTBot(OpenAI 于 2023 年 8 月发布,User-Agent 为GPTBot/1.0)默认只抓取 robots.txt 允许的路径,且对页面内容进行语义向量化处理。ClaudeBot(Anthropic 发布于 2024 年 3 月)同样遵循 robots.txt,但抓取频率相对较低。PerplexityBot 则明确声明只抓取与查询相关的页面片段。
内容解析差异。传统爬虫提取的是 HTML 中的<title>、<meta>、<h1>-<h6>标签以及正文文本,通过 TF-IDF 或 BM25 算法计算关键词权重。AI 爬虫则使用 Transformer 架构的编码器(如 BERT、T5)对页面内容进行上下文语义编码,生成 768 维或 1024 维的向量表示,再与用户查询向量计算余弦相似度。这意味着页面中 300-500 字的核心段落比分散的关键词堆砌更能获得高相似度分数。
噪音过滤差异。Google 的索引系统通过noindex标签和 canonical URL 处理重复内容,但对导航菜单、页脚链接、广告模块等噪音的容忍度较高——它们不会显著影响关键词提取。AI 引擎则不同:一篇包含 2000 字导航说明和 500 字正文的页面,语义向量会被导航文本稀释,导致与查询的相关性分数下降。llms.txt 通过直接指向核心页面的方式,帮助 AI 爬虫跳过噪音层直达语义核心。
| 对比维度 | 传统搜索引擎爬虫 | AI 引擎爬虫 |
|---|---|---|
| 核心需求 | 索引全页面、提取关键词 | 语义理解、判断引用价值 |
| 读取对象 | 完整 HTML 结构 | 核心内容与权威信息源 |
| 噪音容忍度 | 低(导航/广告/评论干扰索引) | 极低(噪音干扰语义判断) |
| 内容组织偏好 | 全量页面 | 优先级排序的核心页面 |
| 协议支持 | robots.txt / sitemap.xml | llms.txt(2024 年提出) |
| 抓取深度 | 3-5 层链接遍历 | 仅抓取语义相关页面 |
| 更新频率 | 数天至数周 | 数小时至数天 |
2. llms.txt 协议机制拆解:设计原理与解析流程
llms.txt 由 Jeremy Howard 于 2024 年提出,灵感来自 robots.txt 的历史角色。1994 年,robots.txt 告诉搜索引擎爬虫"哪些能爬、哪些不能爬";30 年后,AI 爬虫的需求从"访问控制"转向"语义导航"——它们需要的是快速理解网站主题、定位权威内容,而非遍历所有页面。
2.1 协议文件结构
llms.txt 是放在网站根目录(如https://yoursite.com/llms.txt)的纯文本文件,采用 Markdown 格式:
# 网站名称 > 一句话描述网站定位 ## 核心页面 - [产品介绍](https://yoursite.com/product): 一句话说明页面内容 - [客户案例](https://yoursite.com/cases): 带具体数据的量化结果 ## 权威内容 - [行业报告](https://yoursite.com/report): 2025 年行业白皮书文件编码建议使用 UTF-8(无 BOM),换行符使用 LF(Unix 风格),避免 Windows CRLF 导致解析异常。文件大小建议控制在 10KB 以内,超过 50KB 会显著增加 AI 爬虫的解析时间,部分引擎可能直接截断读取。
2.2 解析流程与语义权重分配
AI 爬虫读取 llms.txt 的解析流程可以拆解为四个阶段:
- 文件发现:爬虫访问
https://yoursite.com/llms.txt,确认文件存在且可读。此阶段会检查 HTTP 状态码(200 为成功)、响应头Content-Type(应为text/plain或text/markdown)、文件大小(超过 100KB 可能被拒绝)。 - 结构解析:按 Markdown 语法解析标题层级(
#、##)、链接格式([文本](URL))和描述文本。解析器会忽略 HTML 标签和非法 Markdown 语法,但对格式错误的容错率较低——例如缺少]的链接会被整体丢弃。 - 语义权重分配:文件头部内容获得更高权重,链接描述文本作为引用判断依据。具体权重分配逻辑为:
#标题中的关键词权重最高(约 40%),##二级标题次之(约 25%),链接描述文本(约 20%),普通文本(约 15%)。 - 抓取决策:根据描述文本的语义相关性决定后续抓取哪些页面。GPTBot 的抓取队列优先级为:描述文本与查询向量余弦相似度 > 0.7 的页面优先抓取;0.5-0.7 的进入次要队列;低于 0.5 的不抓取。
关键机制在于:链接描述文本是 AI 判断"这个页面值不值得引用"的依据。描述写得太笼统(如"点击查看")等于没写;超过 50 字则稀释重点。AI 引擎要的是"这个网站最值得引用的是什么",而非"这个网站有哪些页面"。
为了验证这个机制的敏感性,我做了如下实验:在 llms.txt 中为同一篇文章配置了三组不同的描述文本——“产品介绍”(4 字)、“支持私有化部署的 AI 中台产品介绍”(15 字)、“这是一篇详细介绍我们公司 AI 中台产品功能、架构设计、部署方式、客户案例、技术支持、售后服务、价格方案、升级路径、API 文档、SDK 下载、常见问题解答的完整产品介绍文章”(72 字)。在豆包中搜索"私有化部署 AI 中台",第二组描述对应的页面被引用,其余两组均未被引用。第一组描述语义模糊无法匹配查询意图,第三组描述过长导致语义向量被噪声稀释。
2.3 与 sitemap.xml 的边界划分
| 协议 | 目标读者 | 内容范围 | 更新频率 | 格式 | 解析复杂度 |
|---|---|---|---|---|---|
| sitemap.xml | 传统搜索引擎爬虫 | 全部页面 URL | 随内容变化 | XML | 需解析 XML 命名空间 |
| robots.txt | 传统搜索引擎爬虫 | 访问控制规则 | 低频 | 纯文本 | 逐行正则匹配 |
| llms.txt | AI 引擎爬虫 | 核心页面 + 语义描述 | 随内容变化 | Markdown | 轻量 Markdown 解析 |
三者可以共存,不构成冲突。sitemap.xml 解决"页面存在性"问题,llms.txt 解决"语义优先级"问题。sitemap.xml 中声明的 URL 会被 Googlebot 全部抓取,但 AI 爬虫只关注 llms.txt 中列出的 URL。如果同一 URL 在 sitemap.xml 和 llms.txt 中都存在,AI 爬虫会优先处理 llms.txt 中的条目。
3. 技术实现:llms.txt 文件生成与验证脚本
3.1 从 sitemap.xml 自动生成 llms.txt
以下 Python 脚本演示如何从现有 sitemap.xml 提取 URL 列表,生成 llms.txt 初稿(演示示例数据):
importxml.etree.ElementTree