---
title: "智能体可读的网站：llms.txt 与 Markdown 镜像"
canonical: https://wavect.io/zh/blog/agent-readable-website-llms-txt-markdown-mirrors/
language: zh
description: "什么让网站对 AI 智能体可读：robots 访问、服务端输出的 HTML、Markdown 镜像、llms.txt 和 JSON-LD，以及构建关卡能抓到的转换错误。"
image: "https://wavect.io/img/blog/headers/header_agent-readable-website-llms-txt-markdown-mirrors.png"
---

[**返回**](/zh/blog/overview/)

[![Kevin Riedl](/img/team/kevin.webp)](/zh/team/kevin-riedl/)

[Kevin Riedl](/zh/team/kevin-riedl/) https://linkedin.com/in/wsdt

9 分钟 阅读 · 2026年8月18日 最近审核 2026年8月18日

[**下一篇**](/zh/blog/can-an-ai-agent-use-your-product/)

# 智能体可读的网站：llms.txt、Markdown 镜像，以及真正会坏在哪里

要点速览

一个智能体可读的网站需要四个相互独立的接口同时成立：让检索抓取器进得来的 robots 规则、在 JavaScript 运行之前就已存在于服务端输出 HTML 中的正文、一份用 rel=alternate 声明出来的干净 Markdown 或 llms.txt 副本，以及写明发布方的有效 JSON-LD。只满足其中三个，你照样是隐形的。llms.txt 是一种约定而不是标准，它最常见的缺陷是相对 URL，因为这个文件会脱离它原本所在的页面被读取。值得用关卡守住的转换错误包括：未解析的模板值、未闭合的代码围栏、未解码的 HTML 实体、被粘连的相邻链接、对不上的表格列数、重复的 H1，以及空的正文。代价最高的单一错误是把训练爬虫和检索抓取器混为一谈：屏蔽 GPTBot 是授权决定，而它下面那条通配符 disallow 会把你彻底从答案里删掉。这些错误都没有可见症状，所以检查应该放进构建流程，而不是写进一份清单。

**一个智能体可读的网站，会为每个页面提供一份干净的机器副本，在页面头部声明它，并且不屏蔽任何需要抓取它的东西。**难的不是决定要这么做，而是在第四次部署之后它依然成立，因为这里每一种失败在浏览器里都看不见，在你的日志里也不出声。

你正在读的这个网站就在跑这套东西：每个页面的 Markdown 镜像、每种语言一份 llms.txt、公开发布的 agent skills，以及一个只要其中任何一处坏掉就让生产构建失败的校验器。这篇文章列的是这个校验器实际抓到过的东西，比照着规范读出来的清单更有用。

## 智能体真正会用到的四个接口

智能体可读性经常被当成一个话题来谈，但它其实是四个彼此独立的接口，而一个网站可以过了三个，仍然是隐形的。

| 接口 | 它回答的问题 | 失败时的样子 |
| --- | --- | --- |
| robots.txt | 我到底允不允许抓这个？ | 在答案里悄无声息地缺席 |
| 服务端输出的 HTML | JavaScript 运行之前正文在不在？ | 一个带导航的空壳 |
| Markdown 镜像 | 有没有一份便宜且无歧义的副本？ | 对渲染出来的外壳做又贵又嘈杂的解析 |
| JSON-LD | 这是谁发布的，它又是什么？ | 靠正文猜出来的事实，或者什么都没有 |

顺序很重要。给一个检索抓取器根本无权读取的页面修结构化数据，是白干，而这正是这类项目最常见的倒着做的方式。

## 诚实地看 llms.txt

llms.txt 是一种约定，不是标准。没有引擎有义务读它，谁向你保证一定会被读取，那就是在夸大。它同时也很便宜，而且能给智能体一张干净的地图，而不是你渲染出来的导航，所以我们自己发布了一份，通常也会建议这么做。

如果你要发布，有三件事决定它有没有用：

- **绝对 URL。** 这是我们见得最多的错误，我们自己也犯过。llms.txt 会被抓走并四处传递，脱离它原本所在的页面，于是没有基准 URL 可以用来解析相对链接。一份满是 `/services/…` 路径的文件，就是一份满是死路的文件。
- **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 的陷阱：检索不等于训练

