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赋能网络安全等,欢迎一起学习。
