1. 从“skills”这个热词说起它到底是什么为什么突然火了最近半年不管是在技术社区还是开发者群聊里“skills”这个词出现的频率高得离谱。你随便翻翻热搜词列表能看到claude code、codex、agents、plugin、skills开发、codex skills、claude agent skills这些词扎堆出现。很多人第一反应是这不就是“技能”吗有什么好聊的但如果你真在终端里敲过claude code或者折腾过codex的配置你就会明白这里的 skills 指的是一套让 AI 编程助手真正“能干活”的能力封装机制。我最早接触这个概念是在给团队搭内部编码助手的时候。当时我们用claude code做代码审查和重构用codex做补全和单测生成但很快就撞墙了——模型本身很聪明可它不知道我们项目的目录约定、不知道我们内部 CLI 的用法、不知道我们数据库迁移的命名规范。每次都要在 prompt 里重复交代效率极低。后来发现社区里已经有人在用 skills 的方式解决这个问题把“怎么在这个项目里干活”的知识写成结构化的、可被 agent 加载的模块。这就是 skills 的核心价值——它不是模型能力本身而是模型能力的“外挂说明书 工具包”。所以这篇文章我想聊的不是某个具体产品的安装教程而是把 skills 这套东西拆开来看它的设计逻辑是什么、一个合格的 skill 应该包含哪些部分、怎么从零写一个能跑起来的 skill、以及在claude code、codex、agents anywhere这些不同宿主里skills 的加载机制有什么差异。适合谁看如果你已经在用 AI 编程工具但觉得“它总是差那么点意思”或者你想把团队内部的规范沉淀成可复用的资产那这篇内容应该能帮你省下不少试错时间。2. skills 的整体设计思路为什么不是简单的 prompt 模板2.1 从“一次性对话”到“可复用能力单元”的转变很多人第一次听说 skills会把它理解成“高级一点的 prompt 模板”。这个理解不能说错但太浅了。普通的 prompt 模板是静态的文本你复制粘贴到对话框里模型读完就完了。而 skills 的关键区别在于三点可发现、可加载、可组合。可发现意思是 agent 在运行过程中能主动判断“我现在需要某个 skill”然后去查找并调用它。比如claude code在执行一个数据库迁移任务时如果检测到项目里有db-migration这个 skill它会自动加载相关规范而不是等你手动提醒。可加载意味着 skill 不是一次性塞进上下文而是按需注入避免把上下文窗口撑爆。可组合则是说多个 skill 可以叠加使用比如一个code-reviewskill 和一个security-checkskill 可以同时生效。我实测下来这套机制最直接的好处是把“人脑里的隐性知识”变成了“agent 可读的显性资产”。以前你带新人要口头交代一堆“我们项目里 API 返回格式统一用这个 wrapper”“日志必须打 traceId”“单测覆盖率低于 80% 不给合并”。现在这些都可以写进 skillagent 每次干活都会自动遵守。2.2 一个 skill 的最小结构元数据 指令 资源那一个 skill 到底长什么样根据我在claude code和codex里的实践一个最小可用的 skill 通常包含三部分元数据metadata名称、描述、触发条件、适用场景。这部分决定了 agent 什么时候会想起你。指令instructions具体的操作规范、步骤、约束。这是 skill 的主体通常用自然语言写但要求足够具体。资源resources可选的脚本、模板、配置文件、参考文档。agent 可以在执行时读取或调用。我见过很多人写 skill 只写指令不写元数据结果 agent 根本不知道什么时候该用它。这就像你写了一本很好的操作手册但放在书架最底层没人知道它存在。元数据里的“触发条件”尤其重要你要用 agent 能理解的方式描述“什么情况下加载我”。比如不要写“当需要处理数据库时”而要写“当任务涉及 schema 变更、migration 文件生成、或 SQL 查询优化时”。2.3 为什么 skills 比“塞系统提示词”更靠谱有人会问我直接把所有规范写进系统提示词不就行了何必搞这么复杂我一开始也这么想直到系统提示词膨胀到几千字模型开始“选择性遗忘”——前面说的规范后面就忘了。而且系统提示词是全局的你没法针对不同任务加载不同规范。skills 的按需加载机制解决了这个问题。它把大块知识拆成小模块agent 根据当前任务动态加载。这背后其实是一个很朴素的工程原则关注点分离。代码要分模块知识也要分模块。你写代码不会把所有逻辑塞进一个文件那为什么要把所有规范塞进一个 prompt另外skills 通常有版本管理的能力。你可以把 skill 文件放进 Git 仓库改动了就有记录团队可以 review。系统提示词改了什么往往没人知道。这一点在团队协作场景里特别重要。3. 核心细节解析写一个能跑的 skill 要注意什么3.1 元数据怎么写才能被 agent 正确识别元数据是 skill 的“门面”写得好不好直接决定它会不会被加载。我踩过的坑是描述写得太抽象agent 匹配不上。比如我写过一个api-designskill描述是“帮助设计更好的 API”。结果 agent 从来不用它因为“更好”这个词太模糊agent 无法判断当前任务是否匹配。后来我改成“当任务涉及新增 REST 接口、修改请求/响应结构、或定义错误码时加载。包含本项目 API 命名规范、分页约定、错误码分段规则。” 改完之后加载率明显上来了。所以元数据描述要满足两个条件场景具体 关键词明确。你要想象 agent 是在做关键词匹配和语义匹配它需要明确的信号。还有一个细节是“优先级”或“互斥”声明。有些 skill 是互斥的比如strict-mode和quick-prototype你不可能同时用。这时候在元数据里标注清楚避免 agent 同时加载两个冲突的规范。3.2 指令部分的写法具体、可执行、有边界指令部分是 skill 的核心。我总结了一个原则能写成检查清单的就不要写成散文。比如不要写“代码要写得清晰易读”而要写函数名使用动词开头不超过 30 个字符单个函数不超过 50 行超过则拆分复杂逻辑必须加注释注释说明“为什么”而不是“做什么”禁止使用魔法数字常量必须提取并命名这样 agent 执行起来有明确的判断标准。散文式的指令模型解读空间太大每次执行结果都不一样。另外指令里要明确“边界”。什么是这个 skill 不负责的比如一个unit-testskill你要写清楚“只负责生成测试代码不负责修改被测代码”。否则 agent 可能会越界把生产代码也改了。边界写清楚后续排查问题也容易定位。3.3 资源文件的组织方式与加载时机资源文件是很多新手容易忽略的部分。我见过一个 skill 把大段 SQL 模板直接写在指令里结果上下文被撑得很大。更好的做法是把模板放到单独的.sql文件里指令里只写“参考templates/migration.sql的结构”。资源文件的组织我一般按类型分目录my-skill/ skill.md # 元数据 指令 templates/ # 代码模板、配置模板 scripts/ # 可执行脚本 references/ # 参考文档、规范说明加载时机也要注意。不是所有资源都需要一开始就加载。可以在指令里写明“当需要生成 migration 时读取templates/migration.sql”。这样 agent 只在真正用到时才读文件节省上下文。提示资源文件里的内容也要保持“可被 agent 理解”。不要放二进制文件或压缩包agent 读不了。纯文本、Markdown、代码文件是最安全的。3.4 不同宿主对 skills 的支持差异claude code、codex、agents anywhere这几个宿主对 skills 的支持方式不完全一样。claude code的 skills 机制相对成熟支持目录扫描和自动加载你只要把 skill 放在指定目录下它就能发现。codex更偏向通过配置文件显式声明 skill 路径加载时机也更可控。agents anywhere则强调跨平台skill 的定义更偏向标准化格式。我实际用下来的感受是写 skill 时尽量保持格式中立。元数据和指令用 Markdown资源用纯文本这样在不同宿主之间迁移成本最低。如果你绑定了某个宿主的专有格式换工具时就要重写不划算。4. 实操过程从零写一个 code-review skill4.1 明确目标和触发场景假设我们要写一个code-reviewskill用于在claude code里做代码审查。先明确目标当 agent 收到“review 这个 PR”或“检查这段代码”的任务时加载本 skill按照团队规范输出审查意见。触发场景要写具体涉及代码 diff 分析、PR 评论生成、代码质量检查时加载。不要写“当需要审查代码时”太笼统。4.2 编写元数据与指令主体元数据部分我这样写--- name: code-review description: 当任务涉及代码审查、PR 评论、diff 分析、代码质量检查时加载。包含团队代码规范、常见问题清单、评论格式要求。 version: 1.2 ---指令主体分几块审查维度、严重级别定义、评论格式、禁止事项。审查维度包括命名规范、错误处理、边界条件、性能隐患、安全风险。严重级别分 blocker、major、minor、nit。评论格式要求每条意见包含“位置 问题 建议 示例”。这里有个经验严重级别定义要写清楚判断标准。比如 blocker 是“会导致线上故障或数据丢失”major 是“违反团队强制规范”minor 是“可优化但不影响功能”nit 是“风格建议”。标准清楚了agent 输出才稳定。4.3 配置资源文件与模板资源文件我放了两个templates/comment.md是评论模板references/checklist.md是详细检查清单。评论模板长这样**[级别] 位置** 问题... 建议... 示例...检查清单里列了 30 多条常见问题比如“是否处理了空值”“是否有未关闭的资源”“是否有硬编码密钥”。指令里写“审查时逐条对照references/checklist.md”agent 就会去读。4.4 在 claude code 中加载并验证效果把 skill 目录放到claude code的 skills 路径下然后跑一个测试任务给它一段有明显问题的代码看它是否加载了 skill 并按照格式输出。我第一次测试时发现它没加载排查后发现是元数据里的 description 写得太短匹配不上。改长之后正常了。验证时要注意不要只测一个案例。我一般会准备三个案例一个明显有 blocker 的、一个只有 nit 的、一个没有问题的。看 agent 是否都能正确处理。特别是“没有问题”的案例很多 skill 会强行找问题这就是指令里边界没写清楚。注意skill 加载后agent 的行为会变化。如果你发现它变得过于严格或过于宽松先检查指令里的判断标准是否明确而不是直接改模型参数。5. 常见问题与排查技巧实录5.1 skill 不加载或加载错误怎么办这是最高频的问题。排查顺序我一般是这样检查元数据 description 是否包含任务关键词检查 skill 目录是否在宿主扫描路径下检查文件编码是否为 UTF-8有些宿主对编码敏感检查是否有语法错误比如 YAML front matter 格式不对我遇到过最隐蔽的一次是skill 文件名带了空格宿主扫描时跳过了。改成短横线连接就好了。所以文件名尽量用code-review这种格式不要用code review。5.2 agent 加载了 skill 但不遵守指令这种情况通常是指令写得太模糊。比如写“注意错误处理”agent 不知道具体要注意什么。改成“所有可能返回错误的调用必须检查返回值并在失败时记录日志、返回统一错误码”执行率就上去了。另一个原因是指令太长agent 读到后面忘了前面。解决办法是分节每节加小标题关键约束用加粗。或者把长指令拆成多个 skill按需组合。5.3 多个 skill 冲突或重复加载当项目里 skill 多了冲突是难免的。比如strict-mode和fast-iterate同时加载agent 会无所适从。解决办法是在元数据里加conflicts字段声明互斥关系。或者用优先级字段高优先级的覆盖低优先级的。重复加载的问题更常见两个 skill 都涉及日志规范agent 可能输出两套矛盾的要求。这时候要合并 skill或者明确分工——一个管日志格式一个管日志级别。5.4 性能与上下文占用的平衡skill 太多会导致上下文占用过高agent 响应变慢。我的经验是单个 skill 的指令部分控制在 500 字以内资源文件按需加载。如果某个 skill 经常被用到可以考虑把核心指令精简后常驻详细内容放资源文件。另外定期清理不再使用的 skill。我每季度会 review 一次 skill 目录把过时的、重复的删掉。这跟清理代码库是一个道理。问题现象可能原因排查动作解决方式skill 不加载描述模糊、路径错误、编码问题检查元数据、目录、编码改描述、放对路径、转 UTF-8加载但不遵守指令模糊、过长、冲突检查指令具体性、长度、互斥改具体、拆分、加冲突声明多个 skill 冲突规范矛盾、优先级不明检查重叠内容合并或加优先级上下文占用高skill 过多、资源过大统计加载数量与体积精简、按需加载、定期清理5.5 几个我踩过的坑和对应技巧第一个坑把 skill 当成万能药。不是所有问题都适合用 skill 解决。有些是一次性任务写个 prompt 就够了没必要沉淀成 skill。判断标准是这个知识会不会重复用到会才值得写 skill。第二个坑skill 写完就不管了。项目在变规范在变skill 也要跟着更新。我现在的做法是把 skill 放进 Git跟代码一起 review改代码时顺手改 skill。第三个坑过度依赖 skill 的自动化。skill 是辅助不是替代。agent 加载了 skill 不代表它一定做对关键任务还是要人工复核。我一般把 skill 当成“第一道防线”而不是“最终保证”。6. 从 skills 到 agents这套机制还能怎么扩展6.1 把 skill 组合成 agent 的工作流单个 skill 解决单点问题多个 skill 组合起来就能形成工作流。比如code-reviewsecurity-checktest-coverage三个 skill 串起来agent 就能完成一次完整的 PR 审查。我在agents anywhere里试过这种组合效果比单个 skill 好很多因为每个 skill 专注一件事组合起来覆盖全面。组合的关键是定义好 skill 之间的输入输出关系。比如code-review输出问题列表security-check接收这个列表并补充安全维度的问题。这需要在指令里写明“接收上游 skill 的输出格式”。6.2 团队协作中的 skill 管理团队用 skill最大的挑战是版本一致。我见过有人本地改了 skill 没提交导致别人跑出来的结果不一样。解决办法是skill 跟代码同仓库走同样的 PR 流程。另外skill 的变更要有 changelog写清楚改了什么、为什么改。还有一个实践是“skill owner”制度。每个 skill 指定一个负责人负责 review 变更和维护内容。避免出现“没人管”的 skill。6.3 未来可能的方向从热词里能看到agent skills测试、skills开发、claude agent skills这些词在增长说明这个方向还在快速演化。我个人比较关注的是 skill 的“自动生成”——能不能从代码库和提交历史里自动提取规范生成 skill 草稿。还有就是 skill 的“效果评估”怎么量化一个 skill 到底有没有提升 agent 的输出质量。不过这些都是后话。眼下最实在的还是先把团队里最常用的那几个规范写成 skill跑起来用起来。我在实际使用中发现哪怕只写三五个 skillagent 的可用性就会有明显提升。踩过几次坑之后我现在的习惯是每遇到一个“又要重复交代”的场景就停下来想想这个能不能写成 skill。能就花二十分钟写一个。积少成多现在我的 skill 目录已经成了团队新人上手的重要参考。最后分享一个小技巧写 skill 时先别追求完美。写个粗糙版本跑几个任务看 agent 哪里理解偏了再针对性改。skill 是迭代出来的不是一次写成的。我第一个 skill 改了七版才稳定现在回头看第一版简直没法看。但没关系先跑起来最重要。
企业数字化 ERP 产品动态
相关推荐
Android MediaCodec 逐帧提取并保存 YUV 视频帧实战 1. 先把需求拆开:这件事的难点在哪里“Android 上用 MediaCodec 解码视频,把每一帧 YUV 数据取出来,一帧一帧写到 SD 卡上”——这句话我第一次听到的时候,也有过“不就是读帧、解码、写文件”的想法,直到真正动手&… · 2026/11/3 16:11:29
Unity MCP:AI驱动的游戏开发框架解析 1. Unity MCP:AI驱动的游戏开发革命在游戏开发领域,Unity引擎长期占据主导地位,而AI技术的爆发式发展为开发者带来了全新可能。Unity MCP(Model Context Protocol)正是这两大技术交汇的产物——它不是一个简单的代码生… · 2026/11/4 12:15:32
从零搭建语音工作台VoiceStudio:语音采集、降噪、转写与合成全流程实战 1. 从零搭建一个语音工作台:VoiceStudio 到底在解决什么问题 第一次看到 VoiceStudio 这个名字,我脑子里蹦出来的不是某个具体产品,而是一类需求:把“声音”这件事从零散的录音、剪辑、转写、变声、合成里抽出来,做成一… · 2026/11/3 9:17:13
EasyU优启通PE维护盘实战指南:制作、启动与核心操作全解析 1. 为什么一个PE维护盘值得单独拿出来聊装系统、修引导、救数据、清病毒,这些活儿但凡干过几次的人都知道,真正决定效率的往往不是你手速多快,而是手边那套PE环境靠不靠谱。EasyU(圈内习惯叫优启通)就是在这个场景下被… · 2026/11/5 16:49:35
Rust原来很简单二:所有权系统 Part 2 核心篇 —— 所有权系统
本篇覆盖 第 6 ~ 10 章:所有权、借用与引用、生命周期、字符串与切片、内存模型。 ⚠️ 这是全书最重要的一篇。 把它吃透,Rust 从此“很简单”;跳过它,你会处处碰壁。请慢下来,动手敲每一段代码。 第 6 章 所有权:Rust 的第一性原理
6… · 2026/11/5 16:26:08
基于Hadoop+Spark的民宿智能推荐系统设计与实现 1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享… · 2026/11/5 14:59:25
ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
UART接口24位ADC搭配RS485,解决远距离温度监控难题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 14:10:41
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07