文章总结: 本文介绍Agent开发中skill加载的优化方案,核心思路是将技能目录放入系统提示词,并复用已有的read工具来加载技能文件,从而避免新增listskills和loadskill两个工具。该方法减少了token消耗和模型调用轮次,提升了效率。关键洞察是加载技能等于读文件,系统提示词适合存放模型始终需要知道的信息。可操作建议是采用此思路优化Agent开发,节省工具位并简化流程。 综合评分: 90 文章分类: 安全开发,AI安全
Agent开发(七)-更高效优雅的skill加载
原创
BlackFace BlackFace
GG学安全
2026年8月18日 02:42 重庆
在小说阅读器读本章
去阅读
第 5 章我们实现了 skill 机制,用了两个新工具:list_skills(查有哪些技能)和 load_skill(加载技能内容)。这一章我们换个更高效、更优雅的思路,一个工具都不用新增。
回顾第 5 章的做法
用户: "帮我写个 python 脚本"
模型: 调 list_skills → 看到有 python 技能
模型: 调 load_skill("python") → 拿到技能正文
模型: 用技能内容干活
它”不够优雅”的两点
- 占了 2 个工具位。
list_skills和load_skill的定义(name、description、parameters)每个请求都要发给模型,白白消耗 token。 - 模型要先”记着”查。技能列表不在模型视野里,模型得先想到”该看看有哪些技能”,调
list_skills才拿到列表——多了一轮调用,模型还可能忘了查。
新思路:技能目录放系统提示词,用 read 工具加载
核心洞察就一句话:
SKILL.md 就是一个普通文件。而你在第 4 章,已经有一个 read 工具了。
加载技能 = 读文件。那为什么要专门写 load_skill?直接用 read 就行。
做法:
- 启动时扫描
skills/,生成目录文本:名字: 描述(文件: 路径) - 把目录拼进系统提示词——模型一睁眼就看到有哪些技能、每个的文件在哪
- 删掉
list_skills和load_skill两个工具 - 模型判断任务匹配某个技能时,用
read工具读那个文件,技能内容就进来了
用户: "帮我写个 python 脚本"
模型: 系统提示词里已经写着 "python: ...(文件: skills/python/SKILL.md)"
模型: 直接调 read 读 skills/python/SKILL.md → 拿到技能正文
模型: 用技能内容干活
系统提示词怎么拼
def build_skill_catalog():
"""扫描 skills/,生成"名字: 描述(文件: 路径)"目录。"""
if not os.path.isdir(SKILLS_DIR):
return "(没有技能目录)"
lines = []
for folder in sorted(os.listdir(SKILLS_DIR)):
skill_file = os.path.join(SKILLS_DIR, folder, "SKILL.md")
if os.path.isfile(skill_file):
front = read_frontmatter(open(skill_file, encoding="utf-8").read())
name = front.get("name", folder)
desc = front.get("description", "")
lines.append(f"- {name}: {desc}(文件: {skill_file})")
return "\n".join(lines) if lines else "(没有技能)"
SYSTEM_PROMPT = (
"你是一个能读写文件、执行命令的编程助手。\n"
"以下是可用技能。当任务匹配某个技能的描述时,用 read 工具读取它标注的文件,然后按技能内容执行。\n\n"
+ build_skill_catalog()
)
messages = [{"role": "system", "content": SYSTEM_PROMPT}] # 系统消息带着技能目录
注意:这里第一次用上了 role: system(第 2 章讲过但一直没用)——系统提示词就是放”一直想让模型知道的事”的地方,技能目录正好属于这类。
完整代码(step7.py)
# 完整代码
# 和第 5 章的差别只有 3 处:
# 1. 删掉了 list_skills / load_skill 两个函数和它们在 TOOLS、TOOL_FUNCTIONS 里的条目
# 2. 加了 build_skill_catalog(),扫描技能目录生成"名字: 描述(文件: 路径)"
# 3. messages 第一行变成 [{"role": "system", "content": SYSTEM_PROMPT}]
# 其余(5 个文件工具、对话循环、错误兜底)完全沿用第 4 章。
# 见 step7/step7.py
对比
| | 第 5 章 | 第 7 章 |
| — | — | — |
| 查技能列表 | list_skills 工具,要调 | 系统提示词里直接有 |
| 加载技能 | load_skill 工具 | 复用 read 工具 |
| 新增工具 | 2 个 | 0 个 |
| 多一轮调用 | 有(先查再加载) | 无 |
| 新增代码 | 2 个函数 + 2 个工具定义 | 只加一个拼目录的函数 |
验证
>>> 帮我写一个 python 脚本统计词频
你会看到模型直接调 read 读 skills/python/SKILL.md(而不是先 list_skills 再 load_skill)。
这一章的关键
- 加载技能 = 读文件。你已经有 read 工具了,就不需要专门的 load_skill。
- “一直要知道的事”放系统提示词,而不是做成工具让模型去查。
- 工具位是稀缺资源——每个工具的定义每个请求都要发,能复用就不新增。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:GG学安全 BlackFace BlackFace《Agent开发(七)-更高效优雅的skill加载》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论