说到 SKILL.md,很多开发者往往会把注意力集中在格式本身上——比如 YAML 写对没有、目录怎么组织、是否符合规范。
但随着 30 多种 Agent 工具(例如 Claude Code、Gemini CLI、Cursor)都开始采用同一套布局,这个“格式问题”其实已经基本不是问题了。
现在真正的难点,变成了内容设计。
规范告诉你该如何把一个 skill 打包起来,却几乎没有告诉你:skill 内部的逻辑应该如何组织。
举例来说,一个封装 FastAPI 规范的 skill,与一个四步式文档生成流水线 skill,虽然外部的 SKILL.md 看起来几乎一模一样,但它们实际的工作方式却完全不同。
通过研究整个生态中 skill 的构建方式——从 Anthropic 的代码仓库,到 Vercel,再到 Google 的内部指导原则——可以发现,有五种反复出现的设计模式,能够帮助开发者更好地构建 agent。
本文会结合可运行的 ADK 代码,依次讲解这五种模式:
- Tool Wrapper:让你的 agent 立刻成为某个库或框架的专家
- Generator:基于可复用模板生成结构化文档
- Reviewer:按照检查清单并基于严重程度对代码进行评审
- Inversion:在动手之前,先由 agent 来“采访”你
- Pipeline:通过检查点强制执行严格的多步骤流程

模式 1:工具封装
工具封装器(Tool Wrapper)的作用,是为你的 agent 提供某个特定库或框架的按需上下文。

与其把 API 约定硬编码进 system prompt,不如把这些知识封装成一个 skill。只有当 agent 真正处理相关技术时,才加载这些上下文。
这是最容易实现的一种模式。
SKILL.md 文件会监听用户提示词里是否出现特定库的关键词;一旦匹配,就动态加载 references/ 目录中的内部文档,并把这些规则当作绝对准则来执行。
这正是你把团队内部编码规范、某个框架的最佳实践,直接分发到开发者工作流中的方式。
下面是一个 Tool Wrapper 的例子,它教 agent 如何编写 FastAPI 代码。注意,其中的指令明确要求:只有在开始审查代码或编写代码时,才去加载 conventions.md 文件。
1# skills/api-expert/SKILL.md2---3name: api-expert4description: FastAPI development best practices and conventions. Use when building, reviewing, or debugging FastAPI applications, REST APIs, or Pydantic models.5metadata:6 pattern: tool-wrapper7 domain: fastapi8---910你是 FastAPI 开发方面的专家。请将以下规范应用到用户的代码或问题中。1112## 核心规范1314加载 `references/conventions.md`,获取完整的 FastAPI 最佳实践清单。1516## 审查代码时17181. 加载规范参考文件192. 逐条对照规范检查用户的代码203. 对于发现的每一项违规:21 - 引用对应的具体规则22 - 给出修改建议2324## 编写代码时25261. 加载规范参考文件272. 严格遵循其中的每一条规范283. 为所有函数签名添加类型注解294. 使用 `Annotated` 风格进行依赖注入
模式 2:生成器
如果说 Tool Wrapper 解决的是“知识应用”问题,那么生成器(Generator) 解决的就是“输出一致性”问题。

假如你经常遇到 agent 每次生成的文档结构都不一样,那么 Generator 就能通过一种“按模板填空”的流程,把输出稳定下来。
它依赖两个可选目录:
assets/:存放输出模板references/:存放风格指南
这里的指令相当于一个项目经理。它会告诉 agent:
- 加载模板
- 阅读风格指南
- 向用户补齐缺失变量
- 把内容填充进文档
这非常适合用于生成格式稳定的 API 文档、统一 commit message,或为项目快速搭建架构骨架。
在下面这个“技术报告生成器”的例子里,skill 文件本身并不直接包含文档版式或语法规则;它只是负责协调这些资产的加载,并强制 agent 按步骤执行。
1# skills/report-generator/SKILL.md2---3name: report-generator4description: 用于生成结构化的 Markdown 技术报告。当用户请求撰写、创建或起草报告、总结或分析类文档时使用。5metadata:6 pattern: generator7 output-format: markdown8---910你是一个技术报告生成器。请严格按照以下步骤执行:1112步骤 1:加载 `references/style-guide.md`,获取语气和格式规范。13步骤 2:加载 `assets/report-template.md`,获取所需的输出结构。14步骤 3:向用户询问所有用于填充模板但目前缺失的信息,包括:15- 主题或议题16- 关键发现或数据要点17- 目标读者(技术型、高管型、普通读者)1819步骤 4:按照风格指南的要求填充模板。模板中的每一个部分都必须出现在最终输出中。20步骤 5:将完成后的报告作为一个完整的 Markdown 文档返回。
模式 3:审查器
审查器(Reviewer)模式,把“检查什么”与“如何检查”分离开来。
你不需要在 system prompt 里塞进一长串代码异味、风格问题、漏洞类型,而是可以把这些评审标准模块化地存放在 references/review-checklist.md 文件中。

