我用AI辅助写代码前半年最大的痛苦不是它写不出代码而是它每次写的代码风格都不一样。第一周让Claude按团队的ESLint规范调整格式化方式它做到了三天后新开对话同样的要求它完全忘了把规范写进提示词里篇幅越堆越长效果却撑不过十轮对话还白白占掉大量上下文窗口。直到我认真研究并上手了Agent Skills——Claude Agent Skills、Codex Skills这条新路线才意识到问题的解法根本不在把提示词写得更长更多而在于把行为规范核心示例执行流程绑成一个可复用、可检索、可随时安装卸载的模块。这篇就结合我自己踩过的坑聊聊Skills到底是什么、底层怎么设计的、从零手写一个要抓哪些重点以及面对社区里五花八门的skills推荐skills大全到底该怎么选怎么用。1. Skills机制出现前我们都被提示词的长度逼疯过1.1 提示词能把一件事说清但镇不住一个长期项目的角落先说一个特别典型的场景。我维护一个中型React项目团队约定组件必须用TypeScript、样式用Tailwind但不允许写apply、函数组件超过60行必须拆分、路由懒加载有固定写法。这套规范如果用提示词表达大概要写到800字以上。问题来了新建会话后这800字不会自动出现。要么每次手打一遍要么把它存成模板反复粘贴。就算你每次都粘贴AI对它的执行优先级也远低于对代码本身的注意力——规范是参考性文本代码是目标性文本模型天然更关注后者。我实测过把同样的规范放在系统提示词顶部、中部、底部模型执行的结果都不一样底部最容易丢。更隐蔽的问题是上下文预算。Claude这类模型动辄数万token上下文但真正干活时每个token都在消耗注意力。你塞了2000字规范进去看着还有剩余空间实际模型在长文本里提取有效约束的能力是衰减的。我给AI塞过一份包含20条项目约定的提示词结果它在第13条之后就开始选择性遗忘。这不是模型笨是提示词这个容器本身没有按需加载机制——它把所有内容一股脑全倒给模型不分主次不讲时机。1.2 Skills带来的范式变化从一次性说明书到可检索的工具包Skills的逻辑完全不同。它的核心不是把规定写进提示词让模型记住而是构建一个模型在需要时才会主动翻开的手册。我接触的第一份资料是Claude Agent Skills的深度解析文章里面有个比喻很到位传统的system prompt像入职第一天发给你的一本员工手册你得从头读但读完就忘Skill像你工位旁边的一个抽屉平时关着遇到具体活计才拉开里面是这项工作的标准流程和参考模板。具体到机制上Skill是一组放在项目目录下的文件最核心的是SKILL.md。它有自己的描述信息Agent在运行时会扫描所有可用Skill根据当前任务与描述的匹配程度决定要不要加载这份文件。你写代码时前端相关的Skill被自动翻开你处理数据时那份和代码毫无关系的Skill根本不会进入上下文。这直接解决了两个痛点规范不再是一股脑的背景噪音而且不同任务之间的规则可以隔离互不打架。这里要和MCP区分一下。MCP给Agent的是外挂工具调用能力——访问数据库、调用API、操作浏览器Skills给Agent的是特定领域的操作规范和行为模式。用我自己的话总结MCP是告诉AI你可以用这个工具Skill是告诉AI遇到这种情况按这个套路来。两者是互补关系不是替代关系。2. 拆开SKILL.md的壳子一个技能包的内部构造2.1 一个Skill的最小完整形态我在项目里实际建过完整的前端开发Skill目录长这样my-project/ .claude/ skills/ frontend-dev/ SKILL.md references/ tailwind-rules.md component-structure.md scripts/ generate-component.sh assets/ example-component.tsx这个结构是在反复试验中确定的几个目录各有用途。SKILL.md是入口文件承担何时加载、核心要求、快速上手三件事。references/放的是详细规则文档这些内容不需要全部塞进上下文模型只有在觉得基础文件不够用时才去翻。我试过把全部规则写进SKILL.md结果每次加载都吃掉大量token而且规则之间互相干扰拆到references之后模型只在需要进入细节时读取上下文开销明显小一截。scripts/放自动化脚本比如组件生成器、代码格式化脚本方便模型调用外部命令完成任务。assets/作为可选的示例仓库给模型提供正确范例——这对生成代码尤其重要因为模型对规范的抽象描述理解不稳定但对具体示例的模仿稳定得多。2.2 SKILL.md的YAML前置块和正文各自承担什么职责SKILL.md的开头必须有YAML格式的元信息这是它的身份证也直接决定了Agent什么时候加载它。我多次调整自己Skill的元信息后总结出这套配置的关键字段--- name: frontend-dev description: 用于ReactTypeScriptTailwind项目的前端开发规范。在生成组件、修改样式、处理路由懒加载、进行代码审查时使用。包含组件结构、命名、可访问性和Tailwind约束。 ---这里最值得抠的是description。它不能太长否则模型匹配时信息太分散也不能太短否则该触发时不触发。我的经验是用在xxx时使用这种条件句式把适用场景写明确让组件生成样式修改路由处理这些具体动作词出现在字段里触发率会高很多。正文部分我用层次分明的Markdown结构组织比如用## 操作流程、## 核心规范、## 示例这样的段落。实际上模型对Markdown的标题层级理解相当好合理使用标题能让它在检索时更快定位。这也是我自己总结的心得SKILL.md不是给人类读的文档是给模型读的交互手册所以小标题要带检索关键词句子要短促直接命令语气不要散文式表达。2.3 加载机制背后的决策逻辑很多人没注意到Agent决定是否加载一个Skill本质是当前任务文本与description的一段语义匹配。也就是说你的Skill能不能被用上很大程度上取决于description写得多聪明。我踩过很典型的一个坑。我写过一个处理Excel数据的Skilldescription写的是数据处理工具包含pandas与openpyxl规范。听起来没毛病对吧结果发现当我让AI分析这个CSV文件里的销售趋势时这个Skill居然没被触发。后来我明白了模型面对的任务描述里没有出现Excelpandas而是CSV销售趋势我的description太工具导向了没有覆盖场景导向的词汇。修改成在读取、分析、清洗表格数据CSV、Excel时使用涵盖pandas、openpyxl操作规范之后触发率就上来了。这套机制决定了写Skill和写API文档有些神似你的接口描述得让调用方Agent在真实场景下一眼认出该调用。从需求的动词到数据格式的名词都要覆盖到。3. 从零写一个前端开发Skill语义压缩与边界设计3.1 先定义它该管什么、不该管什么真正落笔写SKILL.md之前最重要的一步不是查语法而是划定边界。我见过很多人的Skill文件写得像万能辅助什么内容都往里塞——代码风格、数据库设计、部署流程、甚至简历写法结果模型在大量混杂信息里迷失。我写前端开发Skill时给自己定了三条边界只管ReactTypeScriptTailwind相关的任务只约束行为规范和代码结构不约束业务逻辑不覆盖组件库的API细节那些应该靠组件库文档解决为什么要划边界因为Skill的价值在确定性。当模型知道这份Skill只在特定场景生效时它执行起来更果断如果一份Skill试图覆盖所有场景它的每条规则都会变成仅供参考效果大打折扣。3.2 SKILL.md正文的写法示例优先抽象放后以下是我打磨过很多轮的前端开发Skill核心正文已经去掉真实的业务信息结构保留## 操作流程 1. 先确认组件使用场景页面级组件放入 pages/可复用组件放入 components/并导出对应 index 文件。 2. 使用TypeScript定义Props接口类型用interface不用type。 3. 样式优先使用Tailwind工具类不允许写apply。 4. 组件超过60行时拆分子组件或自定义Hook并在文件内注明拆分理由。 ## 组件结构示例 参考 assets/example-component.tsx 中的标准结构。 ## 禁止事项 - 不要使用 any必要时使用 unknown 并做类型收窄。 - 不要在组件内直接写远程数据请求逻辑应通过React Query的hook封装。 - 不要新增全局CSS类除非有明确的设计系统扩展理由。这个结构是我反复调整后的版本整体原则是可验证大于可描述。你让模型遵循公司代码规范它做不到你让它组件超过60行必须拆分并给个具体示例它就做得到。抽象规则写得再漂亮不如一个正例加一条禁止事项管用。3.3 references和scripts层级化设计带来上下文红利真正让Skill好用的不是把规则全写进SKILL.md而是把SKILL.md写成精炼入口细节全部外置。我自己的SKILL.md正文不到1000字所有Tailwind的边界规则、组件拆分细则都放到references文件里。这样设计的好处是Agent加载Skill时只占用这么点上下文只有在发现现有代码可能触碰边界时才进一步翻references。我还写了一个简单的组件生成脚本放在scripts里。这个脚本的功能是输入组件名自动生成符合我们项目规范的.tsx文件和对应的类型导出。Agent在执行组件创建任务时直接跑这个脚本比我口头描述规范可靠得多。这也是我的一个体会当规范复杂到语言说不清时把它固化进脚本让机器替你保证一致性。这是Skill和纯提示词拉开差距的关键——Skill不只是文本它是文本脚本示例的组合。3.4 手写Skill时的第一批细节错误我前几次写的Skill文件现在回头看全是问题。这里记录几个最容易犯的错误description写成论文式长句Agent匹配不到关键词。正文用应该尽量这类模糊副词模型执行时充满随机性。规则之间互相矛盾比如前面说优先用Tailwind后面又举例写了CSS Module。没有给正例。模型对禁止事项的遵守程度明显低于对正例的模仿。每一条都是我实打实吃亏吃出来的现在社区里大量新发布的Skill也普遍存在这类问题。所以拿到一个别人的Skill千万别直接用先检查description是否具体、正文是否有明确动作指令、有无正例。4. 社区里的Skills生态从GitHub到官方市场怎么选4.1 GitHub上的开源Skills仓库看星星不如看这些指标现在GitHub上带awesome前缀的Skills集合已经多到看不过来什么 Nature Skills 、Superpower Skills之类的项目满天飞。面对这么多选择我的挑选原则和看开源库不太一样有四个硬指标最近一年有没有实际提交。Skills这个概念迭代非常快几个月前的写法可能已经不适配新版客户端了长期停更的仓库要谨慎。有没有把示例文件和目录装齐。只有SKILL.md没有references、没有scripts的仓库大概率是拿提示词改了个文件名价值有限。有没有作者自己的项目实践案例。我在GitHub上看到过一个codex写论文的skills作者贴出了完整的论文产出流程和踩坑记录这种就比只有安装说明的强得多。是不是大而全的超级包。看到那种号称覆盖全领域、一个文件解决所有问题的skills大全我一般直接跳过。上面说过Skill的价值在于边界清晰一个包什么都能干通常意味着什么都干不精细。我自己用的几个比较满意的Skill都是从这种仓库里扒下来、再改造成适合自己项目的版本。所以选Skills不能像选软件一样下载即用更接近fork之后二次开发。4.2 官方市场与第三方下载平台各适合什么场景现在各家AI编程工具都在推自己的官方Skills市场这确实是获取高质量Skill最省心的渠道。官方市场的优点在于审核相对严格、格式统一、更新维护有保障。我在官方市场找过论文写作、分镜规划这类垂直方向的Skill质量整体比开源社区高安装也更方便——通常一条命令就能搞定不用自己处理目录结构。第三方下载平台和GitHub资源站则更适合找场景非常具体的Skill。我之前为了找前端开发skills专门逛过几个技能聚合站优点是分类细从React优化到样式规范都有缺点是质量参差不齐有的明显是从一篇博文硬转成SKILL.md格式的元信息都没填对。用第三方平台的Skill我建议先看下载量和最近的用户评价那些标注作者亲自维护有GitHub仓库同步的可靠性会好得多。4.3 按照真实场景做一张选型参考表我根据自己和身边同事的实际使用整理了一张场景选型表纯粹是经验分享不涉及具体项目名使用场景优先从哪找看什么指标装完后第一件事前端开发React/VueGitHub搜索自己改造组件示例、样式规范、脚本工具拿一个老组件跑一遍验证论文写作官方市场引用格式、段落结构、参考文献处理用小样章测试格式稳定性分镜脚本第三方聚合站分镜术语、镜头语言示例看它是否覆盖不同画幅比例授权安全测试/渗透挖洞类GitHub定向搜索授权声明、操作流程清晰度只在有授权的靶场环境测试数据分析自己从常用数据处理操作改造pandas/openpyxl封装程度先用CSV小样本验证这张表的核心思路是不同的获取渠道对应不同的信任等级别人的Skill永远是半成品装完之后的第一件事永远是测试而不是直接放到正式环境里跑。尤其是涉及安全和合规方向的技能必须在明确授权、完全合规的测试环境里验证这是底线。5. 调试Skills的实战记录最常踩的坑和我怎么绕过5.1 加载失败桌面下的迷雾description到底匹配了什么调试Skills最痛苦的经历是我明明装了Agent却从不使用它。有一段时间我对自己写的代码审查Skill完全无感翻日志也看不出它到底加载了没有。后来我做了个控制变量试验把任务从帮我审查这个组件改成用frontend-dev的规范审查这个组件结果Skill就被加载了。这个试验让我意识到问题出在description触发条件太苛刻。修改description之后我再测发现不带Skill名只是说检查一下这个页面的代码质量也能触发。触发词的选择真的是一门玄学但核心逻辑是把你希望接收任务的常见说法、同义词全部放进description里同时保持语句自然。如果调试时发现Skill死活加载不上务必要按这个顺序排查——先看description里的动作词与任务文本有没有重叠再看文件路径是否放在Agent默认扫描的目录比如.claude/skills/最后看YAML格式是否正确哪怕缩进错一个空格都会导致整个文件被忽略。这些都是我一个个排除过的。5.2 上下文膨胀加载的不是一个Skill而是一整个文件夹另一个高频问题是Skill确实加载了但Agent表现得整个人被带偏反而忘了用户原本的需求。我碰到过的情况是一份描写数据分析的Skill每次提数据相关内容它不仅加载了SKILL.md还把我放在references里的所有文件全读了一遍上下文中突兀地塞进了几千字与当前任务无关的细节。要解决这个问题我在设计Skill时做了一件事给references里的文件也写清楚何时阅读。比如在SKILL.md正文这样写## 参考文件 - references/tailwind-rules.md仅当修改样式定义或讨论Tailwind配置时阅读。 - references/component-structure.md仅当创建新组件、拆分组件时阅读。别小看这个细节加上它之后Agent加载的文本量肉眼可见地减少了。Skill的设计本质上是在和上下文预算做博弈——你给的信息越模块化、附带的读取条件越明确模型越知道什么该看什么不该看。这比单纯压缩字数要有效得多。5.3 规则冲突项目级约定与Skill同时存在谁听谁的使用Claude Code或Codex这类工具时项目根目录往往还有一份全局规则文件比如CLAUDE.md或AGENTS.md它定义了整个项目的底线规范。Skill加载后很容易和它产生冲突。我自己遇到过一个具体矛盾项目全局规范要求不引入新的UI依赖而我写的前端Skill里推荐使用某个开源组件库。结果Agent在生成代码时一度表现出摇摆有时遵循Skill有时遵循全局约定。这让我意识到Skill的文件里开头就要声明优先级。我的解决方案是在Skill的元信息description里加了一句本Skill仅用于组件结构和样式规范依赖引入必须遵守项目根目录AGENTS.md约定。通过这样显式声明冲突范围被明确切分——Skill管怎么写组件项目约定管能不能引入这个库。如果你之间的规则有真正重叠那就要果断合并不要同时保留两份互相冲突的命令。5.4 建立自己的Skill调试清单经过几轮折腾我给自己拟定了一张调试清单每次写完一个Skill就按这个过一遍输入一个必须触发此Skill的任务确认加载是否成功。输入一个不应该触发此Skill的任务确认它不会强行加载。加载后检查上下文里是否出现了references中的无关文件。让Agent执行一遍禁止事项中的动作看是否能拦截。在项目有全局规则文件时故意制造一个冲突场景看优先级是否符合预期。清单里的第三、四条往往能筛出七八成的问题。Skill是否真的有效不是看文件写得有多漂亮而是看该出手时出手、不该出手时安静。6. 我的经验收尾别把Skill当成万能钥匙也别低估它6.1 真正不值得用Skill的场景聊了这么多Skill的好处也要说清楚它的边界。我自己踩过的坑是有一段时间给所有重复性任务都建了Skill连写周报都搞了一套。效果是Agent每次都很认真地加载这份Skill然后按照固定格式生成一段千篇一律的周报我要的这个项目到底卡在哪个环节的判断反而没有了。所以我现在判断要不要写Skill就看两件事第一这个任务是不是有足够稳定的标准操作程序第二这个标准是不是能落到可验证的规则上。凡是需要临场判断、创造性发挥的工作比如产品方案设计、架构权衡都不适合做成Skill。还有一类是通用常识型任务比如写代码前先理清需求这种内容放在全局系统提示词里就够了做成Skill反而是给上下文添负担。6.2 从装Skill到写Skill才算真的打开了新世界很多人在skills下载平台skills大全里囤了一堆包装完就扔最后留下一堆占空间、抢上下文、互相冲突的规则文件。我个人建议先从一个最小、最贴近自己日常的Skill写起比如针对你现在手头最痛的前端开发或者数据处理环节亲手搭一个目录、写一份SKILL.md跑通一次加载和验证。这个过程中获得的体感比下载二十个现成的还管用。我自己的体会是Skill真正值钱的地方不在于它把AI变聪明了而在于它把我脑子里的项目经验和团队规范固化成了AI能随时检索的资产。装再多的现成技能包都不如把你自己天天在做的那套判断变成AI的肌肉记忆。这才是Skills这条路线给我最大的启发——从今天起别再收藏skills大全了花一个下午为你最熟悉的那项工作写个属于自己的Skill吧。
阅读完成 · 觉得有帮助?