
1. 从“skills”这个热词说起它到底是什么为什么突然火了最近几个月不管是在技术社区还是各种开发者群里“skills”这个词出现的频率高得离谱。很多人第一次看到“Claude Skills”或者“SKILL.md”的时候第一反应是“这不就是个提示词模板吗”但真正用过之后才发现它跟传统的提示词工程完全不是一回事。简单来说Agent Skills 是一套让 AI 助手具备可复用、可组合、可版本管理的“能力包”机制而SKILL.md就是这个能力包的核心描述文件。你可以把它理解成给 AI 装的一个“插件说明书”——告诉它遇到什么场景该调用什么工具、按什么流程走、输出什么格式。我最初接触这个概念是在折腾 Claude Code 的时候。当时想让 AI 帮我处理一些重复性的代码审查工作每次都要把同样的要求重新打一遍烦得不行。后来发现 Skills 机制可以把这些要求固化下来写成一个SKILL.md文件放在指定目录里之后每次触发相关任务AI 就会自动加载这个技能包按照预定义的流程执行。这个体验的提升是质的飞跃——从“每次都要教它”变成了“教一次永久生效”。那为什么 Skills 突然就火了呢我的判断是三个因素叠加的结果。第一Claude Code 的普及让大量开发者开始在日常工作中使用 AI 编程助手而 Skills 是提升效率最直接的抓手。第二开源社区的推动GitHub 上出现了大量高质量的 Skills 仓库比如 typesafe-ai-skills、superpower-skills 这些覆盖了前端开发、数学建模、STM32 嵌入式开发等垂直场景大家发现“原来还能这么用”。第三门槛足够低写一个SKILL.md不需要你会写代码只要你能把一件事的流程说清楚就行这让非程序员也能参与到 AI 能力的扩展中来。这篇文章适合谁看如果你是刚接触 Claude Code 的新手想搞清楚 Skills 到底怎么装、怎么写、怎么用那这篇内容就是为你准备的。如果你已经在用 Claude Code但还停留在“每次手动打提示词”的阶段那看完之后你应该能搭建起自己的技能库。如果你是对 AI Agent 开发感兴趣的技术人这里面的设计思路和踩坑经验同样有参考价值。2. Skills 的核心机制拆解为什么它比提示词模板强2.1 SKILL.md 的文件结构与加载逻辑要理解 Skills 为什么好用得先搞清楚它的技术实现。一个标准的 Skill 就是一个文件夹里面至少包含一个SKILL.md文件还可以附带脚本、模板、参考文档等辅助资源。SKILL.md本身是 Markdown 格式但它的内容有严格的约定——顶部是 YAML 格式的元数据frontmatter下面才是具体的指令正文。元数据部分通常包含这几个关键字段name是技能的名称description是一句话描述这个技能干什么用的trigger或when_to_use定义了什么情况下应该激活这个技能。有些实现还支持version、author、dependencies等字段方便做版本管理和依赖追踪。这个设计的精妙之处在于AI 在启动时会扫描所有已安装 Skills 的元数据建立一个“技能索引”当你的请求匹配到某个技能的触发条件时它才会去加载完整的指令正文。这就像你手机上的 App 列表——平时只显示图标和名字点进去才加载完整功能不会一上来就把所有 App 都跑一遍。指令正文部分就是具体的操作指南了。你可以在这里写工作流程、输出格式要求、注意事项、示例输入输出等等。我见过写得好的SKILL.md读起来就像一份给新员工的 SOP 文档步骤清晰、边界明确、异常情况都有交代。而写得差的就是一堆模糊的形容词堆砌AI 读了也不知道该干什么。2.2 与传统提示词工程的根本差异很多人会问这不就是系统提示词吗跟我直接写在对话里有什么区别区别大了我拿实际使用场景来对比。传统提示词是你每次对话都要重新输入一遍或者存在某个文档里复制粘贴。问题是提示词一长AI 的注意力就会分散前面说的要求到后面就忘了。而且不同任务的提示词混在一起容易互相干扰。Skills 的解法是“按需加载”——每个技能独立成一个文件只在需要的时候才注入上下文用完就释放。这样既保证了指令的完整性又不会让上下文窗口被无关内容占满。另一个关键差异是可组合性。Skills 可以嵌套调用一个 Skill 可以在执行过程中触发另一个 Skill。比如你有一个“代码审查”技能它可以在发现问题后自动调用“生成修复建议”技能再调用“创建 PR”技能。这种链式调用在纯提示词模式下几乎不可能稳定实现但在 Skills 框架下就是几行配置的事。还有版本管理。Skills 是文件可以放在 Git 仓库里可以 diff、可以回滚、可以 code review。你改了一版发现效果变差了直接git revert就回去了。提示词你改来改去最后都不知道哪个版本好用。2.3 触发机制与上下文注入的细节Skills 的触发方式主要有两种自动触发和手动触发。自动触发靠的是语义匹配——AI 分析你的请求如果跟某个技能的description或trigger字段高度相关就自动加载。手动触发则是你显式地输入技能名称或命令比如/skill-name这种形式。这里有个坑我踩过自动触发的准确率高度依赖 description 的写法。如果你写得太宽泛比如“帮助处理代码相关任务”那几乎每次写代码都会触发反而干扰正常对话。如果写得太窄又可能该触发的时候不触发。我的经验是description 里要包含具体的动作动词 明确的对象 限定条件。比如“审查 Python 代码中的类型注解缺失问题并生成修复建议”就比“代码审查”好得多。上下文注入的时机也很关键。有些实现是在对话开始时就把所有匹配的技能加载进来有些是在检测到触发条件后才动态注入。后者对上下文窗口更友好但要求 AI 有更强的意图识别能力。实际用下来动态注入 手动确认的组合最稳——AI 判断可能需要某个技能时先问你一句“检测到你可能需要 XX 技能是否加载”你确认后再注入。这样既不会漏也不会误触发。3. 从零搭建你的第一个 Skill完整实操流程3.1 环境准备与目录结构规划在动手写之前先把环境理清楚。Skills 的存放位置取决于你用的工具。Claude Code 默认会扫描项目根目录下的.claude/skills/文件夹也会扫描用户主目录下的~/.claude/skills/。项目级的 Skills 只对当前项目生效用户级的对所有项目生效。我的建议是通用技能放用户级项目特定技能放项目级这样既方便复用又不会让项目仓库变得臃肿。目录结构长这样~/.claude/skills/ ├── code-review/ │ ├── SKILL.md │ └── templates/ │ └── review-template.md ├── commit-message/ │ └── SKILL.md └── math-modeling/ ├── SKILL.md └── references/ └── common-algorithms.md每个技能一个文件夹文件夹名就是技能标识符用短横线连接的小写字母。SKILL.md是必须的其他辅助文件按需添加。我习惯把可复用的模板、参考文档、示例代码都放在技能文件夹里这样技能是自包含的迁移和分享都方便。注意文件夹名不要用中文或空格虽然有些工具能识别但跨平台同步时容易出问题。用英文小写加短横线是最稳妥的。3.2 编写高质量 SKILL.md 的五个关键要素写SKILL.md是有套路的我总结了五个必须交代清楚的要素缺一个都会影响效果。第一明确的触发条件。在 frontmatter 的description里写清楚“什么时候用这个技能”。比如--- name: python-type-hints description: 当用户要求审查 Python 代码的类型注解完整性或需要为现有函数添加类型提示时使用此技能。 ---第二分步骤的执行流程。正文部分用有序列表把步骤写清楚每一步做什么、输入是什么、输出是什么。不要写“分析代码质量”这种模糊指令要写“逐行检查函数签名识别缺少类型注解的参数和返回值”。第三输出格式的精确描述。如果你希望 AI 输出特定格式就在技能里给出模板。比如代码审查技能可以规定输出为表格包含“文件路径、行号、问题类型、严重程度、修复建议”五列。第四边界和异常处理。告诉 AI 什么情况下不应该用这个技能遇到不确定的情况该怎么处理。比如“如果代码文件超过 500 行先询问用户是否只审查变更部分”。第五示例。给一两个输入输出的例子让 AI 有参照。示例不用多但要典型。我见过很多人写SKILL.md就写一句话“帮我审查代码”然后抱怨 AI 不听话。问题不在 AI在于你给的信息量太少了。你写技能文档的详细程度直接决定了 AI 执行的上限。3.3 安装与调试从本地测试到全局生效写完SKILL.md之后怎么让它生效不同工具的加载方式略有差异但大体流程是把技能文件夹放到指定目录然后重启工具或执行重载命令。以 Claude Code 为例放好文件后在对话里输入/skills或类似命令可以列出当前已加载的技能。如果没看到你的技能检查这几个点文件夹名是否正确、SKILL.md的 frontmatter 格式是否合法YAML 对缩进很敏感、文件编码是否是 UTF-8。调试阶段我建议先用手动触发测试确认技能能正常加载和执行。手动触发的方式通常是在对话里直接提到技能名称或者用斜杠命令。等手动触发稳定了再测试自动触发是否准确。有个实用技巧在SKILL.md里加一个debug: true的元数据字段如果你的工具支持这样每次触发时会在控制台输出加载日志方便排查问题。不支持的话就在技能正文开头加一句“在开始执行前先输出‘[技能名] 已加载’”这样你能直观看到技能有没有被激活。4. 进阶玩法让 Skills 组合出真正的生产力4.1 技能链式调用与工作流编排单个技能解决单点问题多个技能串起来就能解决复杂问题。我拿自己的实际工作流举例每次提交代码前我会跑一个“预提交检查”流程它实际上是由三个技能串联而成的。第一个技能是diff-analyzer负责读取 Git diff识别变更了哪些文件、哪些函数。第二个技能是type-checker接收第一个技能的输出针对变更的函数检查类型注解完整性。第三个技能是commit-writer根据前两步的结果生成符合 Conventional Commits 规范的提交信息。这三个技能各自独立但通过输入输出格式的约定可以无缝衔接。关键在于每个技能的输出格式要标准化比如都输出 JSON 或都输出 Markdown 表格这样下一个技能才能稳定解析。编排方式有两种一种是在一个“主技能”里显式调用其他技能另一种是靠 AI 根据上下文自动串联。前者更可控后者更灵活。我的建议是关键流程用显式编排探索性任务用自动串联。4.2 团队协作场景下的 Skills 管理一个人用 Skills 和一群人用 Skills管理策略完全不同。个人用的时候随便放放就行。团队用的时候必须考虑版本同步、权限控制和冲突解决。我们的做法是建一个专门的 Git 仓库来存放团队共享的 Skills目录结构按职能划分frontend/、backend/、data/、devops/等。每个人通过符号链接把仓库挂载到自己的~/.claude/skills/下。更新技能就是git pull回滚就是git revert。权限控制方面我们约定核心技能必须经过至少两人 review 才能合并因为一个写得不好的技能会影响所有人的输出质量。另外每个技能都要有CHANGELOG.md记录改了什么、为什么改、影响范围是什么。冲突解决是个容易被忽视的问题。两个人可能写了功能重叠的技能触发时互相干扰。我们的解法是建立技能注册表每个技能在description里标注优先级和适用范围定期清理冗余技能。Tibo 之前分享过一个清理 Skills 的方法核心思路就是“三个月没触发过的技能就归档”我觉得很实用。4.3 垂直场景实战数学建模与嵌入式开发Skills 在垂直领域的威力特别明显。拿数学建模比赛来说常用的技能包括problem-parser解析赛题提取关键约束、model-selector根据问题类型推荐模型、code-generator生成求解代码、paper-writer按竞赛格式撰写论文。这四个技能串起来基本上覆盖了从读题到交稿的全流程。嵌入式开发场景也类似。我帮朋友配过一套 STM32 开发的 Skills包括hal-config根据外设需求生成 HAL 初始化代码、register-checker检查寄存器配置是否冲突、datasheet-query从参考手册中提取相关章节。朋友反馈说以前查手册要翻半天现在 AI 直接告诉他“PA9 和 PA10 不能同时用作 USART1 的 TX/RX因为复用功能冲突”效率提升非常明显。这些垂直技能的共同特点是领域知识密集、流程标准化程度高、输出格式要求严格。正好是 Skills 最擅长的场景。5. 常见问题与排查技巧实录5.1 技能不触发或误触发怎么办这是最高频的问题。技能不触发先检查三件事SKILL.md的 frontmatter 格式对不对、技能文件夹放的位置对不对、工具的版本是否支持 Skills 功能。如果这三样都没问题那就是description写得太模糊了。试着把触发条件写得更具体加入用户可能说的关键词。误触发更烦人。我遇到过“代码审查”技能在写文档时也被触发的情况原因是 description 里写了“审查”这个通用词。解法是加入否定条件比如“此技能仅用于审查代码文件不适用于文档、配置文件的审查”。有些实现支持exclude字段可以直接排除特定场景。还有一个隐蔽的坑技能之间的触发条件重叠。两个技能都声称处理“Python 代码”AI 就不知道该加载哪个。这时候要么合并技能要么在 description 里明确区分边界比如一个负责“语法层面”一个负责“架构层面”。5.2 输出格式不稳定的排查思路AI 输出格式飘忽不定是另一个让人头疼的问题。明明在技能里规定了输出表格结果它有时候输出列表有时候输出段落。排查下来原因通常有三个。一是指令不够具体。你写“输出表格”AI 不知道你要几列、列名是什么、空值怎么处理。要写成“输出 Markdown 表格包含以下五列文件路径、行号、问题类型、严重程度、修复建议。严重程度只能取 High/Medium/Low 三个值”。二是上下文干扰。如果对话历史里有其他格式的输出AI 可能会模仿。解法是在技能里加一句“忽略对话历史中的格式严格按本技能规定的格式输出”。三是模型能力边界。有些复杂格式比如嵌套 JSON在小模型上就是不稳定。这时候要么换更大的模型要么把格式简化。5.3 性能优化减少 Token 消耗与加速响应Skills 用多了之后Token 消耗会明显上升。每个技能加载都要占用上下文如果一次对话触发了好几个技能上下文窗口很快就满了。优化方向有几个。按需加载用完即卸。有些工具支持技能执行完后自动从上下文中移除这个功能一定要开。合并高频技能。如果两个技能经常一起触发就合并成一个减少加载次数。精简技能正文。把详细的参考文档放到辅助文件里SKILL.md只保留核心流程需要时再让 AI 去读辅助文件。响应速度方面减少技能数量比优化单个技能更有效。我实测下来加载 10 个技能比加载 3 个技能的响应时间平均多 40% 左右。所以定期清理不用的技能不只是为了整洁也是为了性能。问题类型典型表现排查方向解决手段技能不触发输入相关请求无反应检查 frontmatter 格式、目录位置细化 description加入关键词技能误触发无关场景被激活检查触发条件是否过宽加入否定条件明确边界格式不稳定输出格式随机变化检查指令具体程度给出精确模板忽略历史格式Token 消耗高上下文快速占满统计已加载技能数量合并技能按需加载精简正文响应变慢每次对话等待时间长检查技能总数和单个技能大小归档低频技能拆分大技能5.4 跨平台兼容性与版本迁移的坑Skills 目前还不是一个完全标准化的协议不同工具的实现有差异。Claude Code 能识别的SKILL.md放到其他工具里可能就不认。跨平台迁移时这几个地方最容易出问题。Frontmatter 字段名不一致。有的工具用trigger有的用when_to_use有的用activation。迁移时要把这些字段映射好。目录结构要求不同。有的要求技能文件夹必须放在特定层级下有的支持递归扫描。辅助文件的引用方式不同。有的用相对路径有的用特殊语法。我的建议是尽量用最通用的字段名和最简单的目录结构减少对特定工具特性的依赖。如果确实需要跨平台就写一个转换脚本把源格式转成目标格式。这个脚本本身也可以做成一个 Skill挺有意思的。6. 我个人的 Skills 管理心得与常用推荐折腾 Skills 这几个月踩了不少坑也攒了一些经验。最大的体会是不要追求技能数量要追求技能质量。我一开始兴奋地装了二十多个技能结果互相干扰输出质量反而下降。后来精简到八个核心技能每个都反复打磨过效果比之前好得多。我目前常用的技能包括commit-message生成规范提交信息、code-review代码审查、doc-writer文档撰写、math-modeling数学建模辅助、stm32-helper嵌入式开发辅助、api-tester接口测试、sql-optimizerSQL 优化建议、regex-builder正则表达式生成。这八个覆盖了我日常 90% 以上的场景。对于新手我的建议是从一个小痛点开始。不要一上来就搞大而全的技能库先找一个你每天都要重复做的任务把它写成 Skill用一周时间反复调整。等这个技能稳定了再扩展下一个。这样循序渐进既不会 overwhelmed也能真正体会到 Skills 的价值。还有一个容易被忽视的点定期回顾和清理。我每个月会花半小时过一遍所有技能看看哪些三个月没触发过、哪些输出质量下降了、哪些可以合并。这个习惯让我的技能库始终保持精简高效。Tibo 那个清理方法的核心逻辑也是这个——技能库不是仓库是工具箱只留趁手的。最后分享一个写SKILL.md的小技巧把自己想象成在给一个聪明但完全不了解你工作背景的新人写操作手册。你会怎么写就怎么落笔。这个心态转换能帮你写出信息量足够、边界足够清晰的技能文档。我试过效果立竿见影。