为什么讲这个案例:Skill 蒸馏把「Agent 能力扩展→ 自适应与自进化→ 失败分析→ 供应链与伦理安全」四个原本分散的主题串成一条主线,而且几乎零成本可复现——只需一份 SKILL.md 和一批任务轨迹即可动手。

阅读路径:§1 讲格式(是什么),§2 讲方法(怎么蒸),§3 讲运行时(怎么用),§4–§5 是本案例的核心伦理节(能不能用、对谁用),§6 讲评测(值不值),§7 讲失败(错在哪),§8 讨论练习,§9 实验接口预留。


1. Skill 是什么:一份可加载的"流程说明书"

在 agentskills.io 的约定里,一个 Skill 就是一个目录 + 一份 SKILL.md。SKILL.md 采用 front-matter(YAML 元数据)+ 正文(结构化流程说明)的两段式:front-matter 负责"何时被选中",正文负责"选中后怎么做"。

1.1 front-matter:让 Agent 决定"要不要用"

  • name:Skill 唯一标识(小写短横线),供 Bot 按名加载 / 组合引用。
  • description:一句话第三人称说明"做什么 + 何时触发",这是命中判据——Agent 靠它做语义匹配。
  • version:语义化版本(1.2.0),用于回滚与兼容性管理(的版本观)。
  • tags:分类标签,供目录发现与筛选。

1.2 正文:触发条件 / 步骤 / 参数 / 示例 / 边界

正文不是散文,而是一份"给模型看的操作手册"。约定五个小节:触发条件(When)、步骤(How,编号可执行)、参数(Inputs)、示例(Example)、边界(Limits / 不做什么)。

代码块 A(Markdown)——一个完整的"周报生成" Skill(岗位流程场景,不涉及任何真实个人风格):

Markdown · SKILL.md
---
name: weekly-report-gen
description: 当用户要求"写周报 / 汇总本周工作 / 生成本周进展"时,
  按团队标准模板汇总任务、指标与风险,产出结构化周报草稿。
version: 1.2.0
tags: [office, report, template, weekly]
---

# Weekly Report Generation

## 触发条件 (When)
- 用户显式提到"周报 / 本周总结 / weekly status"。
- 已能访问本周任务清单(issue tracker 导出 / 日历 / 聊天记录)。

## 输入参数 (Inputs)
- `period`: 统计区间,默认"本周一至本周日"。
- `tasks_source`: 任务数据路径或只读句柄(必填)。
- `audience`: 汇报对象,影响措辞粒度(manager | team | client)。

## 步骤 (How)
1. 拉取 `period` 内已完成 / 进行中 / 阻塞三类任务。
2. 对每类任务提取:标题、负责人角色(非姓名)、状态、环比变化。
3. 按固定四段模板填充:①本周进展 ②关键指标 ③风险与阻塞 ④下周计划。
4. 指标段落优先引用可量化项(完成率、缺陷数、交付周期)。
5. 生成草稿并**标注每一处数据来源**,供人工核对。

## 示例 (Example)
输入:tasks_source = `exports/2026-W37.csv`,audience = `manager`
输出:见模板渲染结果(含"数据来源"脚注列表)。

## 边界 (Limits)
- 不臆造未出现在数据源里的任务或指标。
- 不记录 / 不推断任何员工个人绩效身份,仅按"角色"聚合。
- 数据源缺失时明确报缺,不用历史值填补。

工程提示:把 description 写成"第三人称 + 触发词 + 边界预告",命中率和安全性都会显著提升——它同时是路由依据和能力契约。格式若与 agentskills.io 官方有出入,以官方仓库为准。


2. 蒸馏流程四步:观察 → 抽取 → 封装 → 验证

"蒸馏"借了知识蒸馏的比喻,但对象不是模型权重,而是行为模式:从多次 Agent 成功轨迹里发现可复用套路,抽象成参数化步骤,写成 SKILL.md,再用同类任务验证是否命中。注意——蒸的是"某类任务怎么做",不是"某个人怎么说话",这条界线在 §4 会展开。

① 观察 收集多条成功轨迹 traces / 步序 / 产物 ② 抽取 对齐共性步骤 参数化差异点 ③ 封装 写 SKILL.md front-matter + 正文 ④ 验证 同类任务回放 命中 & 成功率↑? 未通过 → 回到 ①②:补轨迹 / 改抽象 / 收边界(自进化闭环,) 产出:可版本化、可回滚的 SKILL.md(v1 → v2 → …)
图 2-1 · Skill 蒸馏四步流水线;验证失败沿虚线回流,形成"蒸—验—再蒸"的自进化闭环

四步里最容易被忽略的是②抽取时的"参数化":把轨迹里"每次都不同但结构相同"的部分抽成 Inputs,把"每次都一样"的部分固化成 How 步骤。抽象太粗 → Skill 命中率低;抽象太细 → 换个任务就失效。

方法提示:蒸馏本质是 Agent 的能力自进化:把一次性成功变成可复用资产。但"闭环"必须是人机协同的——第④步的验证判据(成功率↑、步数↓)要提前定死,不能让模型自己既当运动员又当裁判。


3. Hermes Bot 与 Skill 生态

Hermes Bot 承担"运行时"角色:触发(按 description 语义匹配选中 Skill)、加载(把 SKILL.md 正文注入上下文)、组合(多 Skill 串成工作流)。Skill 目录则负责"发现"——按 tags 检索、按 version 拉取。

3.1 与 MCP 工具的边界:内流程 vs 外动作

维度Skill(内部流程)MCP 工具(外部动作)
本质一段"怎么做"的说明文本,被加载进上下文一次"做出去"的函数调用,触达外部系统
产物规划 / 编排 / 判断,不直接改外部状态读文件、发请求、写库等副作用
粒度可跨多步、含分支与边界通常是单原子动作
组合关系Skill 里可调用若干 MCP 工具被 Skill 编排,本身不含流程知识

一句话:Skill 是"菜谱",MCP 工具是"锅铲"。菜谱会写"先焯水再下锅"(流程 + 顺序 + 边界),锅铲只负责"翻一下"(执行一个动作)。

3.2 给 Hermes 加载本地 Skill 目录并触发

代码块 B(Python)——扫描本地 ./skills 目录、解析 front-matter、按自然语言意图命中并触发:

Python
import os, re, yaml

def load_skill(path):
    """解析一个 SKILL.md:返回 (meta, body)。"""
    text = open(path, encoding="utf-8").read
    m = re.match(r"^---\n(.*?)\n---\n(.*)$", text, re.S)
    meta = yaml.safe_load(m.group(1)) if m else {}
    body = m.group(2) if m else text
    return meta, body

class Hermes:
    def __init__(self, skill_dir="./skills"):
        self.skills = {}
        for name in os.listdir(skill_dir):
            fp = os.path.join(skill_dir, name, "SKILL.md")
            if os.path.isfile(fp):
                meta, body = load_skill(fp)
                key = meta.get("name", name)
                self.skills[key] = {"meta": meta, "body": body}
        # 版本冲突检测(:F4 Skill 冲突)
        if len(self.skills) < sum(1 for _ in os.listdir(skill_dir)):
            print("[warn] 存在同名 / 非法 Skill,已跳过")

    def match(self, intent, llm):
        """把候选 description 交给 LLM 做路由,返回最匹配的 skill_name。"""
        cand = {k: v["meta"].get("description", "") for k, v in self.skills.items}
        prompt = f"用户意图:{intent}\n候选技能:{cand}\n只输出最合适的 name,无匹配输出 NONE。"
        return llm.complete(prompt).strip

    def run(self, intent, llm, **inputs):
        name = self.match(intent, llm)
        if name == "NONE" or name not in self.skills:
            return llm.plan_from_scratch(intent)          # 回退:现场规划(对照组)
        skill = self.skills[name]
        ctx = f"[/skill {name} v{skill['meta'].get('version','?')}]\n" + skill["body"]
        return llm.execute(ctx, inputs)                    # 按 SKILL.md 执行

