02 技能作为上下文源的渐进式披露 本节摘要:四类扩展点里,技能(Skill)是最精巧的一个。它不是「把指令全塞进系统提示」,而是用一种渐进式披露(progressive disclosure)的方式暴露给模型——模型先只看到技能的名字和描述(占很少 token),需要时通过「技能工具」读取正文。本节讲清这种机制,以及为什么它比「全塞进系统提示」更省 token、更聚焦。 一、问题:指令全塞进系统提示的代价 先看传统做法的问题。如果你想让 Agent 遵循一堆专门的指令(比如「处理 PDF 的规范」「写测试的规范」),朴素做法是把它们全写进系统提示。但这有代价: token 浪费:很多指令在当前会话里根本用不上(比如不处理 PDF 时,PDF 规范就是浪费)。
本节摘要:四类扩展点里,**技能(Skill)是最精巧的一个。它不是「把指令全塞进系统提示」,而是用一种渐进式披露(progressive disclosure)**的方式暴露给模型——模型先只看到技能的名字和描述(占很少 token),需要时通过「技能工具」读取正文。本节讲清这种机制,以及为什么它比「全塞进系统提示」更省 token、更聚焦。
先看传统做法的问题。如果你想让 Agent 遵循一堆专门的指令(比如「处理 PDF 的规范」「写测试的规范」),朴素做法是把它们全写进系统提示。但这有代价:
技能就是为了解决这个——它不把指令全塞进系统提示,而是「按需加载」。
一个技能本质上是一个指令文件——用一种标准的 SKILL 格式描述,大致含:
| 部分 | 作用 |
|---|---|
| 名字(name) | 唯一标识,如 pdf-handler |
| 描述(description) | 一句话说明这个技能干什么、何时用 |
| 正文(content) | 详细的指令(何时用才读) |
关键在于:名字和描述会暴露给模型,但正文不会自动暴露——正文只在模型决定用这个技能时,通过「技能工具」读取。
这是技能机制的核心。模型看到的是:
模型初始看到的(占很少 token): ├─ 技能: pdf-handler —— 处理 PDF 文件的规范 ├─ 技能: test-writer —— 写测试的最佳实践 └─ 技能: deploy-guide —— 部署流程指引 (只名字+描述,没有正文) ▼ 模型遇到任务:处理一个 PDF │ ▼ 模型判断:这需要 pdf-handler 技能 │ ▼ 调用「技能工具」读 pdf-handler 的正文 │ ▼ 拿到详细指令(此时才消耗 token) │ ▼ 按指令处理 PDF
这就是「渐进式披露」——先给模型一个「技能菜单」(名字+描述),模型按需「点菜」(读正文)。用不到的技能,正文从不进入上下文,token 一点不浪费。
💡 省 token 的本质:假设有 20 个技能,每个正文 2000 token。全塞进系统提示要 40000 token;渐进式披露下,模型只读它用的那 1-2 个(2000-4000 token),省了 90% 以上。技能越多,这种节省越明显。
在第 8 章我们讲过「上下文源(Context Source)」——技能正是作为一种上下文源实现的。具体说:
这意味着技能享受第 8 章纪元机制的好处——技能列表的变化(增删技能)会触发 reconcile,必要时开新纪元或插中途消息。但正文的读取是一次性工具调用,不涉纪元变化。
OpenCode 会从多个地方发现技能:
| 来源 | 位置 |
|---|---|
| 全局 | 用户主目录下的技能目录(如 ~/.claude/skills、~/.agents) |
| 项目 | 项目里的技能目录(向上查找 .claude/.agents/配置目录) |
| 配置指定 | 配置里指定的技能路径 |
| 远程 | 配置里的技能 URL(从远程拉取) |
发现时,OpenCode 扫描这些地方的技能文件(以特定模式命名,如 SKILL.md),解析其名字和描述,注册成「可用技能」。
⚠️ 远程技能的安全:从远程拉技能要小心——技能含指令,恶意技能可能诱导模型做坏事。OpenCode 会做路径安全校验(防穿越攻击),但指令内容本身要你判断可不可信。
技能也会过权限过滤——第 4 章权限规则决定当前 Agent 能看到哪些技能:
发现技能 [A, B, C] │ ▼ 权限过滤(技能级) │ 当前 Agent 可见: [A, C](B 被隐藏) │ ▼ 只有可见的进入「技能菜单」
这让技能的可见性也可控——不是「装了就全见」,而是按 Agent 权限筛。
新手容易混「技能」和「斜杠命令」(下一节)。这里先点破:
| 技能 | 斜杠命令 | |
|---|---|---|
| 触发者 | 模型按需读取 | 用户主动输入 |
| 本质 | 给模型的指令(模型看) | 给会话的提示模板(展开成消息) |
| 解决 | 模型需要时才知道怎么做 | 用户快速发起某类任务 |
技能是「模型按需加载的能力」,命令是「用户快捷发起的模板」。二者完全不同,别混。下一节详讲命令。
技能讲清了,下一节讲斜杠命令——用户侧的快捷方式。