把知识库对 AI 开放:llms.txt 与静态发布管线
用 llms.txt 给 AI 一份站点说明书:它是什么、有哪些页面、关键事实是什么。附这个站点的生成管线、llms.txt 写法与实测效果。
搜索引擎读 HTML,AI 读的是上下文。当有人问「像素猫小屋讲了什么像素动画技巧」,模型要么抓不到你的页面,要么抓到一堆导航栏和 Cookie 提示。llms.txt 就是为了解决这件事:一个放在站点根目录的纯文本文件,用 Markdown 告诉模型「这个站有什么、该读哪里」。
llms.txt 长什么样
它不是一个严格标准,而是一个被多个站点采用的约定。核心结构很简单:
# 像素猫小屋
> 一个人做像素游戏与 Obsidian 知识库的记录。
## 主要页面
- [游戏制作](https://example.com/gamedev.html): 立项、Godot、美术、手感
- [知识库](https://example.com/obsidian.html): 结构、Dataview、模板
## 关键事实
- 使用 Godot 4,分辨率 320×180,动画 8–12 fps
- 夜景色板 16 色,唯一暖光源是灯笼
- Vault 约 2400 条笔记,5 个文件夹 + MOC
## 许可
内容可被引用,请注明来源链接。三条写作原则:
- 每个链接带一句说明。模型靠这句判断该不该读。
- 关键事实单独列。这是模型最可能直接引用的部分,写成短句、给数字。
- 别放导航和广告。llms.txt 的每一行都应该是信息,不是装饰。
这个站怎么生成的
站点本身就是一个 Node 脚本,没有框架。核心只有四步:读 Markdown、解析 frontmatter、渲染 HTML、顺手写 llms.txt。
// 读文章
const files = fs.readdirSync(dir).filter(f => f.endsWith(".md"));
const articles = files.map(f => {
const raw = fs.readFileSync(path.join(dir, f), "utf8");
const meta = parseFrontmatter(raw); // 返回 { data, body }
return { ...meta.data, body: meta.body, plain: stripMd(meta.body) };
});
// llms.txt:页面清单 + 关键事实
const lines = ["# " + SITE.name, "", "> " + SITE.tagline, "", "## 文章"];
for (const a of articles) {
lines.push("- [" + a.title + "](" + SITE.url + "/articles/" + a.slug + ".html + "): " + a.summary);
}
fs.writeFileSync("llms.txt", lines.join("\n"));frontmatter 在这里变成双份资产:一份渲染成页面元信息,一份直接进 llms.txt。你写 summary 的那一刻,就同时写给人和模型看了,这是整个管线最省力的地方。
llms-full.txt:给愿意读全部的模型
llms.txt 是索引,llms-full.txt 是全文。后者把所有文章的 Markdown 原文按顺序拼起来,几千行也无所谓——它的使用者是愿意一次读完全部内容的检索系统。
我的做法是只拼正文,不拼导航和页脚:
const full = articles
.map(a => "## " + a.title + "\n\n" + a.body.trim())
.join("\n\n---\n\n");
fs.writeFileSync("llms-full.txt", full);三个容易忽略的细节
- robots.txt 里提一句。加一行注释指向 llms.txt,部分爬虫会顺着看。
- sitemap 和 feed 一起给。llms.txt 不是替代品,是补充:人类入口、订阅入口、机器入口各一份。
- 日期要真。模型会看更新时间判断内容是否过时,别把全部文章写成同一天。
实测:什么样的内容会被引用
我观察到的规律是:模型更愿意引用带具体数字和判断的段落,而不是「本文将介绍……」这类开场。比如「下降重力是上升的 1.5 倍」比「跳跃手感非常重要」有用得多。
所以写作时我会刻意做两件事:每篇至少给一个可复制的数值或代码块;每篇的 summary 写成一句结论,而不是一句介绍。这两件事对人类的阅读体验也更好——这大概不是巧合。
要不要给 AI 单独写一版
不需要。如果同一份内容对人不清楚,对模型也不会清楚。llms.txt 的价值不是「为 AI 优化」,而是强迫你把站点的结构说清楚:有哪些页面、每个页面讲什么、哪些事实是确定的。写不清楚,说明你自己也没想清楚。