目录
AI搜索时代已经到来。ChatGPT的网页搜索、Perplexity、Google AI Overviews——用户通过AI获取信息的场景正在急剧增加,在这样的背景下,“让AI正确理解你的网站”变得越来越重要。
正因如此,llms.txt应运而生。如果robots.txt是告诉爬虫“这个页面可以/不可以抓取”的文件,那么llms.txt就是给AI指路的文件:“本站有这些内容,详情请看这里”。不过,并没有证据表明放置它就能被AI回答引用;在本站的访问日志中,三天半里没有任何AI爬虫来读取过它。本文也会说明哪类网站真正值得放置。
本文将全面解析llms.txt的格式规范、应填写的信息、静态文件与动态生成的判断标准,以及主要框架的实现代码。
1. llms.txt是什么
llms.txt是放置在网站根目录下的纯文本文件(Markdown格式),其目的是向LLM(大型语言模型)传达网站的概要、结构和内容列表。
基本信息
| 项目 | 内容 |
|---|---|
| 文件名 | llms.txt |
| 放置位置 | 域名根目录(https://example.com/llms.txt)。自 v2 起也可以放在子路径(/docs/llms.txt)下,负责该路径下的页面 |
| 格式 | Markdown(纯文本) |
| 字符编码 | UTF-8 |
| 提出者 | llmstxt.org(Jeremy Howard等) |
| 标准化状态 | 事实标准(并非RFC等正式规范)。当前为 v2(2026年8月修订) |
| 主要读者 | 在帮助用户的过程中需要信息的AI智能体(规范设想的用途,尤其是查阅文档的编程智能体)。尚未见到各公司正式表示 GPTBot 等训练或搜索用爬虫会读取它 |
一句话概括
robots.txt = “禁止进入” / llms.txt = “我们是这样的网站”
robots.txt是访问控制(允许/拒绝)文件,而llms.txt是网站内容说明(自我介绍)文件。两者并不冲突——更准确地说,应该配合使用。
2. 为什么需要它——与robots.txt的区别
你可能会想“有了sitemap和meta标签,AI不就能理解网站了吗?”确实如此,但llms.txt有其独特的优势。
robots.txt / sitemap.xml / llms.txt 的角色对比
| 文件 | 目的 | 对象 | 内容 |
|---|---|---|---|
| robots.txt | 爬取的允许/拒绝 | 所有爬虫 | Allow/Disallow规则 |
| sitemap.xml | 页面列表的提供 | 搜索引擎 | URL、更新日期、优先级 |
| llms.txt | 网站内容说明 | LLM爬虫 | 概要、结构、内容摘要 |
llms.txt必要的3个理由
理由1:LLM无法高效爬取整个网站
Googlebot会爬取数十亿个页面来构建大规模索引,但LLM的爬虫不会如此全面地爬取。放置llms.txt后,可以高效地向AI传达“本站最重要的内容是这些”。
理由2:更容易被AI回答引用——常被这么说,但没有依据
常有人说“放置llms.txt后更容易被ChatGPT或Perplexity引用”,但并没有数据或各公司的正式表态能证明这一点。Google 明确表示,出现在 AI Overviews 和 AI Mode 中不需要面向AI的文本文件(Google 搜索中心)。与其把llms.txt当作增加引用的手段,不如把它看成帮助智能体尽快找到所需信息的目录,这更符合实际;第9节会用真实日志来验证。
关于LLMO的详细解析,请参阅“什么是LLMO?”。
理由3:能传达sitemap.xml所没有的元信息
sitemap.xml只是URL列表。而llms.txt还能传达以下信息:
- 网站的主题与专业领域
- 各内容的摘要与分类
- 网站的更新频率和规模
- 是否支持多语言
- 联系方式
3. 格式规范——写什么、怎么写
llms.txt 的格式结构
H1 站点名 → blockquote 概要 → H2 章节组
llms.txt使用Markdown格式编写。基于llmstxt.org规范的格式如下:
基本结构
# 网站名称
> 网站的概要说明。用1到3句话简洁传达网站的主题、目标受众和提供的价值。
## 栏目名称1
- [页面标题](URL): 页面的摘要说明
## 栏目名称2
- [页面标题](URL): 页面的摘要说明
- [页面标题](URL): 页面的摘要说明
格式规则
| 元素 | Markdown语法 | 作用 |
|---|---|---|
| H1标题 | # 网站名称 | 网站的正式名称。文件中只能有一个 |
| 引用块 | > 概要文本 | 网站的概要说明。放在H1之后 |
| H2标题 | ## 栏目名称 | 内容的分组 |
| 列表链接 | - [标题](URL): 说明 | 各项内容的信息 |
实际示例
# My Tech Blog
> My Tech Blog is a software engineering blog covering web development, cloud infrastructure, and AI tools. Updated weekly with practical tutorials and comparisons.
## Main Sections
- [Articles](https://example.com/articles): 50+ in-depth technical articles
- [Tutorials](https://example.com/tutorials): Step-by-step coding tutorials
## Popular Articles
- [React vs Vue in 2026](https://example.com/articles/react-vs-vue): A detailed comparison of React and Vue.js for modern web development, covering performance, ecosystem, and learning curve.
- [Docker for Beginners](https://example.com/articles/docker-beginners): Complete guide to Docker containers for developers who have never used containerization.
## Site Information
- URL: https://example.com
- Sitemap: https://example.com/sitemap.xml
- Languages: en, ja
- Contact: admin@example.com
注意事项
- 默认使用英语撰写。llms.txt的规范和示例均为英语,因此使用英语是最佳实践。对于多语言网站,建议使用英语撰写,并通过
Languages: ja, en, es, ...标注支持的语言。但是,对于单一语言网站(例如内容全部为法语或俄语的网站),使用网站语言撰写也完全没有问题。主流LLM(GPT、Claude、Gemini等)能够高精度处理大多数语言,这些网站的用户也会使用相同语言提问,从而确保回答的一致性。 - 字符编码必须使用UTF-8。使用GBK等编码会出现乱码
- URL使用绝对路径(以https://开头的完整URL)
- 一个文件只能有一个H1。栏目分隔使用H2
4. 应填写的信息——必填、推荐、可选
很多人不知道该写什么,这里按优先级整理。
另外,规范(llmstxt.org)规定为必需的只有写网站名的H1,摘要引用块和H2下的链接列表在形式上都是可选的。下面所说的“必需”,是指本文认为“没有它就没什么意义”的最低限度。
必填信息(没有这些llms.txt就没有意义)
| 信息 | 写在哪里 | 示例 |
|---|---|---|
| 网站名称 | H1标题 | # AI Arte |
| 网站概要 | 引用块 | > AI learning platform... |
| 主要栏目 | H2 + 链接列表 | - [Articles](URL): 说明 |
推荐信息(有了更利于AI理解)
| 信息 | 为什么需要 |
|---|---|
| 全部内容列表 | AI可以掌握网站的整体覆盖范围 |
| 每项内容的一行摘要 | AI可以预先了解页面内容 |
| 分类/标签体系 | 展示网站的信息结构 |
| 网站URL | 明确标准URL |
| Sitemap URL | 引导至详细URL列表 |
| 支持的语言 | 多语言网站尤为重要 |
| 联系方式 | 表明网站运营者的身份 |
可选信息(有则更好但非必须)
- 技术栈:用什么构建的(框架等)
- 更新频率:多长时间添加一次内容
- 内容总数:文章数等
- 许可/引用政策:AI是否可以引用
- API信息:是否支持程序化访问
不应填写的信息
- 机密信息:管理后台URL、内部API端点等
- 个人信息:超出必要的个人信息(地址、电话号码等)
- 认证信息:API密钥、密码等
5. llms.txt与llms-full.txt的区别
llms-full.txt是把网站全部内容汇总到一个文件中。它并不在llmstxt.org的规范里,而是因为 Mintlify 等文档平台会与llms.txt一起自动生成它而流行起来的惯例(Mintlify 文档)。规范 v2 推荐的做法反而是:不把全文合成一个文件,而是为每个页面提供Markdown版本(page.md 或 page.html.md),并从llms.txt链接过去。
| 文件 | 内容 | 大小参考 | 用途 |
|---|---|---|---|
| llms.txt | 网站的概要、结构、链接列表 | 1~50KB | 整个网站的“目录” |
| llms-full.txt | 全部内容的完整文本 | 100KB~数MB | 向AI提供内容全文 |
需要llms-full.txt的情况
- 技术文档:API参考、库的文档等,让AI理解全文可以提高回答精度的情况
- 知识库:FAQ集、术语表等,经常被片段引用的内容
不需要llms-full.txt的情况
- 博客/媒体网站:文章数量多,把全文放在一个文件里会过于庞大。llms.txt的摘要已经足够
- 电商网站:商品信息通过结构化数据(JSON-LD等)提供更为合适
- 企业官网:页面数量少,仅靠llms.txt就能覆盖
一般的博客或媒体网站,只需llms.txt就足够了。llms-full.txt可以理解为技术文档专用。
6. 静态文件vs动态生成——该选哪种
静态文件 vs 动态生成 — 该选哪个
实现成本与更新运维的权衡
llms.txt的运维方式主要有两种。
方式1:静态文件
在public/llms.txt(或等效路径)直接放置文本文件。
优点:
- 实现最简单(放文件即可)
- 零服务器负载
- 无需框架也能运行
缺点:
- 每次添加或修改内容都需要手动更新文件
- 忘记更新就会向AI传达旧信息
- 内容数量和分类与文件记载不一致
方式2:动态生成
应用程序接收/llms.txt的请求,从数据库获取最新信息并动态生成文本。
优点:
- 始终反映最新信息
- 添加文章后自动同步到llms.txt
- 内容数量和分类名称始终准确
缺点:
- 实现需要一定工作量(路由定义+控制器)
- 每次请求都会访问数据库(可通过缓存减轻)
- 需要框架支持
判断标准
| 条件 | 推荐方案 |
|---|---|
| 内容10篇以下且很少增加 | 静态文件即可 |
| 内容10篇以上或每月更新1次以上 | 推荐动态生成 |
| 使用WordPress/Laravel/Django等 | 动态生成容易实现 |
| 静态网站(Hugo, Jekyll, Astro等) | 构建时自动生成最为理想 |
| 一人运维,希望最小化维护 | 动态生成(搭建一次即可放手) |
结论:犹豫就选动态生成。虽然初始实现成本较高,但可以做到“部署即完成”,长远来看运维成本更低。用静态文件开始后“忘记更新导致旧信息传给了AI”是最糟糕的情况。
7. 实现方法——主流框架代码示例
接下来介绍主流框架中llms.txt动态生成的实现方法。
Laravel(PHP)
路由定义(routes/web.php):
use App\Http\Controllers\LlmsTxtController;
Route::get('/llms.txt', [LlmsTxtController::class, 'index']);
控制器(app/Http/Controllers/LlmsTxtController.php):
class LlmsTxtController extends Controller
{
public function index()
{
$articles = Article::published()
->with(['translations' => fn($q) => $q->where('locale', 'en')])
->orderBy('published_at')
->get();
$lines = [];
$lines[] = '# My Site Name';
$lines[] = '';
$lines[] = '> Site description here.';
$lines[] = '';
$lines[] = '## All Articles (' . $articles->count() . ')';
$lines[] = '';
foreach ($articles as $article) {
$t = $article->translations->first();
if (!$t) continue;
$url = 'https://example.com/en/articles/' . $article->slug;
$lines[] = '- [' . $t->title . '](' . $url . '): ' . $t->meta_description;
}
$content = implode("\n", $lines);
return response($content, 200)
->header('Content-Type', 'text/plain; charset=utf-8');
}
}
关键点是要明确指定Content-Type: text/plain; charset=utf-8。忘记这一点可能会被解析为HTML。
Django(Python)
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('llms.txt', views.llms_txt, name='llms_txt'),
]
# views.py
from django.http import HttpResponse
from .models import Article
def llms_txt(request):
articles = Article.objects.filter(
status='published'
).order_by('published_at')
lines = ['# My Site', '', '> Description.', '', '## Articles', '']
for a in articles:
lines.append(f'- [{a.title}](https://example.com/articles/{a.slug}): {a.meta_description}')
content = '\n'.join(lines)
return HttpResponse(content, content_type='text/plain; charset=utf-8')
Next.js(TypeScript)
// app/llms.txt/route.ts (App Router)
import { NextResponse } from 'next/server'
export async function GET() {
// 从DB或CMS获取数据
const posts = await getAllPosts()
const lines = [
'# My Site',
'',
'> Description.',
'',
'## Articles',
'',
...posts.map(p =>
`- [${p.title}](https://example.com/posts/${p.slug}): ${p.description}`
),
]
return new NextResponse(lines.join('\n'), {
headers: { 'Content-Type': 'text/plain; charset=utf-8' },
})
}
WordPress(PHP)
在functions.php或插件中添加:
// functions.php
add_action('init', function() {
add_rewrite_rule('^llms\.txt$', 'index.php?llms_txt=1', 'top');
});
add_filter('query_vars', function($vars) {
$vars[] = 'llms_txt';
return $vars;
});
add_action('template_redirect', function() {
if (!get_query_var('llms_txt')) return;
header('Content-Type: text/plain; charset=utf-8');
$posts = get_posts(['numberposts' => -1, 'post_status' => 'publish']);
echo "# " . get_bloginfo('name') . "\n\n";
echo "> " . get_bloginfo('description') . "\n\n";
echo "## Articles (" . count($posts) . ")\n\n";
foreach ($posts as $post) {
$url = get_permalink($post);
$desc = get_the_excerpt($post);
echo "- [{$post->post_title}]({$url}): {$desc}\n";
}
exit;
});
WordPress用户别忘了重新保存固定链接设置(刷新重写规则)。
静态网站生成器(Hugo / Astro等)
编写构建时自动生成的脚本。
# build-llms-txt.sh (Hugo示例)
#!/bin/bash
echo "# My Site" > public/llms.txt
echo "" >> public/llms.txt
echo "> Site description." >> public/llms.txt
echo "" >> public/llms.txt
echo "## Articles" >> public/llms.txt
echo "" >> public/llms.txt
for file in content/posts/*.md; do
title=$(grep '^title:' "$file" | sed 's/title: //')
slug=$(basename "$file" .md)
desc=$(grep '^description:' "$file" | sed 's/description: //')
echo "- [${title}](https://example.com/posts/${slug}): ${desc}" >> public/llms.txt
done
在CI流水线(GitHub Actions等)中构建前执行,就能在每次部署时自动更新。
8. 部署后的确认与验证
部署llms.txt后,请确认以下几点。
基本检查清单
| 检查项 | 确认方法 |
|---|---|
| 能否通过URL访问 | curl https://yoursite.com/llms.txt |
| Content-Type是否正确 | 用curl -I确认为text/plain; charset=utf-8 |
| 是否有乱码 | 在浏览器中直接打开,确认中文是否正常显示 |
| 链接是否正确 | 记载的URL是否实际可以访问 |
| HTTP状态码是否为200 | curl -o /dev/null -w "%{http_code}" |
| robots.txt是否有阻止 | 确认robots.txt中没有Disallow: /llms.txt |
动态生成的额外检查
- 添加1篇文章后确认llms.txt:新文章是否已反映
- 内容数量显示是否正确:“All Articles (27)”的数字是否与实际发布文章数一致
- 是否包含未发布的文章:确认草稿和定时发布的文章没有显示
验证工具
目前没有判断llms.txt格式的官方验证工具(截至2026年9月29日)。Chrome 的 Lighthouse 在“agentic browsing”审核中有 llms.txt 一项,但它只检查获取文件时是否出现服务器错误;未放置文件(404)时审核结果为“不适用”(Chrome for Developers)。内容可以用以下方法确认。
- 让ChatGPT或Claude读取:问它“请读取 https://yoursite.com/llms.txt,介绍一下这个网站”
- Markdown预览器:将llms.txt的内容粘贴到Markdown预览器中,确认结构是否正确渲染
- SEO审计工具:部分SEO审计工具已开始支持llms.txt的存在性检查
9. 实测:AI爬虫会来读取 llms.txt 吗
常听人说“放上去AI就会读”,但到底有没有人来读取,可以在自己服务器的访问日志中确认。本站(arte.itlibra.com)也以动态生成的方式提供 /llms.txt,因此我们按 User-Agent 统计了2026年9月26日07:20至29日12:54(UTC,约三天半,共86,696次请求)的日志。
| 爬虫(User-Agent) | 期间内的全部请求 | robots.txt | llms.txt |
|---|---|---|---|
| OAI-SearchBot(OpenAI 搜索用) | 866 | 20 | 0 |
| ChatGPT-User(ChatGPT 应用户请求打开页面) | 1,275 | 2 | 0 |
| ClaudeBot(Anthropic) | 502 | 29 | 0 |
| Claude-User(Claude 应用户请求打开页面) | 438 | 70 | 0 |
| PerplexityBot | 1,086 | 19 | 0 |
| Googlebot | 2,186 | 14 | 0 |
| bingbot | 4,362 | 21 | 0 |
这段时间里,/llms.txt 只被请求了3次:2次来自命令行(curl),1次来自网站审计工具。AI爬虫读了几百次文章,却一次也没有打开 llms.txt。其中很多爬虫都查看了robots.txt,所以并不是“不看小文件”,而是“根本不去找 llms.txt”。
这只是一个网站三天半的日志,换成其他网站或更长的时间可能会有不同结果。不过结合官方的说明,它的定位已经很清楚。
- Google:明确写道“You don't need to create new machine readable files, AI text files, or markup”(无需为此创建新的机器可读文件、面向AI的文本文件或标记),即可出现在 AI Overviews 和 AI Mode 中(AI features and your website)
- 规范(v2,2026年8月):设想 llms.txt 主要在推理时被读取——即智能体在帮助用户的过程中需要信息的时候——而不是用于训练,并写道使用最多的场景是编程智能体查阅软件文档(llmstxt.org)
- Chrome 的 Lighthouse:“agentic browsing”审核中有 llms.txt 一项,但只有获取文件时出现服务器错误才算不通过。未放置(404)时为“不适用”,不会扣分(Chrome for Developers)
要不要放置:判断的分界点
| 网站类型 | 判断 | 理由 |
|---|---|---|
| API 或库的文档 | 放置(并提供各页面的Markdown版本) | 编程智能体确实会顺着它查阅,这正是规范设想的主要用途 |
| 博客·媒体 | 放了也无妨,但不要指望访问量或引用增加 | 本站日志显示,AI爬虫是直接读取文章的。先见效的是文章本身的质量,以及不要在robots.txt中屏蔽AI爬虫 |
| 小型企业官网 | 不必着急 | 页面少,首页和站点地图就够了 |
放置之后,最可靠的是用自己的日志确认效果。如果是 nginx 或 Apache 标准格式(combined)的访问日志,下面这一行就能按次数从多到少统计请求过 /llms.txt 的 User-Agent。
grep ' /llms.txt ' access.log | awk -F'"' '{print $6}' | sort | uniq -c | sort -rn
10. 实际网站的llms.txt案例
OpenAI、Anthropic、Google(Gemini API)都为自家的开发者文档放置了 llms.txt(见规范页面)。我们没有找到关于采用率的统计,因此下表只是趋势的大致参考。
部署率较高的网站类型
| 网站类型 | 部署率 | 原因 |
|---|---|---|
| AI相关服务/工具 | 高 | AI行业本身的LLMO意识较高 |
| 技术文档 | 高 | 希望AI正确传达信息的需求 |
| 技术博客 | 中等 | 对技术趋势的敏感度较高 |
| 企业官网 | 低 | 认知度仍然较低 |
| 电商网站 | 低 | 结构化数据(JSON-LD)优先 |
优秀llms.txt的特征
- 简洁明了的概要说明——一眼就能看出网站的专业领域
- 全部内容附带摘要列出——AI可以把握全貌
- 分类体系清晰展示——信息结构一目了然
- 动态生成——始终保持最新
糟糕llms.txt的特征
- 只有网站名称和联系方式——信息量太少,无助于AI理解
- 复制粘贴全部内容正文——llms.txt是“目录”而非“全文”。全文是llms-full.txt的职责
- 旧信息放置不管——写着“10 articles”但实际有50篇文章,有损可信度
- 包含机密信息——写入管理后台URL或API密钥的情况
常见问题
Q. 不设置llms.txt就不会出现在AI搜索结果中吗?
不会。没有llms.txt,AI也能直接读取页面并在回答中引用。Google 明确表示,出现在 AI Overviews 和 AI Mode 中不需要面向AI的文本文件;在本站的日志中,AI爬虫读了几百次文章,却一次也没有打开llms.txt。它不是“不放就吃亏”的东西,而是想给智能体指路时才放的辅助文件。
Q. 如果robots.txt屏蔽了AI爬虫,llms.txt还有意义吗?
如果在robots.txt中对User-agent: GPTBot等设置了Disallow,该Bot就不会爬取网站。但llms.txt本身与robots.txt的规则是独立的。AI可能通过其他途径(如用户直接粘贴URL等)访问llms.txt。如果你有意屏蔽AI爬虫,不设置llms.txt才是一致的做法。
Q. llms.txt应该用什么语言写?
多语言网站用英语,单一语言网站用网站语言也可以。规范和示例以英语为主,对于多语言网站来说英语是最合理的中立选择。但如果网站内容完全使用一种语言,用该语言撰写llms.txt也是可以的。主流LLM能够高精度处理大多数语言,用户也会使用与网站相同的语言提问,从而获得一致的回答。
Q. llms.txt的文件大小有限制吗?
规范没有设定上限,只要求文件保持在能放进上下文的大小。作为参考,本站的 llms.txt 把225篇文章和40个课程章节各列一行,大小约为116KB(截至2026年9月29日)。如果文件变大,可以依次考虑:缩短一行摘要、把次要链接移到 ## Optional、或像 v2 允许的那样按子路径拆分成多个 llms.txt。想提供全文时,链接到各页面的Markdown版本即可。
Q. 多久更新一次比较合适?
动态生成的情况下,每次请求都会返回最新信息,无需担心。静态文件的情况下,理想的做法是每次添加或修改内容时都更新。至少每月确认和更新一次。与其让旧信息一直放着,不如切换到动态生成。
Q. 对SEO有影响吗?
不影响Google搜索排名。Google 说明,包括 AI Overviews 和 AI Mode 在内,都不需要面向AI的文本文件或特殊标记,常规的SEO基础同样适用(Google 搜索中心)。也没有证据表明它能增加在ChatGPT或Perplexity中的引用。想知道它有没有作用,最可靠的是像第9节那样查看自己的访问日志。
Q. 有WordPress插件吗?
有。llmstxt.org 的列表中,WordPress 方面列有 Yoast SEO 和 AIOSEO 的 llms.txt 生成功能(截至2026年9月29日)。无论使用哪一个,都请务必检查生成的内容。自己在functions.php中加几十行代码也能实现,所以不用插件也完全可以。