当用户提交代码时,agent 就加载这份检查清单,按照其中的规则逐项打分,并按严重程度汇总结果。
如果你把一份 Python 风格检查表,替换成一份 OWASP 安全检查表,那么在完全相同的 skill 基础设施之上,就能立刻得到一种全新的、面向安全审计的专业评审能力。
这是一种非常高效的方式,既可以自动化 PR review,也能在人工介入前提前发现漏洞。
下面这个代码审查 skill 就体现了这种“检查标准外置”的思路:指令本身保持不变,但 agent 会动态加载外部 checklist 中的具体评审标准,并强制输出结构化、按严重程度分组的结果。
1# skills/code-reviewer/SKILL.md2---3name: code-reviewer4description: 审查 Python 代码的质量、风格以及常见缺陷。当用户提交代码请求审查、希望获得代码反馈,或需要进行代码审计时使用。5metadata:6 pattern: reviewer7 severity-levels: error,warning,info8---910你是一名 Python 代码审查员。请严格遵循以下评审流程:1112步骤 1:加载 `references/review-checklist.md`,获取完整的评审标准。13步骤 2:认真阅读用户的代码,在提出批评之前先理解它的用途。14步骤 3:将检查清单中的每一条规则应用到代码中。对于发现的每一个问题:15- 记录行号(或大致位置)16- 标注严重程度:`error`(必须修复)、`warning`(建议修复)、`info`(可酌情优化)17- 解释**为什么**这是个问题,而不仅仅是指出**哪里**有问题18- 给出具体的修复建议,并附上修正后的代码1920步骤 4:输出一份结构化评审结果,包含以下部分:21- **Summary**:代码做了什么,以及整体质量评价22- **Findings**:按严重程度分组列出问题(先 error,再 warning,最后 info)23- **Score**:按 1–10 打分,并简要说明理由24- **Top 3 Recommendations**:最值得优先改进的三项建议
模式 4:反转
Agent 天生倾向于“先猜再生成”,一拿到任务就想立刻开始输出。
而反转(Inversion) 模式,就是要把这个默认倾向反过来:不再是用户给出一个 prompt、agent 马上执行,而是由 agent 先充当“采访者”。

