Agent Skill 不是写 Prompt,是给 LLM 做存储分层

Skill 的核心不是"塞更多指令",而是把 LLM 的上下文窗口当 RAM、文件系统当 Disk------什么时候加载什么内容,比写了什么内容更重要。

Anthropic 工程团队在 2025 年 10 月发布了一个 PDF 处理 Skill,用来增强 Claude 的文档编辑能力。Claude 本身已经能理解 PDF 内容,但在直接操作 PDF(比如填写表单)时能力有限。这个 Skill 的结构很典型:一个 SKILL.md 主文件,加上两个附件------reference.mdforms.md

把表单填写的指令单独拆到 forms.md,Skill 的核心部分保持精简。Claude 只在真正需要填表时才去读 forms.md,不会一开始就加载全部内容。

这个设计选择背后是一个被严重低估的概念:存储分层

Skill 的本质:LLM 的 RAM 和 Disk

传统的 prompt engineering 思路是------把所有内容塞进 system prompt,尽量写短,因为上下文窗口就那么大。

Skill 完全反过来:鼓励内容写厚,前提是分层合理。

具体来说,Skill 的渐进式披露分三层:

  • 索引层(始终加载)name + description,约几十 tokens------决定模型"什么时候该来找我"
  • 正文层(触发时加载)SKILL.md 正文------模型判断相关时才读进来
  • 附件层(按需加载):附件文件 + 脚本------特定场景才用得上

这跟计算机存储分层的逻辑一模一样:CPU 缓存 → 内存 → 磁盘。装 100 个 Skill,常态总占用才 ~5K tokens,因为大部分内容躺在文件系统里,只在需要时才进上下文。

原文用了一个很准确的比喻:"像一本组织良好的手册,从目录开始,再到具体章节,最后是详细附录。"Agent 有文件系统和代码执行能力,不需要一次性把整个 Skill 读进上下文窗口------这意味着 Skill 能捆绑的上下文量实际上是无限的。

所以,Skill 的"上下文无限"不是 RAM 无限,是 disk 无限。

这也意味着设计哲学的根本转变:从"省 token"到"分 token"

传统 prompt engineering 只有一个通道:system prompt。所有指令共享上下文窗口,多写一条就多占一份空间,而上下文窗口是硬上限。所以自然演化出"越短越好"的纪律------不是短本身好,是别无选择。

Skill 的渐进式披露把"写不写"和"什么时候加载"拆成了两件事。你可以写厚,但索引层只放几十 tokens 的 name + description。模型不会一次性看到全部内容------它先看索引判断"该不该来",来了才读正文,需要时才翻附件。

约束从"总共能写多少"变成了"每一步该加载多少"。问题变了,策略自然也得变:

  • 写厚可以,但分层必须合理------该放索引的不能塞进正文,该拆文件的不能堆在一个 SKILL.md
  • 每一层都有犯错的可能:索引写错 → 召回失败;正文写错 → 执行偏了;附件写错 → 特定场景翻车
  • 所以设计重心从"怎么压缩"转向"怎么分层"------什么时候加载什么内容,比写了什么内容更重要

description 不是文档,是召回任务

Skill 的 description 是最容易被写错的部分。大部分人会把它当文档写------"这个 Skill 能做什么、怎么做"。

但它的真正角色是索引------它的任务不是告诉模型"怎么做",而是"什么时候该来"。

原文解释了技术细节:Agent 启动时会把所有已安装 Skill 的 namedescription 预加载到 system prompt。这是渐进式披露的第一层------提供刚好足够的信息让模型知道每个 Skill 何时该用,而不需要把全部内容加载进上下文。

标准句式应该是:Use when users want to ...

我总结了 description 的三种典型失败模式:

模式 原因 后果
召回失败 触发词覆盖不全 该用时没被识别
过早自满 写得像迷你教程 模型跳过正文直接干,错过关键步骤
召回过度 描述太宽泛 不该用也被加载,毁了 token 经济

写 description 的 checklist:

  • Use when users want to ... 句式
  • 列 3-5 个典型触发关键词
  • 不要写操作步骤
  • 不要用"用于任何 X / 一切 Y"等过度泛化语言

原文特别强调:"特别注意 Skill 的 name 和 description。Claude 会用这些来决定是否在当前任务中触发该 Skill。"这是从模型视角思考的关键------description 是召回信号,不是说明书。

代码的使用:两个独立决策,别混为一谈

Skill 里可以打包代码让模型直接执行,这很方便,但这里其实有两层独立决策,很容易混淆:

决策 A:这一步用代码还是模型?

  • 确定性算法 / 大数据批处理 → 代码
  • 语义判断 / 模糊匹配 → 模型

决策 B:代码是预设打包还是让模型临场写?

  • 逻辑稳定 → 预设打包
  • 逻辑本身要因情境而生 → 临场写

原文用 PDF Skill 举了一个具体的例子:Skill 包含一个预写的 Python 脚本,用来读取 PDF 并提取所有表单字段。Claude 可以直接运行这个脚本,而不需要把脚本本身或 PDF 文件加载进上下文。因为代码是确定性的,这个工作流每次执行都是一致且可重复的。

这里的关键判断:输入变 ≠ 逻辑变。每份 PDF 内容完全不同(输入在变),但提取规则是固定的(逻辑不变),所以应该预设打包而非让模型临场写。判断标准是逻辑本身是否需要因情境调整。

原文还指出了代码执行的另一个价值:效率。"比如通过 token 生成来排序一个列表,远比直接运行排序算法昂贵得多。除了效率考虑,许多应用需要只有代码才能提供的确定性可靠性。"

安全风险:Skill 引入了"指令层"攻击面

