AI Agent Skill 拆分:从大文档到按需加载
介绍 AI Agent Skill 的拆分逻辑,说明为什么 SKILL.md 应该只作为入口文件,如何通过 references、scripts、--help 和交叉引用实现按需加载,降低 token 成本并提升执行稳定性。
概述
AI Agent 的 Skill 不是普通文档,而是一段会被模型加载、理解并执行的操作说明。
普通文档可以写得完整,方便人慢慢查;但 Skill 不一样。Skill 一旦进入上下文,就会消耗 token,也会影响模型对当前任务的判断。写得越长,不一定越可靠,反而可能让关键规则被长篇背景、参数说明和示例淹没。
所以 Skill 拆分的核心,不是简单地把一个大文件拆成多个小文件,而是把一个“大而全的提示词文档”,改造成一个按需加载的知识系统。
SKILL.md 是入口文件,只保留触发条件、核心流程、关键约束和跳转路径。真正重的内容,比如 API 参数、复杂示例、排错手册、协议细节、模板和脚本,都应该在需要时再读取或调用。
一句话概括:
SKILL.md 负责让 Agent 快速做对第一步,其他内容按需加载。
一、为什么 Skill 要按需加载
很多 Skill 越写越大,是因为作者希望把所有情况都提前说明清楚:
- 工具有哪些参数
- API 字段是什么意思
- 每种异常怎么处理
- 不同场景下怎么调用
- 最佳实践是什么
- 完整示例怎么写
这些内容本身可能都有价值,但不一定应该放进 SKILL.md。
因为 Agent 执行任务时,通常先需要的是一个清晰入口:
- 什么时候用这个 Skill?
- 当前任务应该按什么流程走?
- 哪些事情不能做?
- 遇到复杂情况时应该读哪个文件?
- 哪些操作应该交给脚本?
也就是说,SKILL.md 的职责不是提供全部知识,而是组织一次任务的加载顺序。
好的 Skill 应该像程序入口:
先读入口
再判断任务类型
需要细节时读取 references
需要稳定执行时调用 scripts
需要工具参数时查看 --help
这就是按需加载。
二、入口文件大小,就是按需加载的边界
控制 SKILL.md 大小,不是为了形式上的“短”,而是为了让入口文件只承担入口职责。
可以用下面这个规模作为参考:
| 技能类型 | 建议规模 | 说明 |
|---|---|---|
| 入门工作流技能 | 150 词以内 / 约 1000 字符以内 | 高频加载,只保留核心流程 |
| 常用技能 | 200 词以内 / 约 1500 字符以内 | 保证触发准确和执行稳定 |
| 其他技能 | 500 词以内 / 约 3500 字符以内 | 可以稍微展开,但不要写成手册 |
这些数字不是绝对标准,而是报警线。
如果一个 SKILL.md 超过 500 词,就应该检查它是不是开始承担太多职责了。
常见信号包括:
- 里面列了完整参数表
- 有多个长示例
- 排错流程占了大段篇幅
- API 字段解释超过核心流程本身
- 同一段流程在多个 Skill 中重复出现
- 模型执行时经常漏掉关键约束
- 修改一个工具参数,需要同步改多处文档
这些问题看起来不同,本质上是一回事:没有按需加载,所有内容都挤在入口文件里了。
入口文件变小以后,收益也很直接:
- Token 更省:高频 Skill 每次少加载几百到几千 token。
- 响应更快:模型要读的入口内容更少。
- 匹配更准:
description和正文更聚焦。 - 执行更稳:关键流程和硬约束不容易被淹没。
- 维护更简单:参数、示例、脚本、流程各改各的地方。
所以,入口文件大小控制、拆分判断、收益评估,本质上都服务于同一个目标:
让 Agent 先加载最少但最关键的信息,再根据任务继续加载细节。
三、Skill 的按需加载分层模型
可以把一个 Skill 拆成四层:
| 层级 | 作用 | 放在哪里 | 加载时机 |
|---|---|---|---|
| 触发层 | 说明什么时候使用这个 Skill | frontmatter description |
技能匹配时 |
| 决策层 | 告诉 Agent 当前任务怎么走 | SKILL.md |
任务开始时 |
| 参考层 | 长文档、参数、协议、复杂示例 | references/ |
需要细节时 |
| 执行层 | 稳定、机械、可重复操作 | scripts/ |
需要执行时 |
SKILL.md 主要承载前两层:触发层和决策层。
它应该写:
- 触发条件
- 任务目标
- 标准流程
- 禁止事项
- 分支判断
- 什么时候读取参考文件
- 什么时候运行脚本
它不应该写:
- 完整 CLI 参数
- 大量 API 字段
- 多个完整案例
- 长篇背景解释
- 少见异常的详细排查
- 已经存在于其他 Skill 的公共流程
判断一段内容是否该放进 SKILL.md,可以问一句:
Agent 在任务开始后的前 10 秒必须知道它吗?
如果必须,就放入口文件。
如果不是,就拆出去,按需加载。
四、具体怎么拆
1. 工具参数交给 --help
不要在 SKILL.md 里详细列出 CLI 的所有参数。
不推荐:
search-conversations 支持 --text、--both、--after DATE、--before DATE、--limit N 等参数。
推荐:
search-conversations 支持多种搜索模式和过滤器。需要参数细节时运行 `search-conversations --help`。
这样入口文件不会随着工具参数增加而膨胀,也避免 Skill 文档和真实工具行为不一致。
2. 重参考内容放进 references/
如果内容有用,但不是每次都要读,就放进 references/。
skill-name/
├── SKILL.md
└── references/
├── api.md
├── troubleshooting.md
└── examples.md
入口文件只保留索引:
需要完整 API 字段时,读取 `references/api.md`。
遇到认证、权限、网络错误时,读取 `references/troubleshooting.md`。
需要复杂示例时,读取 `references/examples.md`。
这就是典型的按需加载:先读入口,任务需要时再读细节。
3. 机械操作放进 scripts/
如果一个步骤是稳定、机械、可重复的,就不要让模型每次重新理解和生成。
比如:
- 统计文件大小
- 校验配置格式
- 批量转换数据
- 调用固定 API
- 生成固定模板
- 检查 Skill 结构
这些适合放进脚本:
skill-name/
├── SKILL.md
└── scripts/
└── validate.py
SKILL.md 只需要写:
修改完成后,运行 `scripts/validate.py` 校验 Skill 结构和大小。
模型适合做判断和编排,脚本适合做稳定执行。
4. 重复流程用交叉引用
如果某个工作流已经由其他 Skill 定义过,不要复制一遍。
不推荐把子代理调度、测试流程、发布流程等内容反复粘贴到多个 Skill 里。这样会产生多份事实来源,后续必然不一致。
推荐写法:
涉及子代理调度时,必须使用 `dispatching-parallel-agents` 工作流。
交叉引用的价值不是少写几行,而是让公共流程只维护一份。
5. 示例只保留最小模式
Skill 里的示例应该帮助模型识别模式,而不是提供完整剧本。
冗长示例可以压缩成:
用户:“我们如何处理 React Router 身份验证错误?”
Agent:搜索历史记录 → 汇总相关做法 → 给出结论。
复杂示例可以放到 references/examples.md。入口文件里只保留最小输入、动作和输出关系。
五、怎么验证拆得是否合理
可以从两个角度检查。
第一,看职责是否清楚:
SKILL.md是否只包含触发条件、核心流程、硬约束和跳转路径?- 参数细节是否交给
--help? - 长示例是否拆到了
references/? - 机械操作是否沉淀成脚本?
- 公共流程是否使用交叉引用?
第二,看文件大小:
wc -c /path/to/skill/SKILL.md
如果主要是中文,也可以统计汉字、字母和数字数量:
grep -o '[[:alpha:]]\|[[:digit:]]\|[\u4e00-\u9fff]' /path/to/skill/SKILL.md | wc -l
这些数字不是目的,只是帮助判断入口文件有没有重新变成“大而全”。
总结
Skill 拆分的核心是按需加载。
SKILL.md 不是百科全书,而是入口文件。它应该短、准、硬:短到模型能快速读完,准到系统能正确匹配,硬到关键约束不会被忽略。
真正复杂的内容不用删除,而是放到更合适的位置:
- 工具参数交给
--help - 长文档放进
references/ - 机械动作放进
scripts/ - 公共流程用交叉引用
- 示例只保留最小模式
这样设计出来的 Skill,才更适合 Agent 执行:先加载最关键的信息,再根据任务需要加载细节。上下文更省,匹配更准,行为更稳,维护成本也更低。
原文链接: AI Agent Skill 拆分:从大文档到按需加载 ,转载请注明来源!
– EOF –