让 SkillOpt 的文本学习率预算跑起来,TaoToken 管 Key。

发布时间:2026/9/19 6:21:26
让 SkillOpt 的文本学习率预算跑起来,TaoToken 管 Key。 1. 先把 SkillOpt 的 Token 账算清文本学习率越大优化器与评估器越吃 Key在 SkillOpt 里把“文本学习率”预算调大时最先被打满的往往不是显存而是优化器模型和评估模型的 Token 账单。你可以先从 TaoToken 官网https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentskillopt_text_lr_intro创建 Key把 Base URL 统一成 https://taotoken.net/api再回到训练配置里做预算对照。本文不讨论模型权重训练只讨论一件更贴近落地的事当 SkillOpt 把一份 Markdown 技能文档当作“冻结 Agent 的外部可训练状态”时优化器怎么改、评估器怎么打分、Key 怎么填、不同文本学习率预算下 best_skill.md 和验证分数会怎么变。SkillOpt 这个项目来自微软开源思路是把写 skill 这件事从“人肉润色”或“强模型一次性生成”变成一个有纪律的优化循环。它借用了神经网络训练里的 epoch、batch size、学习率、验证门这些概念但完全不更新目标模型权重。传统训练优化的是参数矩阵SkillOpt 优化的是一个自然语言文件。目标模型在部署时保持原样技能文档作为外部提示或上下文注入推理阶段不会额外增加优化器调用。这个流程听起来很干净但一旦你真去跑训练循环就会发现 Token 消耗点比想象中多。rollout 阶段由目标模型执行任务产出轨迹和评分反思阶段由优化器模型读取轨迹生成对技能文档的候选编辑聚合阶段把多个候选合并选择阶段由评估模型在留出验证集上比较新旧技能更新阶段只在验证分数严格提升时采纳编辑最后还要重新评估记录 best_skill.md 的分数。优化器模型和评估模型可能相同也可能不同但只要它们都走 API就都吃 Key、都吃额度、都受并发限制。调参开发者最常遇到的不是算法问题而是配置问题。比如把 Base URL 写成https://taotoken.net/api/v1结果 SDK 又自动拼了一层/v1直接 404或者把 Claude Code 的ANTHROPIC_*变量复制到 Codex 的config.toml里导致 Codex 根本读不到供应商又或者优化器和评估器共用同一个 Key跑到一半触发 429却以为是验证门逻辑有 bug。本文按“先准备 Key再填训练后端再设文本学习率预算再跑训练循环最后排障与对照”的顺序展开尽量让你能直接复现。2. 在 TaoToken 侧准备 Key优化器、评估器、目标模型分别怎么挂第一步不是改 SkillOpt 代码而是把 Key 和 Base URL 固定下来。打开 TaoToken 控制台创建 API Keyhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentskillopt_api_keys 。创建后复制 Key用占位符YOUR_API_KEY代替。Base URL 不加 UTM统一使用https://taotoken.net/apiSkillOpt 的训练后端支持 OpenAI、Azure、Claude、Qwen、MiniMax 等多种供应商。你不需要为每个后端准备不同的网关地址只要该后端允许自定义base_url就可以把请求指到同一个入口。建议先把环境变量整理成下面这样避免在 YAML、JSON、TOML 里反复填明文 Keyexport TAOTOKEN_API_KEYYOUR_API_KEY export OPENAI_API_KEY$TAOTOKEN_API_KEY export OPENAI_BASE_URLhttps://taotoken.net/api export ANTHROPIC_AUTH_TOKEN$TAOTOKEN_API_KEY export ANTHROPIC_BASE_URLhttps://taotoken.net/api这里要区分使用场景。OPENAI_*给 OpenAI 兼容后端、OpenAI SDK、Codex 之外的通用训练配置用ANTHROPIC_*给 Claude 原生 SDK 和 Claude Code 外壳用。不要把ANTHROPIC_BASE_URL填进 Codex 的config.tomlCodex 不认这套变量。也不要因为两个变量都指向https://taotoken.net/api就以为它们可以互换协议路径和请求头不同混用会直接报鉴权失败或模型不存在。如果你只想先确认 Key 能不能用可以走模型对话页面发一条最短请求https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentskillopt_chat_check 。能正常返回后再回到 SkillOpt 配置。对于预算实验我建议把优化器模型和评估器模型分开配置哪怕它们暂时用同一个模型名。原因是优化器通常要读长轨迹、生成结构化编辑输出更长评估器要反复跑验证集调用次数更多、单次更短。分开配置后你在 TaoToken 控制台看用量时能一眼判断是“优化器太贵”还是“评估器太频繁”。如果你准备把 SkillOpt 集成到 Claude Code 或 Codex CLI 工作流里也可以先了解 Coding Plan 的适用范围https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentskillopt_coding_plan 。但无论用哪种调用方式Key 和 Base URL 的对应关系不变Key 用YOUR_API_KEYBase URL 用https://taotoken.net/api。3. 给 SkillOpt 训练后端填 KeyOpenAI 兼容、Claude Code、Codex 三套写法SkillOpt 本体是 Python 包安装入口在 PyPIpip install skillopt如果要启用 WebUI 监控面板可以按项目文档追加可选依赖例如pip install -e .[webui] skillopt-webui接下来是配置训练后端。下面用 OpenAI 兼容后端示意一份configs/skillopt_openai.yaml。不同版本的字段名可能略有差异以仓库 docs 为准但核心结构不变优化器、评估器、目标模型分别声明 provider、model、base_url、api_key。optimizer: provider: openai model: gpt-5.5 base_url: https://taotoken.net/api api_key: ${OPENAI_API_KEY} max_output_tokens: 4096 evaluator: provider: openai model: gpt-5.5 base_url: https://taotoken.net/api api_key: ${OPENAI_API_KEY} max_output_tokens: 2048 target: provider: openai model: gpt-5.5 base_url: https://taotoken.net/api api_key: ${OPENAI_API_KEY} text_lr: edit_budget_tokens: 300 max_edits_per_step: 3 min_validation_gain: 0.0 rejected_buffer_size: 20再次强调base_url写https://taotoken.net/api不要在后面补/v1。很多 OpenAI SDK 会自己拼接/chat/completions你补了/v1就会变成重复路径。如果 SkillOpt 内部用的是openaiPython 包等价写法是from openai import OpenAI client OpenAI( api_keyYOUR_API_KEY, base_urlhttps://taotoken.net/api, ) resp client.chat.completions.create( modelgpt-5.5, messages[{role: user, content: ping}], ) print(resp.choices[0].message.content)如果你的 SkillOpt 后端选择 Claude 原生协议不要把 Claude 配置写进 Codex也不要把 Codex 配置写进 Claude Code。Claude Code 外壳使用settings.json常用路径是~/.claude/settings.json{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: claude-sonnet-4-5 } }这份配置只给 Claude Code CLI 及其衍生外壳用。它的三要素是ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_MODEL。如果你的 SkillOpt 集成外壳会调用 Claude Code就让它读取这份 settings.json而不是把变量塞进 Codex。Codex CLI 走另一条线使用config.toml常用路径是~/.codex/config.tomlmodel gpt-5.5 model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api chat然后在 shell 里导出export TAOTOKEN_API_KEYYOUR_API_KEYCodex 的供应商由config.toml里的model_provider决定Key 通过env_key指向的环境变量读取。所以 Codex 侧不要出现ANTHROPIC_BASE_URL或ANTHROPIC_AUTH_TOKEN。如果你同时用 Claude Code 和 Codex建议把两套配置放在各自默认路径不要互相复制。如果你用 CC Switch 管理多个供应商记住它的“三件套”是供应商名称、Base URL、API Key。新增时可以这样填供应商名称TaoTokenBase URLhttps://taotoken.net/apiAPI KeyYOUR_API_KEY模型按你训练和评估需要的模型名填写保存后切换供应商Claude Code 或 Codex 外壳会读取对应配置。若你要同时跑优化器和评估器可以在 CC Switch 里建两个条目一个绑定优化器模型一个绑定评估器模型方便观察调用量。4. 文本学习率预算怎么设从 100 到 1500 token 的对照实验SkillOpt 的“文本版学习率”不是梯度下降里的浮点数而是每步允许对技能文档做多大编辑的预算。它可以表现为单步最多新增或替换多少 token、最多编辑几处、是否允许整段重写、是否允许改变标题层级。预算小优化器只能微调措辞预算大优化器能重组章节但也更容易产生噪声编辑被验证门拒绝。建议按四档跑对照实验不要一上来就调到最大极小额edit_budget_tokens: 100max_edits_per_step: 1小额edit_budget_tokens: 300max_edits_per_step: 2中额edit_budget_tokens: 800max_edits_per_step: 4大额edit_budget_tokens: 1500max_edits_per_step: 6每一档建议复制一份配置只改text_lr和输出目录其他参数保持一致。训练命令示意如下skillopt train \ --config configs/skillopt_lr100.yaml \ --train data/train.jsonl \ --val data/val.jsonl \ --out runs/skillopt_lr100评估命令skillopt eval \ --skill runs/skillopt_lr100/best_skill.md \ --val data/val.jsonl \ --config configs/skillopt_lr100.yaml每跑完一档至少记录五项预算档位best_skill.md token 数验证分数验证门拒绝次数优化器/评估器调用量100待填待填待填待填300待填待填待填待填800待填待填待填待填1500待填待填待填待填这里不要只看最终验证分数。文本学习率大时best_skill.md 可能变长甚至超过 2000 token部署时上下文成本上升。文本学习率小时技能可能只改了几个词验证分数提升有限但被验证门拒绝的次数少训练过程更稳定。你要找的是“验证分数提升明显、技能文档没有膨胀、拒绝次数可接受”的平衡点而不是单纯追求最高分。被拒编辑缓冲区也值得关注。SkillOpt 会把未通过验证门的候选编辑存起来有些版本会在后续 epoch 做慢速或元更新时重新利用。如果你发现拒绝次数很高但缓冲区里反复出现同一类修改说明文本学习率可能设得太小优化器想改但每次只能动一点点反过来如果拒绝次数高且编辑方向散乱说明预算太大优化器在乱试。5. 复现训练循环rollout、反思、聚合、选择、更新、评估SkillOpt 的完整循环可以拆成六个阶段。不同版本命令名可能不同下面给出的是等价流程具体参数以仓库 docs 为准。关键不是记住命令而是理解每个阶段谁在消耗 Token。第一阶段rollout。目标模型在训练集上执行任务产生运行轨迹和评分。这个阶段通常由目标模型完成不一定经过优化器。命令示意skillopt rollout \ --config configs/skillopt_lr300.yaml \ --split train \ --out runs/lr300/rollouts第二阶段反思。优化器模型读取轨迹、评分和当前技能文档输出候选编辑。这是 Token 消耗最集中的阶段之一因为轨迹可能很长优化器还要生成结构化编辑。命令示意skillopt reflect \ --config configs/skillopt_lr300.yaml \ --rollouts runs/lr300/rollouts \ --skill runs/lr300/current_skill.md \ --out runs/lr300/candidates第三阶段聚合。把多个候选编辑合并去除冲突。若候选很多这一步也可能调用模型做合并。命令示意skillopt aggregate \ --config configs/skillopt_lr300.yaml \ --candidates runs/lr300/candidates \ --out runs/lr300/merged第四阶段选择。验证门在留出验证集上比较“当前技能”和“候选技能”。只有候选严格提升分数才采纳。这是评估模型调用最密集的阶段之一因为每个候选都要跑验证集。命令示意skillopt select \ --config configs/skillopt_lr300.yaml \ --candidates runs/lr300/merged \ --skill runs/lr300/current_skill.md \ --val data/val.jsonl \ --out runs/lr300/selected第五阶段更新。把选中的编辑写回技能文档产出新的current_skill.md。命令示意skillopt update \ --config configs/skillopt_lr300.yaml \ --selected runs/lr300/selected \ --skill runs/lr300/current_skill.md \ --out runs/lr300/current_skill.md第六阶段评估。重新跑验证集记录分数、技能长度、拒绝缓冲区和调用量。命令示意skillopt eval \ --skill runs/lr300/current_skill.md \ --val data/val.jsonl \ --config configs/skillopt_lr300.yaml \ --out runs/lr300/eval.json跑完一个 epoch 后你会得到一份紧凑的best_skill.md。按项目公开说明它通常落在 300 到 2000 token 之间可以直接配合原封不动的目标模型使用。部署时不会增加额外推理调用优化器和评估器只在训练阶段出现。这也是 SkillOpt 相比“让强模型在线改技能”更可控的地方线上只读最终技能文档不在线改。如果你要观察跨环境迁移可以把同一份best_skill.md分别放到直接对话、Codex CLI、Claude Code CLI 三种执行环境里验证。公开评测里提到过跨模型规模、跨 Codex 与 Claude Code、以及相近基准之间的迁移复用你可以用自己的验证集复测但不要直接把公开数字当成自己任务的预期收益。6. 排障401、404、429 与验证门一直拒绝第一类高频问题是 401。表现是优化器或评估器一启动就鉴权失败。排查顺序确认 shell 里真的导出了YOUR_API_KEY对应的环境变量。确认 YAML 里引用的是${OPENAI_API_KEY}不是${OPENAI_KEY}这类拼错的名字。确认 Claude Code 用的是ANTHROPIC_AUTH_TOKENCodex 用的是env_key指向的变量。确认没有把 Claude 的 Key 填到 OpenAI 兼容配置里虽然都指向同一个 Base URL但请求头不同。第二类问题是 404 或模型不存在。最常见原因是 Base URL 写错。SkillOpt 配置里统一写https://taotoken.net/api不要写https://taotoken.net/api/v1也不要在模型名前后加多余空格。如果你用 OpenAI SDK 手动测试base_url参数同样用上面这个。若你确实遇到路径问题先单独跑一条最小请求不要直接在训练循环里试错否则一次 rollout 就会浪费很多调用。第三类问题是 429 限流。SkillOpt 的选择阶段会并发评估多个候选优化器反思阶段也可能并发请求。若你把max_concurrency调得很高容易出现瞬时限流。处理方式降低max_concurrency例如从 16 降到 4。降低 batch size减少单轮候选数。把优化器和评估器拆成不同 Key 或不同模型分别观察限流来源。在配置里增加重试和退避但不要把重试次数设得过高否则会放大 Token 消耗。第四类问题是验证门一直拒绝。表现是训练多轮后best_skill.md几乎没变验证分数也不动。可能原因文本学习率太小优化器只能改标点无法产生有效提升。验证集太小或噪声太大候选的微小提升无法稳定超过阈值。优化器模型和评估器模型不匹配。优化器按 A 模型的偏好改技能评估器却用 B 模型打分导致编辑方向不一致。技能文档已经接近该任务的上限继续编辑没有收益。处理建议是先用小额预算跑 2 到 3 个 epoch看拒绝缓冲区里是否有重复模式再把预算提高一档观察验证分数是否阶梯式上升。如果提高预算后拒绝次数暴涨说明预算跨过了稳定边界应该回退。7. 对照产出如何读 best_skill.md 与验证分数跑完四档预算后你手里会有四份best_skill.md和四组验证分数。读技能文档时不要只看长度。重点看三个变化第一是否增加了可执行步骤。好的技能文档会把“注意检查”改成“先运行 A再检查 B若失败则看 C”。这种编辑通常来自优化器对失败轨迹的反思。第二是否删除了模糊描述。比如“尽量保证格式正确”这种话如果验证门发现删掉后分数不降就会被采纳。文本学习率预算越大这类删除越多。第三是否引入了过度特化。如果技能文档里出现了只对某一道训练题有效的规则验证分数可能短期上升但迁移到相近任务会下降。你可以把best_skill.md放到另一个验证集上复测观察跨基准表现。验证分数方面验证门只在严格提升时采纳编辑所以分数曲线往往不是平滑上升而是阶梯式跳动。被拒编辑不会进入技能文档但会进入缓冲区可能影响后续慢速更新。你要记录每个 epoch 的采纳次数、拒绝次数和最终技能 token 数。若某档预算的验证分数最高但 best_skill.md 超过 2000 token就需要权衡上下文成本和部署收益。部署时best_skill.md直接配合目标模型使用不需要再调用优化器或评估器。线上推理不会因为 SkillOpt 增加额外模型调用。训练阶段的 Token 消耗主要来自优化器反思、聚合和评估器验证。如果你用 TaoToken 统一管 Key可以在控制台按 Key 或模型观察调用量判断瓶颈在优化器还是评估器。8. 把 Key 固定成一条链路模型对话、Coding Plan、创建 Key、Claude Code 文档SkillOpt 的训练循环本身不复杂复杂的是把优化器、评估器、目标模型、Claude Code、Codex 这些调用方都接到同一套 Key 和 Base URL 上。我的建议是固定一条链路先用模型对话确认模型可用https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentskillopt_cta_chat如果需要长期跑训练和评估看 Coding Plan 是否覆盖你的调用方式https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentskillopt_cta_coding在控制台创建 API Key占位符统一用YOUR_API_KEYhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentskillopt_cta_keys如果要把 SkillOpt 的集成外壳接到 Claude Code按文档配置settings.json里的ANTHROPIC_BASE_URL和ANTHROPIC_AUTH_TOKENhttps://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentskillopt_cta_claude_code回到训练本身Base URL 始终是https://taotoken.net/apiKey 始终是YOUR_API_KEY。OpenAI 兼容后端用OPENAI_API_KEY和OPENAI_BASE_URLClaude Code 用ANTHROPIC_AUTH_TOKEN和ANTHROPIC_BASE_URLCodex 用config.toml里的model_provider加env_key。三者不要混写。最后再强调一次复现目标让 SkillOpt 的文本学习率预算跑起来TaoToken 管 Key。你需要的产出不是一句“技能变好了”而是四档预算下的best_skill.md、验证分数、拒绝次数和调用量对照。只有把这些数据摆在一起才能判断多大的编辑幅度适合你的任务也才能把优化器模型和评估模型的 Token 消耗控制在可预期范围内。