Skill Loading
只在任务真正需要时注入专业知识。
技能目录 + 按需加载器。
问题
给系统提示词塞下所有领域的知识?不可能——上下文就那么大。但 Agent 总遇到需要专门知识的时候:一次代码审查需要仓库规范,一次发布需要发布流程清单,一次数据处理需要特定的库用法。
知识应当按需注入:Agent 先看到"有哪些技能可用"(目录),需要时再加载具体技能的内容(正文)。这像把一本手册放在书架上,而不是把整本手册贴在脑门上。
解决方案
两级结构:
- 技能目录:每个技能一行元数据(名字 + 一句话描述),常驻系统提示词——非常廉价;
- 加载器工具:
load_skill按名字取回技能的完整正文,注入当前上下文。
const SKILLS = {
"code-review": { description: "按仓库标准审查代码变更", body: "审查步骤:1) 读取 diff ... 2) 检查测试 ... 3) 检查文档 ..." },
"release": { description: "执行发布流程", body: "发布清单:1) 版本号 ... 2) CHANGELOG ... 3) 打 tag ..." },
};
define("load_skill", { type: "object", properties: { name: { type: "string" } }, required: ["name"] },
({ name }) => {
const skill = SKILLS[name];
return skill ? skill.body : `未知技能:${name}。可用技能:${catalog()}`;
});
工作原理
第 1 步:目录注入系统提示词——只花几十个 token。
function catalog() {
return Object.entries(SKILLS)
.map(([name, s]) => `- ${name}: ${s.description}`).join("\n");
}
第 2 步:系统提示词告诉模型"先查目录,需要时加载"。
const SYSTEM = `
可用技能:
${catalog()}
当任务需要某项专门知识时,调用 load_skill 加载它,然后按照加载的步骤执行。
`;
第 3 步:加载后的技能正文进入消息历史,模型据此行动。技能正文只在加载后才占用上下文——10 个技能 × 1000 token 的正文,默认只花 10 × 30 token 的目录开销。
为什么不是把全部技能塞进系统提示词?因为模型在不需要时也会被那些指令干扰(指令越多,遵循越差),且上下文成本线性增长。目录 + 按需加载让成本与实际使用成正比,而不是与可用总量成正比。
试一下
运行 s07,试试:
- "帮我做个代码审查"(模型应加载 code-review 技能)
- "我要发布一个版本"(加载 release 技能)
- 先问一个无关问题,观察模型是否不加载任何技能
观察重点:模型在什么时机决定加载?加载后的指令是否真的改变了它的行为?如果技能正文很长,加载后上下文怎么处理——(s08 压缩会来处理这个问题。)
以下内容基于 packages/skill 的核查。DSH 的技能族与你的一致,但规模更大:
| 包 | 角色 |
|---|---|
skill |
提供者注册与查找(ctx.skills)——提供者中立的目录 |
skill-filesystem |
从本地文件系统发现技能 |
tool-skill |
目录快照 + 模型可见的加载器工具 |
skill-badge |
捆绑的示例技能 |
一、目录是"会话前缀"级别的
tool-skill 把技能目录作为会话前缀注入(每次请求都带上),而技能正文通过加载工具按需取回——和你的两级结构一模一样,只是目录的渲染由插件负责、保证与可用技能一致。
二、发现机制
技能来自提供者:本地文件系统是默认提供者(每个技能一个目录,含 SKILL.md)。因为目录是提供者中立的,未来可以有远程、嵌入式的技能源——模型侧契约(目录 + 加载器)不变。这正是"能力缝"(capability seam)的典型结构:Service Definition(ctx.skills)+ Service Provider(filesystem)+ Consumer(tool-skill)。
三、一个真实例子
本仓库的技能目录就是运行中的 skill-filesystem:.agents/skills/ 下每个子目录一个技能,SKILL.md 是正文。加载 dsh-doc-standards 技能 = 把 .agents/skills/dsh-doc-standards/SKILL.md 的正文注入上下文。
一句话:你的 SKILLS 对象是内存版目录。DSH 把目录、发现、加载拆成可互换的三件套,模型侧只看到"目录 + load"两个面。