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 挺像的:都是根据用户请求检索相关内容,然后注入上下文。
确实有相似之处,但本质区别在于:
| 维度 | 传统 RAG | Skill |
|---|---|---|
| 内容性质 | 参考资料(知识) | 执行指令(方法论) |
| 触发方式 | 被动检索 | 主动语义匹配 |
| 加载策略 | 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、操作文件 │
└─────────────────────────────────┘
↓
外部世界
一个实际的例子:
用户:帮我分析一下数据库里的慢查询
这个任务需要两者协作:
- Skill 提供分析方法论:怎么识别慢查询、常见原因有哪些、优化思路是什么
- MCP 提供连接能力:连接数据库、执行
EXPLAIN、读取查询日志
没有 MCP,Claude 连数据库都访问不了;没有 Skill,Claude 可能漫无目的地瞎分析。
工具限制:allowed-tools
Skill 有一个特殊能力:可以限制 Claude 在执行该 Skill 时能使用的工具。
---
name: safe-reader
description: 只读分析,不修改任何文件
allowed-tools: Read, Grep, Glob
---
这在某些场景下很有用,而且体现了 "约束即增强" 的设计哲学:
-
防止 Token 浪费与上下文污染 如果一个负责重构代码的 Skill 能够访问无关的数据库或日志系统,当 AI 遇到阻碍时,很容易"发散注意力"去读取大量无关的大型数据。这不仅浪费 Token,引入的噪音还会降低推理质量。限制工具能强制模型聚焦在当前上下文中解决问题。
-
强制任务聚焦(关注点分离) 通过限制工具,实际上是在定义 Skill 的"能力边界",防止越界:
- 架构师 Skill:可能只允许
list_files和read_file,强制它从全局视角分析,而不是陷入具体实现的修改。 - 数据库专家 Skill:可能只允许 SQL 相关工具,防止它试图通过修改业务代码来掩盖数据库性能问题。
- 架构师 Skill:可能只允许
-
安全沙箱 这是最直观的用途。比如一个用于"新手引导"的 Skill,只允许读取和解释代码,绝不允许执行
write_file或run_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 处理
举个实际触发的例子。当我说"从第一性原理分析一下这个架构设计"时:
- Claude 匹配到
first-principlesSkill(description 里有"第一性原理"、"从根本分析"这些词) - 加载 SKILL.md,里面定义了五阶段分析流程
- 按流程输出:问题本质 → 假设挑战 → 基础真理 → 推理链条 → 结论
输出格式都是固定的,因为 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 的工作机制可以总结为:
- 启动时:加载所有 Skill 的元数据(name + description),约 50-100 tokens/个
- 用户请求时:语义匹配找到相关 Skill
- 执行时:渐进式加载 SKILL.md → 引用文件 → 脚本
- 能力边界:可通过 allowed-tools 限制工具使用
和其他概念的关系:
- vs RAG:Skill 是结构化、可执行、带方法论的 RAG
- vs MCP:Skill 在知识层(教怎么做),MCP 在连接层(让能做)
- vs Slash Command:Skill 自动触发,Command 手动调用
写好 Skill 的核心:把 description 写具体,把触发场景都列出来。
参考资料
- Introducing Agent Skills - Anthropic 官方公告
- Claude Code Skills 文档 - 官方使用指南
- Agent Skills Overview - Claude Docs 详细文档
- anthropics/skills - 官方 Skills 仓库
- Model Context Protocol - MCP 官方文档
- agentskills.io - Agent Skills 开放标准
- Claude Skills are awesome, maybe a bigger deal than MCP - Simon Willison 的深度评论
如果你觉得这篇文章有帮助,欢迎关注我的 GitHub,下面是我的一些开源项目:
vibe coding 原理学习:
- coding-cli-guide(学习网站)- 学习 qwen-cli 时整理的笔记,40+ 交互式动画演示 AI CLI 内部机制(工具调度状态机、流式解析器、MCP 协议握手等)
Claude Code Skills(按需加载,意图自动识别,不浪费 token,介绍文章):
- code-review-skill - 代码审查技能,覆盖 React 19、Vue 3、TypeScript、Rust 等约 9000 行规则(详细介绍)
- 5-whys-skill - 5 Whys 根因分析,说"找根因"自动激活
- first-principles-skill - 第一性原理思考,适合架构设计和技术选型
全栈项目(适合学习现代技术栈):
- 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