Minion Skills:Claude Code Skills的開源實(shí)現(xiàn)
引言
Claude Code最近推出了一個令人興奮的特性——Skills系統(tǒng)。它讓AI Agent能夠動態(tài)加載專業(yè)能力,按需"學(xué)習(xí)"處理PDF、Excel、PPT等專業(yè)文檔的技能。
作為一個開源愛好者,我立刻意識到這個設(shè)計的價值,并在Minion框架中實(shí)現(xiàn)了完整的開源版本。本文將介紹Skills的設(shè)計理念,以及我的開源實(shí)現(xiàn)細(xì)節(jié)。
Skills解決了什么問題?
在開發(fā)AI Agent的過程中,有一個核心矛盾:
Context Window的有限性 vs 能力需求的無限性
傳統(tǒng)做法是把所有工具、所有指令都塞進(jìn)system prompt:
System Prompt = 基礎(chǔ)指令 + 所有工具描述 + 所有專業(yè)知識
? ? ? ? ? ? = 50K+ tokens
? ? ? ? ? ? = 高延遲 + 高成本 + 低效率
更糟的是,大多數(shù)時候用戶只需要其中一小部分能力。當(dāng)用戶問"幫我處理這個PDF"時,系統(tǒng)卻加載了處理Excel、數(shù)據(jù)庫、代碼等所有能力的上下文。
Skills的核心理念
Claude Code的Skills設(shè)計靈感來自一個簡單的類比:
人類專家不是把所有知識都裝在腦子里,而是在需要時查閱手冊、調(diào)用專業(yè)知識。
Skills系統(tǒng)讓AI Agent也具備這種能力:
用戶請求 → Agent識別需要PDF技能 → 動態(tài)加載PDF處理指令
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?→ 執(zhí)行專業(yè)任務(wù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?→ 返回結(jié)果
Minion的開源實(shí)現(xiàn)
看到Claude Code的Skills設(shè)計后,我決定在Minion框架中實(shí)現(xiàn)一個完全兼容的開源版本,讓更多開發(fā)者能夠使用這一特性。
1. Skill的定義:簡潔而強(qiáng)大
每個Skill就是一個包含SKILL.md文件的目錄:
.minion/skills/
├── pdf/
│? ?├── SKILL.md? ? ? ? ? # 技能定義和指令
│? ?├── references/? ? ? ?# 參考資料
│? ?├── scripts/? ? ? ? ? # 輔助腳本
│? ?└── assets/? ? ? ? ? ?# 資源文件
├── xlsx/
│? ?└── SKILL.md
└── docx/
? ? └── SKILL.md
SKILL.md采用YAML frontmatter + Markdown body的格式:
---
name: pdf
description: PDF文檔處理技能,支持文本提取、表格解析、表單填寫等
license: MIT
---
## 當(dāng)使用此技能時
你現(xiàn)在具備了專業(yè)的PDF處理能力...
### 文本提取
使用pypdf2庫進(jìn)行文本提?。?br>...
### 表格識別
使用tabula-py進(jìn)行表格提?。?br>...
2. 智能發(fā)現(xiàn):按需加載
Skill Loader會在多個位置搜索可用技能:
class SkillLoader:
? ? SKILL_DIRS = [
? ? ? ? ".claude/skills",? ?# 兼容Claude Code
? ? ? ? ".minion/skills",? ?# Minion原生
? ? ]
? ? def get_search_paths(self):
? ? ? ? paths = []
? ? ? ? # 項(xiàng)目級優(yōu)先
? ? ? ? for skill_dir in self.SKILL_DIRS:
? ? ? ? ? ? paths.append((self.project_root / skill_dir, "project"))
? ? ? ? # 用戶級次之
? ? ? ? for skill_dir in self.SKILL_DIRS:
? ? ? ? ? ? paths.append((self.home_dir / skill_dir, "user"))
? ? ? ? return paths
這種分層設(shè)計帶來了靈活性:
.claude/skills和.minion/skills路徑3. 優(yōu)雅的注冊表:快速查找
class SkillRegistry:
? ? def register(self, skill: Skill) -> bool:
? ? ? ? """注冊技能,高優(yōu)先級覆蓋低優(yōu)先級"""
? ? ? ? existing = self._skills.get(skill.name)
? ? ? ? if existing:
? ? ? ? ? ? priority = {"project": 0, "user": 1, "managed": 2}
? ? ? ? ? ? if priority[skill.location] >= priority[existing.location]:
? ? ? ? ? ? ? ? return False? # 已有更高優(yōu)先級的同名技能
? ? ? ? self._skills[skill.name] = skill
? ? ? ? return True
? ? def generate_skills_prompt(self, char_budget=10000):
? ? ? ? """生成可用技能列表,控制context消耗"""
? ? ? ? # 智能截斷,確保不超預(yù)算
? ? ? ? ...
4. Skill Tool:執(zhí)行入口
class SkillTool(BaseTool):
? ? name = "Skill"
? ? description = "動態(tài)加載并執(zhí)行專業(yè)技能"
? ? def execute_skill(self, skill: str) -> Dict[str, Any]:
? ? ? ? skill_obj = self.registry.get(skill)
? ? ? ? if skill_obj is None:
? ? ? ? ? ? return {
? ? ? ? ? ? ? ? "success": False,
? ? ? ? ? ? ? ? "error": f"Unknown skill: {skill}",
? ? ? ? ? ? ? ? "available_skills": self.registry.list_all()[:10]
? ? ? ? ? ? }
? ? ? ? # 獲取技能的完整指令
? ? ? ? prompt = skill_obj.get_prompt()
? ? ? ? return {
? ? ? ? ? ? "success": True,
? ? ? ? ? ? "skill_name": skill_obj.name,
? ? ? ? ? ? "prompt": prompt,? # 注入到對話上下文
? ? ? ? }
實(shí)際效果
場景1:處理復(fù)雜PDF報告
用戶:幫我分析這份財務(wù)報告 report.pdf,提取所有表格數(shù)據(jù)
Agent:
1. 識別需要PDF處理能力
2. 調(diào)用 Skill("pdf") 加載PDF技能
3. 獲得專業(yè)的PDF處理指令
4. 使用pypdf2提取文本
5. 使用tabula-py提取表格
6. 返回結(jié)構(gòu)化數(shù)據(jù)
場景2:批量處理Excel文件
用戶:把這10個Excel文件合并,并生成匯總統(tǒng)計
Agent:
1. 調(diào)用 Skill("xlsx") 加載Excel技能
2. 獲得pandas、openpyxl等庫的專業(yè)用法
3. 批量讀取文件
4. 合并數(shù)據(jù)、計算統(tǒng)計
5. 生成新的Excel報告
性能對比
指標(biāo)傳統(tǒng)方式Skills方式基礎(chǔ)Context50K tokens10K tokensPDF任務(wù)Context50K tokens10K + 3K tokens首次響應(yīng)延遲較長較短專業(yè)任務(wù)質(zhì)量一般更精準(zhǔn)
設(shè)計亮點(diǎn)
1. 聲明式定義
技能通過Markdown定義,非技術(shù)人員也能創(chuàng)建和維護(hù):
---
name: data-analysis
description: 數(shù)據(jù)分析技能
---
## 數(shù)據(jù)清洗步驟
1. 檢查缺失值
2. 處理異常值
...
2. 資源綁定
技能可以帶有參考資料、腳本等資源:
skill_obj.get_prompt()
# 返回:
# Loading: pdf
# Base directory: /Users/xxx/.minion/skills/pdf
#
# [技能內(nèi)容,可以引用 references/api_doc.md 等]
3. 版本和來源追蹤
@dataclass
class Skill:
? ? name: str
? ? description: str
? ? content: str
? ? path: Path
? ? location: str? # project, user, managed
? ? license: Optional[str]
? ? metadata: Dict[str, Any]
為什么做開源實(shí)現(xiàn)?
Claude Code的Skills是一個出色的設(shè)計,但它是閉源的、與Claude生態(tài)綁定的。我實(shí)現(xiàn)開源版本的原因:
未來方向
1. 技能市場
想象一個Skills Marketplace,開發(fā)者可以發(fā)布、分享專業(yè)技能:
minion skill install data-science-toolkit
minion skill install legal-document-analysis
2. 智能推薦
根據(jù)用戶歷史和當(dāng)前任務(wù),自動推薦相關(guān)技能:
def recommend_skills(user_request, history):
? ? # 分析請求內(nèi)容
? ? # 匹配最相關(guān)的技能
? ? # 預(yù)加載可能需要的技能
? ? ...
3. 技能組合
多個技能協(xié)同工作:
# 分析PDF中的數(shù)據(jù),生成Excel報告
skills_used = ["pdf", "xlsx", "data-visualization"]
4. 自學(xué)習(xí)技能
Agent在完成復(fù)雜任務(wù)后,自動生成新技能供未來使用:
async def learn_skill_from_session(session_log):
? ? # 分析成功的任務(wù)執(zhí)行過程
? ? # 提取可復(fù)用的模式和指令
? ? # 生成新的SKILL.md
? ? ...
結(jié)語
Claude Code的Skills系統(tǒng)體現(xiàn)了一個核心設(shè)計哲學(xué):
不要試圖讓AI什么都懂,而是讓它知道在需要時去哪里找到答案。
這種"專家系統(tǒng)"思維,讓AI Agent從"通才"進(jìn)化為"能快速變身專家的通才"。
通過Minion的開源實(shí)現(xiàn),這一能力現(xiàn)在可以被更廣泛的開發(fā)者使用,不受限于特定的LLM供應(yīng)商或閉源生態(tài)。
歡迎試用和貢獻(xiàn):
讓我們一起構(gòu)建更開放、更智能的AI Agent生態(tài)。
關(guān)于作者:鄭炳南,畢業(yè)于復(fù)旦大學(xué)物理系。擁有20多年軟件開發(fā)經(jīng)驗(yàn),是開源社區(qū)的活躍貢獻(xiàn)者,參與貢獻(xiàn)metagpt、smolagents、mem0等項(xiàng)目,為ICLR 2025 oral paper《AFlow: Automating Agentic Workflow Generation》的作者之一。
往期文章: