news 2026/7/2 1:37:44

Skill安全系列之Skill基础

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Skill安全系列之Skill基础

前言

在总结Skill中的相关风险前,我们先通过一篇的内容来看下什么是Skill,对其有一个初步的认识。

什么是Skill

Skill翻译为技能的意思,在AI邻域中,Skill就是一个技能,比如给Agent一个A技能,那我们就需要拥有一个A技能的Skill,相当于赋能,而Skill的本质就是将提示词写到md文件中供Agent调用。

这个提示词相当于我们的经验,我们把一件事的流程和经验写好后存到md文件中,相当于告诉Agent怎么去做这个事,同时,Skill也支持脚本的调用,比如在md中指明处理某个细节时去调用某某脚本,把脚本放到对应目录下即可。

SKill有什么用

Skill一定程度上相当于工作流,比如dify、n8n的工作流,对于一些任务可以用工作流,但用Skill也可以实现,当然并不是所有工作流能实现的都可以用Skill实现,这里举例为了方便理解。

那Skill有什么用呢,可总结下面3点:

1、重复内容不必每次都说,比如让AI写周报,我们可能有格式要求、保存时的文件类型要求、语气要求等等,这些写的时候这些要求要告诉它,下周写的时候为了准确,还要再告诉它一遍,会重复冗余,此时可以将这些要求形成Skill,后续无需再额外说明,直接调用Skill即可。

2、技能更新时,如果多处使用不必每一处都进行说明,比如还是AI写周报,可能每周的周报都是单独一个会话,方便后期复盘总结,但存储格式要修改,例如excel要改为md,此时每个会话都说明一遍会很繁琐,使用SKILL时,只需修改SKILL内容即可,相关会话会自动用最新版。

3、例如还是写周报,如果开启了新会话,则之前周报的要求还得重说一下,但如果有了Skill,直接调用Skill即可。

可以看出需要统一要求时、或者动作重复时、经常做时,可以做成Skill,这里需要注意的是工具就可以搞定的,比如图片之间格式转换,图片压缩等,这个直接使用工具即可,没有必要做成Skill。

另外,一个技能只需要做一件事即可,不建议将多个事情都写到一个Skill中,要避免“万能”Skill,否则不方便维护和优化,Agent也容易出错。。

SKILL有什么优势

Skill之所以流行,是因为大家发现它存在很多方便的地方:

1、相比传统提示词,全量塞给模型会占用上下文空间,而SKILL可以按需加载。

2、传统提示词上下文就是唯一的工作空间,所有的输入信息、处理信息、输出信息都堆积在一个聊天框,而SKILL相当于让文件系统成为了智能体的外部记忆和工作台。

3、传统提示词相当于单个任务,如果需要和其它任务配合,它是不知道其它提示词是什么,而SKILL可以构建协同工作流,多个技能互相配合,各司其职。从而完成更复杂的任务。

4、迭代积累和维护更方便,不论多少会话,都是从SKILL.md读取规则,改完全局生效,且文件支持版本管理,可以持续迭代和优化。

Skill示例

下面来看下一个Skill的基本结构:

一个技能就是一个文件夹(文件夹用小写字母和连字符-),里面有一个SKILL.md的文件(SKILL用全大写),SKILL.md的基本架构如下:

--- name:weekly-report description: 生成周报,当用户要求撰写周报、工作总结、工作汇报等内容时使用 --- 步骤:1. 确认用户本周完成了哪些任务2. 按表格格式输出:任务|进度|备注3. 语气亲和,像同事之间汇报工作4. 将文件保存为Markdown格式,并存储到当前目录

name:技能的名称,和文件夹名保持一致。

description:技能的简介,说清楚技能是做什么的,什么时候用。公式就是:description = 功能定义 + 触发场景/ 触发词

—之间内容相当于元数据,叫做YAML前置信息,智能体启动时会进行查看,以此来判断要调用哪个技能,—之后就是技能正文,正文要说明具体操作步骤、规则等内容。只有当确定了要调用哪个技能后,正文部分才会被读取。

这里关键就是description的编写,一定要描述清楚其功能和触发场景,否则智能体不知道要不要调用该技能。编写技能描述时,可参考如下规则:

一个不好的description,可能导致智能体无法精准识别,加载了一个错的技能,结果浪费时间,消耗了Token。也可能出现智能体识别不出来,认为用户需求自己就可以解决,无需调用SKILL,也导致浪费时间白白消耗Token。

1、一定要遵循公式description = 功能定义 + 触发场景/ 触发词,

