Skill Loading — 用到的时候才加载

用到时再加载, 别全塞 prompt 里" — 通过 tool_result 注入, 不塞 system prompt

Github 原文:shareAI-lab/learn-claude-code

在 Skill 介绍的部分,我们就介绍了渐进式披露,这里我们会详细的来讲讲。

问题

你的项目有一套 React 组件规范、一份 SQL 风格指南、一份 API 设计文档。你希望 Agent 自动遵守这些规范。最直接的想法,全塞进 system prompt:

SYSTEM = (
    f"You are a coding agent. "
    + open("docs/react-style.md").read()       # 2000 行
    + open("docs/sql-style.md").read()         # 1500 行
    + open("docs/api-design.md").read()        # 3000 行
)

6500 行 system prompt。Agent 每次调用 LLM 都带着这些文档——不管是在改 CSS 颜色还是修 SQL 查询。99% 的内容和当前任务无关,白白消耗 token。

解决方案

Skill Loading — 用到的时候才加载

这里,保留之前的最小 hook 结构、todo_write 和子 Agent,本章重点转向新增的 load_skill 工具。启动时把技能目录注入 SYSTEM prompt,运行时多注册一个工具加载完整内容,用到才花 token。

简单来说,就是做成了 2 层,也就是之前渐进式披露的逻辑,也就是平时每一次都注入的只是 Skill 的名字和 Description,其余内容等到要用到在注入。

位置时机代价
1. 目录system prompt启动时注入(harness 扫描 skills/)~100 tokens/skill,每轮都带
2. 内容tool_resultAgent 调用 load_skill 时;SKILL.md 可指引后续的 read_file/bash 调用,用于按需访问额外资源~2000 tokens/skill,按需

工作原理

之前Skill 技能介绍过,每个技能一个子目录,包含 SKILL.md 文件,并且说过一定会包含 name+Description,这里就来解释了。

启动时注入目录

harness 启动时调用 _scan_skills() 扫描 skills/ 目录,解析每个 SKILL.md 的 YAML frontmatter(namedescription),存入 SKILL_REGISTRY 字典。list_skills() 从注册表生成目录,注入 SYSTEM prompt。Agent 每轮都能看到”我有哪些技能可用”,不花额外 API 调用。

载入 skill

Agent 决定”我需要 SQL 风格指南”,调用 load_skill("sql-style")。通过注册表查找,不走文件路径,没有路径遍历风险。SKILL.md 内容通过 tool_result 注入,并可通过现有的 file 和 bash 工具进一步访问引用的 references/scripts/ 或 assets/

总结

技能内容不是 system prompt 的一部分,它作为一次工具结果进入当前 messages。后续调用会随历史一起携带,直到上下文压缩、截断或会话结束。