本文内容
智能体可读的网站:llms.txt、Markdown 镜像,以及真正会坏在哪里
让公开内容易于获取和理解,再验证你发布的附加格式。我们的实现使用 HTML、爬虫规则、Markdown 和 JSON-LD。保持这些表示一致,是可以通过测试解决的工程问题。
你正在读的这个网站就在跑这套东西:每个页面的 Markdown 镜像、每种语言一份 llms.txt、公开发布的 agent skills,以及一个只要其中任何一处坏掉就让生产构建失败的校验器。这篇文章列的是这个校验器实际抓到过的东西,比照着规范读出来的清单更有用。
想在投入修复之前先知道智能体能不能读懂你的网站?
运行免费检查器我们实现中的四种表示
这些表示服务于不同的消费者,并非 AI 可见性的四个通用条件。有用的 HTML 页面即使没有 Markdown 镜像或 JSON-LD,也可以被获取和引用。
| 接口 | 它回答的问题 | 失败时的样子 |
|---|---|---|
| robots.txt | 适用哪一组爬虫规则? | 对应分组与路径中的限制 |
| 服务端 HTML | 不执行 JavaScript 时能读取什么? | 不渲染消费者看到的空壳 |
| Markdown 镜像(可选) | 消费者能否使用忠实副本? | 该副本中的坏链接或内容丢失 |
| JSON-LD(可选) | 公开事实是否一致? | 无效或相互冲突的结构化事实 |
Google 明确说明,其 AI 搜索功能不要求 llms.txt、Markdown 或特殊结构化数据。JavaScript 按常规 SEO 规则处理。索引资格、摘要资格及 Search Console 中生效的生成式 AI 纳入设置才是需要单独核实的条件。请与可选格式测试分开检查。 Google Search Central.
诚实地看 llms.txt
llms.txt 是一种约定,不是 Web 标准。没有引擎有义务读它,谁向你保证一定会被读取,那就是在夸大。它同时也很便宜,而且能给智能体一张干净的地图,而不是你渲染出来的导航,所以我们自己发布了一份,通常也会建议这么做。
如果你要发布,有三件事决定它有没有用:
- 可移植的 URL。v2 约定接受 Markdown 链接,并不强制使用绝对 URL。只要消费者保留 llms.txt 的来源 URL 作为基准,相对链接就能解析;但文件复制到其他工具后可能丢失这层上下文。我们使用绝对 URL,让这张地图更易移植。
- H1 下面那段引用块。H1 是唯一必需的部分,约定把后面的摘要描述为可选。即便如此,当一句话就能清楚说明网站身份时,仍应补上,避免让智能体自行推断。
- 重要链接后的说明。链接后的说明是可选项,但能帮助预算有限的智能体决定先打开什么。标题含义不清时,应补充简短描述。
Markdown 镜像,以及怎么声明它
镜像就是与页面相同的内容,去掉外壳,以 Markdown 形式放在一个可预测的路径上,并从页面头部指向它:
<link rel="alternate" type="text/markdown" href="/services/ai-visibility.md">生成镜像很简单。让它保持忠实才是需要机器的部分,因为镜像可以以数月都没人察觉的方式出现细微错误。生成器在站点构建之后运行,遍历渲染后的 HTML,随后由校验器比对两者。
值得知道的失败模式
这些是我们自己构建里的真实发现,不是假设。在这道关卡存在之前,每一种都至少上线过一次。
| 失败 | 为什么会发生 | 智能体看到什么 |
|---|---|---|
| 未解析的模板值 | 生成器输出了它的空值占位符,或者一对模板分隔符没被渲染就留了下来,而没人看输出 | 一个把你的模板语言原样念回给你的页面 |
| 未闭合的代码围栏 | 有开始的围栏,没有结束的 | 它之后的每个标题都不再是标题,文档因此失去结构 |
| 未解码的 HTML 实体 | 转换过程中没有解码实体 | 一个未解码的与号或撇号实体,被当成它的字面字符读取,而不是当成那个标点 |
| 相邻链接被粘连 | 转换时丢掉了两个 anchor 之间的空白 | 两个链接文字粘成了一个词组 |
| 署名粘在链接上 | 作者链接前少了一个空格 | 一个作者字段,其中链接前面的那个词和姓名黏在了一起 |
| 表格列数对不上 | 表头行和分隔行对列数的说法不一致 | 这个块不再被解析为表格,于是每个数字都失去了它的列 |
| 不止一个 H1 | 外壳里的标题漏进了正文 | 连这个页面到底讲什么都变得含糊 |
| 正文为空 | 内容是客户端注入的,镜像没有东西可镜像 | 只有 front matter 和沉默 |
我们最喜欢的一例比上面任何一种都更细微。给某个页面加了一个装饰性图形,结果把一个字面的双引号放进了 SVG 文本节点,这让 HTML 压缩器在外来内容里停了下来。那个页面剩下的部分未经压缩就上线了,它的 Markdown 镜像在三分之二处悄悄截断,把整个 FAQ 一起带走了。在浏览器里看不出任何异常。是这道关卡让构建失败、指名了那条路由,而修复只是一个字符。
robots.txt 的陷阱:检索不等于训练
这是整个话题里代价最高的误解,而它只是一行配置。
GPTBot 收集训练数据,OAI-SearchBot 用于搜索,ChatGPT-User 用于用户发起的访问。Anthropic 同样区分 ClaudeBot、Claude-SearchBot 和 Claude-User。规则限制针对该代理的已记录用途,并不能代表所有关于网站的回答:
User-agent: GPTBot
Disallow: /
User-agent: *
Disallow: /第一组声明 GPTBot 的训练限制。只有没有更具体分组匹配时,通配符才生效。具体分组优先;路径规则采用最长匹配,长度相同时 Allow 优先。此示例限制遵守 robots 且没有专属分组的搜索爬虫,但不能证明所有助手都无法提及或引用网站。
将训练偏好、搜索和用户发起的访问分开处理。OpenAI 指出 robots 规则可能不适用于 ChatGPT-User。修改策略前,应核实各提供商文档与实际部署响应。 OpenAI; Anthropic.
为什么要用关卡,而不是清单
上面每一项都很容易修一次,也不可能靠意愿一直修着。内容每周在变,模板每月在变,而这些失败都不产生可见症状。季度审计只会晚一个季度才发现它们。
我们的生产校验器检查主动发布的镜像。智能体可读性检查器把选定的镜像规则移植到本地浏览器工具。它只检查一个粘贴文件并明确说明覆盖范围,不运行整站构建,也不访问链接目标。
相邻的问题另有去处:我们的Open Knowledge Format 指南讲如何把内部知识打包成可移植的 Markdown,AI 就绪的公司 wiki 指南讲如何把这些知识提供给你自己的智能体。这篇文章严格只谈公开接口:别人的智能体能读到什么。
常见问题
什么让一个网站对智能体可读?
llms.txt 是标准吗?
llms.txt 里能用相对 URL 吗?
我们该屏蔽 GPTBot 吗?
Markdown 镜像会不会造成搜索引擎的重复内容问题?
上线之后怎么防止它退化?
最终思考
先提供可读的公开内容与合适的访问规则。当消费者能从附加格式中受益时再发布,并在构建中验证完整性。
我们的检查器帮助你在本地检查一个文件。修复已证实的问题,再单独验证部署访问与搜索资格。
