
这几年 LLM 应用里的文本配置文件越来越多最容易让人混淆的两份就是 Skill.md 和 Llms.txt。名字都很短都跟 AI 有关系但定位完全不同Skill.md 是给 Agent 看的“操作手册”。它告诉 AI 某个技能该怎么触发、分几步执行、输出什么格式。Llms.txt 是给 LLM 抓取工具看的“网站地图”。它告诉大模型应用某个网站有哪些值得读的内容、链接在哪里。这两个文件经常被放到一起讨论是因为它们同时出现在「LLM 应用落地」的部署流程里。一个是让模型更像“会干活的人”一个是让模型更高效地“拿到外部信息”。很多人一开始会把两者混为一谈实际它们解决的是两个不同层面的事。这篇文章会做几件事拆开讲清楚 Skill.md 和 Llms.txt 分别负责什么什么场景只需要其中一个什么场景需要两个一起上。给出两份文件的完整格式示例包含 YAML frontmatter、Markdown 正文、URL 列表写法。演示如何在本地 Agent 客户端中创建 skill.md 并验证是否被正确加载。演示如何在网站根目录部署 llms.txt并用脚本验证可解析性。补充 API、批量任务、token 资源占用、常见排查方式和最佳实践。读之前先记住一句最关键的判断当你在用 Agent/Chat 类工具做自动化任务时优先关心 Skill.md当你在运营网站、知识库、文档站希望被 LLM 应用更容易引用内容时优先关心 Llms.txt。如果两者同时出现在你的业务链路里那就需要把两份文件都配置好。1. 核心能力速览先给一张表快速判断两个文件到底差在哪。对比项Skill.mdLlms.txt文件本质Agent 技能定义文件面向 LLM 的网站内容索引目标使用者LLM Agent / 智能体框架LLM 网页抓取、知识库索引、检索工具典型放置位置本地技能目录或项目技能目录网站根目录与 robots.txt、sitemap.xml 同级文件格式Markdown YAML frontmatter类 Markdown 的纯文本链接列表核心字段name、description、正文步骤标题、描述、Markdown 链接列表解决什么问题教 Agent 按标准流程完成某个任务让 LLM 更快找到网站上的关键内容谁来“读”它支持 Agent Skills 的客户端/LLM 框架支持 llms.txt 协议的爬虫、索引器、LLM 工具是否面向搜索引擎不直接面向目前对传统搜索引擎影响有限主要面向 LLM 应用对普通用户门槛低文本编辑即可低静态文本文件即可是否必须写代码不必须但可附加脚本不必须但可配合脚本批量解析典型工作流用户提问 - Agent 加载 skill - 按步骤调用操作/API抓取工具访问站点 - 读取 llms.txt - 定位核心页面合规边界只能授予 Agent 有权限的操作只能列出可公开访问的内容从这张表能看出Skill.md 的产出物往往是“行为”比如写周报、总结会议纪要、调用某个脚本Llms.txt 的产出物往往是“内容索引”让大模型应用知道该去读哪些页面。两者不存在竞争关系更像是一个在“模型侧”做能力编排一个在“数据侧”做信息供给。2. 适用场景与使用边界Skill.md 适合的场景团队内部把常用工作流沉淀成技能文件例如周报生成、代码评审、SQL 查询模板、会议纪要整理。个人把重复性操作固化成标准步骤例如每天从某个目录读取笔记并生成待办清单。把提示词工程和工具调用结合起来让文本描述与脚本、命令、API 调用互相配合。Llms.txt 适合的场景个人博客或企业文档站希望被 LLM 应用的检索功能直接引用。知识库站点希望降低大模型抓取时的理解成本用一份索引把重点页面集中暴露。构建 RAG 应用时用 llms.txt 作为种子链接集合替代人工搜集 URL 的过程。这里同时要讲清楚使用边界越界会导致问题Skill.md 不是命令执行引擎。它本质是结构化文本模型读到的是“步骤说明”真正执行命令或 API 调用的是 Agent 框架。如果某个框架把 skill 内容直接拼进提示词那么模型可能“照着做”但不是在执行文件里的命令。因此不要把 skill.md 当成可以远程运行代码的脚本所有执行权限都应该由 Agent 框架和运行环境约束。Llms.txt 不是 robots.txt。robots.txt 是访问控制声明告诉搜索引擎哪些路径不能抓llms.txt 是内容推荐索引告诉 LLM 哪些页面重要。不能把 llms.txt 当作权限墙线上敏感数据不放进列表才是正确做法。涉及版权和隐私时要确认你有权把页面标题和 URL 列进 llms.txt。同样skill.md 如果被上传到公共仓库要检查有没有把内部命令、密钥、接口地址写进去。如果有人想把 skill.md 用于破解验证码、绕过安全限制、未授权爬取等操作这是明令禁止的。技能文件只能用于合法、有授权的自动化任务。针对“ComfyUI 与 LLM 必须在同一台电脑上么”这类本地部署问题可以顺带说明Skill.md 只负责定义 LLM 侧的行为真正执行生图任务的 ComfyUI 通常通过 HTTP API 被外部调用。只要网络互通、端口可达LLM 与 ComfyUI 不需要装在同一台机器上。反过来说如果你把 ComfyUI 相关操作写进 skill只要 API 地址能被 LLM 客户端访问本地部署和远程部署都可以跑通。3. 格式与语法拆解3.1 skill.md 的典型结构skill.md 的典型结构是“YAML frontmatter Markdown 正文”。frontmatter 位于文件最顶部用---包裹描述技能的名称和触发条件正文则写具体的执行方法、步骤、示例输出。--- name: weekly-report description: 当用户需要生成周报、写工作总结或整理本周进展时使用。 --- # 周报生成技能 ## 触发方式 用户说“帮我写周报”“生成周报”“本周总结”等语句时自动使用本技能。 ## 执行步骤 1. 询问用户本周的时间范围。 2. 读取 work-log.md筛选该时间范围内的记录。 3. 按以下模板输出周报草稿 - 本周完成事项 - 遇到的问题 - 下周计划 - 需要的支持 4. 输出后请用户补充遗漏项再整理成 Markdown 文档。这里面的name和description是常见字段。name是技能标识description是给模型看的语义描述决定模型什么时候该触发这个技能。不同客户端可能还支持模型文件、脚本附件等具体以你使用的 Agent 客户端文档为准。3.2 llms.txt 的典型结构llms.txt 是放在网站根目录的纯文本文件。格式上接近 Markdown支持#标题、描述和[文字](地址)链接。核心逻辑很简单把所有值得被 LLM 阅读的重要页面列出来并加上简短说明。# llms.txt # 示例博客 这个站点分享 AI 工具、模型部署教程和 LLM 应用实战。 [首页](https://example.com) [关于本站](https://example.com/about) [AI 工具部署教程](https://example.com/posts/ai-deployment) [Skill.md 详解](https://example.com/posts/skill-md-guide) [Llms.txt 索引实践](https://example.com/posts/llms-txt-practice)从格式上看llms.txt 与普通 Markdown 文件差异不大读起来很直观。支持 llms.txt 的抓取工具会把文件中的链接作为初始 URL 列表再决定进入哪些页面做深度抓取。相比让 LLM 从整站 HTML 里猜重点这种方式定位准确也节省抓取预算。3.3 skill.md 里#后面到底要不要“执行”“skill.md 里面 # 后面的是不是不执行”这个问题在社区里经常被问到。其实要分两层看如果#出现在文件最上方的 YAML frontmatter 里比如# 这是注释那么在 YAML 解析层它会被当作注释不参与后续数据。如果#出现在正文里它是 Markdown 标题语法比如# 周报生成技能是一级标题。Agent 读取时这些文本会作为上下文供模型理解而不是被某个解释器“执行”。真正会触发执行动作的是模型根据正文里的步骤决定去调用某个工具、执行某条命令、请求某个 API。也就是说“#”本身不是命令问题应当是“模型看完这段描述之后会不会照着做”。如果描述里明确要求“删除临时文件”而 Agent 的框架又允许执行文件删除操作那它就可能执行删除但这与#是否存在无关。所以不要把 skill.md 理解成“带 # 的代码脚本”更安全的做法是技能正文里只写你有权限、且希望模型执行的操作必要时在文件开头加上“需要用户确认后执行”的约束。4. 环境准备与前置条件先泼一盆水Skill.md 和 Llms.txt 都属于“文本配置型”文件没有很高的硬件门槛。你不需要为测试这两个文件专门买显卡也不需要安装重型依赖。需要考虑的主要是“谁来消费这份文件”。4.1 测试 skill.md 需要什么要验证 skill.md 是否生效至少需要一个支持 Agent Skills 约定的客户端或 LLM 框架。当前比较常见的选择包括Claude 桌面客户端、Claude Code以及社区中不少支持自定义 skill 目录的 LLM 框架。不同工具的 skill 存放目录可能有差异常见位置是用户目录下的.claude/skills/每个技能一个子目录子目录里放skill.md。建议准备一个可运行的 Agent 客户端或本地 LLM 框架。一个用于测试的技能目录例如~/.claude/skills/test-skill/。一个文本编辑器建议支持 Markdown 和 YAML 语法高亮。如果技能要调用外部脚本或 API还需要对应运行环境例如 Python、Node.js、网络访问权限。4.2 测试 llms.txt 需要什么llms.txt 静态托管就可以。任何能托管 HTML 的服务器或对象存储服务都能托管 llms.txt。本地测试只需要一个可访问的目录或一个临时 Web 服务。建议准备一个可公网访问或内网可访问的网站根目录。域名解析正常能通过https://你的域名/llms.txt访问。Python 环境用于写解析验证脚本或者直接用 curl 做请求检查。如果网站已有 robots.txt 和 sitemap.xml建议同步检查确认 llms.txt 没有被 robots 规则误拦。这里不涉及具体的 CUDA、PyTorch 版本要求因为 Skill.md 与 Llms.txt 本身不依赖模型推理环境。真正对显存和计算资源有要求的是运行 Agent 或大模型推理的底层服务。比如你的 skill 需要调用本地 LLM 的 API那么那台提供模型服务的机器才需要关注显卡、显存、模型体积和推理框架版本。5. skill.md 创建、加载与效果验证5.1 创建技能目录与文件以常见的 Claude Code 风格目录为例新建一个名为weekly-report的技能目录里面放skill.mdmkdir -p ~/.claude/skills/weekly-report cd ~/.claude/skills/weekly-report touch skill.mdWindows 用户可以用资源管理器创建C:\Users\你的用户名\.claude\skills\weekly-report\skill.md然后把上一节的示例内容写进skill.md。保存时注意编码用 UTF-8文件后缀小写.md。5.2 重启客户端并触发在支持 Agent Skills 的客户端里保存文件后一般需要重启或刷新会话让客户端重新扫描技能目录。重启后在对话中输入帮我写这周的周报如果客户端加载正常它会根据description中的语义描述识别出weekly-report技能然后按正文步骤执行询问时间范围、读取工作日志、生成草稿。你可以在回复里看到它是否引用了 skill 中的步骤模板。如果触发失败先检查三件事文件路径是否在客户端扫描的 skill 目录内。frontmatter是否用---完整包裹且没有语法错误。description是否足够明确模型能不能判断“这句话应该触发这个技能”。5.3 用脚本验证 skill.md 可解析性不启动客户端也可以用一个简单脚本验证文件结构是否合法。下面这个示例用 Python 读取skill.md解析前 2 行---中间的 YAML把元信息和正文分离from pathlib import Path import yaml skill_file Path.home() / .claude/skills/weekly-report/skill.md content skill_file.read_text(encodingutf-8) if content.startswith(---): parts content.split(---, 2) meta yaml.safe_load(parts[1]) body parts[2].strip() print(技能名, meta.get(name)) print(描述, meta.get(description)) print(正文前 200 字) print(body[:200]) else: print(未找到 frontmatter请确认文件以 --- 开头。)这段脚本不验证“模型会不会执行”只验证文件格式是否可能被客户端正常解析。如果你用的客户端对 frontmatter 字段有额外要求比如必须有name且不能为空脚本可以进一步补充字段检查。5.4 判断成功的标准一次完整的 skill 测试建议用下面几个标准判断是否成功客户端能列出或在日志中识别到该技能。在对话中用接近description语义的话能够触发技能。模型按正文步骤生成了目标产物而不是自由发挥。如果技能包含工具调用步骤中出现的操作确实被执行输出结果是预期格式。如果以上任何一个环节不通过说明 skill.md 的位置、格式或描述还不够准确需要回到配置侧排查。6. llms.txt 部署、解析与效果验证6.1 添加文件到网站根目录把第 3 节的 llms.txt 示例内容保存为纯文本上传到网站根目录。假设你的域名是example.com那么最终访问地址应当是https://example.com/llms.txt这里要注意文件必须能通过公网直接访问不要放在需要登录鉴权的目录里。部署后先用浏览器或命令行确认返回内容curl -sI https://example.com/