引言:一个被低估的转折点
当Anthropic在2025年10月宣布Skills功能时,大多数人可能只是把它当成"Claude又加了个新功能"。但如果你仔细观察,你会发现这不是简单的功能叠加,而是AI工程化进程中的一个关键转折点。
这让我想起了软件工程史上的几个类似时刻:
- 从汇编语言到C语言的飞跃
- 从手写SQL到ORM框架的演进
- 从原生开发到npm/pip包管理生态的爆发
每一次转折,本质都是同一件事:把不可维护的散装知识,变成可组合的标准化组件。
Skills正在对AI做同样的事情。
作为一个在云服务领域摸爬滚打多年的技术负责人,我见过太多"看起来很炫"但实际没用的技术。但Skills不一样——它解决的是AI工程化的核心矛盾:如何让AI的能力可积累、可复用、可维护。
这篇文章不会教你怎么用Skills(官方文档已经足够好),我想做的是:用软件工程的视角,深度剖析Skills的技术本质、设计哲学,以及它为什么重要。
第一部分:技术本质 – Skills到底是什么?
1.1 从Prompt到Skill:范式的本质转变
要理解Skills,我们先得理解它要解决的问题。
传统AI工作流的痛点:
想象一下,你想让Claude帮你处理一个复杂的Excel报表,按照公司的规范生成财务分析。传统方式是什么?
你需要写一个几百行的prompt:
- 定义Excel的格式要求
- 说明财务指标的计算公式
- 规定图表的样式规范
- 列举各种边界情况的处理方式
- 提供示例输出
...
然后你会发现:
- 维护灾难:每次公司规范调整,你得找到并修改所有相关的prompt
- 无法复用:团队其他人做类似任务,只能复制你的prompt或者重新写一遍
- 不可靠:Claude可能每次生成的公式都不一样,你无法保证输出的一致性
- 无法积累:你调教AI的经验,只存在于一个个孤立的对话中
这就像我们在软件工程早期的状态:每个程序员都在手写汇编,代码无法复用,知识无法积累。
Skills带来的范式转变:
传统方式:
用户 → 写详细Prompt → Claude理解 → 生成输出(不确定)
Skills方式:
用户 → 简单任务描述 → Claude扫描Skills库 → 匹配相关Skills →
加载(指令+工具+代码) → 专业输出(可靠)
看到区别了吗?核心转变是:
- 从"每次告诉AI怎么做"变成"给AI预装能力包"
- 从"自然语言描述"变成"结构化知识+可执行代码"
- 从"黑盒生成"变成"可控组件组合"
这不是量变,是质变。
1.2 架构设计:文件夹即能力
根据Anthropic的描述,一个Skill本质上是一个文件夹,包含:
my-skill/
├── SKILL.md # 技能的核心描述和指令
├── tools/ # 可调用的工具脚本
├── resources/ # 相关资源文件
└── examples/ # 示例和模板
这个设计极其优雅,因为它遵循了一个Unix哲学:一切皆文件。
SKILL.md的核心作用:
我猜测SKILL.md大概包含这些内容:
# Skill名称
## 触发条件
描述什么情况下应该激活这个Skill
(可能是关键词匹配、任务类型识别、或者更智能的语义理解)
## 能力描述
这个Skill能做什么,有什么限制
## 指令集
具体的操作指令、规则、约束条件
## 工具调用
可以使用的代码工具和调用方式
## 资源引用
需要加载的文档、模板、配置文件
关键在于:SKILL.md不是给人看的文档,而是给AI执行的"程序"。
这就像:
- Dockerfile定义容器
- package.json定义JS项目
- requirements.txt定义Python依赖
SKILL.md定义了一个"AI能力单元"。
1.3 按需加载的实现猜测
最精妙的设计在于:Skills不是把所有东西都塞进context,而是按需加载。
我推测实现机制可能是这样的:
第一阶段:轻量级扫描
用户输入 → Claude快速扫描所有SKILL.md的元信息(触发条件、能力描述)
→ 匹配相关Skills → 计算相关性分数 → 选出Top-K个Skills
这一步是轻量的,可能只读取SKILL.md的前几行,不加载完整内容。
第二阶段:精准加载
确定需要的Skills → 加载完整的SKILL.md → 加载必要的工具和资源
→ 将Skills的上下文注入到当前任务 → 执行
这一步才真正消耗context,但已经过滤掉了无关内容。
第三阶段:智能组合
如果多个Skills都相关 → Claude协调它们的使用顺序
→ 处理Skills之间的依赖关系 → 组合执行
这就像Linux的动态链接库机制:程序启动时不加载所有库,只在需要时加载特定的.so文件。
为什么这个设计重要?
因为它解决了AI的"context长度诅咒"问题:
- 如果每个Skill都要预加载,context很快就爆了
- 如果完全不加载,AI就没有专业能力
- 按需加载是唯一的平衡点
这是一个O(1)的查找 + O(k)的加载的设计,而不是O(n)的暴力搜索。
第二部分:Linus式品味分析
作为一个长期信奉Linus Torvalds技术哲学的人,我看到Skills的设计时,第一反应是:这是有Good Taste的设计。
什么是Good Taste?Linus在一次演讲中说:好的代码不是聪明地处理各种特殊情况,而是消除特殊情况。
让我们用这个标准审视Skills。
2.1 消除特殊情况:统一的格式
糟糕的设计(假设):
- Claude应用里用一种格式定义技能
- API里用另一种格式
- Claude Code里又是第三种格式
- 每种场景都有特殊的配置方式
Skills的实际设计:
一个统一的SKILL.md格式,到处都能用
这就是消除特殊情况。你不需要学习三套系统,不需要维护三份文档,不需要处理三种兼容性问题。
构建一次,到处运行——这不就是Java当年的承诺吗?但这次,Anthropic真的做到了。
2.2 数据结构优先:Skills作为"能力对象"
Linus有个著名的观点:"坏程序员关心代码,好程序员关心数据结构"。
Skills的核心就是定义了一个优雅的数据结构:
# 伪代码表示
class Skill:
metadata: {
name: str
description: str
triggers: List[str]
}
instructions: str
tools: List[ExecutableCode]
resources: List[File]
def match(self, user_task) -> float:
"""计算与任务的相关性"""
def load(self) -> Context:
"""加载到context"""
def execute(self, task) -> Result:
"""执行任务"""
有了这个数据结构,很多问题就自然解决了:
- 版本管理?每个Skill有版本号,Git轻松管理
- 依赖关系?Skills之间可以声明依赖
- 冲突检测?对比metadata就能发现冲突
- 能力发现?扫描所有Skills的metadata即可
好的数据结构让复杂的问题变简单——这就是Linus所说的品味。
2.3 简洁执念:自动匹配 vs 手动选择
想象两种设计:
设计A(糟糕):
用户每次任务前,必须手动选择要使用的Skills
就像每次调用函数前,你得手动include所需的库
设计B(Skills的实际设计):
用户只说任务,Claude自动匹配Skills
就像现代IDE的自动import
这又是一次"消除特殊情况":用户不需要知道"我现在该用哪个Skill",系统自动处理。
但这里有个微妙之处:自动匹配不是简单的"智能化",而是把复杂度推给了系统,而不是用户。
这是好设计的标志:让复杂的事情在幕后发生,让简单的接口暴露给用户。
2.4 向后兼容:不破坏现有工作流
Skills最聪明的一点:它是增强,不是替代。
- 你不用Skills,Claude照常工作
- 你部分使用Skills,现有prompt依然有效
- Skills和传统prompt可以混用
这就是Linus的另一条铁律:"Never break userspace"(永远不破坏用户空间)。
Linux内核30年来一直遵循这个原则:新功能可以加,但不能让旧程序跑不起来。
Skills也是同样的智慧:渐进式增强,而非革命性重构。
第三部分:工程价值 – 解决了什么真问题?
技术分析归技术分析,但作为一个技术负责人,我更关心:这玩意到底能解决什么实际问题?
3.1 痛点1:Prompt的维护性灾难
举个真实场景:
我们团队用Claude做代码review,初期我写了一个很长的prompt,定义了代码规范、安全检查项、常见问题等等。效果很好。
然后问题来了:
- 团队其他人也想用,我得把prompt复制给他们
- 代码规范更新了,我得通知所有人修改prompt
- 不同项目有不同要求,大家开始各自魔改prompt
- 半年后,没人记得"标准版本"是什么样的
这就是Prompt的维护性灾难。
如果用Skills呢?
创建一个 code-review.skill/
├── SKILL.md # 代码规范、检查规则
├── tools/
│ └── security_checker.py # 安全检查脚本
└── resources/
└── team_standards.md # 团队规范文档
提交到Git仓库
团队成员通过版本控制共享
更新时只需Pull最新版本
突然,一切变得可维护了:
- ✅ 单一可信源(Single Source of Truth)
- ✅ 版本控制
- ✅ 团队协作
- ✅ 持续改进
这不是AI能力的提升,而是工程化能力的提升。
3.2 痛点2:生成式AI的不可靠性
生成式AI有个根本性问题:你无法保证输出的一致性。
同样的输入,Claude可能生成不同的Excel公式、不同的代码实现、不同的文档格式。对于需要精确性的场景(财务报表、数据分析、系统配置),这是灾难性的。
Skills的解法:该用代码的地方用代码
Skills可以包含可执行代码,这意味着:
# 在Skill中嵌入Python代码
def calculate_financial_metrics(data):
"""
财务指标计算 - 这是确定性的
不用AI生成,用传统代码保证正确性
"""
revenue = sum(data['sales'])
cost = sum(data['expenses'])
profit_margin = (revenue - cost) / revenue
return {
'revenue': revenue,
'profit_margin': profit_margin
}
这样,工作流变成:
- Claude理解用户意图(这需要AI)
- 调用Skill中的代码计算数据(这用传统编程)
- Claude生成报告文本(这需要AI)
混合模式:AI干AI擅长的,代码干代码擅长的。
这解决了一个根本性问题:不是所有事情都该用生成式AI做。有些事情,传统编程更可靠、更快速、更便宜。
Skills提供了这个混合的框架。
3.3 痛点3:企业知识的沉淀困境
公司花了大量精力调教AI,让它理解业务流程、品牌规范、技术架构。但这些知识都散落在:
- 各个员工的对话历史里
- 邮件线程里
- 文档的各个角落里
- 某个人的大脑里
无法形成企业级的知识资产。
Skills改变了这一点:
企业可以建立私有Skills库:
├── brand-guidelines.skill/ # 品牌规范
├── security-compliance.skill/ # 安全合规检查
├── report-templates.skill/ # 报告模板
├── code-standards.skill/ # 代码标准
└── onboarding.skill/ # 新员工入职指导
这些Skills是:
- ✅ 版本化的企业知识
- ✅ 可复用的最佳实践
- ✅ 可持续改进的资产
- ✅ 可审计的合规工具
企业在AI时代的知识管理,从"隐性知识"变成了"显性资产"。
第四部分:技术类比 – 软件工程的视角
理解一个新技术的最好方式,是找到它在已知领域的类比。Skills让我想到了几个经典的软件工程概念。
4.1 Skills ≈ Package Manager(包管理器)
npm、pip、cargo做的事情是什么?
1. 标准化:定义包的格式(package.json、setup.py)
2. 发现:提供包的搜索和浏览(npmjs.com)
3. 分发:自动下载和安装
4. 依赖管理:解决包之间的依赖关系
5. 版本控制:管理不同版本的兼容性
Skills正在做同样的事情,只是对象从"代码包"变成了"AI能力包":
1. 标准化:SKILL.md定义格式
2. 发现:anthropics/skills市场(已提到)
3. 分发:通过版本控制共享
4. 依赖管理:Skills可以声明依赖其他Skills
5. 版本控制:Git管理版本
我大胆预测:未来可能会出现类似的命令:
# 安装一个Skill
skill install financial-analysis
# 更新所有Skills
skill update
# 查看已安装的Skills
skill list
# 发布自己的Skill
skill publish my-custom-skill
甚至可能有一个Skills的中央仓库,像npm registry一样。
这意味着什么?
想想npm对JavaScript生态的意义:
- 爆发式的社区贡献
- 标准化的代码复用
- 快速迭代的能力
Skills可能对AI生态做同样的事情。
4.2 Skills ≈ Plugin System(插件系统)
VSCode为什么这么成功?因为它的插件系统:
- 核心编辑器保持简洁
- 功能通过插件扩展
- 第三方开发者可以贡献插件
- 用户按需安装
Claude + Skills = 同样的模式:
- Claude核心保持通用性
- Skills提供专业能力
- 企业和开发者可以创建自定义Skills
- 用户自动加载相关Skills
插件系统的成功要素:
- 稳定的API:插件不会因为核心更新而失效
- 隔离性:插件之间互不干扰
- 可发现性:用户能轻松找到需要的插件
- 简单的开发流程:降低贡献门槛
Skills是否具备这些要素?
- ✅ 稳定的API:SKILL.md的标准格式
- ❓ 隔离性:还不确定,Skills之间会冲突吗?
- ✅ 可发现性:anthropics/skills市场
- ✅ 简单开发:内置的skill-creator辅助创建
基本具备了成功插件生态的条件。
4.3 Skills ≈ 领域特定语言(DSL)?
这个类比更抽象,但可能更深刻。
什么是DSL?是为特定领域设计的语言,比如:
- SQL:数据查询语言
- HTML/CSS:网页描述语言
- Dockerfile:容器定义语言
SKILL.md是不是一种AI能力定义语言?
它定义的不是"如何计算"(传统编程),而是:
- 什么时候该做什么(触发条件)
- 做事的规则和约束(指令集)
- 可以使用的工具(代码和资源)
这是一种声明式的能力定义。
为什么这很重要?
因为声明式比命令式更高级:
- SQL:你说"我要什么数据",数据库决定怎么查
- Dockerfile:你说"容器长什么样",Docker决定怎么构建
- SKILL.md:你说"这个能力是什么",Claude决定怎么用
抽象层次的提升,是技术进步的标志。
从这个角度看,Skills不只是功能添加,而是定义了一种新的抽象:能力即声明。
第五部分:深度猜测 – 技术实现的可能性
作为一个技术人,我忍不住要猜测Skills在内部是怎么实现的。以下纯属推测,但可能接近真相。
5.1 Skills的匹配机制
问题:用户输入一个任务,Claude怎么知道该用哪个Skill?
简单方案(我猜Anthropic不会用):
关键词匹配:
SKILL.md里定义关键词列表,用户输入包含关键词就触发
→ 太粗糙,会有大量误匹配
更可能的方案:
语义相似度匹配:
1. 每个Skill的description生成embedding向量
2. 用户输入也生成embedding
3. 计算余弦相似度,选出Top-K
4. 用小模型快速做一次精确性判断
这是一个两阶段检索(Two-stage Retrieval)的经典架构:
- 第一阶段:向量搜索,快速筛选候选
- 第二阶段:精确匹配,确定最终选择
进一步优化的可能:
主动学习:
Claude在使用过程中记录:
- 哪些任务匹配了哪些Skills
- 用户是否手动调整过匹配结果
- 哪些Skills经常一起使用
基于这些数据,不断优化匹配模型
这就像搜索引擎的点击率优化,是一个持续改进的过程。
5.2 Context的动态管理
问题:Context窗口有限,怎么在加载Skills的同时,不影响对话的连贯性?
我的猜测:
Claude内部可能有一个Context分区机制:
[系统Prompt区] - 固定,不可修改
[Skills上下文区] - 动态加载,当前任务相关的Skills
[对话历史区] - 保留最近N轮对话
[当前任务区] - 用户当前输入和Claude的工作空间
优先级:
系统Prompt > Skills上下文 > 当前任务 > 对话历史
当Context快满时:
1. 首先压缩对话历史
2. 然后卸载不再相关的Skills
3. 必要时总结当前任务状态,释放空间
这就像操作系统的内存管理:
- 工作集理论:只保留当前需要的"页面"
- LRU淘汰:最近最少使用的先卸载
- 按需加载:需要时再加载回来
5.3 代码执行的安全隔离
Skills可以包含可执行代码,这带来一个巨大的安全问题:怎么保证恶意代码不伤害系统?
必须有的机制:
沙箱执行环境:
- 类似Docker容器的隔离
- 限制文件系统访问
- 限制网络访问
- 限制计算资源(CPU、内存)
- 超时自动终止
可能的实现:
# 伪代码
class SkillExecutor:
def execute_code(self, skill_code):
# 在隔离环境中执行
sandbox = Sandbox(
max_memory=100MB,
max_cpu_time=5s,
network_access=False,
file_system=read_only
)
result = sandbox.run(skill_code)
if result.timeout:
raise SkillExecutionError("Skill执行超时")
if result.error:
raise SkillExecutionError(f"Skill执行失败: {result.error}")
return result.output
这跟现代云函数(Lambda、Cloud Functions)的隔离机制类似。
更深的问题:如何审核第三方Skills?
如果未来有一个公开的Skills市场,Anthropic必须:
- 静态代码分析,检测恶意模式
- 动态沙箱测试,观察行为
- 社区评审和举报机制
- 官方认证和信任等级
这是一个巨大的工程挑战,也是Skills生态能否成功的关键。
5.4 Skills的组合与冲突
问题:如果两个Skills都匹配当前任务,怎么办?
场景1:互补型组合
任务:生成一份销售报告
匹配到的Skills:
- excel-formatter.skill:处理Excel格式
- sales-analysis.skill:销售数据分析
- company-branding.skill:公司品牌规范
理想行为:三个Skills协同工作
1. sales-analysis分析数据
2. excel-formatter格式化输出
3. company-branding应用品牌元素
这需要一个Skills协调机制:
class SkillOrchestrator:
def coordinate(self, matched_skills, task):
# 分析Skills之间的关系
dependencies = self.analyze_dependencies(matched_skills)
# 构建执行DAG(有向无环图)
execution_plan = self.build_dag(dependencies)
# 按拓扑序执行
for skill in execution_plan:
result = skill.execute(task)
task.update(result) # 每个Skill的输出作为下一个的输入
场景2:冲突型碰撞
任务:生成代码
匹配到的Skills:
- python-style.skill:Python风格指南(要求用下划线命名)
- java-style.skill:Java风格指南(要求用驼峰命名)
这两个Skills冲突了!
可能的解决方案:
- 优先级机制:每个Skill有权重,高优先级的覆盖低优先级
- 用户选择:检测到冲突时,询问用户
- 上下文推断:根据任务内容判断(代码是Python就用Python-style)
这又回到了软件工程的经典问题:依赖冲突解决。
npm的解决方案是:允许同一个包的多个版本共存,通过node_modules的嵌套结构隔离。
Skills可能也需要类似的机制。
第六部分:对未来的想象
技术的价值在于它开启的可能性。Skills会把我们带向哪里?
6.1 短期影响(6个月-1年)
Skills市场的兴起:
- 类似Chrome应用商店、VSCode插件市场
- 个人开发者可以发布Skills
- 企业购买垂直领域的专业Skills
- 可能出现"Skills开发"作为一种新职业
企业级应用的爆发:
- 每个企业都会建立私有Skills库
- Skills成为企业AI知识管理的标准方式
- 咨询公司开始提供"企业Skills定制服务"
教育和培训的转变:
- 从"教你怎么写prompt"变成"教你怎么设计Skills"
- 出现Skills工程师认证
- 大学可能开设"AI能力工程"课程
6.2 中期演化(2-3年)
AI应用的开发模式转变:
现在的AI应用开发:
编写复杂的prompt → 调用API → 后处理输出 → 集成到应用
未来的AI应用开发:
组合现成的Skills → 配置组合逻辑 → 直接部署
就像Web开发从"手写HTML"变成"组合React组件"。
垂直领域的专业化:
- 出现"医疗Skills包"、"法律Skills包"、"金融Skills包"
- 这些Skills包含领域知识、合规检查、专业工具
- 购买一个领域Skills包,就能让AI成为该领域的专家
Skills的依赖管理生态:
# 未来可能的SKILL.md
name: advanced-financial-analysis
version: 2.1.0
dependencies:
- excel-processor: ^1.5.0
- data-visualization: ^3.2.0
- accounting-standards: 2.0.1
这是完整的包管理生态。
6.3 长期想象(5年+)
AI能力的商品化:
- Skills成为可交易的数字商品
- 企业的核心竞争力之一,是其私有Skills库
- 可能出现Skills的版权、专利问题
AI的"操作系统化":
Claude本身 = 操作系统内核
Skills = 应用程序
用户任务 = 进程
类比:
Android系统 → Claude平台
Google Play → Skills Market
APK文件 → SKILL.md包
AI不再是一个"智能助手",而是一个可编程的计算平台。
"AI即服务"的新形态:
- 企业不再自己训练大模型
- 而是购买基础模型 + 订阅Skills服务
- Skills提供商成为新的云服务商
想象一下AWS的场景:
- EC2 = 计算资源
- S3 = 存储资源
- Claude = AI资源
- Skills Marketplace = AI能力资源
这是云计算的下一个演化阶段。
6.4 潜在的风险
技术乐观主义要警惕,我们也得思考风险:
风险1:锁定效应(Vendor Lock-in)
- 如果大量业务依赖Claude的Skills
- Anthropic提价或改变政策怎么办?
- Skills能否迁移到其他AI平台?
风险2:安全性担忧
- 第三方Skills的代码如何审计?
- 企业的私密数据会不会泄露?
- 恶意Skills的防御机制是否足够?
风险3:复杂度爆炸
- 当一个任务匹配了20个Skills
- Skills之间的依赖关系形成巨大的图
- 系统会不会变得不可维护?
风险4:知识产权纠纷
- Skills中包含的企业知识,版权归谁?
- 员工离职带走Skills,算商业机密泄露吗?
- Skills的授权和分发模式如何设计?
这些问题没有简单答案,但必须提前思考。
结论:这只是开始
回到开头的问题:Skills是不是AI工程化的转折点?
我的答案是:是的,而且它的意义被低估了。
Skills做对了什么?
- 标准化:定义了AI能力的标准格式
- 模块化:让AI能力可组合、可复用
- 工程化:用软件工程的方法管理AI能力
- 生态化:为社区贡献和商业化奠定基础
它标志着什么?
从"调教AI"到"工程化AI能力"的转变
从"孤立对话"到"知识资产"的转变
从"黑盒工具"到"可编程平台"的转变
对我们意味着什么?
作为技术从业者,我们需要:
- 学习"能力工程"的思维方式
- 思考如何把团队知识封装成Skills
- 关注Skills生态的演化
- 警惕潜在风险,提前规划
最后的思考:
软件工程用了50年,从汇编走到今天的高级语言和包管理生态。
AI工程化会更快。
Skills可能就是那个启动按钮。
参考资料
- Anthropic官方博客:Claude Skills: Customize AI for your workflows
- Linus Torvalds on Good Taste in Coding(TED演讲)
- Unix哲学:《The Art of Unix Programming》, Eric S. Raymond
- 包管理器的演化历史:npm、pip、cargo的设计哲学
- Plugin系统的成功案例:VSCode Extension API设计
后记:
这篇文章写作时(2025年10月20日),Skills功能刚推出不久。我的很多猜测可能不准确,但思考的方向应该是对的。
如果你对Skills有更深的理解,或者有实际使用经验,欢迎讨论。
技术的乐趣,就在于探索未知。
最新评论
注册很麻烦