如何将Skills进阶提升到更高层次?

摘要:Skills、Tools、MCP 与 Subagents 完全指南 目录 核心概念 MCP(Model Context Protocol) Tools(工具) Skills(技能) Subagents(子代理) 协作流程 skill-cre
Skills、Tools、MCP 与 Subagents 完全指南 目录 核心概念 MCP(Model Context Protocol) Tools(工具) Skills(技能) Subagents(子代理) 协作流程 skill-creator 深度解析 项目结构 核心文件详解 完整工作流程 三个专用子代理 实践:创建自定义技能 参考资源 核心概念 MCP 全称:Model Context Protocol(模型上下文协议) 定义:AI "插件化"的标准协议,定义统一的请求/响应格式,让 AI 能够链接各种按照此协议开发的接口(数据库、API、文件系统等)。 大白话:MCP 是 AI 和外部世界对话的"通用语言"——就像 USB 接口标准,任何设备插上就能用。 Tools 定义:可以调用的具体功能函数,就像工具箱里的锤子、螺丝刀。 特点: 有明确的名字和参数 执行一个具体动作(查数据、发消息、截图) 有输入和输出 示例: feishu_doc read doc_token="xxx" wecom_mcp call contact getContact '{}' agent-browser click selector="#submit" Skills 定义:能力模块,提供一组相关的 Tools 集合。 特点: 描述什么时候触发(trigger condition) 包含具体的操作指南(Markdown) 可以引用外部资源(scripts/、references/、assets/) 示例技能: feishu-doc:读写飞书文档 agent-browser:浏览器自动化 skill-creator:创建和优化技能 Subagents 定义:主 AI 派出去的"小助手团队",独立干活,干完回来汇报。 为什么需要: 任务复杂,主 AI 一个人忙不过来 需要并行处理,加快速度 某些任务需要专门技能 关键点: Subagent 是独立运行的 AI,有自己的思考能力 Subagent 也有自己的 Skills/Tools/MCP 能力(可以不同) 主 AI 只负责分派和汇总,不干涉具体执行 协作流程 用户任务 ↓ 主agent接收任务 ↓ 主agent分析:是否需要分派Subagents? ├─ 否 → 主agent直接使用自己的Skills/Tools/MCP完成 └─ 是 → spawn Subagent(s),分配子任务 ↓ Subagent接收子任务 ↓ Subagent规划执行步骤(思考需要哪些数据、工具) ↓ 是否需要外部数据? ├─ 是 → 调用MCP工具获取 └─ 否 → 继续 ↓ 调用Skills中的Tools处理数据 ↓ 完成任务,返回结果给主agent ↓ 主agent汇总所有Subagent结果 ↓ 主agent整合、格式化最终结果 ↓ 输出给用户 核心要点总结 概念 是什么 类比 Skills 能力模块(提供Tools集合) 手机App Tools 具体可调用的函数 App里的按钮 MCP 通信协议(Tools底层) 通用语言/电话 Subagents 并行执行的小智能体 外包团队 主agent 协调者+最终整合者 项目经理 关键区别: Skills 是静态能力包,Tools 是 Skills 里的具体动作 MCP 是某些 Tools 的底层通信方式 Subagents 是并行执行的任务分派单元 skill-creator 深度解析 项目结构 skill-creator/ ├── SKILL.md # 技能主文档(33KB) ├── agents/ # 子代理指令集 │ ├── analyzer.md # 分析代理:分析基准测试结果 │ ├── comparator.md # 比较代理:盲测比较两个输出 │ └── grader.md # 评分代理:评估断言通过情况 ├── references/ │ └── schemas.md # JSON 数据结构定义 ├── scripts/ # 可执行脚本 │ ├── aggregate_benchmark.py # 聚合基准数据 │ └── generate_report.py # 生成HTML评估报告 └── assets/ # 静态资源(模板等) 核心文件详解 1. SKILL.md(灵魂文件) 作用:定义 skill-creator 这个技能的完整行为规范 结构: --- name: skill-creator description: Create new skills, modify and improve existing skills... --- 工作流程(Markdown 正文): 1. 捕获意图(问清楚技能要干吗) 2. 采访研究(了解边界、依赖、工具) 3. 编写 SKILL.md(按规范写) 4. 创建测试用例(evals.json) 5. 运行测试(并行spawn子代理) 6. 评估结果(评分+benchmark) 7. 改进技能(根据反馈修改) 8. 重复直到满意 9. 优化触发描述(可选) 关键概念: 概念 说明 渐进式披露 技能内容分层加载(元数据→SKILL.md正文→引用文件),避免一次性加载太多 无惊喜原则 技能不能包含恶意代码,必须与描述一致 迭代循环 draft → test → review → improve(闭环) 客观评估 用断言(assertions)和基准测试(benchmark)量化技能效果 2. agents/*.md(三个专用子代理) 这些文件是给子代理看的指令,当主技能 spawn 这些代理时,会把对应的 .md 内容发给他们作为"工作手册"。 (1) comparator.md(盲测比较员) 角色:像评委,给两个输出打分,但不知道哪个是哪个(盲测) 工作流程: 收到:输出A、输出B、任务描述 ↓ 理解任务要求(要产出什么?质量标准?) ↓ 制定评分标准(内容分+结构分,每项1-5分) ↓ 给A和B分别打分 ↓ 决定谁赢了(根据总分,次要看断言通过率) ↓ 输出 JSON 结果(winner, reasoning, rubric) 输出示例: { "winner": "A", "reasoning": "Output A provides a complete solution...", "rubric": { "A": { "content_score": 4.7, "structure_score": 4.3, "overall_score": 9.0 }, "B": { "overall_score": 5.4 } } } (2) analyzer.md(赛后分析师) 角色:比赛完后,分析为什么赢家赢了,输家输了,给出改进建议 工作流程: 收到:winner/loser的技能路径、执行记录、比较结果 ↓ 读输家的技能 → 读赢家的技能 → 找差异 ↓ 读输家的执行记录 → 读赢家的执行记录 → 找行为差异 ↓ 总结: • 赢家强在哪里? • 输家弱在哪里? ↓ 输出改进建议(priority + category + suggestion) 输出示例: { "winner_strengths": ["Clear step-by-step instructions", "Included validation script"], "loser_weaknesses": ["Vague instruction", "No script for validation"], "improvement_suggestions": [ { "priority": "high", "category": "instructions", "suggestion": "Replace 'process appropriately' with explicit steps", "expected_impact": "Would eliminate ambiguity" } ] } (3) grader.md(断言评分员) 角色:检查输出是否满足预设的"断言"(expectations),并评估测试用例本身的质量 工作流程: 收到:断言列表、执行记录、输出文件路径 ↓ 读执行记录 + 检查输出文件 ↓ 对每条断言: • 找证据(transcript 或输出文件里有没有?) • 判断 PASS/FAIL(要有明确证据,不能是巧合) ↓ 额外工作: • 提取输出中的隐含声明(claims)并验证 • 读用户笔记(如果有) • 评估断言质量(是否太松?是否遗漏重要检查?) ↓ 输出 grading.json 评分标准: PASS:有明确证据,且反映实质性完成 FAIL:无证据、有反证、或只是表面满足 burden of proof:默认 FAIL,除非证据确凿 输出示例: { "expectations": [ {"text": "The output includes the name", "passed": true, "evidence": "Found in transcript..."}, {"text": "The spreadsheet has SUM formula", "passed": false, "evidence": "No spreadsheet was created"} ], "summary": {"passed": 1, "failed": 1, "pass_rate": 0.5}, "eval_feedback": { "suggestions": ["Assertion too loose, consider adding content verification"] } } 3. references/schemas.md(数据格式字典) 作用:定义所有 JSON 文件的 schema,确保不同组件能互相理解 包含的结构: 文件名 用途 位置 evals.json 定义测试用例 evals/evals.json grading.json 评分结果 <run-dir>/grading.json metrics.json 执行指标 <run-dir>/outputs/metrics.json timing.json 时间记录 <run-dir>/timing.json benchmark.json 基准测试汇总 benchmarks/<timestamp>/benchmark.json comparison.json 盲测比较结果 <grading-dir>/comparison-N.json analysis.json 分析报告 <grading-dir>/analysis.json history.json 迭代历史 工作区根目录 4. scripts/*.py(实用工具) aggregate_benchmark.py 作用:把多个运行(with_skill、without_skill,每个3次重复)的数据聚合成统计摘要 输入:<workspace>/iteration-N/ 下的多个 grading.json 输出:benchmark.json + benchmark.md 关键计算: # 对每个配置(with_skill, without_skill)计算: mean = average(所有run的pass_rate) stddev = 标准差(看波动大不大) min/max = 最好/最差 # delta = with_skill 均值 - without_skill 均值 delta = { "pass_rate": "+0.50", # 技能提升50% "time_seconds": "+13.0", # 慢了13秒 "tokens": "+1700" # 多用1700 tokens } generate_report.py 作用:根据 run_loop.py(描述优化)的输出,生成可视化的HTML报告 输入:run_loop 的 JSON 输出 输出:HTML 文件,表格展示: 行:每个描述版本(iteration 1, 2, 3...) 列:每个测试查询 单元格:✅ 或 ❌(是否触发了技能) 功能: 区分 train(训练集)和 test(测试集)的触发率 自动刷新(可选) 显示 train/test 得分,防止过拟合 完整工作流程 场景:你要做一个"把PDF转Excel"的技能 第1步:想清楚技能要干吗 ↓ 第2步:写初版 SKILL.md(说清楚:遇到PDF转Excel就触发,用python写脚本) ↓ 第3步:设计测试用例(evals.json) - case1: "把这个销售PDF转成Excel" - case2: "财报PDF,提取表格" ↓ 第4步:并行运行测试 spawn 3个 with-skill 代理 + 3个 without-skill 代理 每个代理独立完成任务,保存输出 ↓ 第5步:评分 grader 代理检查:输出是不是Excel?数据对不对? ↓ 第6步:聚合统计 aggregate_benchmark.py 算: with-skill 平均通过率 85%,标准差 5% without-skill 平均通过率 35%,标准差 8% ↓ 第7步:看报告 generate_report.py 生成HTML,打开浏览器看: - 哪些case过了?哪些挂了? - 输出文件长什么样? ↓ 第8步:改进技能 发现:技能里没说"遇到扫描件要用OCR" 修改 SKILL.md,加上OCR步骤 ↓ 第9步:重复4-8步,直到用户满意 ↓ 第10步:优化触发描述(可选) run_loop.py 自动测试20个query,调整description ↓ 第11步:打包成 .skill 文件给用户 三个专用子代理对比 代理 角色 输入 输出 用途 grader 断言评分员 断言 + transcript + outputs grading.json 客观评分每条断言 comparator 盲测比较员 输出A + 输出B + 任务 comparison.json A/B测试,决定哪个更好 analyzer 赛后分析师 winner/loser的skill + transcript analysis.json 分析胜负原因,给出改进建议 实践:创建自定义技能 步骤1:使用 skill-creator # 如果你在 Claude Code 中,直接说: "我想创建一个技能,用来..." # skill-creator 会引导你: # 1. 捕获意图(问清楚用途、触发条件、输出格式) # 2. 采访研究(边缘案例、依赖、示例) # 3. 编写 SKILL.md 步骤2:设计测试用例 创建 evals/evals.json: { "skill_name": "my-skill", "evals": [ { "id": 1, "prompt": "User's task prompt", "expected_output": "Description of expected result", "files": ["evals/files/sample1.pdf"], "expectations": [ "The output includes X", "The skill used script Y" ] } ] } 步骤3:运行评估 # skill-creator 会: # 1. spawn with_skill ×3(并行) # 2. spawn without_skill ×3(基线) # 3. 保存结果到 workspace/iteration-1/ 步骤4:查看报告 # 生成 HTML 报告 python -m scripts.generate_report <workspace>/iteration-1 \ --skill-name "my-skill" \ --benchmark <workspace>/iteration-1/benchmark.json 步骤5:迭代改进 根据 feedback.json 和 analysis.json 修改 SKILL.md,重复步骤3-4。 步骤6:描述优化(可选) 提升触发准确率: python -m scripts.run_loop \ --eval-set trigger_evals.json \ --skill-path ./my-skill \ --model <current-model> \ --max-iterations 5 步骤7:打包 python -m scripts.package_skill ./my-skill # 输出:my-skill.skill 参考资源 官方仓库 anthropics/skills:https://github.com/anthropics/skills 官方预设 Skills 技能 用途 链接 docx Word 文档处理 查看 xlsx Excel 表格处理 查看 pptx PowerPoint 处理 查看 pdf PDF 处理 查看 教程 🎥 B站视频:吴恩达《Agent Skills with Anthropic》教程中文版 📚 中文教程:Datawhale agent-skills 📚 英文教程:Deeplearning-ai Agent-skills 附录:技能 Anatomy skill-name/ ├── SKILL.md (required) │ ├── YAML frontmatter (name, description required) │ └── Markdown instructions └── Bundled Resources (optional) ├── scripts/ - Executable code for deterministic/repetitive tasks ├── references/ - Docs loaded into context as needed └── assets/ - Files used in output (templates, icons, fonts) 渐进式披露: Metadata(name + description)— Always in context (~100 words) SKILL.md body — In context whenever skill triggers (<500 lines ideal) Bundled resources — As needed (unlimited, scripts can execute without loading)