crea.site
阅读需 1 分钟 seoagents

llms.txt、robots.txt 与以 Markdown 提供页面

智能体的阅读方式和浏览器不同。每个生成的网站都会提供:llms.txt、点名 AI 爬虫的政策,以及每个页面的 markdown 版本。

越来越多会听说某家小商家的人,永远不会访问它的网站。他们会去问模型,而模型只会根据它能读到的内容作答。

这让"智能体能读懂这个网站吗?"成为一个关乎获客的问题,而不是技术上的好奇。由此得出三件事,每个在这里生成的网站都会自动具备,无需你开口。

robots.txt 应该点名 AI 爬虫

对它们只字不提,它们就会回落到 User-agent: *。那不是政策,只是你继承来的默认值。

所以我们点了它们的名。会把引用带回来的搜索和问答智能体:OAI-SearchBot、ChatGPT-User、Claude-SearchBot、Claude-User、PerplexityBot;以及训练爬虫:GPTBot、ClaudeBot、Google-Extended、meta-externalagent。它们每一个都沿用和其他所有人完全相同的 Disallow 列表:没有哪个爬虫能访问 API,也没有哪个爬虫能访问仅限会员的页面。

点名并不是为了放宽。而是让政策被写在一个可以被有意修改的地方。

llms.txt 是目录,不是推销

llms.txt 的约定很简单:一个标题,一段放在引用块里的摘要,然后是带链接的分区。模型来到这里,应该一次请求就能知道这个网站是什么、重要页面在哪,无需渲染任何东西。

我们的 llms.txt 由网站定义生成,这比听上去重要得多。列表使用与 sitemap 相同的公开/私有规则进行过滤:

# Piekarnia Lune

> A sourdough bakery in Kraków. Bread baked daily, cakes to order,
> open from seven.

## Pages

- [Menu](https://...): What we bake, and what it costs.
- [Order a cake](https://...): Wedding and birthday cakes, two weeks' notice.

同一份列表被读取三次:sitemap、llms.txt 和 robots meta 标签。三者不可能不一致,因为根本没有需要同步的东西。

每个页面都有 markdown 版本

最容易被误读的方法,就是让读者从一整页版式里去找三句话。所以每个生成网站的每个页面,既能以 HTML 响应,也能以 markdown 响应:

  • 发送 Accept: text/markdown,你会在同一个 URL 得到页面的 markdown 版本。
  • 或者在路径后加上 .md,供许多不做内容协商的智能体使用。

保证它诚实的规则值得说明。它是重写,不是重定向。只有明确请求 text/markdown 时才会发生,绝不会因 */* 而发生,因为发送"任意类型"的浏览器想要的是页面本身。两种响应都带有 Vary: Accept,所以共享缓存不会把同一个内容返回给所有人。并且 markdown 版本是 noindex,所以它不会在搜索中与它所复制的页面竞争。

序列化器遍历的是网站定义,而不是渲染后的 HTML,这就是输出如此干净的原因:功能区块变成列表,FAQ 变成标题和答案,价格表变成表格。地图或预约日历会变成一行如实说明有什么的文字,而不是编造它本来会显示什么。

我们自己也适用

本文在相同的 URL 后加 .md 就能获取。crea.site 上的其他每个页面也是如此,我们自己的 llms.txt 列出了它们。

一个连自家页面都无法让智能体读懂的建站工具,就是在自己反驳自己。