这是整个话题里代价最高的误解，而它只是一行配置。

有些爬虫存在的目的是收集训练数据。另一些是为了回答一个问题并当场引用而去抓取页面。屏蔽第一类是一个你很可能确实想做的授权决定。屏蔽第二类会把你彻底从答案里删掉，而这几乎总是无意的：

```
User-agent: GPTBot
Disallow: /

User-agent: *
Disallow: /
```

第一段是有意的训练退出。第二段把所有答案引擎抓取器一起带走了，因为没有自己分组的爬虫会继承通配符规则。写下这份配置的团队以为自己退出了训练。他们同时也退出了被引用。

如果你想要的是“可以引用我，但不要拿我训练”，这个立场是自洽且可配置的：明确列出检索抓取器并放它们进来，再按名字屏蔽训练爬虫。

## 为什么要用关卡，而不是清单

上面每一项都很容易修一次，也不可能靠意愿一直修着。内容每周在变，模板每月在变，而这些失败都不产生可见症状。季度审计只会晚一个季度才发现它们。

所以这些检查属于构建流程，和测试放在一起。我们的检查在站点生成之后运行，并会让部署失败，于是坏掉的镜像是一条红色流水线，而不是一处慢慢渗漏。这就是全部的诀窍，也是我们把规则目录交出去而不是交一份报告的原因： [智能体可读性检查器](/zh/tools/agent-readability-checker/) 在你的浏览器里跑的就是同一套镜像规则，也正是决定这个网站能不能部署的同一段代码。

相邻的问题另有去处：我们的 [Open Knowledge Format 指南](/zh/blog/open-knowledge-format-okf/) 讲如何把内部知识打包成可移植的 Markdown， [AI 就绪的公司 wiki 指南](/zh/blog/ai-ready-company-wiki/) 讲如何把这些知识提供给你自己的智能体。这篇文章严格只谈公开接口：别人的智能体能读到什么。

## 常见问题

### 什么让一个网站对智能体可读？

四件事同时成立：让检索抓取器进得来的 robots 规则、在 JavaScript 运行之前就存在于服务端输出 HTML 中的正文、在页面头部声明出来的干净 Markdown 或 llms.txt 副本，以及写明发布方的有效 JSON-LD。只过了其中三个，通常就足以让你保持隐形。

### llms.txt 是标准吗？

不是。它是一种约定，没有引擎有义务读它。它发布成本低，而且给智能体一张干净的地图而不是渲染出来的导航，所以我们自己维护了一份。但如果有人声称它一定会被读取，那正是你该怀疑他其余说法的理由。

### llms.txt 里能用相对 URL 吗？

不可靠。这个文件会脱离它原本所在的页面被抓取和传递，于是没有基准 URL 可供解析。请使用绝对 URL。

### 我们该屏蔽 GPTBot 吗？

那是授权决定，不是可见性问题。屏蔽 GPTBot 或 CCBot 让你退出训练数据，并不会把你从 ChatGPT 或 Perplexity 的答案里删掉，因为那些由另外的检索抓取器提供。真正把你从答案里删掉的，是屏蔽那些检索抓取器。

### Markdown 镜像会不会造成搜索引擎的重复内容问题？

把 canonical URL 带进镜像，并让镜像不要进入你的 XML sitemap，这样发现路径依然指向 HTML 页面。镜像是同一份 canonical 文档的另一种表示形式，通过 rel=alternate 声明。

### 上线之后怎么防止它退化？

把检查放进构建流程，而不是写进文档。内容和模板一直在变，而这些失败都没有可见症状，所以任何靠意愿维持的东西，一两个季度内就会退回去。

## 最终思考

智能体可读性不是一个内容项目。它是四个机械性的接口、一份不长的转换错误清单，以及一行决定其余一切有没有意义的配置。

先从 robots.txt 开始，因为它检查成本最低，出错代价最高。然后提供一份干净的副本、把它声明出来、校验你的结构化数据，并把这一切放到关卡后面，让下一次部署必须继续让它成立。

## 你可能也喜欢..

