LEARN CLAUDE CODE
S05: Skills — 按需加载的知识库
这一课解决什么问题
你想让 Agent 掌握很多专业技能——Git 操作规范、代码审查清单、部署流程、特定框架的最佳实践。把这些全塞进 system prompt?一个技能 500 token,20 个技能就是 10,000 token——还没开始干活,上下文窗口就吃掉了 10%。更糟糕的是,大多数任务只用到其中 1-2 个技能。
S05 的思路:只在 system prompt 放名字,内容按需加载。
核心机制
┌────────────── 两层注入机制 ──────────────────┐
│ │
│ 第一层:System Prompt(始终存在) │
│ ┌───────────────────────────────────────┐ │
│ │ "你有以下可用技能: │ │
│ │ - git-commit: Git 提交规范 │ │
│ │ - code-review: 代码审查清单 │ │
│ │ - deploy: 部署流程 │ │
│ │ - react-best: React 最佳实践 │ │
│ │ ...共 20 个技能名称" │ │
│ │ │ │
│ │ 成本: ~200 tokens(只有名字) │ │
│ └───────────────────────────────────────┘ │
│ │
│ 用户说: "帮我提交代码" │
│ │ │
│ ▼ 模型识别需要 git-commit 技能 │
│ │
│ 第二层:按需加载(使用时才注入) │
│ ┌───────────────────────────────────────┐ │
│ │ 模型调用: use_skill("git-commit") │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ 从文件系统加载完整技能内容: │ │
│ │ skills/git-commit.md │ │
│ │ → 500 tokens 的详细规范 │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ 注入到 messages[] 中(作为 system │ │
│ │ reminder 或 tool_result) │ │
│ └───────────────────────────────────────┘ │
│ │
│ 对比: │
│ 全量注入: 20 × 500 = 10,000 tokens(始终) │
│ 按需注入: 200 + 500 = 700 tokens(本次) │
└───────────────────────────────────────────────┘
关键概念解释
- 技能目录(skill catalog)所有可用技能的名称和简短描述列表。始终存在于 system prompt 中,让模型知道自己「有哪些能力可以用」,但不包含具体内容。类似于书的目录页。 — 成本极低的「能力索引」。
- 按需注入(lazy loading)只在模型决定使用某个技能时,才从文件系统加载完整的技能内容。这和前端开发中的「懒加载」是同一个思路——不用的东西不加载。 — 核心优化:用一次文件读取替代始终占据上下文的大块 token。
对应到 Claude Code 官方的什么
SkillTool + skill loading 机制
Claude Code 的技能加载和 S05 几乎一致:
- 技能名称列表在 system prompt 中以
system-reminder形式注入 - 用户输入
/commit或模型检测到需要某技能时,SkillTool加载.prompt文件 - 技能来源可以是本地
.claude/skills/、bundled 内置技能、MCP 服务器提供的 prompts - 加载后的技能内容作为消息注入到对话上下文中
官方还支持技能的依赖声明和触发条件匹配。
变更对比表
| 维度 | S04(无技能系统) | S05(Skills) |
|---|---|---|
| 专业知识来源 | 只靠模型训练时学到的 | 可外挂任意领域知识 |
| System prompt 成本 | 固定(或全量膨胀) | 只有名称索引,极低 |
| 知识可维护性 | 无法更新模型知识 | 修改 .md 文件即可更新 |
| 知识覆盖范围 | 通用但不深 | 可针对团队/项目深度定制 |
| 新增组件 | — | skill 目录注入 + use_skill 工具 + 文件加载器 |
洞察:这个两层加载模式和 Claude Code 的 ToolSearch 是同一个设计思想——启动时只暴露名字,使用时才加载完整 schema。整个 Claude Code 架构中反复出现这种「延迟加载」模式,因为上下文窗口是最稀缺的资源。