Skill Loading

只在任务真正需要时注入专业知识。

技能目录 + 按需加载器。

55 行1 个工具

问题

给系统提示词塞下所有领域的知识?不可能——上下文就那么大。但 Agent 总遇到需要专门知识的时候:一次代码审查需要仓库规范,一次发布需要发布流程清单,一次数据处理需要特定的库用法。

知识应当按需注入:Agent 先看到"有哪些技能可用"(目录),需要时再加载具体技能的内容(正文)。这像把一本手册放在书架上,而不是把整本手册贴在脑门上。

解决方案

两级结构:

  1. 技能目录:每个技能一行元数据(名字 + 一句话描述),常驻系统提示词——非常廉价;
  2. 加载器工具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"两个面。