文章目录
-
- [1.Skill 是什么](#1.Skill 是什么)
- [2.Skill 的组成部分](#2.Skill 的组成部分)
- [3.完整的 Skill 流程](#3.完整的 Skill 流程)
- [4.Skill和 Tool、MCP 的区别](#4.Skill和 Tool、MCP 的区别)
- 5.代码
1.Skill 是什么
Skill = 知识文档 + Tool 执行能力。它不是独立的新技术,而是把Tool 包装在一个"按需加载知识"的框架里。
来自:什么是Skill?
Skill是包含指令、脚本和资源的文件夹,Claude 可以动态加载这些文件夹来改进专业任务的性能。技能教会 Claude 如何以可重复的方式完成特定任务,无论是使用您公司的品牌指南创建文档、使用您组织的特定工作流程分析数据,还是自动化个人任务。
设计目标:节省 token 。LLM 的上下文窗口有限,不该把所有领域知识(PDF 处理、图片编辑、音视频转换等)都塞进 system prompt。Skill 的做法是:用到时才加载(渐进式加载)。
MCP 为代理连接多种工具和系统提供了基础协议。然而,一旦连接过多服务器,工具定义和结果可能会消耗过多令牌,降低代理效率。随着MCP使用规模的扩大,有两种常见模式会增加agent成本和延迟:
1.工具定义会让上下文窗口过载;
2.中间工具的结果会消耗额外的token。
2.Skill 的组成部分
2.1. 知识文档 --- SKILL.md
每个 Skill 是一个 Markdown 文件,结构分两部分:
markdown
---
name: pdf
description: 当用户想处理 PDF 时激活此 Skill
---
这里是实际的知识内容...
- YAML 元数据 (两个
--之间):Skill 的名称、描述、触发条件 - 正文:领域知识(API 用法、代码示例、最佳实践)
2.2. 加载器 --- skill_loader.py
skill_loader.py 只有 23 行,核心逻辑:
def load(path: str) -> tuple[dict, str]: # 1. 读文件 # 2. 检查是否以 --- 开头(没有就直接返回全文) # 3. 用 --- 分割,取 parts[1] → YAML 元数据,parts[2] → 正文 # 4. 返回 (metadata, body)
返回的 metadata 用来判断是否该激活此 Skill ,body 是注入到 LLM 上下文的实际知识。
2.3. 底层依赖 --- Tool 系统
Skill 本身不包含执行逻辑,它只是给 LLM 提供"知识"。LLM 看完知识后,如果需要操作文件、执行命令,还是通过 ToolExecutor 调用内置工具(read/write/bash 等)。
3.完整的 Skill 流程
用户:"帮我提取这个 PDF 里的表格"
│
▼
① 检测关键词 → 匹配到 "pdf" Skill
│
▼
② 加载 skills/pdf/SKILL.md
→ metadata.name = "pdf"
→ body = "## pdfplumber...extract_tables()..."
│
▼
③ 把 body 注入到 system prompt
"你是 PDF 专家,参考以下指南:
### Extract Tables
with pdfplumber.open(...) as pdf:
tables = page.extract_tables()..."
│
▼
④ LLM 根据知识,决定调用 Tool
比如:bash({"command": "pip install pdfplumber"})
→ ToolExecutor 执行 → 结果返回 LLM
│
▼
⑤ LLM 最终给出回答
注意:④是可选步骤。如果用户只是问"PDF 有几种提取表格的方法",LLM 只靠 SKILL.md 的知识就能回答,不需要调用工具。
4.Skill和 Tool、MCP 的区别
| 概念 | 解决什么问题 | 怎么说 |
|---|---|---|
| Tool | LLM 需要执行本地操作 | "给你一个函数,你可以调用它" |
| MCP | LLM 需要调用远程服务 | "给你一个远程 API,你可以调用它" |
| Skill | LLM 不懂某个领域知识 | "给你一份文档,你先读懂了再干活" |
一句话 :Tool 给 LLM 手 ,MCP 给 LLM 远程手 ,Skill 给 LLM 大脑的参考资料。
5.代码
skill_loader.py:
python
"""Skill 加载模块"""
import yaml
def load(path: str) -> tuple[dict, str]:
"""解析 SKILL.md 文件,返回 (metadata, content)。"""
with open(path, "r", encoding="utf-8") as f:
content = f.read()
if not content.startswith("---"):
return {}, content
# 找到第二个 ---
parts = content.split("---", 2) # 只分割成三部分:前导空字符串、metadata、剩余内容
if len(parts) < 3:
return {}, content
# 划分元数据和正文
metadata = yaml.safe_load(parts[1])
body = parts[2].strip()
return metadata or {}, body
if __name__ == "__main__":
import sys
from pathlib import Path
# 默认测试文件(相对于脚本所在目录)
script_dir = Path(__file__).parent
test_file = script_dir / "skills/pdf/SKILL.md"
if len(sys.argv) > 1:
test_file = Path(sys.argv[1])
print(f"Loading: {test_file}")
print("=" * 50)
meta, body = load(str(test_file))
print("METADATA:")
for k, v in meta.items():
display = f"{v[:60]}..." if isinstance(v, str) and len(v) > 60 else v
print(f" {k}: {display}")
print(f"\nCONTENT (first 300 chars):\n{body[:300]}...")
skill.md文件:
markdown
---
name: pdf
description: Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.
license: Proprietary. LICENSE.txt has complete terms
---
# PDF Processing Guide
## Overview
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
参考: