Claude、Codex、Trae... 都在做:为什么 "Skill" 成了 AI 编程工具的标配?

0 阅读9分钟

Claude Code Skill 工作机制:一种带执行能力的结构化 RAG

这篇文章不讲怎么写 Skill(官方文档写得够清楚了),而是从底层拆解 Skill 到底是怎么工作的,以及它和 RAG、MCP 这些概念的本质区别。


Skill 是什么

一句话:Skill 是一个目录,里面放着 SKILL.md 文件和可选的辅助文件(脚本、模板、参考文档)

my-skill/
├── SKILL.md           # 核心指令(必须)
├── REFERENCE.md       # 详细参考(可选)
├── EXAMPLES.md        # 示例集(可选)
└── scripts/
    └── helper.py      # 辅助脚本(可选)

SKILL.md 的格式很简单,就是一个带 frontmatter 的 Markdown:

---
name: code-review
description: 代码审查技能,用于分析代码质量、安全漏洞、性能问题。
             说"审查代码"、"review this"、"检查一下这段代码"时自动激活。
---

# 代码审查

## 审查流程

1. 先看整体结构
2. 检查安全问题
3. 分析性能瓶颈
4. 提出改进建议

## 检查清单

- [ ] 是否有硬编码的密钥
- [ ] 是否有 SQL 注入风险
- [ ] 是否有 N+1 查询
...

核心机制:渐进式信息公开

Skill 的设计基于一个核心理念:不要一次性把所有内容塞进上下文,按需加载

Anthropic 把这叫做 Progressive Disclosure(渐进式信息公开),分三层:

┌─────────────────────────────────────────────────────┐
  Level 1: 元数据层(启动时)                           
  - 只加载 name  description                        
  - 每个 Skill  50-100 tokens                       
  - 用于语义匹配,决定是否激活                          
└─────────────────────────────────────────────────────┘
                          
                    用户请求触发匹配
                          
┌─────────────────────────────────────────────────────┐
  Level 2: 指令层(任务相关时)                         
  - 加载完整的 SKILL.md 内容                           
  -  2-5K tokens                                   
  - 包含核心流程、检查清单、最佳实践                     
└─────────────────────────────────────────────────────┘
                          
                    执行过程中发现需要更多信息
                          
┌─────────────────────────────────────────────────────┐
  Level 3+: 资源层(按需)                             
  - 加载引用的文件:REFERENCE.md、scripts/helper.py    
  - 只在实际需要时读取                                 
  - 可以是无限深度的文件树                              
└─────────────────────────────────────────────────────┘

这个设计解决了一个实际问题:你可以有几十甚至上百个 Skill,但不会把上下文撑爆

启动时只加载元数据,假设你有 50 个 Skill,每个 50 tokens,总共也就 2500 tokens。真正干活的时候,只加载用得上的那个 Skill 的完整内容。


触发机制:语义匹配

Skill 不是靠关键词匹配触发的,而是语义匹配

这意味着:

# 以下请求都能触发同一个代码审查 Skill
"帮我审查一下这段代码"
"review this code"
"这个函数有没有问题"
"检查一下安全漏洞"
"看看性能有没有优化空间"

所以 description 字段极其重要。官方说法是:description 决定 90% 的触发效果

写 description 的诀窍是把可能的触发场景都列出来:

# 这样写太模糊,很难触发
description: 帮助处理文档

# 这样写才有效
description: 提取 PDF 文本、填写 PDF 表单、合并 PDF 文件。
             用于处理 PDF 文档,当用户提到"PDF"、"表单"、
             "文档提取"、"合并文件"时自动激活。

执行流程拆解

用一个实际场景来说明。假设用户说:"帮我审查一下这段代码,看看有没有安全问题"。

Step 1:语义分析

Claude 分析用户意图,识别出"审查代码"、"安全问题"这些语义。

Step 2:Skill 匹配

对比所有已加载的 Skill description,发现 code-review 这个 Skill 的描述提到了"代码审查"、"安全漏洞",匹配度最高。

Step 3:加载 SKILL.md

读取 ~/.claude/skills/code-review/SKILL.md 的完整内容,注入上下文。

Step 4:执行任务

按照 SKILL.md 里定义的流程执行:

  • 先看整体结构
  • 检查安全问题(重点关注)
  • 分析性能瓶颈
  • 提出改进建议

Step 5:按需加载补充资料

如果在检查过程中发现需要参考 OWASP Top 10 的详细说明,Claude 会去读取 REFERENCE.md 或者 security-checklist.md

Step 6:执行脚本(如果有)

如果 Skill 里包含了脚本(比如一个 Python 静态分析工具),Claude 可以直接调用执行,而不是把脚本内容加载到上下文里。

sequenceDiagram
    participant U as 用户
    participant C as Claude
    participant S as Skill Store
    participant F as 文件系统

    U->>C: "审查一下这段代码"
    C->>S: 查询匹配的 Skill
    S-->>C: 返回 code-review (description 匹配)
    C->>F: 读取 code-review/SKILL.md
    F-->>C: 返回完整指令
    C->>C: 按流程执行审查

    alt 需要补充资料
        C->>F: 读取 REFERENCE.md
        F-->>C: 返回参考内容
    end

    alt 需要执行脚本
        C->>F: 执行 scripts/analyze.py
        F-->>C: 返回执行结果
    end

    C->>U: 输出审查报告

Skill vs RAG:本质区别

看到这里,你可能觉得 Skill 和 RAG 挺像的:都是根据用户请求检索相关内容,然后注入上下文。

确实有相似之处,但本质区别在于:

维度传统 RAGSkill
内容性质参考资料(知识)执行指令(方法论)
触发方式被动检索主动语义匹配
加载策略Top-K 一次性加载三层渐进式加载
结构扁平的文本 chunks分层的目录结构
输出增强文本生成执行任务 + 调用脚本

RAG 回答的是 "What"(是什么),Skill 回答的是 "How"(怎么做)

RAG 会告诉你:"React 的 useEffect 是一个副作用 Hook,用于处理组件的副作用..."

Skill 会指导你:"审查 React 代码时,按这个流程:1. 检查依赖数组是否正确 2. 是否有内存泄漏 3. 是否滥用 useEffect..."

一个是知识库,一个是方法论库。

如果非要给 Skill 下个定义,我觉得可以叫:带执行能力的结构化 RAG

  • 结构化:不是扁平的文本,是有组织的目录结构
  • 带执行能力:不只是提供参考,还能执行脚本、调用工具
  • RAG 的底子:核心还是"检索 → 注入 → 增强"这套逻辑

Skill vs MCP:分层协作

另一个容易混淆的概念是 MCP(Model Context Protocol)

简单说:

  • MCP 是"手":让 Claude 能触碰外部世界(数据库、API、文件系统)
  • Skill 是"技能书":教 Claude 怎么做事

它们工作在不同的层级:

用户请求
    ↓
┌─────────────────────────────────┐
│  Skill Layer(知识/方法论)       │  ← 教我怎么做
│  - 审查流程、检查清单、最佳实践    │
└─────────────────────────────────┘
    ↓
┌─────────────────────────────────┐
│  LLM 推理层                      │
└─────────────────────────────────┘
    ↓
┌─────────────────────────────────┐
│  MCP Layer(连接/执行)           │  ← 让我能做
│  - 读数据库、调 API、操作文件      │
└─────────────────────────────────┘
    ↓
外部世界

一个实际的例子:

用户:帮我分析一下数据库里的慢查询

这个任务需要两者协作:

  1. Skill 提供分析方法论:怎么识别慢查询、常见原因有哪些、优化思路是什么
  2. MCP 提供连接能力:连接数据库、执行 EXPLAIN、读取查询日志

没有 MCP,Claude 连数据库都访问不了;没有 Skill,Claude 可能漫无目的地瞎分析。


工具限制:allowed-tools

Skill 有一个特殊能力:可以限制 Claude 在执行该 Skill 时能使用的工具。

---
name: safe-reader
description: 只读分析,不修改任何文件
allowed-tools: Read, Grep, Glob
---

这在某些场景下很有用,而且体现了 "约束即增强" 的设计哲学:

  1. 防止 Token 浪费与上下文污染 如果一个负责重构代码的 Skill 能够访问无关的数据库或日志系统,当 AI 遇到阻碍时,很容易"发散注意力"去读取大量无关的大型数据。这不仅浪费 Token,引入的噪音还会降低推理质量。限制工具能强制模型聚焦在当前上下文中解决问题。

  2. 强制任务聚焦(关注点分离) 通过限制工具,实际上是在定义 Skill 的"能力边界",防止越界:

    • 架构师 Skill:可能只允许 list_filesread_file,强制它从全局视角分析,而不是陷入具体实现的修改。
    • 数据库专家 Skill:可能只允许 SQL 相关工具,防止它试图通过修改业务代码来掩盖数据库性能问题。
  3. 安全沙箱 这是最直观的用途。比如一个用于"新手引导"的 Skill,只允许读取和解释代码,绝不允许执行 write_filerun_command,从而实现绝对的安全审计。