[**Open Knowledge Format：企业指南** 如何把组织知识打包成可移植、人类可读的 Markdown，并带上来源与新鲜度信号。](/zh/blog/open-knowledge-format-okf/) [**AI Enablement 对比通用 AI 咨询** 把在你自己基础设施上可衡量的落地，与只交付战略的合作方式做个对比。](/zh/compare/ai-enablement-vs-generic-ai-consultancy/)

智能体工程

## 继续浏览此集群

编程智能体、MCP、上下文系统、评估与可靠自动化控制。

[从核心文章开始**AI 智能体的图工程：知识图谱什么时候值得做？**](/zh/blog/graph-engineering-ai-agents/)

- [本地化 URL 会搞坏 hreflang：只保留一个英文 slug](/zh/blog/english-slugs-vs-localized-urls-hreflang/)
- [AI 智能体能用你的产品，还是只能读到它？](/zh/blog/can-an-ai-agent-use-your-product/)
- [Graft 评测 2026：智能体仓库地图该进 Git 吗？](/zh/blog/graft-review-agent-repo-map/)
- [通过工具输出压缩降低编码代理成本](/zh/blog/codag-cost-control/)
- [用 AI 编码智能体更聪明地管理 Token](/zh/blog/smarter-token-usage-with-your-ai-coding-agent/)

只收重要内容

## 关注与你相关的内容

每当我们发布新文章，你会收到一封简短邮件。你可以关注整个博客，也可以只选感兴趣的主题。

[**返回**](/zh/blog/overview/)

[![Kevin Riedl](/img/team/kevin.webp)](/zh/team/kevin-riedl/)

[Kevin Riedl](/zh/team/kevin-riedl/) https://linkedin.com/in/wsdt

9 分钟 阅读 · 2026年8月18日 最近审核 2026年8月18日

[**下一篇**](/zh/blog/can-an-ai-agent-use-your-product/)

邮件订阅新文章 ×

×

通过邮件获取新文章