2、写描述时,不要用人称代词,以陈述句直接描述功能即可,比如“你可以用该技能来识别PDF并生成统计表格”,这种就可以直接写为“识别PDF并生成统计表格”。

3、同时描述不要写太长,建议50-200个字。

4、反向触发词,当技能装的越来越多,可能某个任务有多个技能都可以处理,此时可以在描述中规定界限,即什么情况下不要触发该技能。

另外就是确定做一个Skill时,自己要很熟悉这个技能的整个流程,不如很难写出稳定的技能,同时写Skill前应该先确认相关信息,如下:

1、问题:确定要解决什么问题。

2、场景:谁在什么时候用。

3、输入:需要输入哪些信息。

4、输出:技能需要产生什么。

5、规则:有哪些相关的约束。

6、禁止清单:绝对不能做什么。

按需加载

SKILL的按需加载机制,也叫做渐进式披露:

启用即加载:智能体启动时,会将技能的YAML前置信息加载上,随后用户发指令后,大模型会根据指令内容来决定使用哪个技能。

用到再加载:当确定使用某个技能后,此时智能体会去加载这个技能的正文内容,并进行执行。

必要时再加载:当技能复杂时,可能不止一个SKILL.md文件,可能还有一些关联文件,比如references目录下放的md参考文档,scripts目录下放的py脚本文件,assets目录下放的图片、pdf等静态资源。这些关联文件可能是在触发到具体任务时才需要使用,不触发就不使用,所以是必要时再加载。

具体怎么触发可以在SKILL.md中说明,比如需要XXX时,就调用scripts/test.py文件进行处理,这里路径说明时建议使用从技能根目录出发的相对路径,且只引用一层即可。不要出现A引用B,B又引用C的嵌套引用,可能会导致智能体混乱不知道要做什么,也会加大Token开销。

和MCP区别

在智能体中会涉及到一些概念,如下:

提示词:用户给AI下发的指令。

大模型:智能体的大脑,负责思考、推理和下达指令。

上下文:智能体处理当前任务时所要处理的信息集合。

工具:智能体能调用的相关工具,比如内置工具、扩展工具。

技能:写给智能体看的具体的任务操作手册。

MCP:外部工具接入智能体时的统一对接标准。

这里Skill和MCP容易搞混,总结一句话就是Skill是告诉智能体具体怎么做,MCP让各种外部工具接入到智能体,便于智能体去调用。

SKILL使用的一些技巧

1、虽然智能体启动只加载技能的元数据,但如果SKILL过多,则也会占用上下文空间,官方建议上限是安装20~50个技能,如果元数据是中文,则理论汉字占空间更多,需要进一步减少。所以可以根据需求来关闭一些技能。

同时采用分层管理,比如常用的技能可以放全局目录,项目具体用到的技能,可以放到项目技能目录下,避免智能体启动加载所有SKILL。

2、SKILL.md文件最好控制正文长度,可以进行拆分,不同功能放到关联文件中,建议长度在5000个token内,中文在3800字内,避免正文内容太大,占用上下文。

3、技能一旦被使用,它的内容就会存在于当前会话的上下文,连续使用多个复杂技能,对上下文占用是巨大的,可以适当开启新会话来避免该情况。

总结

所以,Skill装的其实就是自己的经验,以文本和代码形式给到智能体供其调用。

以上就是Skill安全系列之Skill基础,感谢阅读。

小枣信安:专注AI安全,包括但不限于大模型安全、智能体安全、机器人安全、AI赋能网络安全等,欢迎一起学习。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 1:34:17

跨架构容器化恶意软件动态分析沙箱设计与实现

1. 项目概述:跨架构容器化恶意软件动态分析沙箱在网络安全领域,动态恶意软件分析一直是识别和对抗新型威胁的重要手段。传统分析方案通常依赖于笨重的虚拟机管理程序或专用物理设备,这不仅限制了分析的灵活性和自动化程度,也难以适…

作者头像 李华
网站建设 2026/7/2 1:32:06

computer-use-fix-record

Codex Computer Use Plugin 不可用 摘要:本文详细分析了 Codex 桌面应用中 Computer Use 功能不可用的故障现象、根本原因及完整修复方案。问题根源在于 Codex 的插件同步机制未能正确将 computer-use 插件和 cua_node 运行时从 WindowsApps 应用包部署到用户数据目…

作者头像 李华
网站建设 2026/7/2 1:27:36

leecodecode【面试150】【2026.6.26-7.1打卡-java版本】

二叉树的右视图 要点:层次遍历的套路 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, Tree…

作者头像 李华