实际案例:我系统里的 Skill

我本地装了大概 100 多个 Skill,来源有三种:

1. 手动创建的(~/.claude/skills/

oss-contributor/      # 开源贡献规范
mermaid-syntax/       # Mermaid 语法参考

2. 通过 symlink 安装的插件 Skill

frontend-design → ~/.claude/plugins/.../frontend-design
postgresql → ~/.claude/plugins/.../postgresql
typescript-advanced-types → ...

3. 插件自带的(~/.claude/plugins/*/skills/

superclaude/skills/
├── first-principles/    # 第一性原理思维
├── 5-whys/             # 5-Why 根因分析
└── confidence-check/   # 置信度检查

anthropic-agent-skills/skills/
├── pdf/                # PDF 处理
├── xlsx/               # Excel 处理
└── pptx/               # PPT 处理

举个实际触发的例子。当我说"从第一性原理分析一下这个架构设计"时:

  1. Claude 匹配到 first-principles Skill(description 里有"第一性原理"、"从根本分析"这些词)
  2. 加载 SKILL.md,里面定义了五阶段分析流程
  3. 按流程输出:问题本质 → 假设挑战 → 基础真理 → 推理链条 → 结论

输出格式都是固定的,因为 SKILL.md 里写死了:

## First Principles Analysis: [Topic]

### 1. Problem Essence
**Core problem:** [One sentence]
**Success criteria:** [Measurable outcomes]

### 2. Assumptions Challenged
| Assumption | Challenge | Verdict |
|------------|-----------|---------|
| ... | ... | Keep/Discard/Modify |

### 3. Ground Truths
- [Irreducible fact 1]
- [Irreducible fact 2]

### 4. Reasoning Chain
Ground Truth → [Step 1] → [Step 2] → Solution

### 5. Conclusion
**Recommended approach:** ...

这就是 Skill 的价值:把隐性知识变成显性流程,把个人经验变成可复用的能力


开放标准

值得一提的是,Skill 规范已经发布为开放标准:agentskills.io

Anthropic 也在 GitHub 上开源了官方的 Skills 仓库,包含文档处理(Excel、PDF、Word、PPT)等预置 Skill。

这意味着同样的 Skill 格式理论上可以在其他 AI 平台使用。当然,目前主要还是 Claude 生态在用。正如 Simon Willison 评价的:「Skills 可能比 MCP 更重要」——因为它让 AI 能够学习和复用人类的专业知识和工作流程。


小结

Skill 的工作机制可以总结为:

  1. 启动时:加载所有 Skill 的元数据(name + description),约 50-100 tokens/个
  2. 用户请求时:语义匹配找到相关 Skill
  3. 执行时:渐进式加载 SKILL.md → 引用文件 → 脚本
  4. 能力边界:可通过 allowed-tools 限制工具使用

和其他概念的关系:

  • vs RAG:Skill 是结构化、可执行、带方法论的 RAG
  • vs MCP:Skill 在知识层(教怎么做),MCP 在连接层(让能做)
  • vs Slash Command:Skill 自动触发,Command 手动调用

写好 Skill 的核心:把 description 写具体,把触发场景都列出来


参考资料


如果你觉得这篇文章有帮助,欢迎关注我的 GitHub,下面是我的一些开源项目:

vibe coding 原理学习

  • coding-cli-guide学习网站)- 学习 qwen-cli 时整理的笔记,40+ 交互式动画演示 AI CLI 内部机制(工具调度状态机、流式解析器、MCP 协议握手等) coding-cli-guide

Claude Code Skills(按需加载,意图自动识别,不浪费 token,介绍文章):

全栈项目(适合学习现代技术栈):

  • prompt-vault - Prompt 管理器,用的都是最新的技术栈,适合用来学习了解最新的前端全栈开发范式:Next.js 15 + React 19 + tRPC 11 + Supabase 全栈示例,clone 下来配个免费 Supabase 就能跑
  • chat_edit - 双模式 AI 应用(聊天+富文本编辑),Vue 3.5 + TypeScript + Vite 5 + Quill 2.0 + IndexedDB