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 \"\
\".join(lines) if lines else \"(没有技能)\"
SYSTEM_PROMPT = (
\"你是一个能读写文件、执行命令的编程助手。\
\"
\"以下是可用技能。当任务匹配某个技能的描述时,用 read 工具读取它标注的文件,然后按技能内容执行。\
\
\"
+ 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。
- \"一直要知道的事\"放系统提示词,而不是做成工具让模型去查。
- 工具位是稀缺资源——每个工具的定义每个请求都要发,能复用就不新增。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论