上周同事问我为什么准备客户拜访材料那么快,我说不是我手快,是把重复工作交给了几个开源的Skills。他当时一脸疑惑,等我把笔记整理、客户会议准备、查数据、做演示、配图这五个场景挨个演示了一遍,他也开始往自己的工具链里装。这篇就把这5个实用开源Skills的选型思路、实际用法和踩过的坑整理出来,给正在用Claude Code、Codex或OpenCode这类Agent工具,又被重复劳动困住的朋友一个参考。
1. 先弄清楚Skills是什么:不是插件,不是提示词,也不是脚本
先把这个概念理清楚,不然后面安装和排查问题时会绕弯子。市面上讨论Agent时经常把Skills和Plugin、MCP工具、提示词模板混在一起说,实际它们的定位完全不一样。
1.1 Skills的构成:SKILL.md、脚本和资源文件
一个Skill本质上是一个目录,里面包含一份SKILL.md说明文件和若干辅助资源,核心是告诉Agent“在什么情况下、按什么步骤、调用什么工具,完成一类特定任务”。我本地的Skills目录会长这样:
meeting-prep-skill/ ├── SKILL.md ├── scripts/ │ ├── fetch_company_news.py │ └── build_agenda.py └── assets/ └── agenda_template.mdSKILL.md是灵魂,用Markdown编写,通常带一段YAML格式的元信息。Agent读到这里就知道这个技能是干什么用的,以及应该什么时候触发它。下面是典型的元信息:
--- name: meeting-prep description: 输入客户公司名称或官网,生成客户会议准备包 when_to_use: 当用户需要准备客户拜访、客户会议或商务洽谈时 ---这里的关键在于:Agent不是所有时候都会调用这个Skill,它靠描述里的关键词来匹配。描述写得太宽,Agent会频繁误触;写得太窄,该用的时候又不会触发。我一般会在描述里写清“输入是什么、输出是什么、什么场景用”,让匹配准确率尽量高。
1.2 为什么Skills现在这么火:一次封装,处处复用
我个人的理解,Skills火起来是因为它解决了提示词工程的复用问题。以前我把一套会议准备流程写在提示词里,每次用都要复制粘贴,还经常因为上下文太长被截断。写成Skill之后,Agent自动在合适的时候加载与任务相关的那一份说明,既不占上下文,又能保证每次按固定步骤执行。
它跟MCP工具也不是替代关系。MCP解决的是“Agent能不能做到某件事”,比如能不能访问数据库、能不能搜索网页;Skills解决的是“Agent知不知道该怎么做好这件事”。好的组合方式是Skill脚本里调用MCP工具,把外部能力串进固定流程里。后面我会专门讲这两者怎么配。
2. 整理笔记的Skill:把碎片信息自动归位
先说笔记整理这个场景。我的笔记来源很杂:临时记的Markdown文件、网页剪藏、会议记录、随手截图里的文字。以前每周手动整理一次,每次都得花一个多小时,而且越积越不想动。
2.1 一个笔记整理任务的前后对比
装上笔记整理Skill之后,我现在只需要在Agent对话里说一句“整理一下我的notes目录,先dry-run”,它就会扫描目录下所有Markdown文件,测出主题、生成标签建议、找出重复内容,然后输出一份整理计划。计划里会写明准备把哪个文件移动到哪里、给哪些文件补frontmatter、建议新建什么索引,全部确认后我再让它执行。
整理前,我的目录是一堆无规则文件,比如新建文档 12.md、想法.txt、关于那个啥的笔记.md。整理后,文件会按主题分到notes/ai-agents/、notes/customer-visits/这样的目录下,每个文件头部带上时间、标签和摘要,根目录生成一份index.md汇总索引。
2.2 调用方式与内部流程
这个Skill的内部逻辑其实不复杂,但顺序很要紧。它会先跑一个Python脚本扫描目录,提取每个文件的基础信息;然后把文件名列表交给Agent,让它结合文件内容推断主题;最后脚本根据Agent给出的分类建议执行移动和重命名操作。关键是扫描和分析两步之间,一定要让Agent看到文件内容,而不是只根据文件名猜。
我常用的调用方式有两种。一种是在对话里用自然语言触发:“整理notes目录,重点关注本周新增的文件”;另一种是直接跑脚本:
python scripts/scan_notes.py --input ./notes --dry-run--dry-run参数非常重要。第一次跑的时候,它会先生成一份重命名和移动方案,而不是直接改文件。我建议所有整理类Skill都保留这个参数,让人工确认一步,避免AI把文件名改得莫名其妙。
2.3 中文笔记环境里的三个坑
笔记整理实际用下来,有三个坑最典型:
第一个坑是文件名编码和超长问题。系统里经常有包含空格、中文标点、特殊符号的文件名,脚本处理不当会出现乱码或者路径解析错误。我的方案是统一走Python的pathlib,文件操作全部用Path对象,避免直接拼接字符串。
第二个坑是自动改正文内容。有些笔记Skill会顺手把正文里的结构也改了,这在个人笔记上问题不大,但如果是团队共享的文档目录,改坏了很难恢复。我要求Skill默认只动frontmatter和文件位置,不修改正文内容,需要改正文时单独询问。
第三个坑是关联关系幻觉。AI在整理索引时,经常会把“看起来内容相似”的笔记强行关联成“相关笔记”,实际上只是用了相近的关键词。生成的双向链接里有不少是错配。现在我的习惯是让Skill先生成链接建议,我确认过再写入,不直接自动建立大量link。
3. 客户会议准备Skill:从空白页面到完整会议包
见客户最烦的不是聊天,而是准备阶段。以前我见一个陌生客户,至少要花半天去查公司背景、最近的新闻、组织架构、可能的决策链,再自己拼一份议程。客户会议准备Skill就是来解决这件事的。
3.1 会议包应该包含哪几块
一个完整的客户会议准备包,我按这四块来组织:
- 客户背景摘要:公司主营方向、规模、近年动态、所在行业的挑战
- 决策链与关键人:从公开资料里能推断出的组织架构信息,列出可能参与会议的角色
- 会议议程草案:按时间块划分的议程,包含每个环节的目标和时长
- 常见异议与应答要点:站在客户角度可能会提的疑问,以及我方回应时可以参考的话术
这个Skill输入很简单,只需要给一个公司名称或者官网地址,最多再加一个希望会议覆盖的主题方向。它会把公开信息收集、整理、成稿这套流程全部接过去。
3.2 执行顺序是防幻觉的关键
我踩过最大的坑是顺序问题。第一版这个Skill拿到客户名字后直接让AI“生成”一份会议包,结果里面提到的客户新闻、口号、甚至联系人职位都是编的,样子很好看,但根本不能用。
后来我把执行顺序硬性固定了:先做事实收集,再做分析输出。具体分成三步:
- 通过搜索相关工具抓取客户官网、新闻页面、招聘信息,把原始链接收集下来
- 从原始材料里摘取事实,每条事实都记录来源
- 最后基于事实清单生成背景摘要和议程
遵守这个顺序之后,编造内容的情况少了非常多。同时我还在SKILL.md里加了一条很强的规则:对于找不到明确来源的信息,必须返回“未知”,而不是推测。宁可让报告里出现“未知”,也不要让AI编出一个听起来顺理成章的答案。
3.3 结合CRM历史的进阶用法
只靠公开信息还不够,因为老客户的情况主要存在CRM里。我现在会把CRM导出的表格作为附件一起提供,让Skill把上一轮的会议纪要、未完成事项、客户提出的问题并进来,这样生成的议程会更有针对性。
比如上一轮客户提到“对当前方案的权限管理不满意”,Skill在生成议程时会自动把“权限方案演示与确认”排进去,还会在异议应答里准备对应的解释材料。这一步带来的提升比公开信息搜索更明显,毕竟存量客户的信息才是最有价值的。
一个小提醒:客户公司的人事变动比AI训练数据新很多,尤其是职位和决策链信息。我习惯在会议前一天重新跑一次这个Skill,确保用的不是几个月前的旧信息。
4. 查数据Skill:用自然语言替代每次手写SQL
数据分析这个场景,几乎每个团队都有。以前要么找数据同学帮忙跑数,要么自己打开数据库写SQL,光搞清楚表结构就要花不少时间。查数据Skill解决的正是这个链条里的“理解库结构”和“生成正确查询”两个环节。
4.1 查数Skill与聊天窗口里的“直接问”有什么不同
如果你只是把数据库建连信息贴给Agent,然后问“本周新增用户多少”,它有可能会成功。但问题在于没有任何约束:Agent可能去猜字段名、可能全表扫描、可能把敏感字段带出来。
查数据Skill做的事情是加了一层护栏一本数据结构说明。它会先请求数据库返回schema,列出主要表和字段,再根据用户问题生成SQL,最后以受限的方式执行。如果遇到字段名不一致,它不会瞎猜,而是会查看表注释或者返回可能匹配的字段列表让用户确认。
比如我问“本月各区域销售额占比”,Skill的流程是:
- 列出与订单、区域相关的表
- 检查这些表的字段注释
- 生成一条带区域维度的聚合SQL
- 执行并输出Markdown表格结果
- 把“这个结果说明了什么”的分析附在后面
4.2 一个安全的连接与执行配置
我把配置都放在环境变量里,不写进Skill文件:
export DB_HOST=localhost export DB_PORT=5432 export DB_NAME=analytics export DB_USER=readonly_user export DB_PASSWORD=****** export QUERY_TIMEOUT=15注意这里用的是readonly_user,这是最重要的一条。查数据Skill连接数据库一定要用只读账号,从机制上杜绝Agent执行UPDATE或DELETE语句的可能。数据库端还要设置statement_timeout或查询超时时间,避免复杂查询把线上库拖垮。
如果建账号不方便,至少要在Skill的脚本里做两层检查:先解析SQL,发现非SELECT开头就拒绝执行;再统一给查询加上LIMIT,并且不允许通过子查询绕过。
4.3 大表和敏感字段的处理经验
实际用下来有几个经验值得分享。第一,Schema很大的时候,不要让Agent一次看所有表。很多数据库有几百张表,上下文塞不下,也容易分析混乱。我在Skill里加了一步:先只列出与问题可能相关的表名,再针对这些表读取字段信息。
第二,大表一定要自动加限制。比如查“用户表里有多少人”,如果不加LIMIT,Agent可能会尝试把整个表拉下来再计数。正确做法是让Skill识别聚合类查询,允许全表聚合,但拒绝不带聚合条件的明细查询。
第三,敏感字段要脱敏。Skill在返回结果前会检查列名,碰到手机号、邮箱、身份证这类字段时自动做打码处理。这一点在团队里多人共用同一套查数入口时特别重要,不然一个数据分析入口很容易变成数据泄露通道。
5. 演示文稿Skill:先大纲、后页面,输出可编辑PPTX
做演示是很多人高频需求,但我看到的大部分AI直接生成PPT的方案都不太靠谱。要么生成的是网页版幻灯片,要么是纯图片,不能编辑,改一个错别字都得重来。我用的演示文稿Skill走的是“先大纲、后渲染”的路线。
5.1 为什么不用“一句话生成整份PPT”
第一版我也试图让AI直接一口气生成完整PPT,效果很差。原因很简单:PPT的结构决策和内容填充是两件事,混在一起做,AI既没想清楚逻辑,又会写出大段文字填满页面。
现在这个Skill分两步走。第一步,先根据用户给出的主题生成大纲,包含页码、每页标题、每页要点和备注提示。大纲输出后,用户先审阅修改,确认不需要大调后,才进入第二步。这样看似多了一个环节,实际上总耗时反而更短,因为后期返工少了。
5.2 渲染阶段的技术选型
渲染阶段我见过几种方案,评估下来最省事的是通过python-pptx直接生成可编辑的.pptx文件。它虽然不能做出花哨的视觉效果,但能保证每一页都是原生文本框和形状,客户拿过去能直接改。
另一种方案是用Marp把Markdown转成HTML格式的slide,适合个人演示和纯技术分享;如果公司内部要求统一PPT模板,就得用python-pptx套模板,把模板页复制出来再往指定位置填文字。下面是一段用python-pptx生成基础页面的核心代码:
from pptx import Presentation from pptx.util import Inches prs = Presentation() slide_layout = prs.slide_layouts[1] # 标题和内容版式 slide = prs.slides.add_slide(slide_layout) slide.shapes.title.text = "示例标题" slide.placeholders[1].text = "第一段要点\n第二段要点" prs.save("output.pptx")这只是一个简单示例,实际Skill里会把大纲里的每个page标题和要点逐一映射到对应的版式和占位符中。关键是输出结果一定记得用Python重新打开检查一遍,因为偶尔会遇到“文字超出了文本框边界”或“第二页占位符缺失”这类渲染问题。
5.3 让演示文稿像“人做的”的细节
AI生成的PPT最容易被看出AI痕迹的问题有三个:文字太多、字体不统一、配色混乱。
文字太多是最典型的。Skill里我会限制每一页的正文要点不超过4条,每条不超过20个字,详细的解释放到演示者备注里。这样页面干净,演示者也有讲稿可用。
字体方面,中文环境建议在模板中统一设置为思源黑体或系统自带的微软雅黑。python-pptx生成的中文文本如果不显式设置字体,容易落到默认字体上,不同电脑打开效果差别很大。
配色方面,最简单的方式是把公司或团队的主题色写进Skill的配置文件,所有页面都从这套颜色里取色。这样即使页面结构很朴素,整体观感也会比五颜六色的方案好很多。
6. 配图Skill:搜图、生成、压缩和版权检查一体化
配图看起来不是硬核工作,但真正做内容的人知道它有多琐碎。找图、改尺寸、压缩、写Alt文本、确认版权,每一步都耗时间。配图Skill把这些步骤串成了一条流水线。
6.1 配图这件琐碎活到底琐碎在哪
以前给一篇技术文章配图,我至少要经历:根据段落内容想关键词、到图库网站搜索、筛选风格匹配的图、下载后裁剪大小、压缩体积、写一句合适的Alt文本、记录图片来源和许可协议。这一套流程下来,一篇长文配5张图,半小时就没了。
配图Skill的用法是直接告诉它“给这篇文章配图,内容是关于Agent工作流的,输出图片文件和说明”,它会自动做下面这些事:
- 阅读文章或给出的提纲,提取每一段的关键主题
- 为每个主题生成图片检索词或文生图提示词
- 调用图库接口搜索CC0或可商用许可的图片,或者调用本地文生图模型生成
- 批量裁剪到统一宽度、压缩体积、重命名
- 生成一份图片清单,包含文件名、建议插入位置、Alt文本、来源链接、许可类型
6.2 一次实际出图过程
我在一次社区分享的幻灯片里用过这个流程。文章标题是“让Agent按流程干活”,我给Skill的指令只有一句话:“为这篇分享配5张配图,主题包括工作流、自动化、人机协作。”它返回的结果是:
[ { "filename": "workflow-map.png", "alt_text": "带有分支节点的流程示意图,表示Agent按步骤执行任务", "source": "https://example.com/photos/flow.png", "license": "CC0", "insert_after": "第2页:Skills工作原理" }, { "filename": "automation-levers.png", "alt_text": "多块控制开关的抽象图,表示自动化控制", "source": "https://example.com/photos/levers.png", "license": "CC BY 4.0(需署名)", "insert_after": "第5页:一次封装处处复用" } ]输出格式统一之后,我插入图片时只需要照着清单操作,Alt文本和许可信息直接复制就能用,省了很多事。
6.3 版权与风格统一的红线
配图这块有两条红线,碰一次就会很麻烦。
第一条是版权。图库网站上标注“免费”不代表可以商用,更不代表可以二次修改。Skill里检索图片时会过滤许可类型,只保留CC0、CC BY或明确允许商用的素材。CC BY系列记得保留署名信息,这是许多人容易忽略的。
第二条是风格统一。一篇文章里如果出现照片、插画、扁平图标三种风格,观感会很碎。我会在Skill配置里写死风格偏好,比如“扁平插画风、低饱和色、无文字水印”,这样生成或筛选出的图片才能保持一致。
另外,文生图模型生成图片时要注意别让模型生成与真实品牌、真实人物相关的形象,容易踩到肖像权和商标权的坑。配图Skill在提示词里加了负向过滤词,同时生成后由人工过一眼再使用。
7. 安装与调用中的高频坑:环境、权限、路径和MCP
就算Skill本身写得再好,安装和调用环节出了岔子也会让人劝退。这部分把我自己踩过的或者帮朋友排查过的问题集中列一下,基本都是常见场景。
7.1 依赖与权限问题
多数Skill依赖Python或Node环境,还牵扯到一些系统命令。如果脚本是用Python写的,建议新建独立虚拟环境,不要直接装到系统环境里,避免版本冲突。
更隐蔽的是执行权限问题。在Linux或macOS上,如果脚本没有可执行权限,Agent调用时会直接报“Permission denied”。装完Skill后第一件事就是执行:
chmod +x scripts/*.shWindows环境下的处理方式不同,通常是用git bash或wsl跑这些脚本。如果你用的框架只支持Windows原生环境,那配置起来会多花一些时间。
7.2 中文路径和编码问题
这恐怕是国内用户最常踩的坑。很多开源Skill是在英文环境下开发的,对中文文件名、中文路径、UTF-8 BOM这些情况没做处理。
我的经验是:安装Skill时尽量把路径改简单,比如C:\Users\你的名字\skills这类包含中文用户名的路径,容易在脚本解析时出问题。虽然现在大部分脚本已经能处理Unicode路径,但没必要给自己增加不确定性。
如果你的笔记文件是中文名,记得在Skill脚本里强制指定文件读写编码为utf-8。有个细节:Windows下部分编辑器保存的Markdown文件带BOM头,脚本读取时第一行会多出\ufeff字符,解析frontmatter时容易报错。可以在读文件时用encoding='utf-8-sig'来兼容。
7.3 Skills与MCP工具的配合
再说Skills和MCP工具的关系。两者可以在一个任务里协同工作,但前提是配置准确。Skill脚本里如果要调用MCP工具,需要声明清楚需要哪个工具,并且保证MCP服务已经在后台启动。
我遇到过一种情况:Skill的脚本依赖数据库MCP服务,但MCP服务没启动,Agent试了两次之后干脆绕开数据库,开始编数据。这个问题很危险。后来我在SKILL.md里加了一条规则:“依赖的MCP工具不可用时,必须明确告知用户工具未就绪,并停止任务,而不是猜测或编造结果。”
下面用一个表整理常见问题和处理方式,方便排查:
| 问题 | 现象 | 处理办法 |
|---|---|---|
| Skill不触发 | 用户按场景描述需求,Agent没有加载该Skill | 检查SKILL.md的description关键词,尽量覆盖更多同义表达 |
| 脚本报权限错误 | 终端提示Permission denied | 设置脚本可执行权限,Windows用git bash运行 |
| 中文文件名乱码 | 输出文件名为乱码或路径解析失败 | 统一UTF-8编码,使用pathlib处理路径 |
| MCP工具未启用 | 脚本需要调数据却拿不到结果 | 检查MCP服务状态,SKILL.md中注明依赖 |
| Agent绕过脚本 | 结果格式和脚本输出不一致 | 在SKILL.md中强调必须调用脚本,不允许自行生成结果 |
8. 从“用别人的”到“写自己的”:一个最小Skill的诞生
用了几个开源Skills以后,你就很难忍住不写自己的。实际上写一个最小Skill并不难,也不需要会写多复杂的代码,关键是理解SKILL.md的编写逻辑。
8.1 最小可用的SKILL.md长什么样
我拿一个最简单的场景举例:给单篇Markdown笔记生成标题建议和标签。目录结构如下:
title-tagger/ ├── SKILL.md └── scripts/ └── tag_note.pySKILL.md内容可以写成这样:
--- name: title-tagger description: 为Markdown笔记生成3个标题候选和5个标签,当用户说“帮我起个标题”或“给这篇笔记加标签”时使用 when_to_use: 用户整理笔记、写文章需要标题或标签建议时 --- ## 执行步骤 1. 读取用户指定的Markdown文件内容 2. 运行 `python scripts/tag_note.py <文件路径>` 3. 根据脚本输出的关键词,给出3个标题候选和5个标签 4. 如果用户要求直接写入文件,询问是否替换原有frontmatter这里最核心的写法是:把步骤写清楚,让Agent照着走。不要让它自由发挥,而是把每一步都固定下来。
8.2 测试思路
写完Skill之后,测试比编码更需要耐心。我的做法是准备三组样例输入:一组是典型输入,验证正常流程;一组是边界输入,比如空文件、纯图片文件;一组是诱导输入,试图让Skill删文件或者绕过步骤,验证规则是否牢靠。
测试时加--debug参数观察Agent的思考轨迹,能看到它读SKILL.md之后是否理解了步骤,还是跳过了某些操作。如果发现Agent经常不按SKILL.md执行,多半是描述写得不够明确,需要把步骤写得更细,甚至明确禁止某些做法。
8.3 发布与分享的建议
如果你觉得自己的Skill确实好用,可以把它发布到开源社区。发布时不要只丢一个代码包,至少要配一个简短的README,写清楚适用场景、输入输出格式、依赖环境和几个示例。我自己挑选开源Skills时,最关注的就是README里有没有给出真实调用示例,没有示例的项目一律不装,因为看不懂它到底能干什么。
版本管理上也建议从一开始就纳入Git管理,每次改动记录清楚。Skills这类的“经验沉淀”,最怕就是改着改着忘了当初为什么这么设计,有提交历史会好很多。
一个实践方法是:每当你在实际工作中发现某个重复性任务已经有固定步骤,就试着把它写成一个新Skill,或者改进现有的Skill。我现在的习惯是每周五下午花三十分钟,复盘这一周里哪些事情是反复做的,然后沉淀到Skill里。别追求一次性自动化率100%,哪怕每次只省十分钟,十个Skills累积下来就是很可观的时间。真正有价值的不是那些花哨的功能,而是你把“知道怎么做”这件事固定了下来,之后每次执行都不会再把同样的错误。