诚实提示:Hermes 的实际接口(加载方式、match/run 签名、Skill 目录约定)以其官方仓库为准;上文是最小可读实现,用于演示"触发—加载—组合"三件事,不含真实网络调用。


4. "人物蒸馏"的技术与合规边界(核心伦理节)

视频与社区里常出现"复现某位专家工作风格"的玩法——本质是拿某人公开发言 / 作品 / 聊天记录当语料,让模型模仿其表达与决策习惯。技术上可行,但合规与人格权风险极高,是的典型场景。

4.1 三种允许场景

  • ✔ ① 虚构角色:蒸馏对象是创作者自己虚构的人物(无真实对应自然人),如架空助手"老周·项目经理"。
  • ✔ ② 本人书面授权:真实人物明确、书面、可撤回地授权对其风格做限定用途蒸馏,授权链完整留档。
  • ✔ ③ 岗位流程标准化:蒸馏的是"某岗位怎么做"而非"某人怎么想"——即本文 §1 的周报 Skill,只按角色聚合,不绑定姓名。

4.2 明确禁止

  • ✘ 未经同意的真实第三方人物蒸馏:以肖像 / 声音 / 表达风格 / 声誉风险为代价,模仿一个未授权的真实在世个人。无论"只是模仿说话"还是"以其名义产出",都触碰人格权与误导红线。

4.3 蒸馏对象 × 授权 × 场景 × 风险

表格 1——合规判定矩阵:

蒸馏对象授权类型允许场景风险等级
虚构角色(无真实对应)创作者自有助手人设、示例、产品 Demo低
岗位标准流程组织内部规范SOP 沉淀、新人培训、周报/评审模板低
真实在职个人本人书面授权 + 留档本人授权的自传播 / 数字分身,标明 AI 生成中
真实公众人物(演讲/著作)无 / 模糊授权❌ 不得以其风格对外产出并暗示为其本人高
真实第三方个人(同事/客户)无同意❌ 禁止:涉肖像/声音/人格权、声誉与误导风险极高

伦理提示:判断"能不能蒸"的第一道闸门是问:数据里有没有可识别到真实自然人的部分?那个人授权了吗? 只要两问有一问答"是/没有",就必须走 §5 的审查表并默认拒绝。本文所有示例统一使用"虚构角色"或"岗位流程",不使用任何真实人物。


5. 伦理与合规审查表

任何 Skill 上线(尤其涉及"风格/表达/人设")前,过一遍这六项。缺任一项 → 不放行。对接供应链/伦理与安全。

  • ① 数据源合法性:语料/轨迹来源是否合规、有无爬取或泄露痕迹。
  • ② 授权链完整性:涉及真实主体时,书面授权是否可追溯、是否可撤回。
  • ③ 肖像权与人格权:是否可能识别到特定自然人,是否触碰肖像/声音/名誉。
  • ④ 输出可识别性:AI 生成内容是否清晰标注,避免"以某人名义"误导。
  • ⑤ 场景风险等级:对外/对内、是否影响他人权益、是否规模化传播。
  • ⑥ 下架与追责机制:出问题时能否快速停用该 Skill、责任主体是否明确。

代码块 C(YAML)——可直接复制填写的审查表模板:

YAML · skill-audit.yaml
skill_name: weekly-report-gen
skill_version: "1.2.0"
reviewer: "张三(合规)"
review_date: "2026-10-01"

