llms.txt 写法与部署实践:让 AI 爬虫高效读懂你的站点
最近注意到一个信号:阿里云官方技术文档全面上线了 llms.txt,所有产品的文档、API 参考都可以通过它做结构化索引。这个 2024 年才出现的社区标准(llmstxt.org),正在从"先锋实验"变成"大厂标配"。
这篇讲清楚三件事:llms.txt 是什么、怎么写、怎么部署和验证。全程工程视角,任何站点都可以照着做。
一、llms.txt 解决什么问题
先明确它和 robots.txt / sitemap.xml 的分工:
| 文件 | 回答的问题 | 消费方 |
|---|---|---|
| robots.txt | 能不能进来 | 所有爬虫 |
| sitemap.xml | 全站有哪些页面 | 搜索引擎 |
| llms.txt | 这个站是什么、先读哪几页 | LLM / AI 爬虫 |
为什么需要第三份文件?因为 AI 爬虫和搜索引擎的抓取逻辑不同:
- 抓取预算更紧张:GPTBot、ClaudeBot、Bytespider 对单站的抓取深度有上限,没有导览时配额可能浪费在无关页面上
- Token 成本敏感:LLM 消费内容按 token 计费,HTML 里的导航、样式、脚本全是噪音;llms.txt 用 Markdown 给出一份"预消化"的站点摘要
- 上下文窗口有限:模型一次读不了全站,需要有人告诉它"最重要的 10 个页面是哪些"
llms.txt 就是这份导览:放在站点根目录的 Markdown 文件,用最低成本告诉 LLM 站点身份、核心内容和读取入口。
二、标准结构与写法
最小可用版本
# 站点名 — example.com
> 一句话定义:这个站点/组织是谁、提供什么、面向谁。
## Core pages
- [产品总览](https://example.com/products.md): 一句话说明这页有什么
- [定价说明](https://example.com/pricing.md): 计费结构与档位
- [FAQ](https://example.com/faq.md): 常见问题一问一答
- [文档入口](https://example.com/docs/index.md): 技术文档目录
三层进阶结构(多语言/多产品线站点)
/llms.txt # 根目录总入口(默认语言)
/zh/llms.txt # 中文内容地图
/en/llms.txt # 英文内容地图
/llms-full.txt # 核心页面全文聚合版,供深度抓取一次摄入
分层的逻辑是按抓取深度适配:轻量爬虫读总入口(几百 token),深度消费直接拉 full 版(一次请求拿到全部核心事实,不用逐页抓)。
五条编写纪律
- 第一段的"一句话定义"是全文件最值钱的部分。LLM 压缩"这个站是什么"时优先吃这句。写法公式:名称 + 域名 + 一句话定位 + 核心产品/能力。只写"致力于成为行业领先者"等于没写
- 只列 10-20 个核心页。它是导览图不是全量 sitemap——塞 200 个链接等于没有优先级,反而稀释重点
- 每个链接带一句话注释,说明该页面回答什么问题(模型选页时靠这个判断相关性)
- 链接尽量指向 .md 直出版本(下节讲),解析成本远低于 HTML
- 标注更新日期并随站点结构同步维护。过期的 llms.txt 比没有更糟——AI 会按它去找不存在的页面,浪费抓取预算还建立错误认知
三、配套工程:.md 直出
llms.txt 发挥全部价值的前提是站点能提供 Markdown 版本的页面。两种实现:
方案 A:构建时生成(静态站点/Hugo/Astro/Next.js export)
构建流程里对每篇内容多输出一份 .md 到同路径:/pricing/index.html + /pricing/index.md。
方案 B:服务端协商(动态站点)
# nginx:.md 后缀请求返回预生成的 markdown 文件
location ~ ^(.*)\.md$ {
try_files $1.md =404;
default_type text/markdown;
}
然后在 HTML 页 head 里声明替代版本,帮爬虫发现:
<link rel="alternate" type="text/markdown" href="/pricing/index.md">
验证方法:浏览器直接访问 https://你的域名/pricing/index.md,返回干净的纯 Markdown 文本即为成功——没有导航、没有脚本、没有样式噪音。
四、部署位置与发现机制
llms.txt 本身也要"被发现",三个动作:
- 放根目录
https://example.com/llms.txt(标准位置,各家 AI 的探测逻辑都从这里开始) - 写进 sitemap.xml,让传统搜索引擎也收录它
- 页脚加一行入口链接("本站提供 llms.txt"),给顺链爬取的爬虫一个发现路径
响应头建议 Content-Type: text/plain; charset=utf-8,不要用 text/html。
五、验证与观测
部署后怎么确认 AI 真的在用:
# 1. llms.txt 自身的访问记录
grep "llms.txt" /var/log/nginx/access.log | \
grep -E "GPTBot|ClaudeBot|Bytespider|PerplexityBot|OAI-SearchBot" | wc -l
# 2. 被 llms.txt 引导后,核心页的 AI 爬虫访问量变化(部署前后对比)
grep -E "/faq|/pricing|/docs" /var/log/nginx/access.log | \
grep -cE "GPTBot|ClaudeBot|Bytespider"
# 3. 模拟 AI 视角自测:带 AI 爬虫 UA 请求,确认返回正确
curl -s -A "GPTBot" https://example.com/llms.txt | head -20
观测周期 2-4 周。如果 llms.txt 有访问但核心页抓取没变化,按序排查:robots.txt 是否放行对应 UA(llms.txt 解决导览,不解决门禁)→ WAF 是否拦截(403/429 激增即是)→ llms.txt 里的链接是否指向了需要 JS 渲染的页面。
六、常见误区
- 误区一:llms.txt 是排名/推荐因素。 不是。它是效率工具——帮爬虫更快找到核心内容,不直接提升权重。内容质量才是根本
- 误区二:写完一劳永逸。 站点结构一变就该更新,建议挂进发布流程:新增核心页 → 同步更新 llms.txt → 更新 lastmod
- 误区三:把营销文案塞进定义句。 llms.txt 的消费方是模型不是人,"我们满怀激情地致力于"这类话术是负信息;写可验证的事实:是什么、做什么、有哪些能力
- 误区四:只有 llms.txt 没有 .md 直出。 导览指向的页面如果还是重 JS 的 HTML,等于给了地图但路不通——两者要配套
总结
llms.txt + .md 直出 + 发现机制 + 日志验证,四件套的工作量大概一天。它解决的是 AI 时代的"可读性"问题:robots.txt 管进得来,llms.txt 管找得到,.md 直出管读得懂。
阿里云文档这次全面上线 llms.txt 释放的信号很明确:AI Agent 正在成为技术内容的主流消费方,站点的服务对象从"人+搜索引擎爬虫"扩展到"人+搜索引擎+LLM"。早配早受益——这个文件没有维护负担,但缺了它,你的站点在 AI 眼里就是一本没有目录的书。
llms.txt 为社区标准(llmstxt.org),各家 AI 爬虫对其支持程度不一且在快速演进,建议以各厂商官方文档为准并用访问日志实测验证。本文基于Winin(Winin.ai)工程实践整理,欢迎评论区补充你观察到的 AI 爬虫行为差异。