ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

llms.txt:面向大模型的内容分发基础设施与部署指南

llms.txt:面向大模型的内容分发基础设施与部署指南 最近不少人在讨论一个叫llms.txt的文件。技术圈的反应很有意思一边是“大模型时代的sitemap.xml”“给 AI 写的网站说明书”这类说法被反复转发另一边是真正把文件部署到服务器上的人过几天一看日志发现根本没有任何 AI 爬虫找上门。“Nobody Fetched My Llms.txt”这是一个真实存在的困惑。先说我的判断llms.txt不是一个“今天提交、明天就有 AI 流量”的 SEO 工具它更像是面向大模型内容分发的长期基础设施。这个规范目前还处在早期演进阶段部署它的价值在于让未来的 AI 系统更容易理解你的网站而不是立刻看到可量化的抓取收益。很多人部署之后觉得没用不是因为文件格式错了而是因为对它的定位、生效时机和运行机制理解得不够完整。这篇文章会围绕这个问题展开llms.txt到底解决了什么痛点它的文件格式和部署方式是什么为什么你部署了却没人来抓取以及在当前阶段我们应该如何正确使用它。1. 先说结论llms.txt 是长期基础设施不是短期 SEO 工具如果你正在做网站运营、技术博客维护或者企业官网的内容管理最近大概率听过这种说法llms.txt可以告诉大模型“你的网站里最重要的是哪些内容”让 ChatGPT、Claude 这类产品在回答问题时更愿意引用你。这个说法方向没错但它很容易让人产生一个错误预期只要放上llms.txtAI 爬虫就会立即来抓取然后网站的 AI 推荐流量就会上升。现实并不是这样。llms.txt的定位更加基础它解决的是“机器如何理解网站内容结构”的问题。传统搜索引擎靠爬虫抓取 HTML再通过链接关系分析内容权重而大模型应用在做检索增强生成RAG时需要的是干净、结构化、可以直接作为上下文的文本。llms.txt想做的就是在网站根目录提供一个可供大模型直接读取的“内容地图”。这意味着它的价值不是立刻显现的而是随着 AI 产品的逐步采纳慢慢释放。如果你把它当长期资产来维护方向是对的如果把它当短期流量工具大概率会失望。2. 为什么大模型时代需要 llms.txt要理解llms.txt的价值先要理解大模型获取网站内容的方式和传统搜索引擎有哪些不同。传统搜索引擎的流程大致是爬虫抓取 HTML 页面去掉标签提取正文分析关键词、外链、页面权重然后建立索引。用户搜索时搜索引擎在索引里匹配返回链接列表。整个过程HTML 是一个重要载体页面之间的链接关系也是排序信号。大模型应用则不一样。无论是训练模型、做 RAG还是让模型实时检索网页它需要的都是“高质量的文本本身”而不是一堆 HTML 标签。HTML 对模型来说有两个问题第一噪声太多。一个页面里往往有导航、侧边栏、广告、评论区、推荐位真正的内容可能只占一小部分。把整个 HTML 塞给模型既浪费 token又容易干扰模型理解。第二结构不友好。现代网站大量使用 JavaScript 渲染爬虫看到的 HTML 可能只是一个空壳真正的内容是客户端异步加载出来的。模型要拿到内容必须先执行脚本这对抓取方来说成本很高。llms.txt的思路是在网站根目录放一个Markdown格式的文件告诉 AI 系统这个网站最重要内容在哪里、每部分讲什么。这样AI 应用只需要抓取一个文件就能拿到整个网站的结构化摘要再按需抓取对应的 Markdown 页面。另外要注意llms.txt不是要替代现有的网页而是给 AI 系统一个更高效的入口。网页依然存在人类用户依然访问网页但 AI 可以使用自己的路径。这让我想到robots.txt和sitemap.xml当年出现时的场景前者告诉爬虫“哪些能抓”后者告诉搜索引擎“有哪些页面”。llms.txt在这个基础上更进一步它告诉 AI“这些页面讲什么、哪些最重要”。3. llms.txt 的核心概念与文件规范llms.txt是一个相对简单的规范。它的设计思路是“利于人类编写、利于机器解析”所以文件放在网站根目录格式是通用的 Markdown。3.1 文件位置规范要求文件放在网站的根目录https://example.com/llms.txt注意是 HTTPS 根路径不是放在某个子目录里。这和robots.txt、sitemap.xml的放置方式一致方便 AI 系统在访问一个站点时快速发现。如果文件放在子目录或者加了复杂的鉴权那 AI 系统很难自动发现它也就失去了意义。3.2 文件格式llms.txt的内容格式很轻量主要由三个部分组成一个 H1 标题说明这个网站的名称。一个区块引用用来说明网站定位、内容范围以及这个文件本身的作用。一个 Markdown 链接列表列出网站最重要的页面或资源每个链接后面可以跟一段描述。一个典型的llms.txt长这样# Example Docs Example Docs is a technical blog focused on web development, AI engineering, and system design. This llms.txt file helps AI models understand the sites content structure and discover key articles. ## Tech Blog Posts - [Understanding Large Language Models](https://example.com/posts/understanding-llms): A beginner-friendly introduction to LLM architecture and training. - [Prompt Engineering Patterns](https://example.com/posts/prompt-patterns): Practical prompt patterns for real-world applications. - [Building a RAG Pipeline](https://example.com/posts/rag-pipeline): End-to-end guide for building retrieval-augmented generation systems. ## Documentation - [API Reference](https://example.com/api): Complete API documentation for the Example platform. - [Deployment Guide](https://example.com/docs/deployment): Step-by-step deployment instructions.从内容上看这个文件的核心作用就是“让 AI 在抓起整个网站之前先看到最重要的链接和一句话说明”。链接可以按主题分组用二级标题区分不同模块。3.3 llms.txt 与 llms-full.txt 的关系除了llms.txt规范还提出过一个llms-full.txt的概念。简单理解llms.txt是“索引”列出网站的重要内容llms-full.txt则是把网站最重要的文本内容直接拼接成一个完整的 Markdown 文件。如果你希望 AI 系统在引用你的网站时不需要逐个抓取内部链接而是直接把全文作为上下文那么可以考虑维护llms-full.txt。不过llms-full.txt的文件体积会比llms.txt大很多。实际使用时需要权衡 token 成本和内容更新的成本。对于大多数个人博客和中小型网站先维护好llms.txt就足够了。3.4 与 robots.txt、sitemap.xml 的区别很多人会把这三者搞混这里用一张表格对比文件目标对象核心作用主要内容robots.txt所有爬虫声明抓取规则允许或禁止抓取的路径sitemap.xml搜索引擎爬虫提供 URL 清单页面地址、更新时间、优先级llms.txtAI 系统 / 大模型应用提供结构化内容地图站点介绍、重要链接、内容描述简单来说robots.txt是“规矩”sitemap.xml是“目录”而llms.txt是“给 AI 的内容摘要”。它们可以同时存在互不冲突。需要注意llms.txt不会覆盖robots.txt的限制。如果某个路径在robots.txt中被禁止抓取即使它在llms.txt里出现合规的抓取方也不会去抓。4. 为什么“Nobody Fetched My Llms.txt”回到标题提出的问题为什么你部署了llms.txt却没人来抓取这不是一个孤立现象很多人在部署后都遇到了类似的情况。原因可以归结为几个层面。4.1 规范还处于早期产品集成需要时间llms.txt是一个较新的提案距离被主流 AI 产品默认支持还有相当长的路。即使某些 AI 应用已经开始关注这个规范从“关注”到“默认抓取”也需要产品迭代和灰度发布。对大部分站点来说部署之后看不到 AI 爬虫访问是正常的。这不是说部署没有意义。任何标准都要经历“提出 - 讨论 - 采纳 - 广泛支持”的过程。早期部署者是在提前踩坑也是在为未来积累经验。4.2 抓取不等于访问根文件还有一个容易被忽略的点AI 系统在抓取网站时可能不会每次都访问llms.txt这个根文件而是直接抓取你已经在页面里提供的 Markdown 文件。也就是说它可能已经通过其他路径拿到了内容只是没有触发你对“抓取 llms.txt”的日志统计。另外很多 AI 爬虫的抓取频率很低尤其对新站或者权重不高的站点可能几周甚至几个月才来一次。你观察日志的时间窗口太短也会得出“没人抓取”的结论。4.3 内容质量与链接价值决定后续分发llms.txt更像一个入口而不是排名开关。AI 产品拿到你的llms.txt后是否愿意引用你网站的内容取决于它对你内容的分析结果。如果你的网站内容质量不高、与用户问题相关性弱即使llms.txt写得再规范也很难被优先采用。所以不要只把注意力放在文件格式上更要把注意力放在内容本身。4.4 你期待的“抓取收益”可能错误如果你把llms.txt当成类似“百度收录提交”那样的操作期望部署后 AI 推荐流量立刻上升那大概率会失望。当前阶段llms.txt的部署价值主要体现在三点为网站未来被 AI 产品理解打下基础。让已经支持该规范的 AI 工具能更高效地读取网站内容。训练团队对“面向 AI 的内容结构设计”的认知。这些价值是长期的也是不容易量化的。5. 手动部署一个最简 llms.txt理解了原理之后我们用一个最小示例跑通流程。假设你现在有一个技术博客想为它部署一个llms.txt。5.1 编写内容在你的项目根目录或网站根目录创建一个llms.txt文件。内容可以参考下面的结构# Example Tech Blog Example Tech Blog publishes articles about software development, AI engineering, and DevOps. This file is provided to help AI systems understand the sites main topics and locate important articles. ## Featured Articles - [How to Build a RAG Application](https://example.com/posts/build-rag-app): A practical guide with code examples. - [Understanding Vector Databases](https://example.com/posts/vector-databases): Key concepts, trade-offs, and use cases. - [KTensor vs TensorFlow vs PyTorch](https://example.com/posts/framework-comparison): A comparison from real project experience. ## About - [About This Blog](https://example.com/about): Background and content topics.写完文件后把它上传到服务器的网站根目录。对静态站点来说通常就是public或dist目录下与index.html同级的位置。5.2 放到网站根目录以 Nginx 为例站点根目录配置通常是这样的server { listen 80; server_name example.com; root /var/www/example.com; index index.html; }那么llms.txt应该放在/var/www/example.com/llms.txt。上传后可以通过浏览器直接访问https://example.com/llms.txt如果能看到 Markdown 内容说明文件已经可以公开访问了。5.3 配置响应头llms.txt本质是一个纯文本文件。正常情况下服务器会自动识别为text/markdown或text/plain。如果希望显式指定 Content-Type可以在 Nginx 配置中加入location /llms.txt { add_header Content-Type text/markdown; charsetutf-8; add_header Cache-Control public, max-age3600; }这里添加Cache-Control是为了让爬虫和 CDN 适当缓存减少源站压力。这个配置不是必需的但作为工程实践更完整。6. 用脚本自动生成和维护 llms.txt手动维护llms.txt对文章数量少的博客来说没问题但一旦文章变多、更新频繁手动维护就容易遗漏。推荐写一个简单的生成脚本放在 CI 流程中自动更新。6.1 Python 生成脚本假设你的博客文章都以 Markdown 形式保存在content/posts/目录下文件名格式为slug.md每篇文章的 Front Matter 中包含title和summary。可以用下面的脚本生成llms.txt 文件路径scripts/generate_llms_txt.py 功能扫描 Markdown 文章生成 llms.txt 依赖Python 3.8无第三方依赖 import os import re from datetime import datetime from urllib.parse import urljoin SITE_URL https://example.com CONTENT_DIR content/posts OUTPUT_FILE public/llms.txt POST_LINK_PATTERN re.compile( r^---\s*$.*?^title:\s*(.)$.*?^summary:\s*(.)$.*?^---\s*$, re.MULTILINE | re.DOTALL, ) def extract_meta(filepath): 提取 Markdown 文件 Front Matter 中的 title 和 summary with open(filepath, r, encodingutf-8) as f: content f.read() match POST_LINK_PATTERN.search(content) if not match: return None title match.group(1).strip().strip() summary match.group(2).strip().strip() slug os.path.splitext(os.path.basename(filepath))[0] url urljoin(SITE_URL /, fposts/{slug}/) return title, summary, url def generate(): posts [] for root, _, files in os.walk(CONTENT_DIR): for filename in files: if not filename.endswith(.md): continue filepath os.path.join(root, filename) meta extract_meta(filepath) if meta: posts.append(meta) # 按标题排序保证输出稳定 posts.sort(keylambda x: x[0].lower()) lines [] lines.append(# Example Tech Blog) lines.append() lines.append( Example Tech Blog publishes articles about software development, AI engineering, and DevOps.) lines.append( This file is generated automatically. Last updated: datetime.utcnow().strftime(%Y-%m-%d)) lines.append() lines.append(## Latest Articles) lines.append() for title, summary, url in posts: lines.append(f- [{title}]({url}): {summary}) os.makedirs(os.path.dirname(OUTPUT_FILE), exist_okTrue) with open(OUTPUT_FILE, w, encodingutf-8) as f: f.write(\n.join(lines) \n) print(fGenerated {OUTPUT_FILE} with {len(posts)} posts.) if __name__ __main__: generate()脚本的核心逻辑是遍历content/posts/下的所有 Markdown 文件读取 Front Matter 中的标题和摘要然后按固定格式输出到public/llms.txt。运行方式python scripts/generate_llms_txt.py注意上述脚本中的 Front Matter 正则表达式是简化版本。如果你的博客使用 Hugo、Hexo、VitePress 等框架Front Matter 格式会略有差异建议根据实际情况调整解析逻辑。6.2 在 CI 中自动更新如果你使用 GitHub Actions、GitLab CI 或 Jenkins可以在每次 main 分支更新时自动运行脚本并将生成的llms.txt部署到服务器或静态托管平台。以 GitHub Actions 为示例的一个简化思路name: Update llms.txt on: push: branches: [main] jobs: generate: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkoutv4 - name: Setup Python uses: actions/setup-pythonv5 with: python-version: 3.11 - name: Run generator run: python scripts/generate_llms_txt.py - name: Deploy to server run: | scp public/llms.txt userserver:/var/www/example.com/llms.txt这个示例中的scp需要提前配置好 SSH 密钥如果你使用对象存储或 CDN也可以换成对应的上传命令。7. 验证你的 llms.txt 是否合格部署之后要做一些基础验证不能只看文件能不能打开。7.1 基础检查先用curl检查 HTTP 状态码和响应头curl -I https://example.com/llms.txt预期结果中HTTP 状态码应该是 200Content-Type应该是text/markdown或text/plain。如果返回 404说明文件路径不对如果返回 403说明服务器权限有问题。再抓取完整内容确认文件内容格式是否正确curl -s https://example.com/llms.txt | head -207.2 格式校验脚本可以写一个简单的 Python 脚本检查llms.txt是否符合基本要求文件可以通过 HTTP 访问。第一行是 H1 标题。包含区块引用说明。包含至少一个 Markdown 链接。链接是绝对 URL。 文件路径scripts/validate_llms_txt.py 功能校验 llms.txt 的基本格式 import re import sys import urllib.request URL https://example.com/llms.txt def main(): try: resp urllib.request.urlopen(URL, timeout10) content resp.read().decode(utf-8) except Exception as e: print(fFAIL: cannot fetch {URL}: {e}) sys.exit(1) lines content.strip().splitlines() if not lines: print(FAIL: file is empty) sys.exit(1) if not lines[0].startswith(# ): print(FAIL: first line should be an H1 title) sys.exit(1) if not content.startswith(): print(WARN: no blockquote description after H1) links re.findall(r\[.*?\]\((https?://.*?)\), content) if not links: print(FAIL: no absolute markdown links found) sys.exit(1) print(fPASS: {len(links)} links found, title: {lines[0]}) sys.exit(0) if __name__ __main__: main()运行python scripts/validate_llms_txt.py如果输出PASS说明文件的基础结构没有问题。7.3 跟踪 AI 爬虫要判断是否有 AI 爬虫访问过你的站点可以按 User-Agent 查看服务器访问日志。以 Nginx 为例grep -i GPTBot\|ClaudeBot\|PerplexityBot\|Google-Extended /var/log/nginx/access.log | tail -20这个命令会过滤出与主流 AI 爬虫相关的访问记录。需要说明的是不同产品的爬虫名称会变化而且很多产品的抓取行为并未公开所以看不到访问记录不代表你的llms.txt没被用过。8. 常见问题与排查思路部署llms.txt的过程中有一些高频问题整理如下问题现象可能原因排查方式解决方案访问llms.txt返回 404文件没有放到根目录检查服务器根路径和文件位置将文件移动到站点根目录返回 403文件权限不足用ls -l查看文件权限调整为644或664返回Content-Type: text/html服务器或 CDN 将未知后缀当 HTML 处理检查 Nginx/Apache/CDN 配置显式设置text/markdown或text/plain文件中文乱码编码不是 UTF-8用编辑器查看文件编码统一保存为 UTF-8 无 BOM链接是相对路径手工编写时遗漏域名前缀打开文件检查链接链接改为https://开头的绝对 URL没有 H1 标题格式不规范查看文件第一行加上# 站点名称作为首行没有区块引用说明格式不完整检查是否有开头段落添加站点介绍AI 爬虫没有访问产品尚未集成或抓取频率低查看日志、观察时间窗口调整预期持续优化内容和格式文件体积过大把所有文章全量写入检查文件大小只保留高价值链接或维护llms-full.txtrobots.txt 禁止了 AI 爬虫robots.txt规则冲突查看 robots.txt 中 User-agent 规则按需放行合规 AI 爬虫9. 最佳实践与工程建议9.1 内容策略先有内容再有 llms.txtllms.txt本身不产生内容价值它只是让内容更容易被 AI 系统发现。如果你网站的内容质量本身不够或者页面长期不更新那llms.txt写得再好意义也有限。建议从用户问答场景出发思考“如果 AI 产品引用我的网站用户会得到什么答案”。把最高质量的、最常被搜索的内容放在llms.txt的靠前位置。9.2 安全与访问控制不要把私有内容放进 llms.txtllms.txt是公开文件任何能访问你网站的人都能看到。不要在这个文件里或者文件指向的目标文件里放任何需要登录才能访问的内容、付费内容、内部文档或敏感信息。从安全角度不要把llms.txt当作访问控制的替代品。不要在公开的 Markdown 文件中写数据库连接串、API 密钥、内部地址。如果某些页面只允许特定用户访问确保它们不在llms.txt的链接列表中。9.3 运维与监控把 llms.txt 纳入版本管理建议把llms.txt的生成逻辑纳入版本管理和 CI/CD 流程。这样可以确保内容更新时llms.txt自动同步。每次变更都可以审计。团队成员都能看到改动记录而不是手动覆盖线上的文件。监控方面可以在访问日志中对llms.txt的请求单独打点定期观察是否有新的 AI 爬虫访问。但要注意不同产品的抓取频率不同不要因为短期没有数据就急于下结论。9.4 与现有 SEO 体系的关系llms.txt不会替代sitemap.xml。传统搜索引擎仍然依赖sitemap.xml和页面外链llms.txt可以理解为“AI 时代的补充层”。两者并行维护才是更稳妥的策略。另外如果你同时使用robots.txt限制某类爬虫需要确认llms.txt中的内容没有被误伤。否则就会出现“文件写好了但合规爬虫被规则挡在门外”的情况。10. 总结与后续学习方向回到最初的问题Nobody Fetched My Llms.txt。这不是llms.txt这个规范的失败而是它的生命周期还处在非常早期的阶段。任何面向未来的标准都要经历从提出、讨论、采纳到广泛支持的过程。提前部署的价值不在于短期内换来多少 AI 流量而在于当主流的 AI 应用开始支持这个规范时你的网站已经准备好了。如果你现在还没部署不需要焦虑如果你想试点建议从一个最小示例开始先手动创建llms.txt再逐步用脚本自动化维护。过程中注意三点内容优先、格式规范、安全边界。后续可以继续关注的方向包括llms.txt规范的更新和演进尤其是llms-full.txt的取舍。主流 AI 产品对llms.txt的支持方式和抓取策略。RAG 应用中llms.txt如何与向量检索、知识库构建配合。面向 AI 的内容结构设计比如如何写摘要、如何组织链接、如何控制文件体积。这些都是新话题还没有标准答案。先把基础流程跑通再根据实际变化调整才是当前阶段更务实的选择。
返回列表