
Agent 生态正在快速分化:Claude、ChatGPT、Gemini、开源框架、企业自建智能体,各有各的工具调用协议、提示词格式和运行时。结果就是——你为一个平台精心调好的“能力”,换一个平台就要重写一遍。
Agent Skills 试图解决这个问题。它的核心主张很简单:把 Agent 的能力封装成独立的、可移植的文件单元,而不是散落在提示词和代码里。写一次,多个平台都能用。
需要先说清楚:“Agent Skills”目前主要指 Anthropic 提出的 SKILL.md 规范(Claude 生态中的技能包机制),其他平台也在跟进类似概念。具体字段、加载方式、支持程度以各平台官方文档为准,本文讲的是可迁移的通用方法。
一句话:用文件夹封装一项能力,用元数据描述何时使用,用渐进式加载控制上下文成本。
一个标准的 Skill 就是一个目录:
skills/
└── pdf-report/
├── SKILL.md # 主文件:元数据 + 指令
├── scripts/ # 可选:辅助脚本
│ └── render.py
└── references/ # 可选:参考资料
└── format.mdSKILL.md 由两部分组成:YAML 元数据(frontmatter)+ Markdown 指令正文。
---
name: pdf-report
description: 当用户需要把结构化数据导出为 PDF 报告时使用。
---
# 生成 PDF 报告
## 步骤
1. 校验输入数据字段完整性
2. 调用 scripts/render.py 渲染
3. 输出文件路径,不要输出二进制内容
## 注意事项
- 金额一律保留两位小数
- 缺字段时先询问,不要猜测关键点:name 和 description 是给模型看的“索引”,决定它何时加载这个 Skill;正文才是真正执行时读取的指令。
为什么 Skills 比“把所有提示词塞进系统提示”更好?因为它解决了上下文成本问题。
渐进式加载分三层:
层级 | 加载内容 | 时机 | 成本 |
|---|---|---|---|
L1 | 所有 Skill 的 name + description | 始终 | 极低 |
L2 | 命中 Skill 的 SKILL.md 正文 | 按需 | 中 |
L3 | scripts/ 和 references/ 中的具体文件 | 执行时 | 按需 |
这意味着:你有 50 个 Skill,日常只消耗 50 条描述的 token;只有真正用到某个 Skill 时,才加载它的完整内容。
这是 Skills 能规模化的根本原因。 没有渐进式加载,Skill 越多,上下文越爆。
这是本文的重点。同一套 Skill 文件,如何在不同平台跑起来?
Claude 的 Skills 机制原生读取 SKILL.md,你只需把目录放到指定位置,模型会自动索引。
在项目根目录放置 skills/,并在 AGENTS.md 或 CLAUDE.md 中声明:
# 项目约定
- 可用 Skills 位于 ./skills/,使用前先阅读对应 SKILL.md
- 涉及 PDF 导出时,必须使用 pdf-report skill如果你的平台不支持原生 Skills,就自己写一个极简加载器。代码量很少:
import os, yaml
def load_skill_index(skills_dir):
"""L1:只读取所有 Skill 的元数据"""
index = []
for name in os.listdir(skills_dir):
path = os.path.join(skills_dir, name, "SKILL.md")
if not os.path.exists(path):
continue
meta, _ = parse_frontmatter(path)
index.append(meta) # 只保留 name + description
return index
def load_skill_body(skills_dir, skill_name):
"""L2:命中时才读取正文"""
path = os.path.join(skills_dir, skill_name, "SKILL.md")
_, body = parse_frontmatter(path)
return body调用逻辑:把 load_skill_index() 的结果注入系统提示;模型选择某个 Skill 后,再调 load_skill_body() 加载正文。核心只有两个函数,但实现了渐进式加载。
很多框架(如 OpenAI 的函数调用、LangChain 工具)要求 JSON Schema。你可以从 SKILL.md 自动生成:
def skill_to_tool_schema(meta):
return {
"type": "function",
"function": {
"name": meta["name"],
"description": meta["description"],
"parameters": {"type": "object", "properties": {}}
}
}这样,一份 Skill 定义,既能给原生支持的平台用,也能转成其他框架的工具描述。
要让 Skill 真正跨平台可用,编写时必须遵守三条纪律:
description 必须回答“什么时候用”,而不是“这是什么”。模型靠它做路由决策。
description: PDF 工具description: 当用户需要将结构化数据导出为 PDF 报告时使用不要在 SKILL.md 里写死某个平台的 API、路径或变量名。用抽象描述:
调用 Anthropic 的 files API 上传将生成的文件保存到工作目录并返回路径scripts/ 里的脚本,必须在正文中写明运行环境和依赖,否则换平台就报错
## 环境要求
- Python 3.10+
- 依赖:reportlab==4.0.0
- 运行:python scripts/render.py --input data.jsonSkills 特别适合可复用、有明确触发条件、逻辑稳定的能力:
不适合:一次性任务、强依赖实时上下文的对话、需要复杂多轮协商的决策。
目前 Skills 还处在“事实标准”阶段,但它指向了一个明确趋势:Agent 能力正在从提示词工程,走向可分发、可组合、可版本化的模块化封装。
如果这个方向成立,未来可能出现:
谁先建立起可移植的 Skill 资产,谁就在多平台 Agent 时代占据先机。
Agent Skills 的价值不在“多了一个提示词文件”,而在把能力从平台中解耦出来。用 SKILL.md 描述意图,用渐进式加载控制成本,用适配层对接不同平台——这三件事做好,你写的每一项能力,都能在多个 Agent 上复用。
模型会换,平台会更迭,但可移植的能力封装,会是穿越周期的资产。少量代码,清晰约束,多平台复用——这就是 Agent Skills 的核心方法论。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。