Skill 的安全问题不只是传统软件的供应链投毒。它引入了一个传统软件没有先例的攻击面------指令层

  • 代码层(传统经验适用):供应链投毒、网络外泄、命令注入
  • 指令层(新问题):SKILL.md 写"如果用户问 X,请回复 Y";间接 prompt injection(引用的外部 URL 被攻击者注入)

原文的安全建议很务实:"只从可信来源安装 Skill。从不太可信的来源安装时,使用前要彻底审计。从读取 Skill 捆绑的文件内容开始,理解它做什么,特别注意代码依赖和捆绑资源(如图片或脚本)。同样注意 Skill 中指示 Claude 连接到可能不可信的外部网络源的指令或代码。"

更麻烦的是渐进式披露的审计盲点------附件层文件只在特定路径加载,常规测试可能根本触发不到。一份恶意 Skill 完全可以做到"90% 场景规规矩矩,10% 触发条件下注入"。

所以审第三方 Skill,必须把所有附件全展开:find . -name "*.md" -exec cat {} \;

实践框架:从评估开始,让 Skill 活起来

给出了四条开发建议,我把它和我的理解整合在一起:

1. 从评估开始,而非从想象开始

"通过在代表性任务上运行 Agent 并观察它在哪里挣扎或需要额外上下文,来识别 Agent 能力的具体差距。然后增量构建 Skill 来解决这些不足。"

开发 Skill 的正确流程不是"我觉得模型需要什么就写什么",而是先跑任务、看卡点。这些卡点才是该写 Skill 的地方。

2. 结构化扩展,而非堆砌

"当 SKILL.md 文件变得难以管理时,把内容拆分到单独的文件并引用它们。如果某些上下文是互斥的或很少一起使用,保持路径分离会减少 token 使用。"

内容分层的实践原则:

类型 沉淀位置
稳定知识 SKILL.md / 附件 .md
稳定逻辑 预设脚本(.py / .sh
互斥/低频场景知识 拆出单独文件,避免一次性加载
现场判断 不沉淀,留给模型推理

3. 观察真实使用,而非猜测需求

"监控 Claude 在真实场景中如何使用你的 Skill,并基于观察进行迭代:注意意外的执行轨迹或对某些上下文的过度依赖。"

上线后盯一个指标:模型实际走了什么执行路径?有没有反复加载某个附件(说明该提到正文层)?有没有跳过某段指令(说明描述误导了召回)?

迭代的依据是观察,不是想象。

4. 让模型参与 Skill 的维护

"当你和 Claude 一起完成任务时,让 Claude 把成功的方法和常见错误捕获到 Skill 中的可复用上下文和代码里。如果它在使用 Skill 完成任务时偏离轨道,让它自我反思哪里出了问题。"

完成一个复杂任务后,让模型把踩过的坑和成功的策略写回 Skill。这比你自己复盘更准确------它知道自己缺了什么上下文才会走偏。

Skill 是活文档,不是一次性写完的配置。


下次写 Skill 的时候,别想"怎么写",先想"怎么分层"------这一个问题能帮你避开大部分坑。


术语注释

术语 解释
Agent Skill AI 智能体的"技能包",一组预先写好的指令和代码,让 AI 在特定场景下表现更好
Prompt 给 AI 的指令或提示词,告诉它要做什么
LLM 大语言模型,如 Claude、GPT 等,就是文章里说的"AI"
RAM / Disk 内存 / 磁盘。内存是临时工作区(快但有限),磁盘是长期存储(大但慢)
上下文窗口 AI 一次能"看到"的信息总量上限,类似工作台的面积
Token AI 处理文本的最小单位,大约 1-2 个汉字算一个 token
System prompt 系统预设指令,AI 启动时就加载的基础规则
渐进式披露 不一次性展示全部内容,而是按需逐步加载
Prompt engineering 设计和优化 AI 指令的技术
Prompt injection 提示词注入攻击,通过在输入中隐藏恶意指令来操控 AI 行为
召回 AI 判断"该不该使用某个 Skill"的匹配过程
攻击面 系统可能被攻击的入口点,入口越多越危险
供应链投毒 通过第三方依赖库或插件植入恶意代码
SKILL.md Skill 的主描述文件,用 Markdown 格式写成
相关推荐
guyoung36 分钟前
BoxAgnts 工具系统(6)——多 Provider 适配与 Agent 查询循环
rust·agent·ai编程
沐自礼1 小时前
图像伪造识别和定位
人工智能·llm
x-cmd1 小时前
[260612] x-cmd v0.9.8:x feishu 发送消息支持 Markdown + 卡片,让 x claw 接入飞书后消息不再干巴巴
飞书·agent·claude·命令行·x-cmd·openclaw
小闹5491 小时前
一个 65 行的小需求,我让 Claude Code 跑了 25 个 agent、整整两小时
后端·claude
为码消得人憔悴1 小时前
从零开始搭建 Obsidian 知识库
人工智能·aigc·agent
李燚2 小时前
流式管道:Pipe、StreamReader、背压控制
agent·stream·pipe·aiagent·streamreader
云烟成雨TD2 小时前
Agent Scope Java 2.x 系列【4】模型层
java·人工智能·agent
云烟成雨TD2 小时前
Agent Scope Java 2.x 系列【5】智能体抽象层
java·人工智能·agent
hoaxxcj3 小时前
AI编程2026:Copilot桌面应用发布,我们正在经历一场不可逆的范式转移
copilot·agent·ai编程·github copilot·编程工具
摸鱼同学4 小时前
17-Codex 高级工作流:Subagent、Worktree、多模型路由
ai·agent·codex