# Claude Code Agent Skills 使用与开发实战指南 (面向有 Prompt 经验的 LLM 开发者) *** ## 0. 面向谁 \& 要解决什么问题 本指南面向已经熟悉「写系统 Prompt / 模板 Prompt 来驱动大模型」的工程师,重点回答三个问题: 1. **从 Prompt 到 Skill 的本质差异是什么?** 2. **在 Claude Code / Agent SDK 里,Skill 实际是怎么被发现、触发和执行的?** 3. **如何把现有的 Prompt 工作流系统性迁移为 Skill,并做好工程化维护?** 全文会大量对比 Prompt vs Skill,突出 Skill 在「可复用、可维护、可组合」上的优势,并给出面向工程实践的设计建议。 *** ## 1. 核心概念:什么是 Agent Skill? 从官方定义出发,**Skill = 指令包(Markdown)+ 元数据(YAML)+ 可选脚本/资源文件**,用于给 Claude 注入特定领域的专业能力,并在需要时**按需加载(progressive disclosure)**。 可以粗略理解为: > 从「一次性 Prompt」升级为「可发现、可触发、可共享的领域专家插件」。 ### 1.1 Skill 的组成 典型 Skill 目录结构(Claude Code / Agent SDK 默认形式)如下: ```text my-skill/ ├── SKILL.md # 必须,有 YAML frontmatter + 主指令 ├── reference.md # 可选,详细文档/规范,按需加载 ├── examples.md # 可选,用法示例 └── scripts/ # 可选,可执行脚本(Python/JS/bash 等) └── helper.py ``` 其中: - **SKILL.md** - 顶部 `---` 之间为 YAML frontmatter: - `name`: Skill 名(唯一标识) - `description`: Skill 做什么 \& 何时使用(触发判断关键信号) - 下方为 Markdown 正文:指令、步骤、示例、链接到其它文件等 - **其他 Markdown 文件** - 延伸文档、规范、API 说明、更多示例 - Skill 激活后才按需加载,避免一开始就占满上下文 - **scripts/** - 放可执行脚本,由 Claude 通过 code execution / bash 调用,结果再由模型解释 ### 1.2 Skill 在系统里的位置 在 Agent SDK / Claude Code 中,Skill 被作为一种特殊的「工具」存在(工具名通常为 `Skill`),出现在工具列表中,与 `Read` / `Write` / `Bash` 等并列。 但它和传统工具最大的区别是: - 传统工具:**执行动作 → 返回结果** - Skill:**注入指令/上下文 → 修改后续推理环境** 换句话说,Skill 更像是**上下文工程 (context engineering) 的模块化单元**,通过: - 在对话历史中插入系统/用户级指令 - 动态调整可用工具、模型、思考 token 限制等 *** ## 2. Prompt vs Skill:从 Prompt 工程师视角的系统性对比 为了方便有 Prompt 经验的读者,先用表格给出高层对比。 ### 2.1 Prompt / Slash Command / Skill / MCP / Subagent 对比 | 维度 | 普通 Prompt | Slash Command (`/xxx`) | Skill (Agent Skill) | MCP 工具 | Subagent | | :-- | :-- | :-- | :-- | :-- | :-- | | 触发方式 | 用户临时输入 | 用户显式输入命令 | 模型根据描述自动触发(可带确认) | 模型显式选择调用 | 用户或模型显式切换 | | 存储形态 | 文本片段 / 模板 | 单一 `.md` 文件 | 目录 + `SKILL.md` + 资源文件/脚本 | 外部服务 / 进程 | 独立 agent 配置文件 | | 作用范围 | 当前对话 | 当前项目或用户 | 全局(用户级)+ 项目级 | 任意集成的应用 | 子上下文 | | 核心能力 | 影响一次或一段对话行为 | 复用一段 Prompt | 封装**可重用工作流 + 资源 + 可执行逻辑** | 访问外部数据/服务 | 长期专职 agent,独立上下文 | | 上下文成本 | 每次要重新输入或粘贴 | 命令内容一次性进入上下文 | 先只加载 metadata,触发后再加载全文(progressive disclosure) | 按调用次数计入提示 | 独立 context window | | 发现机制 | 人脑记忆/文档 | 人主动记命令名 | 模型基于 `description` 自动匹配任务 | 调用逻辑通常在 app 代码里 | 由 orchestrator 决定何时委派 | | 脚本支持 | 需要外部 pipeline | 支持有限(多数为文本) | 可绑定脚本并在 code execution 环境中运行 | 自己就是代码 | 可使用一组工具 | | 复用 \& 版本管理 | 很难系统管理 | 可以通过 Git 管理单文件 | 自然地通过 Git / 目录版本化、共享 | 依赖微服务/Git | 类似 micro-service 配置 | 从 Prompt 工程师角度,可以总结为: > **Prompt 是「指令文本」,Skill 是「指令系统」** > Prompt 强在「灵活,快速试验」,Skill 强在「标准化,可复制,可演化」。 ### 2.2 Skill 相比纯 Prompt 的关键优势 1. **发现 \& 自动触发** - 不需要用户记住「要贴哪段 Prompt」,模型通过 Skill 的 `description` 判断当前请求是否适配,然后请求使用该 Skill。 - 对于团队内部知识,极大降低使用门槛(只要「说人话描述任务」即可)。 2. **进阶的上下文工程** - Progressive disclosure:启动时只加载 metadata;触发 Skill 时再读 `SKILL.md` 和相关文件,既省 token 又避免污染通用对话。 - 能把长文档、规范、脚本拆分到多个文件,按需加载,而不是一次性塞进系统 Prompt。 3. **与可执行代码融合** - 可在 `scripts/` 里放好经过验证的 Python/JS/Bash 脚本,Skill 中只写「何时、如何调用脚本、如何解释输出」。 - 把「确定性处理」(解析文件、复杂计算、格式转换)迁到脚本,「不确定性决策」留给模型。 4. **工程化与团队协作** - Skill 目录可以直接纳入 Git 仓库,与代码、文档同一生命周期进行评审、测试、发布。 - 可以在个人级 (`~/.claude/skills/`) 和项目级 (`.claude/skills/`) 间共享和组合。 5. **跨界面统一复用** - 同一个 Skill 可同时在 Claude App / Claude Code / API / 支持 Skills 的 IDE 插件中使用。 - 你在本地为团队开发的 Skill,理论上可以作为「统一的工作流组件」在多个入口使用。 *** ## 3. Skill 的运行机制:发现 → 触发 → 执行 理解运行机制,有助于更好地做「技能触发设计」和「上下文工程」。 ### 3.1 Discovery:启动时的轻量加载 当 Agent 启动(Claude Code、SDK 程序、支持 Skill 的 app)时,会做: 1. 扫描 `~/.claude/skills/` 和当前工程 `.claude/skills/` 中的子目录。 2. 对每个目录,只读取 `SKILL.md` 的 YAML frontmatter(`name` + `description` 等)。 3. 把这些 metadata 以文本形式加入 Skill 工具的描述中,出现在模型能看到的 system 提示中。 **此时模型只知道:** > 「有哪些技能、叫啥名字、干什么、什么时候用」, > 但还没有看到真正的长指令和资源内容。 ### 3.2 Activation:根据自然语言请求触发 当用户输入任务(例如「帮我生成一份符合公司品牌规范的 PPT」),流程大致是: 1. 模型在看到当前用户消息 + Skill 列表描述后,**根据语义匹配**,判断有哪些 Skill 适用。 2. 如果判断某个 Skill 合适,会通过 `Skill` 工具发起一次调用,内部携带 `command`/`name` 等信息。 3. 前端/SDK 通常会给用户一个「是否使用某某 Skill」的确认提示(尤其在 Claude Code/Claude App 中)。 匹配质量高度依赖: - `description` 里是否写清楚**任务类型、输入形式、关键关键词**; - 是否给出类似「当用户说 X/Y/Z 时,使用本 Skill」的语句。 ### 3.3 Execution:加载指令、脚本与资源 Skill 激活后,系统会做: 1. 通过 `Bash` / 文件访问工具读取 `SKILL.md` 正文内容,插入到对话上下文中(通常以用户可见 + 隐藏两条消息注入)。 2. 如果 `SKILL.md` 里引用了其他 Markdown 文件(如 `reference.md` / `examples.md`),则在需要时再读取对应内容,进一步注入上下文。 3. 若指令中包含像「运行 `scripts/analyzer.py` 并解析输出」的步骤,Claude 会: - 使用 code execution / bash 工具执行脚本; - 读取输出文件(比如 JSON/CSV),再进行解释和总结。 4. 在整个 Skill 激活期内,可以调整: - 可用工具的白名单/黑名单(例如只读文件、不允许 Bash 修改文件); - 使用的模型(例如对某 Skill 固定使用 Sonnet / Opus); - 思考 token 等参数,使复杂任务能更稳定完成。 Skill 完成任务后,可以自然退出,其指令虽然已在对话里,但后续模型可根据上下文判断是否继续遵循,或在需要时再次触发其它 Skill。 *** ## 4. Skill 目录结构与 `SKILL.md` 设计详解 ### 4.1 `SKILL.md` 最小可用示例 以一个「解释代码」的 Skill 为例(官方文档类似示例): ```markdown --- name: explaining-code description: Explain source code in clear, structured language; use when users ask you to explain or understand code. --- # Explaining Code ## Goal When this skill is active, you explain the given code in a way that is: - Clear and concise - Structured with headings and bullet points where helpful - Focused on behavior, design decisions, and potential issues ## Instructions 1. First, identify the language, framework, and main purpose of the code. 2. Then, explain: - What the code does step by step - How key functions, classes, and modules interact - Any assumptions or implicit behaviors 3. Highlight: - Potential bugs or edge cases - Performance concerns - Security considerations 4. Provide suggestions for improvement if relevant. ## Examples ### Example 1: Small function _User request_: "Explain what this JavaScript function does and if there are any issues." ... ``` 要点: - **YAML frontmatter 必须有 `name` \& `description`**;模型就是靠这两个字段判断何时使用该 Skill。 - 正文建议包含: - 明确的目标(Goal) - 详细的步骤(Instructions) - 若干典型示例(Examples) - Skill 是给「另一实例的 Claude」看的文档,写法应面向模型:步骤清晰、可执行、少模糊语义。 ### 4.2 推荐的正文结构模板 对于多数工程类 Skill,可以采用固定骨架: ```markdown # ## 1. 适用场景(When to use this Skill) - 当用户... - 当输入包含... - 不要在以下情况使用... ## 2. 输入与输出约定 - 输入可以是: - ... - 输出必须包括: - ... - 对输出格式的要求(如 JSON schema / Markdown 结构) ## 3. 工作流步骤 1. ... 2. ... 3. ... ## 4. 参考规范 / 约束 - 引用 `style-guide.md` / `api-reference.md` 等 - 明确必须遵守的约束(安全/隐私/合规) ## 5. 示例 ### 示例 1 _用户..._ _期望输出..._ ## 6. 常见错误与修正 - 如果出现 X,则... ``` 这样设计有几个好处: - 方便未来的 Claude 实例按「When to use」部分进行自我检查; - 输入输出约定可以和脚本/下游系统严格对齐; - 工作流步骤使 Skill 更像一份 SOP(标准作业流程),可复用性强。 ### 4.3 多文件 Skill 的组织方式 多文件 Skill 适合复杂领域,例如: - 公司级代码规范/安全规范; - 复杂文档模板(产品需求文档、设计文档、测试计划); - 大型 API / 数据仓库查询规范。 典型做法是: ```text code-review/ ├── SKILL.md # Overview + 导航 ├── SECURITY.md # 安全审计检查表 ├── PERFORMANCE.md # 性能审查要点 ├── STYLE.md # 代码风格规范 └── scripts/ └── run-linters.sh ``` 在 `SKILL.md` 中: - 先给出总体工作流; - 再指示 Claude 在特定步骤「按需打开 SECURITY.md / PERFORMANCE.md」等文件。 这天然支持 progressive disclosure:仅在安全相关检查时才加载 `SECURITY.md`,避免所有规范一次性进入上下文。 *** ## 5. 在 Claude Code / Agent SDK / App 中使用 Skill ### 5.1 Claude Code 中的使用路径 在 Claude Code(VS Code / 其他 IDE 集成)中,Skill 的使用大致包括: 1. **安装/放置位置** - 全局:`~/.claude/skills//SKILL.md` - 项目级:`/.claude/skills//SKILL.md` 项目级具备更高优先级,更适合项目特定约束。 2. **启用 Skill 工具** - Agent SDK 或 Claude Code 的配置中,需要将 `Skill` 工具加入 `allowedTools` / `allowed_tools` 才能使用 Skill。 3. **交互方式** - **自然语言触发**:直接按业务语言提需求,只要和 `description` 匹配,模型就会尝试触发 Skill。 - **显式指定技能名**:如「使用 `explaining-code` 这个技能帮我…」,可提高触发概率。 - **列出可用 Skill**(在 IDE 中):例如通过命令面板或直接问 Claude 「列出当前可用的 Skills」,方便调试加载是否成功。 4. **结合 Subagent 使用** - 在 Subagent 的配置里可以指定 `skills: skill1, skill2`,让某个 Subagent 启动时自动加载对应技能。 - 典型用法:创建 `code-reviewer` Subagent,并为其加载 `code-review` Skill,包括安全/性能/风格规范。 ### 5.2 在 Claude App / Web / 桌面端中的使用 技能同样在 web/桌面端可用: - 在设置中的「Skills」部分可以: - 启用内置官方技能(Excel/Word/PPT/PDF 等); - 上传自定义 Skill(打包成 zip 或按要求目录); - 对话中,当 Claude 自动使用 Skill 时,会有明显标记(例如「已使用某某 Skill」),便于观察和调试; - 「Skill Creator」技能可以辅助用自然语言生成新的 Skill 初稿(对 prompt 工程师尤其友好)。 ### 5.3 在 API / Agent SDK 中使用 在 Agent SDK 或直接使用 Claude Messages API 时: - 在 agent 配置中声明开启 Skills,并允许 `Skill` 工具。 - 上下文中会自动注入已安装技能的 metadata,后续与 Claude Code 的逻辑一致。 - 某些环境还支持在 API 调用中显式指定要使用的 Skill 名称,以更强约束模型行为。 *** ## 6. 从 Prompt 到 Skill:一个系统化迁移方法论 假设你已经有一批在日常工作中频繁使用的 Prompt(代码审查模板、文档模板、业务流程模板等),可以按如下步骤逐步迁移为 Skill。 ### 6.1 Step 1:挑选适合作为 Skill 的场景 优先选择具备以下特征的 Prompt: - **任务稳定、重复频率高** 例如「生成符合公司模板的周报」、「按照固定格式写 PRD」、「执行特定框架的代码审查」。 - **指令较长,粘贴成本高** 每次要粘贴 100+ 行 Prompt 才能用的流程。 - **有明确可复用工作流** 如「先收集需求 → 再分析约束 → 再生成文档 → 再生成测试用例」。 - **需要结合外部资源 / 规范** 如品牌规范 PDF、API 文档、现有脚本。 这类场景用 Skill 迁移后收益最大。 ### 6.2 Step 2:抽象为「领域工作流」 把原 Prompt 拆成几个维度: 1. **适用场景 / 不适用场景**(写入 `description` 和正文「When to use」部分) 2. **输入输出契约**(类型、格式、字段) 3. **步骤化工作流**(尽量写成 numbered list) 4. **引用的外部知识/规范** 5. **可交给脚本完成的确定性操作** 再决定: - 哪些应该留在 `SKILL.md` 主体中; - 哪些应拆出到 `reference.md` / `examples.md`; - 哪些迁移到 `scripts/` 中由代码执行。 ### 6.3 Step 3:创建目录与 `SKILL.md`,写好 frontmatter 在本地或项目中创建目录: ```bash mkdir -p ~/.claude/skills/my-weekly-report ``` 然后新建 `SKILL.md`,至少包含: ```yaml --- name: weekly-report description: Create structured weekly status reports following our team's format, tone, and content guidelines. Use when users want to draft, revise, or polish weekly reports. --- ``` 描述里建议同时包含: - **任务类型**(create / review / analyze…) - **对象类型**(weekly report / PRD / code / log…) - **关键触发词**(weekly report, 周报, 状态更新 等) 有实践表明,过于抽象的描述会导致触发不稳定,描述应「贴近用户会说的话」。 ### 6.4 Step 4:迁移 Prompt 内容为结构化指令 把原来的大段 Prompt 迁移到 `SKILL.md` 正文里: - 按前文推荐的「适用场景 / 输入输出 / 工作流 / 规范 / 示例」骨架重构; - 适当拆分为多个 Markdown 文件,通过链接组织; - 将那些「给人看的摆设性说明」删减,把关键的决策规则和格式要求留下。 此时建议使用官方的 `skill-creator` Skill 做一次「反向审阅」:让 Claude 作为「Skill 审查专家」检查你的 `SKILL.md` 是否清晰、可执行。 ### 6.5 Step 5:引入脚本(可选) 对于涉及复杂文件处理、数据转换的 Skill: - 在 `scripts/` 目录中放置脚本(如 `scripts/generate_charts.py`); - 在 `SKILL.md` 中写明: - 何时触发该脚本; - 调用方式(命令行参数、输入输出文件); - 如何基于脚本输出继续生成响应。 示例片段: ```markdown ### Step 3: Generate metrics 1. Run `python {baseDir}/scripts/metrics.py --input "{INPUT_PATH}" --output "metrics.json"`. 2. Read `metrics.json` and: - Summarize key metrics - Highlight anomalies - Propose follow-up actions ``` 这样可以让 Skill 在执行时自动落地可靠、可测试的脚本逻辑。 ### 6.6 Step 6:测试、迭代与版本管理 - 在 Claude Code 中打开工程,触发 Skill 相关任务,观察: - Skill 是否被正确检测与加载; - 输出是否稳定、可预期; - 是否存在错误触发或遗漏触发的情况。 - 把 Skill 目录纳入 Git: - 对 `SKILL.md` 和脚本做 code review; - 用单元测试或 golden test 验证脚本输出与模型输出模式; - 给 Skill 加上版本号和 changelog,避免团队混乱。 *** ## 7. 与其它能力的关系:Prompt / Slash Commands / MCP / Subagents ### 7.1 与 Slash Commands 的关系 官方文档已经明确给出对比: - **Slash Commands 更适合:** - 简单、单文件的快捷 Prompt 片段; - 用户显式调用的「动作」(如 `/review`、`/optimize`)。 - **Skills 更适合:** - 多步骤、复杂工作流; - 需要脚本/多个文档支持的能力; - 希望由模型自动发现与触发的能力。 一个现实做法是: - 将「一两句话就能说清楚的常用命令」做成 Slash Command; - 将「背后有 SOP/规范/脚本组合」的能力做成 Skill。 ### 7.2 与 MCP(Model Context Protocol)工具的关系 MCP 工具解决的是「对接外部服务和数据源」的问题,而 Skill 解决的是「**如何使用这些工具与数据完成任务**」的问题。 常见组合方式: - MCP 提供: - 数据库查询; - 外部 API 调用; - 文件存储与检索。 - Skill 提供: - 如何根据业务规则选择查询; - 如何解释结果并组装报告; - 如何处理失败/重试逻辑(在指令层面)。 可以理解为: > MCP = 手里的工具箱 > Skill = 用这些工具完成某项工程的施工手册 ### 7.3 与 Subagents 的关系 Subagent 是具备独立系统 Prompt / 上下文 / 工具集合的「子代理」: - 适合: - 长期运行的专职角色(如「安全审核专家」「数据科学家」); - 需要独立上下文,避免主对话污染。 - 而 Skill 本身不创建新上下文,只是在当前 agent 环境里注入额外知识与流程。 两者可以协同: - Subagent 的系统 Prompt 里定义角色; - 为该 Subagent 配置一组 Skills(通过 `skills:` 字段自动加载),让其在子上下文中运用这些技能处理任务。 *** ## 8. Skill 设计与实现的最佳实践(结合 Prompt 工程经验) 从 Prompt 工程到 Skill 工程,有几条实践尤为关键: ### 8.1 面向「触发」写 description,而不是面向人写标题 - 不要只写「Brand style enforcement skill」; - 应写「Enforce our company's brand style when generating documents, slides, and emails; use when users request brand-compliant content or mention brand guidelines.」 要点: - 包含**动词 + 对象 + 触发语句**; - 尽量覆盖用户实际会说的关键词(包括中英文同义词); - 明确排除场景(可写在正文里)。 ### 8.2 把 Skill 当「SOP + Playground」而不是「单次提示」 - SOP:用 numbered steps 描述必须遵守的流程; - Playground:在示例部分给出多个「现实场景 -> 标准输出」的例子,帮助模型对齐风格。 对比传统 Prompt,把「元层说明」(你是谁、你要怎么做)抽象到稳定 SOPS;把一次性的上下文保留在对话中。 ### 8.3 严格区分「模型擅长」和「脚本擅长」的部分 - 让脚本做: - 复杂解析(PDF/Excel/日志); - 一致性要求高的格式转换; - 算法类计算、指标统计。 - 让模型做: - 决策、总结、解释; - 文本生成、风格迁移; - 多步推理。 Skill 文本中应明确告诉 Claude 什么时候「先运行脚本再思考」,减轻 hallucination 风险。 ### 8.4 使用 progressive disclosure 优化上下文 - 把大型规范/文档拆分为多个文件; - 在 `SKILL.md` 中通过「当执行到某步时,再读取某文件」的方式引用; - 避免在 Skill 中「一上来就复制粘贴整本手册」。 这样不仅省 token,还减少上下文「噪音」,提高任务对齐度。 ### 8.5 将测试和迭代流程制度化 - 为关键 Skill 设计一组「golden prompts + expected patterns」; - 每次改动 `SKILL.md` 或脚本后,跑一遍回归验证; - 把「Skill 使用问题」回溯到: - description 不清; - 指令歧义; - 示例不足; - 或脚本行为与说明不一致。 社区和官方仓库里的 Skill(如 `skill-creator`)是很好的参考和基准,可以从中抽取通用结构和写法。 *** ## 9. 常见坑与排错思路 结合官方文档与社区经验,总结几个典型问题及解决方向: 1. **Skill 明明写好了,但从未触发** - 检查: - 目录名是否正确,`SKILL.md` 是否位于根目录; - frontmatter 是否合法 YAML,`name`/`description` 是否存在; - 是否在 agent 配置中启用了 `Skill` 工具; - `description` 是否过于抽象、不含实际触发关键词。 2. **Skill 误触发或过度触发** - 现象:稍有相关就被加载,导致上下文被早早塞满。 - 解决: - 在 description 中更明确限定任务范围; - 在正文「When NOT to use」部分增加自检指令,让 Claude 自我约束; - 将多个任务拆成多个更细粒度的 Skill。 3. **Skill 行为不一致,时好时坏** - 可能原因: - 工作流步骤过于模糊,缺少关键约束; - 示例不足,导致风格漂移; - 依赖的脚本无单测或输出不稳定。 - 建议: - 增加「负例」示例,说明不应该产生的输出; - 对关键决策处增加明确的「思考检查清单」。 4. **多 Skill 并用时出现冲突** - 例如:多个文档生成 Skill 都认为自己适用。 - 治理方式: - 在 description 中加入更具体的触发条件(如特定文件类型、特定领域关键词); - 在 Skill 正文中加入互斥说明:如「如果 X 更匹配另一个 Skill,则不要使用本 Skill」。 *** ## 10. 总结:从 Prompt 工程到 Skill 工程 从体系化视角看: - **Prompt 工程**解决的是: 「如何构造一次性上下文,让模型在当前会话表现良好」。 - **Skill 工程**解决的是: 「如何以模块化方式封装知识与流程,让模型在不同场景、长期、多人协作下都表现一致」。 对于已经有成熟 Prompt 经验的开发者,下一步的升级路径可以概括为: 1. 把高频、高价值 Prompt 抽象成可重用工作流(SOP); 2. 迁移为 Skill:写好 `SKILL.md` 的 frontmatter 与结构化正文; 3. 将领域知识与脚本一起封装,利用 progressive disclosure 和 code execution 提升稳定性与效率; 4. 通过 Git + 测试 + 版本管理,把 Skill 纳入工程资产; 5. 结合 MCP 和 Subagent,把 Skill 作为「领域 Playbook」,构建真正可运营的 AI agent 体系。 在 Claude Code / Agent SDK 生态下,Skill 已经成为官方推荐的「中间层抽象」: 与 MCP 工具、Subagent、Projects 等能力一起,构成从 Prompt 工程到 Agent 工程的关键桥梁。 如果后续希望,可以进一步围绕你的具体场景(例如代码库结构、文档模板、数据分析流程)给出一份「定制 Skill 设计蓝图」,直接从现有 Prompt 资产出发设计目录和 `SKILL.md` 模板。