写在前面
我们平时写 Skill,更多关注的是:
Skill 里面应该写什么?
但还有一个问题:
我写好的 Skill,到底是怎么被大模型看到的?
很多人会理解成:用户提问后,Agent 找到对应 Skill,然后把整个 SKILL.md 全部交给模型。
但其实 Skill 并不是一次性全部加载,而是按需读取。
先发现 Skill
一个 Skill 通常会有:
name: create-component
description: 创建符合项目规范的 React 组件
一个项目可能同时存在很多 Skill:
create-component
code-review
plan-before-code
find-skill
Agent 没必要一开始就读取它们的全部内容,因为内容太多了。
可以简单理解:
name:我是谁description:我什么时候有用
当用户提问:
帮我创建一个 UserList 组件。
Agent 会根据任务和 description 判断哪些 Skill 可能相关。
所以 description 不只是备注,它会影响 Skill 能不能被正确发现。
找到之后,再读取内容
确定需要某个 Skill 后,Agent 才会继续读取它的具体内容。
例如:
create-component/
├── SKILL.md
├── examples.md
└── templates/
└── table.tsx
SKILL.md 放核心规则:
- 使用 TS
- 使用函数组件
- 样式使用 CSS Modules
- 组件放到 src/components
如果任务需要示例,再读取 examples.md;需要模板时,再读取对应模板。
这就是 渐进式加载 。
核心思想:
先给必要的信息,需要更多内容时再读取。
这样可以避免项目里几十甚至上百个 Skill 的内容全部进入 Context。
最终模型看到的是什么?
真正执行任务时,模型拿到的通常不只是 Skill,而是当前任务相关的上下文:
系统指令
用户消息
相关 Skill
按需读取的 Skill 内容
工具信息
已有对话上下文
比如创建 UserList 时,模型可能拿到:
用户需求:创建 UserList 组件
Skill:
- 使用 TS
- 使用函数组件
- 使用 CSS Modules
- 放到 src/components
模型再结合这些信息生成代码。
所以更准确地说:
Skill 不是进入了大模型,而是 Agent 在执行任务时,把相关内容加载到当前 Context 中。
Skill 和 Prompt 的区别
两者在内容上其实很像,都可以描述:
应该做什么
怎么做
哪些事情不能做
区别在于 Skill 更强调复用和按需加载。
Prompt 更像是:
你现在按照这些规则做。
Skill 更像是:
遇到这类任务时,使用这套规则。
所以可以把 Skill 理解成一份可以被 Agent 按需调用的 SOP。
写在最后
写 Skill 时,不一定要把所有东西都塞进 SKILL.md。
可以简单分成:
Name:我是谁
Description:什么时候用我
SKILL.md:具体怎么做
Reference / Template:需要时再看
这样既方便 Agent 发现,也能减少无关内容进入 Context。
Skill 的核心并不是“写了多少”,而是让 Agent 在合适的时候,拿到合适的内容。