checks:
  data_source_legal:            # ① 数据源合法性
    pass: true
    evidence: "内部任务系统导出,已脱敏"
    note: ""
  authorization_chain:          # ② 授权链完整性
    applicable: false           # 岗位流程,不针对个人
    pass: null
    evidence: "蒸馏对象=岗位角色,非自然人"
  personality_rights:           # ③ 肖像权与人格权
    identifiable_real_person: false
    pass: true
    note: "仅按角色聚合,无姓名/声音/肖像"
  output_attributable:          # ④ 输出可识别性
    ai_generated_label: true
    pass: true
  scenario_risk_level:          # ⑤ 场景风险等级
    level: low                  # low | medium | high
    rationale: "对内使用,不对外发布"
  takedown_accountability:      # ⑥ 下架与追责
    kill_switch: true
    owner: "平台运维组"
    pass: true

decision: approve               # approve | reject | pending
blocking_items: []              # 未通过的 ①-⑥ 编号,非空即不得 approve

工程提示:把这张 skill-audit.yaml 与 CI 打通——PR 里若 blocking_items 非空或 decision!=approve,拒绝合并 Skill。合规从"事后道歉"变成"事前门禁",正是想要的"把伦理做进流水线"。


6. 蒸馏前 vs 蒸馏后评测

Skill 到底值不值?做对照:同一批任务,无 Skill(每次让 LLM 现场规划)vs 有 Skill(按 SKILL.md 执行),沿三个维度比:成功率 ↑ / 平均步数 ↓ / token 成本 ↓。

代码块 D(Python)——最小评测器,落 traces.csv:

Python
import csv, statistics as st

def eval_skill_vs_none(tasks, hermes, llm, k=3):
    """tasks: [{'intent':str,'accept':callable}, ...];对每任务跑 无/有 两臂各 k 次。"""
    rows = []
    for tid, t in enumerate(tasks):
        for arm in ("no_skill", "with_skill"):
            for rep in range(k):
                try:
                    if arm == "no_skill":
                        out = hermes.run(t["intent"], llm)          # 回退到 plan_from_scratch
                    else:
                        out = hermes.run(t["intent"], llm, tasks_source=t["source"])
                    ok = bool(t["accept"](out))
                except Exception as e:                              # 失败也记,供 §7 编码
                    out, ok = repr(e), False
                rows.append(dict(
                    task_id=tid, arm=arm, rep=rep,
                    success=int(ok),
                    steps=getattr(llm, "last_step_count", 0),
                    tokens=getattr(llm, "last_token_count", 0),
                    skill_name=getattr(llm, "last_skill", ""),      # 见 §9 schema
                    skill_version=getattr(llm, "last_skill_version", ""),
                    authorization_status=getattr(llm, "last_authz", "n/a"),
                ))
    with open("traces.csv", "w", newline="", encoding="utf-8") as f:
        w = csv.DictWriter(f, fieldnames=list(rows[0]))
        w.writeheader; w.writerows(rows)
    return rows

def summarize(rows):
    print("arm          成功率   均步数   均tokens")
    for arm in ("no_skill", "with_skill"):
        g = [r for r in rows if r["arm"] == arm]
        sr = sum(r["success"] for r in g) / len(g)
        print(f"{arm:12s} {sr*100:5.1f}%  "
              f"{st.mean(r['steps'] for r in g):6.1f}  "
              f"{st.mean(r['tokens'] for r in g):8.0f}")

表格 2——示意结果(示意,非实测值):

臂成功率 ↑平均步数 ↓平均 token 成本 ↓
无 Skill(现场规划)58%9.4~4200
有 Skill(按 SKILL.md)83%5.7~2300

度量提示:三指标要一起看。若某 Skill 让成功率涨了但步数/成本也涨,说明它过度规定了流程;真正的好 Skill 通常三向同时改善——因为"套路"替模型省掉了反复试错。


7. 失败案例编码(为 pr09 铺垫)

Skill 生态有它独有的失败面。给五类失败编码,供 §6 的 traces.csv 人工 / 双标注使用,Kappa 一致性分析见 pr09。