Inversion 依赖一类明确且不可协商的“门禁式指令”——比如“在所有阶段完成之前,禁止开始构建”。
这样就能强制 agent 先收集上下文,再开始行动。它会按顺序提问,并在进入下一阶段前等待你的回答;在它完整掌握你的需求与部署约束之前,它不会生成最终结果。
下面这个项目规划 skill 就展示了这种方式。关键点在于:阶段划分非常严格,而且提示语里有明确的门禁,阻止 agent 在还没收齐用户回答前就抢先生成最终方案。
1# skills/project-planner/SKILL.md2---3name: project-planner4description: 通过结构化提问收集需求,再为新的软件项目制定计划。当用户说“我想做一个……”“帮我规划一下”“设计一个系统”或“开启一个新项目”时使用。5metadata:6 pattern: inversion7 interaction: multi-turn8---910你正在进行一场结构化需求访谈。在所有阶段完成之前,**不要**开始构建或设计。1112## 阶段 1 —— 问题发现13(一次只问一个问题,并等待用户回答)1415请按顺序提出以下问题,不要跳过:1617- Q1:这个项目要为用户解决什么问题?18- Q2:核心用户是谁?他们的技术水平如何?19- Q3:预期规模是多少?(例如:每日用户数、数据量、请求速率)2021## 阶段 2 —— 技术约束22(仅在阶段 1 完整回答后进入)2324- Q4:你计划部署在什么环境中?25- Q5:你对技术栈有没有明确要求或偏好?26- Q6:有哪些不可妥协的要求?(例如延迟、可用性、合规、预算)2728## 阶段 3 —— 方案整合29(仅在所有问题都回答完毕后进入)30311. 加载 `assets/plan-template.md`,获取输出格式322. 使用已收集到的需求信息填满模板中的每一个部分333. 将完成后的计划呈现给用户344. 询问:“这份方案是否准确反映了你的需求?你希望调整哪些部分?”355. 根据反馈继续迭代,直到用户确认
模式 5:流水线
对于复杂任务来说,最怕的就是步骤被跳过、指令被忽视。
流水线(Pipeline) 模式,就是通过明确的检查点,强制执行严格的顺序化工作流。
在这种模式中,指令本身就充当了工作流定义。
通过设置显式的“菱形门禁条件”——比如要求用户先确认 docstring 生成结果,才能进入最终组装阶段——Pipeline 可以确保 agent 无法跳过复杂流程,直接给出一个未经验证的最终结果。

这种模式会用到所有可选目录:在不同步骤中,只在真正需要时加载对应的参考文件和模板,从而保持上下文窗口尽量干净。
下面这个文档流水线示例就非常典型。注意其中的门禁条件:在上一步生成的 docstring 没有得到用户确认之前,agent 被明确禁止进入文档组装阶段。
1# skills/doc-pipeline/SKILL.md2---3name: doc-pipeline4description: 通过多步骤流水线,从 Python 源代码生成 API 文档。当用户要求为模块编写文档、生成 API 文档,或根据代码创建文档时使用。5metadata:6 pattern: pipeline7 steps: "4"8---910你正在执行一条文档生成流水线。请按顺序执行每一步。不要跳过步骤;如果某一步失败,也不要继续往下执行。1112## 步骤 1 —— 解析与清点1314分析用户提供的 Python 代码,提取其中所有公开的类、函数和常量。15将提取结果以检查清单的形式呈现。16然后询问用户:17“这就是你希望写入文档的完整公开 API 吗?”1819## 步骤 2 —— 生成 Docstring2021对于每一个缺少 docstring 的函数:2223- 加载 `references/docstring-style.md`,获取所要求的格式规范24- 严格按照风格指南生成 docstring25- 将每一条生成的 docstring 展示给用户审核2627在用户确认之前,**不要**进入步骤 3。2829## 步骤 3 —— 组装文档3031加载 `assets/api-doc-template.md`,获取输出结构。32将所有类、函数和 docstring 汇编成一份完整的 API 参考文档。3334## 步骤 4 —— 质量检查3536对照 `references/quality-checklist.md` 进行审查,检查以下内容:3738- 每一个公开符号都已被记录39- 每一个参数都有类型和说明40- 每一个函数至少包含一个使用示例4142汇报检查结果。43在向用户展示最终文档之前,先修复发现的问题。
如何选择合适的 Agent Skill 模式
每一种模式,回答的其实都是不同的问题。
你可以用下面这棵“决策树”来判断,哪一种最适合你的使用场景。

最后:这些模式是可以组合的
这些模式并不是彼此排斥的。恰恰相反,它们是可以自由组合的。
一个 Pipeline skill 完全可以在最后加上一个 Reviewer 步骤,对自己的结果再做一次检查。
一个 Generator,也可以在最开始先套用 Inversion,通过提问收集必要变量,再进入模板填充流程。
借助 ADK 的 SkillToolset 和渐进式披露(progressive disclosure)机制,你的 agent 只会在运行时,为当前真正需要的模式消耗上下文 token。
不要再试图把复杂、脆弱、难维护的指令一股脑塞进一个 system prompt 里。
把工作流拆开,给不同问题匹配合适的结构化模式,才能构建出更可靠的 agent。
原文:"5 Agent Skill design patterns every ADK developer should know", Google Cloud Tech



