目录
AI搜索时代已经到来。ChatGPT的网页搜索、Perplexity、Google AI Overviews——用户通过AI获取信息的场景正在急剧增加,在这样的背景下,"让AI正确理解你的网站"变得越来越重要。
正因如此,llms.txt应运而生。如果robots.txt是告诉Googlebot等搜索引擎爬虫"这个页面可以/不可以抓取"的文件,那么llms.txt就是向GPTBot、ClaudeBot等AI爬虫"介绍自己网站"的文件。
本文将全面解析llms.txt的格式规范、应填写的信息、静态文件与动态生成的判断标准,以及主要框架的实现代码。
1. llms.txt是什么
llms.txt是放置在网站根目录下的纯文本文件(Markdown格式),其目的是向LLM(大型语言模型)传达网站的概要、结构和内容列表。
基本信息
| 项目 | 内容 |
|---|---|
| 文件名 | llms.txt |
| 放置位置 | 域名根目录(https://example.com/llms.txt) |
| 格式 | Markdown(纯文本) |
| 字符编码 | UTF-8 |
| 提出者 | llmstxt.org(Jeremy Howard等) |
| 标准化状态 | 事实标准(非RFC等正式规格) |
| 读取的Bot | GPTBot、ClaudeBot、PerplexityBot、Google-Extended等 |
一句话概括
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回答引用的可能性
当ChatGPT或Perplexity通过网页搜索生成回答时,如果通过llms.txt明确展示了网站的专业性和内容,该网站更容易被识别为可信的信息来源。这是LLMO(大型语言模型优化)的一环。
关于LLMO的详细解析,请参阅"什么是LLMO?"。
理由3:能传达sitemap.xml所没有的元信息
sitemap.xml只是URL列表。而llms.txt还能传达以下信息:
- 网站的主题与专业领域
- 各内容的摘要与分类
- 网站的更新频率和规模
- 是否支持多语言
- 联系方式
3. 格式规范——写什么、怎么写
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等编码会出现乱码
- 避免使用em破折号(—)等特殊字符。由于以纯文本显示,某些浏览器可能出现乱码。建议使用连字符(-)或双连字符(--)
- URL使用绝对路径(以https://开头的完整URL)
- 一个文件只能有一个H1。栏目分隔使用H2
4. 应填写的信息——必填、推荐、可选
很多人不知道该写什么,这里按优先级整理。
必填信息(没有这些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的区别
llmstxt.org的规范中,除了llms.txt之外还定义了llms-full.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动态生成——该选哪种
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)"的数字是否与实际发布文章数一致
- 是否包含未发布的文章:确认草稿和定时发布的文章没有显示
验证工具
截至2026年4月,尚无llms.txt的官方验证器。不过可以通过以下方式验证:
- 让ChatGPT或Claude读取:问它"请读取 https://yoursite.com/llms.txt,介绍一下这个网站"
- Markdown预览器:将llms.txt的内容粘贴到Markdown预览器中,确认结构是否正确渲染
- SEO审计工具:部分SEO审计工具已开始支持llms.txt的存在性检查
9. 实际网站的llms.txt案例
来看看已经部署了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也能爬取网站并在搜索结果中展示。llms.txt只是"帮助AI理解的辅助文件"。不过,设置后AI可以更准确地把握网站的结构和内容,因此被认为可以提高在AI搜索中被引用的可能性。这与SEO中sitemap.xml的定位类似——没有也能运行,但有了更有利。
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的文件大小有限制吗?
规范上没有明确限制。不过,实际使用中建议控制在50KB以下。即使有数百篇文章的网站,每篇文章的标题加一行摘要也完全可以控制在50KB以内。如果想包含全文,请另外准备llms-full.txt。
Q. 多久更新一次比较合适?
动态生成的情况下,每次请求都会返回最新信息,无需担心。静态文件的情况下,理想的做法是每次添加或修改内容时都更新。至少每月确认和更新一次。与其让旧信息一直放着,不如切换到动态生成。
Q. 对SEO有影响吗?
llms.txt不会直接影响传统SEO(Google搜索排名)。Google使用Googlebot爬取HTML,并未将llms.txt作为搜索排名因素。但对于AI Overviews(Google搜索结果中显示的AI回答)以及ChatGPT、Perplexity等AI搜索中的引用可能性,可能会有影响。请将其视为与传统SEO不同层面的措施(LLMO)。
Q. 有WordPress插件吗?
截至2026年4月,已出现了一些可以自动生成llms.txt的WordPress插件。不过功能和质量参差不齐,使用插件时务必确认生成的内容。自己在functions.php中添加几十行代码也能实现,即使不用插件也完全可以搞定。