我们写好的 Skill,是怎么被大模型看到的?

43 阅读2分钟

写在前面

我们平时写 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 在合适的时候,拿到合适的内容。