手写 llms.txt 验证器:让 AI 更愿意引用你的网站(GEO)

手写 llms.txt 验证器:让 AI 更愿意引用你的网站(GEO)

GEO(Generative Engine Optimization,生成式引擎优化)这两年火起来,核心目标是让 ChatGPT、Perplexity 这类 AI 在回答问题时更愿意引用你的内容。其中有个越来越被认可的入口,叫 llms.txt:一个放在网站根目录、专门给大模型看的说明文件。

llms.txt 由 llmstxt.org 提出,格式是纯 Markdown。它告诉 AI:这个站是干什么的、有哪些重点文档、哪份是完整版。文件规范不难,但手写容易漏。这篇写一个验证器,按规范自动校验你的 llms.txt 写得对不对。

规范原文看这里:llmstxt.org,具体字段和示例在它页面里有详细说明。

规范要点回顾

llms.txt 的基本结构是这样:

markdown 复制代码
# 站点名称

> 一句话描述这个网站是干什么的

- [产品介绍](https://example.com/products): 核心产品与参数说明
- [使用文档](https://example.com/docs): 完整使用手册
- [完整版](https://example.com/llms-full.txt): 全站内容合并版

三块内容:H1 标题、块引用描述、一组带描述的链接。可选的是用 H2 给链接分组。

工具能检查什么

  1. llms.txt 是否存在、能否访问(HTTP 200)
  2. Content-Type 是否合理
  3. 第一行是不是 H1 标题
  4. 有没有块引用描述
  5. 链接格式是否符合 - [文本](url): 描述
  6. 有没有建议链接 llms-full.txt
  7. 链接可访问性抽样

依赖:requests。

完整代码

python 复制代码
# -*- coding: utf-8 -*-
"""
llms.txt 验证器
用途:按 llmstxt.org 规范校验网站的 llms.txt 文件
依赖:pip install requests
"""

import re
import requests

HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                         "(KHTML, like Gecko) Chrome/120.0 Safari/537.36"}

H1_RE = re.compile(r"^#\s+\S")
BLOCKQUOTE_RE = re.compile(r"^>\s*")
LINK_RE = re.compile(r"^-\s*\[([^\]]+)\]\(([^)\s]+)\)(?::\s*(.*))?$")


def fetch(url):
    try:
        resp = requests.get(url, headers=HEADERS, timeout=10)
        return resp.status_code, resp.text, resp.headers.get("Content-Type", "")
    except requests.RequestException as e:
        return None, "", str(e)


def validate(base_url):
    url = base_url.rstrip("/") + "/llms.txt"
    print(f"校验目标: {url}\n" + "=" * 60)

    code, text, ctype = fetch(url)
    if code != 200:
        print(f"[错误] llms.txt 无法访问 (HTTP {code})")
        return

    print(f"[信息] Content-Type: {ctype}")
    if ctype and not any(k in ctype for k in ("text/plain", "text/markdown", "octet-stream")):
        print(f"  [警告] Content-Type 建议为 text/plain,当前是 {ctype}")

    lines = text.splitlines()
    errors, warnings, links = [], [], []

    # 1. H1 标题
    if not lines or not H1_RE.match(lines[0].strip()):
        errors.append("第一行必须是 H1 标题(# 站点名)")
    else:
        print(f"[通过] 标题: {lines[0].strip()}")

    # 2. 块引用描述
    if not any(BLOCKQUOTE_RE.match(l.strip()) for l in lines):
        warnings.append("缺少块引用(> 描述),建议加一句站点介绍")

    # 3. 链接解析
    for i, line in enumerate(lines, 1):
        m = LINK_RE.match(line.strip())
        if m:
            links.append((m.group(1), m.group(2), (m.group(3) or "").strip(), i))

    if not links:
        errors.append("没有任何链接,llms.txt 至少要有一个文档链接")

    # 4. llms-full.txt
    if not any("llms-full.txt" in u for _, u, _, _ in links):
        warnings.append("建议链接到 llms-full.txt(完整版)")

    print(f"\n共 {len(links)} 个链接:")
    for text, u, desc, ln in links:
        tip = "" if desc else "(建议补一句描述)"
        print(f"  第{ln}行: [{text}]({u}) {tip}")

    # 5. 可访问性抽样(最多10个)
    print("\n[检查] 链接可访问性抽样:")
    for text, u, desc, ln in links[:10]:
        c, _, _ = fetch(u)
        mark = "OK" if c == 200 else f"HTTP {c}"
        print(f"  {mark}  {u}")

    print("\n[错误]", len(errors))
    for e in errors:
        print("  -", e)
    print("[警告]", len(warnings))
    for w in warnings:
        print("  -", w)

    print("\n" + "=" * 60)
    print("校验结束。规范细节见 llmstxt.org。")


if __name__ == "__main__":
    validate("https://example.com")

怎么用

bash 复制代码
pip install requests

把最后一行 validate(...) 里的域名换成你自己的,运行。它会在域名后自动拼上 /llms.txt。

三个写 llms.txt 时最常犯的错

第一行不是 H1。 有人第一行直接写链接或者空行,AI 读起来不知道这个文件叫什么、是哪个站。第一行必须是 # 站名。

链接没有描述。 光给一个 - [文档](https://...),AI 不知道这个链接讲什么、值不值得去读。每条链接后面加一句描述,是让 AI 愿意点进去的关键。

没给完整版。 如果你的内容比较多,把全站合并成一个 llms-full.txt,在 llms.txt 里指过去。这样 AI 一次就能拿到全量内容,不用挨个链接爬。

写在最后

llms.txt 是 GEO 里投入小、见效直接的一步,一个文件就能让 AI 更清楚你的站。代码拿去用,跑一遍就知道自己的文件合不合规。觉得有用欢迎点赞、收藏、转发,有疑问评论区留言或私信交流。

相关推荐
一晌小贪欢14 分钟前
Python基础:第 09 篇 · while 循环:重复直到不满足
开发语言·c++·python·数据可视化·面向对象·python办公
机 _ 长30 分钟前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维
xiaoye-duck1 小时前
《C++ 项目:手写大模型接入 SDK》LLMManager架构设计与实现
开发语言·网络·c++·语言模型
用户4356782936371 小时前
五线并行认知架构:从算力内卷到思考秩序的底层革命
人工智能
一 铭1 小时前
WrenAI 详解:给 AI Agent 的开源 GenBI 引擎
人工智能·开源
say_fall1 小时前
【AI大模型】MCP 模型上下文协议:客户端-服务器架构、JSON-RPC 消息与能力协商、工具发现与调用链路、与函数调用的分工
服务器·人工智能·架构
一条大祥脚1 小时前
CuTe 与 CuTe DSL:从 C++ 模板元编程到 Python DSL 的 GPU 编程演进
开发语言·c++·python·cutlass·cute·cute dsl
早起CaiCai1 小时前
【2023-01 OM】利用深度学习算法融合异质观测实现海洋场降尺度
人工智能·深度学习·算法
周杰伦的稻香1 小时前
AI 助手 2.0:多轮对话、卡片化与文章页感知
人工智能
Martina_03212 小时前
AI生成3D场景从白模换成精模后镜头全偏了?用6步检查单位、枢轴与层级替换
图像处理·人工智能·3d·ai·自然语言处理·材质·1024程序员节