1. 从 2523 条 Prompt 到可继承 Skill一次 Claude Code 蒸馏实验的完整复盘如果你明天换一台电脑或者换一个同事接手你的项目你过去和 AI 协作时形成的那套节奏——怎么提问、怎么拆任务、怎么验收结果——能被打包带走吗大多数人没想过这个问题因为这些东西散落在~/.claude/的会话历史里既不在 Git 仓库也不在文档里。我最近做了一次实验用 Claude Code 把 2523 条历史 Prompt 做去重、聚类与蒸馏产出一个可以被同事和 AI 直接加载的 Skill。这篇文章会把目录结构、蒸馏脚本、Skill 配置模板以及在 Agent-Teams 里加载后的验证动作全部写清楚你可以照着做一遍。先说清楚这个 Skill 是什么、能做什么、适合谁。它本质上是一个放在~/.claude/skills/下的结构化知识包用SKILL.md做总索引子目录按身份、思维、语气、工作流分层。Claude Code 加载它之后回答风格、任务拆解方式、输出格式都会向你的历史习惯靠拢。适合三类人长期用 Claude Code 做开发、手里攒了几百上千条会话记录的人需要把个人工作流交接给团队的人以及想从第三视角观察自己协作模式的人。不适合刚用几天、历史数据不足百条的情况因为蒸馏的前提是有足够的原材料。整个流程分四步先盘点数据源再跑蒸馏脚本做去重和聚类然后生成 Skill 目录与配置最后在 Agent-Teams 里加载验证。下面按这个顺序展开每一步都给可复制的命令和配置。2. 前置准备TaoToken 接入 Claude Code 与数据源盘点在动手蒸馏之前得先保证 Claude Code 能稳定跑起来尤其是需要长上下文、多轮迭代的蒸馏任务。我这边用的是 TaoToken 的 API 接入方式Base URL 指向https://taotoken.net/api模型走 Claude 系列。如果你还没配好先花五分钟把这一步做完不然后面脚本跑到一半断流会很麻烦。配置 Claude Code 的环境变量在~/.zshrc或~/.bashrc里加export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYsk-你的Key export ANTHROPIC_MODELclaude-sonnet-4-5-20250929Key 在控制台的 API Keys 页面生成地址是https://taotoken.net/console/api-keys。生成后source ~/.zshrc让变量生效然后跑一句claude --version确认 CLI 能识别。这一步的验证请求很简单curl -s https://taotoken.net/api/v1/messages \ -H x-api-key: $ANTHROPIC_API_KEY \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d {model:claude-sonnet-4-5-20250929,max_tokens:64,messages:[{role:user,content:reply with ok}]}返回里能看到content字段带ok就说明链路通了。如果返回 401多半是 Key 没生效或者环境变量没 source如果报local proxy failed检查是不是本地有别的代理工具在抢端口。接下来盘点数据源。Claude Code 的会话历史默认在~/.claude/下结构大致是这样~/.claude/ ├── history.jsonl # 全局历史索引 ├── projects/ # 按项目分目录的会话 │ ├── -Users-xzl-proj-a/ │ │ └── *.jsonl │ └── -Users-xzl-proj-b/ └── skills/ # 已有 Skill先统计一下规模别急着蒸馏find ~/.claude/projects -name *.jsonl | wc -l du -sh ~/.claude/projects cat ~/.claude/history.jsonl | wc -l我这边跑出来是 104 个项目会话目录、363MB 累积数据、去掉空行后 2523 条有效 Prompt。这个量级刚好太少聚类没意义太多单次上下文塞不下需要分批。除了 Prompt 历史我还把三棵项目树和已有的user-profileSkill 一起作为补充输入~/GithubProjects/ # 个人开源项目 ~/ai-projects-all-xzl/ # 企业 AI 项目 ~/My-Project/ # 研究、博客、资料库项目树不用全量读蒸馏脚本里只做目录结构采样和关键文件摘要避免上下文爆炸。这一步做完原材料就齐了。3. 可复制配置蒸馏脚本与 Skill 目录模板蒸馏的核心思路是三步去重、聚类、生成。去重解决 2523 条里大量重复指令的问题聚类把相似意图归到同一主题生成则把聚类结果写成 Skill 文件。下面这个脚本可以直接存成distill.py跑。import json, os, hashlib, re from collections import defaultdict from pathlib import Path CLAUDE_DIR Path.home() / .claude / projects OUT_DIR Path.home() / .claude / skills / my-mind OUT_DIR.mkdir(parentsTrue, exist_okTrue) def normalize(text): text re.sub(r\s, , text.strip().lower()) return text def load_prompts(): seen, prompts set(), [] for f in CLAUDE_DIR.rglob(*.jsonl): for line in f.read_text(errorsignore).splitlines(): try: obj json.loads(line) except json.JSONDecodeError: continue if obj.get(type) ! user: continue content obj.get(message, {}).get(content, ) if isinstance(content, list): content .join(c.get(text, ) for c in content if isinstance(c, dict)) if not content or len(content) 8: continue key hashlib.md5(normalize(content).encode()).hexdigest() if key in seen: continue seen.add(key) prompts.append(content) return prompts def bucket(prompts): groups defaultdict(list) rules { agent-teams: [agent-teams, teammate, 并行], skill-load: [skill, 加载, 结合我的], discuss-first: [先讨论, 不做开发, 对齐], output-format: [保存为 md, 输出格式, 给我], } for p in prompts: low p.lower() for name, kws in rules.items(): if any(k in low for k in kws): groups[name].append(p) break else: groups[misc].append(p) return groups if __name__ __main__: ps load_prompts() print(f去重后 Prompt 数: {len(ps)}) groups bucket(ps) for name, items in groups.items(): (OUT_DIR / fraw-{name}.txt).write_text(\n---\n.join(items[:200])) print(f{name}: {len(items)})跑完会得到几个raw-*.txt每个文件是一类 Prompt 的样本。接下来把这些样本喂给 Claude Code 做二次蒸馏生成结构化 Skill。目录模板长这样# ~/.claude/skills/my-mind/SKILL.md --- name: my-mind description: 个人协作风格与工作流蒸馏包加载后按本人习惯拆解任务 version: 1.0 --- # my-mind 索引 - 01-identity/ # 身份、技术栈、表达习惯 - 02-thinking/ # 判断模式、决策偏好 - 03-voice/ # 语气、句式指纹 - 04-self-calibration/# 已知短板与纠偏提示 - 05-workflows/ # 可复用 SOP - 06-projects/ # 项目树摘要每个子目录放一个index.md主SKILL.md只做索引加载时按需读取避免一次性塞 20 万字进上下文。05-workflows/是同事最该看的部分里面放agent-teams-playbook.md、blog-production.md、mvp-development.md这类可直接复用的流程文件。生成这些文件时让 Claude Code 分批处理每批只读一个raw-*.txt输出对应的 markdown最后合并。如果你用 Cline 或 CC Switch 管理多个模型配置记得把三件套写全Base URL 填https://taotoken.net/apiKey 填控制台生成的Model ID 填claude-sonnet-4-5-20250929。Codex 用户则在~/.codex/auth.json里对应填base_url和api_key字段别只填一半否则会报reading choices之类的解析错误。4. 验证请求在 Agent-Teams 中加载 Skill 并对比效果Skill 生成完得验证它真的生效。最直接的方式是在 Agent-Teams 里加载然后跑一个对照任务。先确认 Skill 被识别ls ~/.claude/skills/my-mind/ cat ~/.claude/skills/my-mind/SKILL.md | head -20然后在 Claude Code 里发一条加载指令结合我的 my-mind skill启动 Agent-Teams teammate 都用 opus max effort 每个 teammate 结果保存为 md 方便共享。 不要停下来等我确认自己迭代直到完成。这条指令本身就是从历史 Prompt 里蒸馏出来的高频模板出现次数很高。加载后Agent-Teams 会按 Skill 里05-workflows/agent-teams-playbook.md定义的 SOP 拆任务一个 teammate 负责数据采样一个负责聚类一个负责写文件最后主 agent 合并。验证效果对比我做了两组测试。第一组不加载 Skill直接让 Claude Code 写一个数据清洗脚本第二组加载 Skill 后再写同样的脚本。差异很明显不加载时输出是通用模板变量命名随意没有中间结果落盘加载后脚本会自动把中间结果存成 md命名遵循我历史习惯的raw-xxx.txt格式而且会在开头先问一句“要不要先讨论方案再动手”——这正是 Skill 里discuss-first规则在起作用。再跑一个更硬的验证让 Agent-Teams 处理 500 条 Prompt 的聚类任务观察是否按 Skill 里的并行模板执行# 在 Claude Code 会话里 结合 my-mind skill把 raw-misc.txt 里的 500 条 prompt 聚类 每个 teammate 处理 100 条结果存成 cluster-{n}.md 最后合并成 clusters.md不要等我确认。实测下来Agent-Teams 会起 5 个 teammate 并行跑每个产出cluster-1.md到cluster-5.md主 agent 合并成clusters.md。整个过程没有中途停下来问确认符合 Skill 里“不要停下来等我确认”的规则。这就是可继承的体现换个人来发同样的指令得到的工作方式和我本人操作时一致。如果你只想快速验证模型链路是否正常可以先用模型对话页面发一条测试消息确认返回正常再跑 Agent-Teams。地址是https://taotoken.net/models。长期做这类编码和 Agent 任务的话Coding Plan 会更划算地址是https://taotoken.net/coding-plan。5. 常见报错排查401、local proxy failed 与 reading choices蒸馏和加载过程中踩过几个坑都是真实报错对照着排查能省不少时间。401 Unauthorized。最常见的原因是ANTHROPIC_API_KEY没生效。先确认echo $ANTHROPIC_API_KEY有输出再确认 Key 没有多余空格。如果用的是 CC Switch 切换配置检查切换后有没有重新 source。还有一种情况是 Key 被禁用或额度耗尽去控制台看一眼状态。local proxy failed。这个报错通常出现在本地有代理工具占用端口或者ANTHROPIC_BASE_URL被别的配置覆盖了。检查~/.claude/settings.json里有没有硬编码的 base_url和 shell 环境变量冲突。解决方式是统一只保留一处配置其他清掉。reading choices 解析失败。这个多出现在用 Codex 或 Cline 时返回体格式和预期不符。检查~/.codex/auth.json里的base_url是不是写成了https://taotoken.net/api注意不要漏掉/api也不要多加/v1。Model ID 要和请求体里的一致否则会返回空 choices。OAuth 相关报错。如果你之前用 OAuth 方式登录过 Claude Code切换成 API Key 后可能残留旧凭证。删掉~/.claude/credentials.json或对应的缓存文件重新用环境变量方式启动。Skill 加载后不生效。先确认SKILL.md的 frontmatter 格式正确name和目录名一致。再确认加载指令里写的 skill 名和name字段匹配。如果还是不行检查~/.claude/skills/下有没有同名目录冲突。蒸馏脚本跑一半中断。多半是单次读取的 jsonl 文件太大内存爆了。改成流式逐行读或者按项目目录分批处理。我这边 363MB 数据分了 4 批跑完每批约 600 条 Prompt。排查时建议开一个单独的终端跑curl验证链路和 Claude Code 会话分开这样能快速定位是网络层还是应用层的问题。接入文档在https://taotoken.net/doc里面有各客户端的完整配置示例。6. 把蒸馏变成持续更新从 v1.0 到可继承的工作方式做完这次实验我最大的感受是蒸馏出来的 Skill 不是终点而是一个需要持续更新的起点。2523 条 Prompt 蒸馏出的 v1.0记录的是某个时间点的行为快照。如果我的工作习惯变了Skill 不更新就会出现一个过时的“我”在替现在的我说话。所以我在05-workflows/里加了一个update-skill.md规定每积累 200 条新 Prompt 就跑一次增量蒸馏把新的句式、新的工作流合并进去。增量脚本复用第 3 节的distill.py只是把输出目录改成my-mind-v2然后人工对比差异决定哪些合并、哪些丢弃。对于想交接给团队的场景建议把 Skill 和项目树摘要一起打包放在团队共享的~/.claude/skills/下。同事加载后Agent-Teams 的拆解方式、输出格式、验收标准都会向你的习惯靠拢。这不是复制一个人而是复制一套可执行的工作方式。如果你还没开始积累最实用的建议是从今天起把每次和 AI 的对话都留着别清历史。每一条 Prompt 都是原材料积累够了蒸馏只需要一条指令。等你的 Skill 跑到 v2.0、v3.0回头看那些被统计出来的高频句式和自我校准条目你会发现蒸馏的过程本身就是一次自我认知。