一个 .md 文件之所以能被 Agent 执行,是因为它并非普通文档,而是一个结构化的“指令包”。其核心并非文件本身运行代码,而是通过元数据触发 Agent 按需加载,并通过 Markdown 正文中的清晰步骤指导 Agent 一步步完成任务。
这背后的机制可以总结为:一种称为"渐进式披露"的三阶段激活流程。
下面我们来详细拆解一个 SKILL.md 的结构以及它是如何生效的。
SKILL.md 的"外壳":让 Agent 认识你
一个标准的 SKILL.md 文件以 --- 包围的 YAML 格式元数据开头,这是 Agent 识别和决定是否调用你的关键。其中有两个必填字段:
-
name: 技能的唯一标识名(例如:pdf-processing)。命名规则很严格,只能用小写字母、数字和连字符-,并且不能以-开头或结尾。 -
description: 这是最核心的字段。Agent 就是靠这段描述来决定是否激活技能的。所以描述必须清晰、具体地说明技能的功能和使用场景,并包含关键词,方便 Agent 进行语义匹配。
示例:
--- name: pdf-text-extractor description: 从 PDF 文件中提取文本内容。当用户需要处理、解析或读取 PDF 文件时使用此技能。 ---
这个
description就是 Agent 在启动时加载的全部内容。它像一个"搜索引擎摘要",让 Agent 知道"哦,这里有个处理 PDF 的专家,等用户提到 PDF 时我再去找他详细问"。
SKILL.md 的"内核":指导 Agent 如何做
当用户的请求与 description 匹配时,Agent 就会加载整个 SKILL.md 文件的正文部分(也就是 Markdown 内容),并将其作为核心指令来执行。
这部分内容虽然是自然语言,但需要像写"操作手册"一样清晰。它通常包含:
-
具体步骤:告诉 Agent 先做什么,后做什么。
-
条件判断:在什么情况下该怎么做。
-
预期结果:每一步完成后应该得到什么。
-
异常处理:如果出错了该怎么办。
示例:
# PDF 文本提取技能 ## 执行流程 1. 接收用户提供的 PDF 文件路径。 2. 检查文件是否存在。如果不存在,向用户报告错误并终止。 3. 调用 `scripts/pdf_parser.py` 脚本,将文件路径作为参数传递给它。 4. 获取脚本返回的文本结果。 5. 将结果以清晰的格式呈现给用户。
从"说明书"到"行动":如何执行具体任务
你可能注意到了,上面的步骤里出现了 scripts/pdf_parser.py。这正是 SKILL.md 强大之处:它通过引用外部脚本,将需要高精度、重复性的工作交给确定性代码完成,避免了让模型"自由发挥"带来的不确定性。
这也是一个 Skill 文件夹的完整形态,但这一切都是可选的。一个 .md 文件也能工作,只是通过引入这些资源,可以变得更强大:
my-skill/ ├── SKILL.md # 必需:核心指令文件 ├── scripts/ # 可选:存放可执行的Python/Shell脚本,用于完成确定性任务 ├── references/ # 可选:存放详细的文档、API手册等,供Agent按需查阅 └── assets/ # 可选:存放模板、图片等静态资源
这里的 scripts/ 目录是执行的关键。在 SKILL.md 中,你可以明确指示 Agent 运行这些脚本,而不是让它自己去写代码。脚本的行为是确定的、可重复的,极大地提升了任务的成功率。
如何自己编写一个 Skill
编写一个 Skill 其实很简单,主要就是创建一个符合规范的 Markdown 文件。
-
创建文件夹和文件:首先为你想要创建的 Skill 起一个名字(例如
code-review),并用这个名字创建一个文件夹。然后在文件夹内创建一个名为SKILL.md的文件。 -
编写元数据:在
SKILL.md顶部,用---包裹 YAML 格式的元数据,其中name和description是必填的。--- name: code-review description: 根据团队编码规范对代码变更进行审查。当用户请求代码审查、PR 评审或代码质量检查时使用此技能。 ---
-
编写指令正文:在元数据下方,使用 Markdown 格式编写清晰的、分步骤的操作指南,告诉 Agent 应该按照什么流程执行任务。
# 代码审查流程 1. 获取本次代码变更的文件列表。 2. 对于每个变更文件,检查是否存在违反以下规范的情况: - 行尾是否有多余的空格。 - 是否有未使用的导入或变量。 3. 汇总所有发现的问题,并生成审查报告。
总结
Agent Skills 的核心就是将专业能力封装成 Agent 可发现、可加载、可执行的模块。它通过"渐进式披露"机制,先加载轻量级的元数据进行匹配,匹配成功后再加载详细的指令和脚本,以此来实现高效、精准的任务执行
非特殊说明,本博所有文章均为博主原创。