表格 3——失败编码本片段:

编码定义触发条件严重度处置建议
F1未授权蒸馏 / 越权Skill 语料含未同意真实个人且过不了 §5极高立即下架 + 走追责机制
F2幻觉步骤执行时凭空补出 SKILL.md 里没有的操作高收紧 边界 段 + 加"缺数据即报缺"
F3风格漂移输出与 SKILL.md 约定模板/口径持续偏离中补示例、提温度约束或升版本
F4Skill 冲突多 Skill 命中同一意图,步骤互相矛盾中明确优先级 / 拆分 description
F5触发误判不该用该 Skill 的任务被匹配上中细化触发条件与负样本

归因提示:F1 是合规失败(走 §5 下架),F2–F5 是工程失败(回 §2 重蒸)。两者处置路径完全不同,编码时必须分清——这正是 pr09 用 Cohen's Kappa 校标注一致性的原因。


8. 讨论练习练习:AI 蒸馏与职场

三个开放议题,每题给正反方要点与"可核查证据清单"。建议先分头查证再辩论,避免空对空。

议题 A:岗位技能被标准化,是赋能还是取代?

正方:Skill 把重复劳动沉淀成资产,员工从"手工执行"升到"审校与创造",新人上手更快。反方:可复用即"可替代",标准化的深度可能压过人的剩余价值,议价权流向持有 Skill 库的一方。
可核查证据:所在团队引入 SOP/Skill 前后同类任务的人均耗时与错误率;岗位说明书是否随之改写。

议题 B:一个人的工作风格被蒸馏,这个 Skill 归谁?

正方:产出用了公司数据与算力,成果归组织。反方:风格源于个人长期积累,未经书面授权不应被固化为可转让资产。
可核查证据:劳动合同 / 职务作品条款;是否有书面授权与可撤回机制(对照 §4.1)。

议题 C:"蒸馏"是否等于"复制"一个人?

正方:只抽流程与模板,不复制人格与生物特征,属正当抽象。反方:若输出可稳定还原个人表达且对外可识别,其社会效果已接近"数字复制"。
可核查证据:盲测——不知情者能否从输出反推到具体自然人(关联 §5 第③④项)。

动手提示:辩论结论不是"能不能蒸",而是"在什么授权与标注前提下、蒸到什么粒度才可接受"。把每方的证据落到 §4–§5 的判定矩阵与审查表上,才算闭环。


9. 实验接口预留

沿用 pr03 的 traces.csv schema,为 Skill 蒸馏额外追加三列,让 pr08 度量、pr09 Kappa 编码、pr14 实证都能复用同一份轨迹:

  • skill_name:本条轨迹实际命中的 Skill(no_skill 臂留空)。
  • skill_version:命中的版本号,支撑回滚与版本对比。
  • authorization_status:granted / fictional / role-based / denied,把 §4–§5 的合规判定写进数据,供下游按风险切片统计。
↳
向下衔接

这三列是 pr08(度量与 A/B)、pr09(失败标注 + Cohen's Kappa)、pr14(实证研究)共用的接口。authorization_status=denied 的行应触发 F1,直接从质量指标里剔除并单独统计——把伦理维度变成可查询的数据列。

格式提示:追加列只做"加法"、不改 pr03 已有列名,保证旧脚本向前兼容。字段取值集若与官方后续定义冲突,以官方为准并在此注明版本。


一页纸总结:Skill = front-matter + 正文的可加载流程说明书;蒸馏 = 观察→抽取→封装→验证的自进化闭环;Hermes 负责触发/加载/组合(Skill 是菜谱、MCP 是锅铲);人物蒸馏只允许"虚构角色 / 书面授权 / 岗位流程"三场景,未经同意的真实第三方一律禁止并用六项审查表 + 数据列(authorization_status)把它做进流水线;价值用"成功率↑/步数↓/成本↓"三维评测验证,失败用 F1–F5 编码归因。