AI Agent Skills入门:从Prompt到可复用能力包,一次讲清边界与实战路径
我第一次接触“AI Skill”这个概念时心里最大的疑问是它跟一段精心编写的 Prompt除了名字不同到底有什么本质区别后来我在实际项目里帮团队搭 AI Agent比如让 Agent 定期做代码规范走查、按固定模板生成技术方案、把散落的表格数据清洗成统一格式我才慢慢意识到Skill 真正改变的不是“一句话能不能说清楚”而是“一段经验能不能被沉淀下来、被复用、被维护”。所谓 AI 的 Skill可以简单理解成一份面向 Agent 的“操作手册 参考材料包”。它不是一个新模型也不是一个点击就生效的按钮而是把操作流程、领域知识、输入输出规范和验收标准打包成文件让 Agent 在需要的时候自己读取、自己执行。这篇文章适合作为“AI Agent Skills 技能教程”的第 01 篇先不急着写代码也不追求做一个复杂的插件而是先把“什么是 Skill、它解决什么问题、边界在哪里”这件事想清楚。1. 先搞清楚 AI 的 Skill 到底是什么1.1 从一句提示词到一个可复用能力包先回到一个很常见的使用场景。你想让 AI 帮你写一个 Verilog 模块传统做法是把项目背景、端口定义、命名规范、仿真的注意事项全部塞进 Prompt。任务越复杂Prompt 就越长最后变成一段几千字的“一次性说明书”。问题是下次换一个模块你还要重新整理一遍。再换一个同事他也要重新整理一遍。任何一次需求里的细节变化都会让整段 Prompt 失效。这个过程的本质是“每次都在重新教”。Skill 的思路不一样。它把“完成某类任务所需的知识、步骤、样例和验收办法”提前放进一个固定位置。Agent 遇到任务时先读取对应的 Skill再按里面的流程执行。你不需要每次都把背景重讲一遍只需要告诉 Agent“用哪个 Skill处理什么输入”。所以 Skill 并不是一个更长的 Prompt而是一个“能力包”。这个能力包可以独立维护可以放进 Git 做版本管理也可以跨项目复用。1.2 Skill、Agent 和通用 Prompt 的边界很多初学者会把 Skill、Agent、Prompt、工具函数混在一起。这里我建议用一张表先把边界划清楚。概念它更接近什么核心作用使用时的典型问题Prompt一次对话里的指令告诉模型这次任务要什么每次都要重复细节一变就失效Skill一份可复用的操作手册告诉 Agent 长期稳定的“做事方法”需要定义清楚适用边界否则会被误用Agent一个能推理、调用工具的执行者负责理解目标、拆解步骤、选择方法如果缺少 Skill/工具只能“纯聊天”Tool / Function一个具体动作的接口执行某个单一函数例如查天气、发请求只管执行不管完整流程其中最容易混淆的是 Skill 和 Tool。Tool 像是工具箱里的一把螺丝刀它只能完成一个动作Skill 更像是“如何用这把螺丝刀把这台设备安全拆开”的说明书。Agent 才是那个拿到说明书、从工具箱里选工具、按照步骤操作的人。如果跟 RAG 做对比区别会更明显。RAG 解决的是“不知道某个知识时从资料里检索出来给模型”模型只要知道“是什么”就够了Skill 解决的是“知道一个目标后按什么流程把它做出来”模型要理解的是“怎么做、先做什么、后做什么、做到什么程度才算合格”。两者可以配合使用Skill 里可以写“如果需要判断某条规范先检索 references 目录里的规范文档”但 Skills 的核心资产是流程不是知识库条目。1.3 为什么这种设计能改变日常使用方式过去我们评价一个 AI 助手好不好用基本看模型聪明不聪明。但只靠模型能力解决不了经验重复建设的问题。同样是让 Agent 写代码没有 Skill 时今天写的代码风格和明天写的可能完全不同。你有能力把问题描述得很清楚模型就做得好你描述得含糊结果就差。这等于把所有质量风险都压在“表达能力”上。有了 Skill 之后质量风险开始转移到“经验设计”上。只要你把步骤、样例、避坑点写清楚Agent 每次执行都会自动带上这套经验。对个人来说维护 Skill 的成本比反复调 Prompt 更低对团队来说一个人沉淀的 Skill可以被其他成员共享而不是锁在某个人的聊天记录里。这也是我认为 Skill 真正值得关注的原因它让 AI 的使用方式从“每次重新沟通”走向“把经验固化成资产”。这句话会是这篇教程的主线后面所有实操都会围绕它展开。2. 一个 Skill 通常长什么样2.1 常见的组织方式一个文件夹加一份主文档在常见实践里一个 Skill 通常被组织成这样的结构skills/ └── code-review/ ├── SKILL.md ├── references/ │ ├── naming-rules.md │ └── checklist.md ├── examples/ │ └── review-demo.md └── scripts/ └── run_lint.pySKILL.md是整个 Skill 的入口文件。Agent 在决定“要不要使用这个 Skill”时会先读这个文件在执行过程中也会根据SKILL.md的说明去加载 references、examples 或 scripts。不同产品对 Skill 的命名和加载机制不完全一样有的叫 Skills有的叫 Actions有的直接叫自定义工具。但在主流方案里通过一个 Markdown 文件来描述“名称、用途、步骤、约束”已经成了比较通用的做法。如果你没有特殊定制需求从SKILL.md开始通常是成本最低的路径。2.2 主文档里应该写哪些内容SKILL.md不是一个自我介绍文件而是一份“可执行说明”。一份能工作的 Skill 文档至少要包含下面几类信息name这个 Skill 叫什么建议用 kebab-case 或 snake_case方便在目录、命令和日志里引用。description什么时候使用、什么时候绝不要使用。描述写得太宽泛Agent 会把不相关任务也交给它处理写得太狭窄Agent 又找不到它。input调用这个 Skill 需要提供什么。是需要文件路径、粘贴代码、还是结构化表格尽量给出必填项和可选项。steps具体执行顺序。这是核心要写成可操作步骤而不是只写“分析问题再给出答案”这种废话。output最终要交付什么。是报告代码修改清单要定义大致格式。constraints哪些事不能做哪些事需要停下来问人。这是很多人会漏掉的部分。references要不要读其他文档要不要运行某个脚本。examples给一个真实样例让 Agent 理解“完整输出长什么样”。这里有一个容易被低估的点description的质量直接决定 Agent 能不能正确选择 Skill。如果你写的是“帮助处理代码”那么很多非代码任务也可能会被错误路由进来。更合适的写法是“在用户要求对前端工程做代码走查、输出问题清单和修改建议时使用不用于架构设计或性能优化”。2.3 判断一个 Skill 是否合格的三个标准我在验证自己写的 Skill 时一般不看它是不是“看起来很完整”而是看三个问题第一次就成功一个之前没接触过这个 Skill 的 Agent 或新人仅凭这份文档能不能独立完成同类任务输入变化时不慌把输入从“简单案例”换成“另一个项目、另一种规模的输入”Skill 里的步骤还能不能继续指导执行失败时可定位当输出不对时人能不能根据文档里的步骤快速判断是哪一步没执行、哪一步偏离了预期如果三个问题都回答不上来说明这个 Skill 还只是“资料堆”不是能真正驱动 Agent 执行的能力包。注意不要把SKILL.md当成一个简单的 Markdown 模板来套。它更像一段给 Agent 看的程序任何模糊的表达都会直接反映在最终输出质量上。3. 什么场景适合把能力沉淀成 Skill3.1 适合场景重复、有步骤、有验收标准判断一个任务是否值得做成 Skill不需要看它是不是高端技术只看三个特征重复出现、有固定步骤、有明确的完成标准。如果这个任务你每周只用一次而且每次情况完全不一样做 Skill 的性价比可能不高。但如果它满足以下条件我会建议你认真做一个试试团队里每两三天就要执行一次每次执行都需要提到同一批背景规则输出结果可以被格式化成固定模板虽然不复杂但如果少做一步后面会返工举几个真实场景。代码走查是一个典型 Skill你需要先确认技术栈再检查命名规范、文件结构、潜在 bug、可维护性问题最后按严重级别给出修改建议。这些步骤不会因为换了仓库就完全变形完全值得沉淀。再比如数学建模比赛里常见的“问题拆解 模型构建 论文排版”流程也可以做成 Skill。把题目分析步骤、假设条件、模型命名规范和论文结构写进去让 Agent 在每轮写作时都按同一个框架来。还有硬件设计方向的 Verilog 代码生成同样适合 Skill。很多刚接触 AI 辅助硬件设计的同学会遇到一个问题让 Agent 写代码很容易但生成结果经常不符合仿真环境或命名要求。如果把编译环境、命名规则、仿真流程、常见版图约束写进 Skill模型输出稳定度会高很多。3.2 不适合场景别把 Skill 万能化Skill 不是万能药。以下三类场景建议你谨慎使用强探索性任务比如“帮我构思一个新的产品方向”“头脑风暴一下这个界面的设计方案”。这类任务的价值在于发散过早用流程约束反而会限制结果。强实时信息任务比如“查询最新股价”“看看现在哪台服务器负载最高”。Skill 可以提供“去调用哪些接口”的步骤但如果环境没有给你相应工具和权限单靠 Skill 文档没有任何意义。强审批/高风险任务比如生产环境变更、资金操作、面向客户的正式承诺。这类任务即便写成 Skill也应该在关键节点强制要求人工确认不能全权交给 Agent 自动完成。3.3 Skill 不是任务清单一个容易误用的地方是把 Skill 当成普通任务清单。任务清单关心的是“今天要做哪些事”Skill 关心的是“这一类事情在什么条件下、按什么流程做、做到什么标准才算完成”。它需要包含分支判断如果输入符合 A走路径 A如果符合 B走路径 B如果信息不足停下来问人。所以不要在一份 Skill 里塞几十个互不相关的动作。一个 Skill 最好只对应“一类任务”比如“代码走查”和“生成接口测试用例”可以拆成两个 Skill而不是混在一个“质量保障”的大包里。4. 从零创建一个 Skill 的实操路径4.1 先选定一个有边界的痛点创建 Skill 的第一个动作不是写文档而是选择一个够小的任务。我个人建议先问自己三个问题这个任务我最近 3 个月有没有做过至少 3 次如果让一个新人去学他大概需要 10 分钟以上才能搞清规则这个任务的输出有没有办法让另一个人或另一个 Agent 判断“对不对”如果三个答案都是“是”就可以开始。接下来把任务的边界写下来。不是写完整流程只写两件事输入是什么输出是什么。比如“输入一段业务代码路径输出一份 Markdown 格式的代码规范走查报告”。边界越清楚后面写步骤就越不容易偏。4.2 编写主文档的推荐结构下面给一个示例结构它不是唯一标准但足够作为入门模板。以“代码走查 Skill”为例--- name: code-review-guideline description: 对前端工程代码做一轮规范化走查输出问题清单和修改建议。当用户要求“检查代码”“走查规范”时使用。不用于架构设计或性能调优。 --- ## 输入 - 需要走查的代码文件路径或直接粘贴的代码片段 - 技术栈标识可选默认按 Vue 3 TypeScript 处理 ## 执行步骤 1. 先确认技术栈并读取 references/checklist.md 中对应规范。 2. 对输入内容按“结构、命名、类型安全、可维护性”四层逐项检查。 3. 发现问题时记录文件位置、严重级别高/中/低和原因。 4. 给每个问题写出修改建议建议必须是可直接落地的代码级说明。 5. 最后汇总成一份走查报告。 ## 输出格式 | 编号 | 位置 | 严重级别 | 问题描述 | 修改建议 | | --- | --- | --- | --- | --- | ## 约束 - 如果输入中没有给出文件路径也没有粘贴代码不要猜测先要求用户补充输入。 - 如果发现严重安全问题不要直接给出绕过建议应提示走安全评审流程。 - 不输出模板化结论每个问题都必须对应到具体代码位置。 ## 参考 - references/checklist.md - examples/review-demo.md写完之后自己先站在 Agent 的角度读一遍如果我只看到这份文件能不能独立走完整个流程哪些地方还是会让人犹豫犹豫的地方就是下一步要补充的内容。4.3 用最小样例验证再扩大覆盖面很多初学者写 Skill 容易一口气写得非常全恨不得把未来所有可能情况都列进去。但在真实工程里这样做的结果通常是文档很长Agent 抓不住重点执行质量反而更差。我更建议用“最小验证”的方式推进先准备一个真实案例。让 Agent 按 Skill 执行这个案例观察输出。如果失败记录是“选错了 Skill”“步骤不清晰”还是“输出格式没被遵守”。修改文档后再用第二个案例测试。当连续 3 个不同输入都能给出合格结果时再考虑扩展边界。不要一上来就测十几个案例。输入变化太多你很难判断问题出在文档还是出在某个特例上。4.4 将 Skill 接入 Agent 工作流Skill 写好后还需要让 Agent 能够访问到。根据你使用的技术栈不同接入方式会有差异。如果你用的是配置化 Agent通常只需要把 Skill 目录放到一个指定位置然后在 Agent 配置里声明“允许加载哪些目录”。如果你在基于 Java / Spring AI 这样的框架里开发 Agent常见做法是把可执行动作封装成 Tool / Function Calling再用 Skill 文档作为 Agent 的流程指引——查询上下文中的“指南”部分通过注解暴露方法并在执行时把 Skill 文件里的约束加载进来。无论使用哪种方式接入后都要先做一次“路由测试”给 Agent 一个相关任务看它能不能自动选择到正确的 Skill。如果 Agent 没有触发先检查description是否写得足够具体如果触发了但执行混乱再检查steps是否仍有歧义。提示Skill 接入的初级目标是“能被用起来”进阶目标是“能被正确选到”。后者往往比前者更影响体验。5. 最容易踩坑的几个细节5.1 把 Skill 写成了万能 Prompt最常见的坑是把 Skill 写成一个四平八稳的万能提示词。比如步骤里写“请分析用户需求并给出合理建议”。这句话放在 Prompt 里没问题放在 Skill 里几乎等于没写。因为 Skill 是给 Agent 执行用的操作手册它需要的是“先做什么再做什么什么条件下做什么”而不是一句正确的废话。解决办法是每一条步骤都要落到“可以执行的动作”上。遇到判断节点直接写条件分支让 Agent 不需要临时猜测。5.2 在 Skill 里夹带外部依赖和权限假设第二个坑是 Skill 里提到“运行脚本”“读取服务器文件”“调用内部接口”但没有说明这些依赖是否存在、需要什么权限、有没有安装。在团队协作场景里这个坑几乎是必然出现。你的环境能直接跑某个脚本不代表下一个使用者的环境和你有相同权限你有数据库连接不代表 Agent 运行时能拿到同一个连接。所以 Skill 里必须写明“前置条件”并且在无法满足时明确要求 Agent 停止执行并反馈原因。不要写“如果环境缺少依赖先自动安装”这种危险授权。5.3 没有定义失败模式和验收标准很多 Skill 的步骤是“做完 A 再做 B 再做 C”但如果 B 做失败了该怎么办文档里完全没写。此时 Agent 可能会“自己编一个 B 的结果”硬着头皮继续往下走。这个问题很隐蔽尤其当输出是一份报告或代码时里面的错误不一定会直接报错。所以在 Skill 的关键步骤后加入“自检动作”会非常实用。比如“检查输出报告中是否每个问题都带有具体文件路径没有路径的建议需要回炉重做。”这样就把部分失败问题从“难以察觉”变成“可验证”。5.4 忽视版本管理Skill 是代码也是文档但它核心属性是“会经常变更的生产资产”。我今天觉得代码走查需要有“类型安全”检查明天可能又觉得要加“性能问题”这种调整都会改变 Agent 后续所有行为。如果 Skill 没有版本管理你根本不知道某次输出变化是谁改出来的。我的建议是从一个 Skill 开始就用 Git 管理。哪怕里面只有一个 Markdown 文件也要有提交记录。等 Skill 数量变多后再考虑每个独立版本和升级说明。6. 如何判断一个 Skill 是“好用”而不是“热闹”6.1 从四个维度评估 SkillSkill 做出来后不能只看“能用一次”就算成功。我一般会用一个四维度列表来评估维度判断方法上限与下限成功率随机选不同输入跑 10 次看首次成功的比例至少 7 次以上才算初步可用稳定性同一类输入多次执行输出格式和质量差异大不大差异应体现在内容而不是结构混乱调试成本当输出失败时人需要花多久找出问题环节如果超过 15 分钟说明步骤分得不够细维护成本修改一个字段需要动多少地方尽量做到一个文件或一个目录内闭环这套评估方法不需要跑得很重接近真实使用场景测几次就能得出结论。6.2 对 Skill 的边界保持清醒Skill 会让 Agent 看起来“更专业”但它不会让 Agent 变万能。它解决的是流程稳定性的问题不负责判断“这个需求本身该不该做”。所以凡是涉及高风险、强个性判断、需要人来背锅的场景都应该在 Skill 里留出人工确认点。另外Skill 也需要定期清理。如果一个 Skill 超过两个月没有被任何 Agent 选中要么是入口描述写得不好要么是任务本身已经不常发生。这时候不要急着扩展它先考虑归档或删除避免技能库变成一个信息垃圾场。6.3 进阶思路Skill 的组合与共享当你拥有几个稳定可用的 Skill 后下一步值得思考的是组合。比如你有一个“代码走查 Skill”又有一个“生成 commit message Skill”那它们可以组合成一条更完整的“代码提交前检查流程”。这个组合不一定需要写进同一个 Skill 文件而是可以让 Agent 通过编排能力自动调用多个 Skill。在这个阶段真正有价值的不再是某一份文档而是一个“技能库”。技能库越成熟团队对 Agent 的复用效率越高。新同事来了不用重新踩一遍所有坑业务规则变了只需要改对应 Skill 文档。但这里我要提醒一句技能库同样需要克制。不要让 Skill 之间互相重叠不要一个 Skill 里堆几十个大而全的流程。最好的状态是“单个 Skill 小而清晰多个 Skill 能灵活组合”。AI Agent 的可控性本质上来自我们把多少经验写成了可理解、可调试、可维护的规则。Skill 是这些规则的容器。它不会替代人的判断但能让普通使用者少做大量重复的“调教”工作。你现在最该做的事不是急着做出一个复杂技能而是找出一个你反复在做的任务先试着把它写成一个文件夹加一份说明跑通三遍。真正理解了这一步再谈批量沉淀和工程化都不迟。