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等正式规格)
读取的BotGPTBot、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的格式结构:H1为网站名称,引用块为概要,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等编码会出现乱码
  • 避免使用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动态生成——该选哪种

静态文件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状态码是否为200curl -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中添加几十行代码也能实现,即使不用插件也完全可以搞定。