1. 调 SkillOpt 的 batch size 前,先把模型 Key 交给 TaoToken 托管
如果你正在用微软开源的 SkillOpt 训练best_skill.md,大概率已经遇到一个很现实的问题:每跑一轮 rollout,优化器模型和目标模型都要真实消耗 Token;当 batch size 从 4 调到 16,账单和验证分数会同时抖动。我的做法是把模型入口收敛到 TaoToken:官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=opening_skillopt 拿 Key,Base URL 固定用https://taotoken.net/api,SkillOpt 这边只改batch_size、epochs和验证门策略,Key 轮换与后端切换交给 TaoToken。
SkillOpt 的核心思路,是把一份自然语言技能文档当作“冻结 Agent”的可训练状态。它借用神经网络训练的纪律:有 epoch、有 batch size、有文本版学习率、有验证门,但不去改模型权重。每批 rollout 会同时调用优化器模型和目标模型:优化器模型负责把打分后的轨迹转成对技能文档的有界编辑,目标模型负责按当前技能文档执行任务并产生分数。也正因如此,batch size 不只是训练超参,它直接决定每轮要消耗多少 Token、验证门会不会因为样本太少而剧烈摇摆,以及最终best_skill.md是否稳定。
这篇内容按“调 batch size + 管 Key”的路线来写:先理解 SkillOpt 训练循环里 batch size 的位置,再把训练后端接到 TaoToken,随后设计 4 / 8 / 16 / 32 的对照实验,最后给出 Claude Code、Codex、CC Switch 三套配置和排障清单。目标很明确:让你能复现一次技能文档训练,对照不同 batch size 下的best_skill.md与验证分数,而不是只停留在“README 看起来很强”。
2. 理解 SkillOpt 的训练循环:batch size 到底在调什么
SkillOpt 把技能优化拆成一条相对清晰的训练链:rollout → 反思 → 聚合 → 选择 → 更新 → 评估。这里的“技能”通常是一段 Markdown 说明书,告诉模型某类任务该怎么做。传统微调改的是权重,SkillOpt 改的是这份文档:增加一段约束、删除一条过时规则、替换某个示例,编辑范围是有界的。
batch size 在这条链里的角色,可以理解为“每次让优化器看多少条轨迹,再决定要不要改文档”。如果 batch size 太小,比如 1 或 2,每批 rollout 的分数方差会很大,优化器可能被个别失败案例带偏,候选编辑在验证门上容易被拒。如果 batch size 太大,比如 64 或 128,单轮统计更稳,但优化器模型和目标模型都要跑更多样本,Token 消耗和等待时间会明显上升,而且可能让编辑方向过于平滑,错过某些小样本上的关键改进。
更具体地说,SkillOpt 里至少有两个模型角色在消耗 Token:
- 优化器模型:读取 rollout 轨迹、反思失败原因、聚合编辑建议、生成候选技能文档修改。
- 目标模型:拿着当前技能文档执行任务,产生答案或动作轨迹,供评分器打分。
这两个角色可以来自同一后端,也可以分开配置。比如优化器用能力更强的模型,目标模型用成本更低的模型;或者反过来,用目标模型贴近实际部署环境。无论怎么组合,只要每批 rollout 的样本数增加,两个角色的调用次数通常都会增加。因此调 batch size 不能只看验证分数,还要看“每提升一个点验证分,消耗了多少 Token”。
验证门是 SkillOpt 的另一个关键纪律。候选编辑只有在留出的验证集上严格提升分数,才会被采纳,否则进入被拒编辑缓冲区。这个机制让技能优化比松散的自我修改更可控,但也意味着 batch size 会通过评分稳定性间接影响通过率。batch size 太小,验证门可能频繁拒绝;batch size 太大,训练一次的成本又可能超过收益。
所以,调 batch size 不是找一个“越大越好”的值,而是在方差、成本、编辑接受率之间找平衡。对于大多数想复现实验的开发者,建议从 8 或 16 开始,再向 4 和 32 扩展。每轮都保存best_skill.md和验证分数,别只保留最终结果。
3. 训练后端接入 TaoToken:Base URL、Key 与多后端配置
SkillOpt 支持多种模型后端,包括 OpenAI、Azure、Claude、Qwen、MiniMax 等。不同后端在配置文件里的字段名可能不同,但核心就三件事:Key、Base URL、模型名。Key 建议统一从 TaoToken 获取,入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=backend_key 。拿到后填到环境变量或 SkillOpt 配置里,Base URL 用https://taotoken.net/api,不要在每个后端配置里散落多套 Key。
先准备环境变量。下面这份示例把 TaoToken Key 暴露给常见的 OpenAI 兼容后端和 Claude 后端:
# 本地终端执行,Key 替换为你自己的 export TAOTOKEN_API_KEY="YOUR_API_KEY" export OPENAI_API_KEY="$TAOTOKEN_API_KEY" export OPENAI_BASE_URL="https://taotoken.net/api" # Claude 后端使用 ANTHROPIC_*,不要把它套到 Codex 配置里 export ANTHROPIC_AUTH_TOKEN="$TAOTOKEN_API_KEY" export ANTHROPIC_BASE_URL="https://taotoken.net/api"然后在 SkillOpt 的模型配置文件里,把优化器和目标模型分别指向 TaoToken。不同版本的字段名可能不同,下面是一份 YAML 示意,字段名以你本地仓库的 docs 为准:
# configs/skillopt_taotoken.yaml skillopt: task: "your_task_name" optimizer: provider: "openai" model: "gpt-4.1" api_key: "YOUR_API_KEY" base_url: "https://taotoken.net/api" target: provider: "openai" model: "gpt-4.1-mini" api_key: "YOUR_API_KEY" base_url: "https://taotoken.net/api" train: epochs: 3 batch_size: 8 text_learning_rate: 0.2 validation_gate: true rejected_buffer: true output: dir: "./runs/skillopt_bs8"如果你用 Claude 作为优化器后端,可以改成类似provider: "anthropic",并让它读取ANTHROPIC_BASE_URL与ANTHROPIC_AUTH_TOKEN。但要注意:Claude Code 的配置和 Codex 的配置是两套东西。Claude Code 用ANTHROPIC_*,Codex 用config.toml;不要把ANTHROPIC_*写进 Codex 的 provider 配置里,否则会出现鉴权头不匹配、模型名解析失败等问题。
安装 SkillOpt 本身很简单:
pip install skillopt skillopt --help如果需要 WebUI 监控面板,可以按官方说明安装 webui 扩展,再启动面板观察每轮 rollout、候选编辑采纳情况和验证分数变化。训练时建议把优化器模型和目标模型的调用日志分开看,因为 batch size 增加时,两边的 Token 曲线往往不是同比例增长。
4. batch size 对照实验:4 / 8 / 16 / 32 怎么跑
要回答“batch size 调到多少合适”,最可靠的方式是做对照实验。不要一次只跑一个值,也不要只跑一轮就下结论。建议固定其他变量:同一份初始技能文档、同一套训练集和验证集、同一个优化器模型、同一个目标模型、同样的 epoch 数。唯一变化的是batch_size。
可以按下面矩阵开跑:
| 实验组 | batch_size | epochs | 优化器模型 | 目标模型 | 观察重点 |
|---|---|---|---|---|---|
| A | 4 | 3 | 强模型 | 低成本模型 | 验证门拒绝率、方差 |
| B | 8 | 3 | 强模型 | 低成本模型 | 稳定性与成本平衡 |
| C | 16 | 3 | 强模型 | 低成本模型 | 编辑接受率、最终分数 |
| D | 32 | 3 | 强模型 | 低成本模型 | Token 成本、过平滑风险 |
每组保存独立输出目录,例如runs/bs4、runs/bs8、runs/bs16、runs/bs32。配置示例如下:
# configs/bs8.yaml train: batch_size: 8 epochs: 3 validation_gate: true output_dir: "./runs/bs8"执行训练时,按你本地 SkillOpt 的命令入口运行。如果 CLI 提供子命令,可以用类似方式;如果没有,就以仓库 docs 给出的训练脚本为准:
# 先确认命令帮助,避免参数名猜错 skillopt --help # 示例:按配置文件启动训练,实际入口以本地 docs 为准 skillopt train --config ./configs/bs8.yaml训练结束后,重点对照三样东西:
best_skill.md的内容差异:不同 batch size 下,优化器增加/删除/替换了哪些规则。- 验证分数曲线:是稳步上升,还是震荡后回落。
- 被拒编辑比例:验证门拒绝太多,说明 batch size 可能过小或评分噪声大;接受率过高但验证分数不涨,说明验证集可能失去区分度。
可以用下面的脚本做本地对照。前提是你的训练输出里包含metrics.json或类似指标文件;如果没有,就从日志里导出验证分数。
# 对比不同 batch size 的 best_skill.md diff -u runs/bs4/best_skill.md runs/bs8/best_skill.md || true diff -u runs/bs8/best_skill.md runs/bs16/best_skill.md || true # 汇总验证分数与接受编辑数 python - <<'PY' import json from pathlib import Path for bs in [4, 8, 16, 32]: p = Path(f"runs/bs{bs}/metrics.json") if not p.exists(): print(f"bs={bs}: metrics.json not found") continue m = json.loads(p.read_text(encoding="utf-8")) print( f"bs={bs}", "val_score=", m.get("val_score"), "accepted_edits=", m.get("accepted_edits"), "rejected_edits=", m.get("rejected_edits"), ) PY实际判断时,可以用“验证分数 / Token 消耗”作为粗指标。如果 bs=8 比 bs=4 的验证分数高出一截,而 Token 只增加 40%,那 8 更值得继续调。如果 bs=32 相比 bs=16 只提升很小甚至下降,就不用为了心理安全感继续加 batch size。
5. Claude Code、Codex 与 CC Switch:三套配置不要串线
SkillOpt 训练完成后,技能文档最终要配合目标模型使用。很多开发者会在 Claude Code、Codex CLI 里调用同一个 TaoToken Key,但配置格式必须分开。下面三套配置可以直接抄,但注意不要交叉污染。
5.1 Claude Code:settings.json / ANTHROPIC_*
Claude Code 读取~/.claude/settings.json,在其中配置环境变量。Base URL 用 TaoToken 的 API 入口,Key 用你自己的YOUR_API_KEY:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "claude-sonnet-4-5" } }这里使用的是ANTHROPIC_*系列变量。改完后重启 Claude Code,或者新开终端会话,确保环境变量生效。如果你在 CC Switch 里管理多个供应商,Claude Code 这一侧仍然按ANTHROPIC_*填。
5.2 Codex:config.toml
Codex 不走ANTHROPIC_*,而是用config.toml里的 model provider。下面是一个指向 TaoToken 的示例:
# ~/.codex/config.toml model = "gpt-5-codex" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "responses"然后在本地设置TAOTOKEN_API_KEY:
export TAOTOKEN_API_KEY="YOUR_API_KEY"注意:不要把ANTHROPIC_AUTH_TOKEN或ANTHROPIC_BASE_URL写进 Codex 的config.toml。Codex 和 Claude Code 的鉴权头、请求格式、模型命名都不是一套东西,混填以后常见表现是 401、404 或模型不存在。
5.3 CC Switch 三件套
如果你用 CC Switch 做多供应商切换,新增供应商时填三件套即可:
供应商名称:TaoToken Base URL:https://taotoken.net/api API Key:YOUR_API_KEY切换完成后,Claude Code 侧会生成对应的ANTHROPIC_*配置;Codex 侧仍建议单独维护config.toml。不要指望一个 CC Switch 配置同时覆盖 Claude Code 和 Codex 的所有字段,它们的配置载体不同。
如果你还没有 Key,可以走 TaoToken 控制台创建: https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=create_key_skillopt 。创建后先在小任务里验证,再放进 SkillOpt 的批量 rollout。
6. 常见排障:401、429、验证门全拒、batch size 与 Token 成本
调 batch size 时,报错通常不来自 batch size 本身,而是 Key、Base URL、并发或验证集配置。下面这几类问题比较常见。
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 401 Unauthorized | Key 为空、过期、Header 不匹配 | 检查YOUR_API_KEY是否替换;Claude 用ANTHROPIC_AUTH_TOKEN,Codex 用env_key |
| 404 / model not found | Base URL 或模型名错误 | Base URL 固定https://taotoken.net/api;模型名按平台列表填写 |
| 429 Too Many Requests | batch size 太高、并发太大 | 先降 batch size,再降并发;必要时把优化器和目标模型拆到不同时间窗口跑 |
| 验证门全拒 | batch 太小、评分噪声大、学习率预算过大 | 把 batch size 从 4 提到 8/16;检查验证集是否太小;降低文本学习率 |
验证分数涨但best_skill.md不可读 | 编辑过度、规则堆叠 | 开启被拒编辑缓冲区;限制每轮编辑长度;人工审查后合并规则 |
| Token 消耗远超预期 | 优化器模型与目标模型重复调用 | 记录每批 rollout 的调用次数;先用小样本估算单轮成本 |
成本控制上,建议把 batch size 与模型选择一起看。优化器模型通常需要较强推理能力,目标模型则可以根据实际部署环境选择。如果只是验证技能文档是否迁移,目标模型可以用更便宜的版本;如果正式评估,再换成线上同款模型。TaoToken 的 Coding Plan 页面适合先了解可用的模型与额度策略: https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan_skillopt 。
另外,SkillOpt 新版本里有SkillOpt-Sleep夜间离线自进化机制,可以回顾历史会话、重放常见任务,把验证通过的技能沉淀下来。如果你准备长期跑,建议把白天的 batch size 试验和夜间的离线沉淀分开,避免同一时间大量占用模型调用。
7. 复现清单与 CTA
最后把整条链路压缩成一份可执行清单:
- 安装 SkillOpt:
pip install skillopt,需要 WebUI 时按官方扩展安装。 - 去 TaoToken 官网拿 Key: https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=repro_checklist 。
- 在 SkillOpt 配置里填
base_url: https://taotoken.net/api,Key 用YOUR_API_KEY。 - 固定初始技能文档、训练集、验证集、优化器模型、目标模型。
- 设置
batch_size: 4跑第一组,保存best_skill.md和验证分数。 - 依次跑 8、16、32,对比验证分数、接受编辑数、被拒编辑数和 Token 消耗。
- 人工审查最优组的
best_skill.md,确认规则没有堆叠或冲突。 - 把最终技能文档放到 Claude Code 或 Codex CLI 中做一次真实任务验证。
如果你还没决定用哪条模型线路,可以先从模型对话页面开始做小样本试跑: https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=cta_chat_skillopt 。需要长期跑训练和 rollout 时,再看 Coding Plan: https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=cta_coding_plan_skillopt 。创建正式 Key 走控制台: https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=cta_api_keys_skillopt 。Claude Code 接入细节可以对照文档: https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=cta_claude_code_doc_skillopt 。
batch size 不是越大越稳,也不是越小越省。对 SkillOpt 这种“优化器模型 + 目标模型”双调用链来说,8 或 16 常常是第一个值得认真对照的区间。先把 Key 和 Base URL 收敛到 TaoToken,再让 batch size 成为唯一变量,这样跑出来的best_skill.md和验证分数才有比较价值。