我们发布时给你一封简短邮件。免费，不做跟踪。

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/zh/blog/agent-readable-website-llms-txt-markdown-mirrors/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-08-18",
      "inLanguage": "zh",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-08-18",
      "url": "https://wavect.io/zh/blog/agent-readable-website-llms-txt-markdown-mirrors/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "abstract": "一个智能体可读的网站需要四个相互独立的接口同时成立：让检索抓取器进得来的 robots 规则、在 JavaScript 运行之前就已存在于服务端输出 HTML 中的正文、一份用 rel=alternate 声明出来的干净 Markdown 或 llms.txt 副本，以及写明发布方的有效 JSON-LD。只满足其中三个，你照样是隐形的。llms.txt 是一种约定而不是标准，它最常见的缺陷是相对 URL，因为这个文件会脱离它原本所在的页面被读取。值得用关卡守住的转换错误包括：未解析的模板值、未闭合的代码围栏、未解码的 HTML 实体、被粘连的相邻链接、对不上的表格列数、重复的 H1，以及空的正文。代价最高的单一错误是把训练爬虫和检索抓取器混为一谈：屏蔽 GPTBot 是授权决定，而它下面那条通配符 disallow 会把你彻底从答案里删掉。这些错误都没有可见症状，所以检查应该放进构建流程，而不是写进一份清单。",
  "articleBody": " 博客概览/AI 与智能体/智能体工程 智能体可读的网站：llms.txt、Markdown 镜像，以及真正会坏在哪里 要点速览 一个智能体可读的网站需要四个相互独立的接口同时成立：让检索抓取器进得来的 robots 规则、在 JavaScript 运行之前就已存在于服务端输出 HTML 中的正文、一份用 rel=alternate 声明出来的干净 Markdown 或 llms.txt 副本，以及写明发布方的有效 JSON-LD。只满足其中三个，你照样是隐形的。llms.txt 是一种约定而不是标准，它最常见的缺陷是相对 URL，因为这个文件会脱离它原本所在的页面被读取。值得用关卡守住的转换错误包括：未解析的模板值、未闭合的代码围栏、未解码的 HTML 实体、被粘连的相邻链接、对不上的表格列数、重复的 H1，以及空的正文。代价最高的单一错误是把训练爬虫和检索抓取器混为一谈：屏蔽 GPTBot 是授权决定，而它下面那条通配符 disallow 会把你彻底从答案里删掉。这些错误都没有可见症状，所以检查应该放进构建流程，而不是写进一份清单。 一个智能体可读的网站，会为每个页面提供一份干净的机器副本，在页面头部声明它，并且不屏蔽任何需要抓取它的东西。难的不是决定要这么做，而是在第四次部署之后它依然成立，因为这里每一种失败在浏览器里都看不见，在你的日志里也不出声。 你正在读的这个网站就在跑这套东西：每个页面的 Markdown 镜像、每种语言一份 llms.txt、公开发布的 agent skills，以及一个只要其中任何一处坏掉就让生产构建失败的校验器。这篇文章列的是这个校验器实际抓到过的东西，比照着规范读出来的清单更有用。 智能体真正会用到的四个接口 智能体可读性经常被当成一个话题来谈，但它其实是四个彼此独立的接口，而一个网站可以过了三个，仍然是隐形的。 接口它回答的问题失败时的样子 robots.txt我到底允不允许抓这个？在答案里悄无声息地缺席 服务端输出的 HTMLJavaScript 运行之前正文在不在？一个带导航的空壳 Markdown 镜像有没有一份便宜且无歧义的副本？对渲染出来的外壳做又贵又嘈杂的解析 JSON-LD这是谁发布的，它又是什么？靠正文猜出来的事实，或者什么都没有 顺序很重要。给一个检索抓取器根本无权读取的页面修结构化数据，是白干，而这正是这类项目最常见的倒着做的方式。 诚实地看 llms.txt llms.txt 是一种约定，不是标准。没有引擎有义务读它，谁向你保证一定会被读取，那就是在夸大。它同时也很便宜，而且能给智能体一张干净的地图，而不是你渲染出来的导航，所以我们自己发布了一份，通常也会建议这么做。 如果你要发布，有三件事决定它有没有用： 绝对 URL。这是我们见得最多的错误，我们自己也犯过。llms.txt 会被抓走并四处传递，脱离它原本所在的页面，于是没有基准 URL 可以用来解析相对链接。一份满是 /services/… 路径的文件，就是一份满是死路的文件。 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 的陷阱：检索不等于训练 这是整个话题里代价最高的误解，而它只是一行配置。 有些爬虫存在的目的是收集训练数据。另一些是为了回答一个问题并当场引用而去抓取页面。屏蔽第一类是一个你很可能确实想做的授权决定。屏蔽第二类会把你彻底从答案里删掉，而这几乎总是无意的： User-agent: GPTBot Disallow: / User-agent: * Disallow: / 第一段是有意的训练退出。第二段把所有答案引擎抓取器一起带走了，因为没有自己分组的爬虫会继承通配符规则。写下这份配置的团队以为自己退出了训练。他们同时也退出了被引用。 如果你想要的是“可以引用我，但不要拿我训练”，这个立场是自洽且可配置的：明确列出检索抓取器并放它们进来，再按名字屏蔽训练爬虫。 为什么要用关卡，而不是清单 上面每一项都很容易修一次，也不可能靠意愿一直修着。内容每周在变，模板每月在变，而这些失败都不产生可见症状。季度审计只会晚一个季度才发现它们。 所以这些检查属于构建流程，和测试放在一起。我们的检查在站点生成之后运行，并会让部署失败，于是坏掉的镜像是一条红色流水线，而不是一处慢慢渗漏。这就是全部的诀窍，也是我们把规则目录交出去而不是交一份报告的原因：智能体可读性检查器在你的浏览器里跑的就是同一套镜像规则，也正是决定这个网站能不能部署的同一段代码。 相邻的问题另有去处：我们的Open Knowledge Format 指南讲如何把内部知识打包成可移植的 Markdown，AI 就绪的公司 wiki 指南讲如何把这些知识提供给你自己的智能体。这篇文章严格只谈公开接口：别人的智能体能读到什么。 常见问题 什么让一个网站对智能体可读？ 四件事同时成立：让检索抓取器进得来的 robots 规则、在 JavaScript 运行之前就存在于服务端输出 HTML 中的正文、在页面头部声明出来的干净 Markdown 或 llms.txt 副本，以及写明发布方的有效 JSON-LD。只过了其中三个，通常就足以让你保持隐形。 llms.txt 是标准吗？ 不是。它是一种约定，没有引擎有义务读它。它发布成本低，而且给智能体一张干净的地图而不是渲染出来的导航，所以我们自己维护了一份。但如果有人声称它一定会被读取，那正是你该怀疑他其余说法的理由。 llms.txt 里能用相对 URL 吗？ 不可靠。这个文件会脱离它原本所在的页面被抓取和传递，于是没有基准 URL 可供解析。请使用绝对 URL。 我们该屏蔽 GPTBot 吗？ 那是授权决定，不是可见性问题。屏蔽 GPTBot 或 CCBot 让你退出训练数据，并不会把你从 ChatGPT 或 Perplexity 的答案里删掉，因为那些由另外的检索抓取器提供。真正把你从答案里删掉的，是屏蔽那些检索抓取器。 Markdown 镜像会不会造成搜索引擎的重复内容问题？ 把 canonical URL 带进镜像，并让镜像不要进入你的 XML sitemap，这样发现路径依然指向 HTML 页面。镜像是同一份 canonical 文档的另一种表示形式，通过 rel=alternate 声明。 上线之后怎么防止它退化？ 把检查放进构建流程，而不是写进文档。内容和模板一直在变，而这些失败都没有可见症状，所以任何靠意愿维持的东西，一两个季度内就会退回去。 最终思考 智能体可读性不是一个内容项目。它是四个机械性的接口、一份不长的转换错误清单，以及一行决定其余一切有没有意义的配置。先从 robots.txt 开始，因为它检查成本最低，出错代价最高。然后提供一份干净的副本、把它声明出来、校验你的结构化数据，并把这一切放到关卡后面，让下一次部署必须继续让它成立。 你可能也喜欢.. Open Knowledge Format：企业指南 如何把组织知识打包成可移植、人类可读的 Markdown，并带上来源与新鲜度信号。 AI Enablement 对比通用 AI 咨询 把在你自己基础设施上可衡量的落地，与只交付战略的合作方式做个对比。 智能体工程 继续浏览此集群 编程智能体、MCP、上下文系统、评估与可靠自动化控制。 从核心文章开始AI 智能体的图工程：知识图谱什么时候值得做？ 本地化 URL 会搞坏 hreflang：只保留一个英文 slug AI 智能体能用你的产品，还是只能读到它？ Graft 评测 2026：智能体仓库地图该进 Git 吗？ 通过工具输出压缩降低编码代理成本 用 AI 编码智能体更聪明地管理 Token 集群中的下一篇本地化 URL 会搞坏 hreflang：只保留一个英文 slug 相关服务路径： AI 可见性 看看生产环境中的应用: 债券分析平台 先做决定: 如何挑选软件开发公司 只收重要内容 关注与你相关的内容 每当我们发布新文章，你会收到一封简短邮件。你可以关注整个博客，也可以只选感兴趣的主题。 Company 电子邮箱 你希望接收哪些内容？ 完整的 Wavect 博客接收六个主题下的每一篇新文章。 仅接收所选主题请在下方选择一个或多个分类。 选择主题 AI 与智能体 产品与 MVP 交付与 QA 领导力与团队 商业与监管 Web3 与隐私 我希望接收所选的 Wavect 博客邮件，并已阅读 隐私信息。我可以随时退订。 发送确认邮件→ 免费、双重确认、不使用跟踪像素。 ",
  "articleSection": "Engineering",
  "author": {
    "@id": "https://wavect.io/team/kevin-riedl/#person",
    "@type": "Person",
    "name": "Kevin Riedl",
    "sameAs": [
      "https://www.wikidata.org/wiki/Q139796365",
      "https://www.linkedin.com/in/wsdt",
      "https://github.com/wsdt"
    ],
    "url": "https://wavect.io/team/kevin-riedl/"
  },
  "dateModified": "2026-08-18",
  "datePublished": "2026-08-18",
  "description": "一个智能体可读的网站需要四个相互独立的接口同时成立：让检索抓取器进得来的 robots 规则、在 JavaScript 运行之前就已存在于服务端输出 HTML 中的正文、一份用 rel=alternate 声明出来的干净 Markdown 或 llms.txt 副本，以及写明发布方的有效 JSON-LD。只满足其中三个，你照样是隐形的。llms.txt 是一种约定而不是标准，它最常见的缺陷是相对 URL，因为这个文件会脱离它原本所在的页面被读取。值得用关卡守住的转换错误包括：未解析的模板值、未闭合的代码围栏、未解码的 HTML 实体、被粘连的相邻链接、对不上的表格列数、重复的 H1，以及空的正文。代价最高的单一错误是把训练爬虫和检索抓取器混为一谈：屏蔽 GPTBot 是授权决定，而它下面那条通配符 disallow 会把你彻底从答案里删掉。这些错误都没有可见症状，所以检查应该放进构建流程，而不是写进一份清单。",
  "headline": "智能体可读的网站：llms.txt、Markdown 镜像，以及会坏在哪里",
  "image": "https://wavect.io/img/blog/headers/header_agent-readable-website-llms-txt-markdown-mirrors.svg",
  "inLanguage": "zh",
  "keywords": "AI 可见性, 机器可读的 Web",
  "mainEntityOfPage": {
    "@id": "https://wavect.io/zh/blog/agent-readable-website-llms-txt-markdown-mirrors/",
    "@type": "WebPage"
  },
  "publisher": {
    "@id": "https://wavect.io/#organization",
    "@type": [
      "Organization",
      "ProfessionalService",
      "LocalBusiness"
    ]
  },
  "url": "https://wavect.io/zh/blog/agent-readable-website-llms-txt-markdown-mirrors/",
  "wordCount": 260
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/",
      "name": "首页",
      "position": 1
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/overview/",
      "name": "博客概览",
      "position": 2
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/topics/ai-agents/",
      "name": "AI 与智能体",
      "position": 3
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/clusters/agent-engineering/",
      "name": "智能体工程",
      "position": 4
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/agent-readable-website-llms-txt-markdown-mirrors/",
      "name": "智能体可读的网站：llms.txt 与 Markdown 镜像 | ",
      "position": 5
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "四件事同时成立：让检索抓取器进得来的 robots 规则、在 JavaScript 运行之前就存在于服务端输出 HTML 中的正文、在页面头部声明出来的干净 Markdown 或 llms.txt 副本，以及写明发布方的有效 JSON-LD。只过了其中三个，通常就足以让你保持隐形。"
      },
      "name": "什么让一个网站对智能体可读？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "不是。它是一种约定，没有引擎有义务读它。它发布成本低，而且给智能体一张干净的地图而不是渲染出来的导航，所以我们自己维护了一份。但如果有人声称它一定会被读取，那正是你该怀疑他其余说法的理由。"
      },
      "name": "llms.txt 是标准吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "不可靠。这个文件会脱离它原本所在的页面被抓取和传递，于是没有基准 URL 可供解析。请使用绝对 URL。"
      },
      "name": "llms.txt 里能用相对 URL 吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "那是授权决定，不是可见性问题。屏蔽 GPTBot 或 CCBot 让你退出训练数据，并不会把你从 ChatGPT 或 Perplexity 的答案里删掉，因为那些由另外的检索抓取器提供。真正把你从答案里删掉的，是屏蔽那些检索抓取器。"
      },
      "name": "我们该屏蔽 GPTBot 吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "把 canonical URL 带进镜像，并让镜像不要进入你的 XML sitemap，这样发现路径依然指向 HTML 页面。镜像是同一份 canonical 文档的另一种表示形式，通过 rel=alternate 声明。"
      },
      "name": "Markdown 镜像会不会造成搜索引擎的重复内容问题？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "把检查放进构建流程，而不是写进文档。内容和模板一直在变，而这些失败都没有可见症状，所以任何靠意愿维持的东西，一两个季度内就会退回去。"
      },
      "name": "上线之后怎么防止它退化？"
    }
  ]
}
```
