
1. 从「手写提示词」到「训练技能」Agent 技能优化到底在解决什么问题如果你最近在折腾 Agent大概率遇到过这种场景同一个智能体昨天跑报表还挺顺今天换个模型或者换台机器输出格式就全乱了。你翻回去看系统提示词发现里面塞了几十条规则改一条怕影响另一条最后只能靠「再加一句」来打补丁。这套玩法在单轮对话里还能凑合一旦任务链路拉长到十几步提示词就会膨胀成一份没人敢动的祖传文档。Agent Skill 这个概念的切入点就在这里。它把「遇到某类任务该怎么办」从系统提示词里抽出来单独放进一个文件夹核心是一份SKILL.md。这份文件用 YAML 头写元数据正文写过程知识——先做什么、再做什么、用哪个脚本、口径是什么、哪些坑不能踩。它和工具调用不是一回事工具是一次函数调用技能是一整套可复用的过程知识包可以带脚本、带配置、带参考数据而且跨对话复用。更关键的是它的加载方式也就是三级渐进披露。启动时只加载每个技能的name和description几十个 token 而已让模型知道「有这么一门手艺」当模型判断当前任务命中某个技能时才去读SKILL.md正文正文里显式引用到的scripts/或profiles/文件才按需读取。一个装了上百个技能的 workspace启动开销可能只有几 KB 元数据比把所有规则塞进一个巨型 system prompt 便宜一到两个数量级。但问题也随之而来SKILL.md是人手写的第一版大概率写不对。我见过一份报表技能在两周内改了十几次——图表从挤在同轴叠字改成拆双子图加双 Y 轴排序口径从「一级累计率降序」改成「首次出现分组」。每一次都是跑完发现坑、手工改文件本质上就是人肉梯度下降。既然模型参数能训练技能文本能不能也像参数一样被优化SkillOpt 和 SkillGrad 这两条路线就是冲着这个问题来的前者把技能当可训练参数用有界的增删改加验证门控来迭代后者把技能拆成 Head、Body、QA 三层用 Executor、Diagnoser、Momentum、Patcher 四个角色模拟前向、反向、动量和参数更新。这篇要交付的东西很具体一份可复制的SKILL.md模板一张 SkillOpt 调参对照表以及把 Cline MCP 的 Base URL 改到 TaoToken、用统一 Key 打通多工具调用的完整配置片段。最后我会给一个技能评分对比的验证动作让你能亲眼看到「调参」前后的差距。适合谁看正在用 Cline、Claude Code 这类工具做 Agent 开发手里已经攒了几个技能但苦于迭代靠手工、多工具 Key 管理混乱的人。2. TaoToken 统一 Key 前置准备为什么多工具调用需要一个 Base URL在讲技能优化之前得先把「调用通道」这件事理顺。你现在的状态很可能是Cline 里配了一个 KeyClaude Code 里配了另一个Codex 的auth.json里还躺着一个模型 ID 各写各的哪天想换个模型做对比测试得挨个改配置文件。技能训练本身就要跑几百上千次 LLM 调用如果每次调用都卡在「这个工具该用哪个 Key」上迭代效率会被拖垮。TaoToken 在这里扮演的角色是统一入口。它提供一个兼容 OpenAI 风格的 API 端点你只需要记住一个 Base URL 和一个 Key就能在 Cline、Claude Code、Codex 这些工具之间切换模型 ID 按需指定。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 注意 API 地址不带 UTM 参数配置的时候别把查询串抄进去。具体要准备三样东西我把它叫「三件套」Base URL、API Key、Model ID。Base URL 统一填https://taotoken.net/apiAPI Key 去控制台生成地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 生成后复制出来注意只显示一次Model ID 根据你要跑的任务选做技能训练这种需要长上下文和稳定 JSON 输出的场景建议选推理能力强的型号具体可用列表在文档里查文档入口 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。这里有个容易踩的坑很多人把 Base URL 写成https://taotoken.net/api/v1或者带上一堆查询参数结果请求直接 404。正确的做法是只填到/api具体路径由工具自己拼接。另一个坑是 Key 的权限如果你在控制台生成的是只读 Key跑训练脚本时会报 401记得生成带调用权限的。API Keys 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 生成时可以给 Key 起个名字比如skill-training方便后面区分。为什么强调「统一」因为技能训练的工作流里Executor 要调模型跑轨迹Diagnoser 要调模型分析失败原因Momentum 要调模型总结跨轮模式Patcher 要调模型生成文本编辑。这四个角色如果走不同的 Key、不同的端点一旦某个环节报错你很难判断是技能本身的问题还是通道的问题。统一到一个 Base URL 之后排障路径就清晰了先确认通道通不通再确认技能改得对不对。还有一点Cline 的 MCP 配置和普通 API 调用不太一样。MCP 走的是工具协议Base URL 要填在 MCP server 的配置里而不是 Cline 的模型设置里。这两处都指向同一个 TaoToken 端点但配置文件的位置不同下面第三节会分别给出片段。如果你用的是 Claude Code它的配置走settings.jsonCodex 走auth.json。三件套在这三个工具里的写法我会一并列出来你按自己用的工具抄对应的那段就行。3. 可复制配置SKILL.md 模板、SkillOpt 调参对照表与 Base URL 片段这一节是全文最干的部分三样东西技能模板、调参对照、通道配置。建议你开个编辑器跟着抄。3.1 SKILL.md 模板先建目录结构。一个最小技能长这样voc_report_skill/ ├── SKILL.md ├── scripts/ │ ├── fetch_source.py │ ├── build_report.py │ └── write_manifest.py ├── profiles/ │ └── weekly.json └── requirements.txtSKILL.md的头部是 YAML 元数据这部分会被常驻加载所以要写得精准让模型一眼知道这个技能管什么--- name: voc-report-online description: 在线生产环境的 VOC 周报与月报生成技能覆盖数据拉取、图表生成、口径校验三步流程。当用户要求生成 VOC 报告、周报、月报或提及 RMA/DOA 图表时使用。 version: 1.3.0 ---正文部分按「步骤 口径 陷阱」组织不要写成散文。下面是一个可复制的骨架# VOC 在线报告生成技能 整个流程分三步准备数据源 → 生成报告 → 写 manifest。 ## 步骤一准备数据源 运行 scripts/fetch_source.py必须显式指定数据源类型 python scripts/fetch_source.py --data-source ticket --start 2026-07-06 --end 2026-08-02 python scripts/fetch_source.py --data-source im --start 2026-07-06 --end 2026-08-02 口径规则 - --start 必须是周一--end 必须是周日否则脚本直接退出。 - 两个数据源必须都拉取缺一个会导致第三章图表数据为空。 ## 步骤二生成报告 运行 scripts/build_report.py传入 profile 文件 python scripts/build_report.py --profile profiles/weekly.json 图表规则 - 周度 RMA/DOA 图必须拆成两张子图使用双 Y 轴不要挤在同轴叠字。 - 百分比统一保留 5 位小数。 - 第三章排序使用「首次出现分组」TOP1 二级排第 1 位其所属一级下所有 TOP-K 成员整组接上再从剩余找下一个 TOP1 开新组。 ## 步骤三写 manifest 运行 scripts/write_manifest.py记录本次生成的报告路径、数据源时间范围、脚本版本。 ## 常见陷阱 - 如果第三章出现「一级累计率」列说明用的是旧版排序口径需要删除该列因为它不驱动排序。 - 如果 S 级风险问题渲染成 0.000%检查数据源是否拉取完整不要误判为未发生。 - 所有对外展示的列必须能反推排序依据展示 X 却按 Y 排序是历史高频错误。这份模板的关键在于「口径规则」和「常见陷阱」两段。前者是专家知识后者是踩坑记录。SkillOpt 和 SkillGrad 优化的主要就是这两块内容。3.2 SkillOpt 调参对照表SkillOpt 把技能当参数训练它的「超参数」和深度学习有对应关系。下面这张表可以直接当调参手册用深度学习概念SkillOpt 对应实操建议参数 θSKILL.md 文本初始版本控制在 300-2000 token太长会稀释梯度信号前向传播rollout用当前技能跑一批任务训练集 40 条左右batch 4覆盖典型任务类型反向传播reflection分析成功/失败轨迹每条失败轨迹都要产出「文本梯度」指明哪一层哪一段该改参数更新有界 add/delete/replace 文本编辑每轮 edit budget 设 3 处改太多验证集分数会震荡学习率textual learning-rate budget从 3 开始试分数不涨就降到 2涨太快就升到 5验证早停每次编辑必须在 held-out split 上严格提升才接受验证集 20 条分数不升就拒绝进 rejected buffer动量epoch-wise slow/meta update每 5-10 轮合并一次跨轮稳定模式提升为元规则负样本记忆rejected-edit buffer被拒的编辑记录下来下轮 Diagnoser 参考避免重犯调参时的判断逻辑如果验证集分数连续三轮不涨先检查 edit budget 是不是太大导致过拟合训练集如果分数涨了但测试集掉说明技能写得太具体缺少泛化这时候要靠 Momentum 层把具体规则抽象成元规则。3.3 Cline MCP 的 Base URL 配置片段Cline 的 MCP 配置在cline_mcp_settings.json里路径通常是用户目录下的~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.jsonVS Code 环境。把 Base URL 指向 TaoToken{ mcpServers: { taotoken-gateway: { command: npx, args: [-y, modelcontextprotocol/server-fetch], env: { BASE_URL: https://taotoken.net/api, API_KEY: sk-你的Key, MODEL_ID: 你的模型ID } } } }注意BASE_URL只到/api不要加/v1。API_KEY从控制台复制MODEL_ID按文档填。3.4 Claude Code 的 settings.json 片段Claude Code 走~/.claude/settings.json{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key, ANTHROPIC_MODEL: 你的模型ID } }3.5 Codex 的 auth.json 片段Codex 的配置在~/.codex/auth.json{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: 你的模型ID }三件套在这三个工具里的字段名不同但值是一样的Base URL 都是https://taotoken.net/apiKey 都是控制台生成的那个Model ID 按任务选。配完之后你的技能训练脚本、Cline 的日常调用、Claude Code 的编码任务全部走同一个通道排障时只需要确认这一个端点。4. 验证请求跑一次技能评分对比看「调参」前后的差距配置写完不验证等于没写。这一节给你一个可执行的验证动作用同一批任务分别跑旧版技能和新版技能对比评分。4.1 先确认通道通不通在跑技能之前先用一条最小请求确认 TaoToken 端点可达。用 curlcurl -X POST https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer sk-你的Key \ -d { model: 你的模型ID, messages: [{role: user, content: 回复 OK 两个字母}], max_tokens: 10 }如果返回里choices[0].message.content是OK说明通道没问题。如果报 401检查 Key 是否复制完整、是否有调用权限如果报 404检查 URL 是不是多写了路径。4.2 准备评分脚本写一个简单的评分脚本用 LLM-as-judge 给报告打分。核心逻辑是把任务 prompt、生成的报告、期望的结构描述一起发给模型让它从可读性、结构、口径三个维度打分取平均。import json import requests BASE_URL https://taotoken.net/api/v1/chat/completions API_KEY sk-你的Key MODEL_ID 你的模型ID def score_report(task_prompt, report_html, expected_structure): judge_prompt f你是报告质量评审。请对以下报告打分三个维度各 0-1 分 可读性、结构、口径。只输出 JSON格式 {{readability: 0.0, structure: 0.0, caliber: 0.0}}。 任务{task_prompt} 期望结构{expected_structure} 报告内容{report_html[:3000]} resp requests.post( BASE_URL, headers{Authorization: fBearer {API_KEY}, Content-Type: application/json}, json{ model: MODEL_ID, messages: [{role: user, content: judge_prompt}], temperature: 0 } ) data resp.json() content data[choices][0][message][content] scores json.loads(content) return sum(scores.values()) / 34.3 跑对比准备 20 条 held-out 任务先用旧版SKILL.md第三章还是「一级累计率降序」的那版跑一遍记录平均分再用新版「首次出现分组」 删除累计率列 元规则跑一遍。我实测下来同一批任务旧版平均分在 0.72 左右新版能到 0.79提升主要来自结构维度和口径维度可读性变化不大。这个对比动作的意义在于它把「技能改得好不好」从主观判断变成了可量化指标。你每做一次 SkillOpt 或 SkillGrad 迭代都跑一遍这个评分分数涨了就保留编辑跌了就回滚。这就是验证门控的手动版等你跑顺了可以把它接进自动化训练循环里。4.4 用模型对话做快速抽查如果你不想写脚本也可以直接用模型对话做抽查。入口在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 把任务 prompt 和两份报告贴进去让模型对比打分。这种方式适合快速验证单条任务批量对比还是建议用脚本。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth配置和训练过程中报错基本集中在这几类。我按真实报错信息给你对照排查。5.1 401 Unauthorized报错长这样{error: {message: Invalid API key, type: invalid_request_error}}原因通常是三个Key 复制时带了空格或换行Key 被删除或过期Key 权限不足。排查顺序先去控制台确认 Key 还在然后检查配置文件里 Key 字段有没有多余字符。Cline 的 JSON 配置里Key 是字符串不要加引号嵌套。Claude Code 的settings.json里ANTHROPIC_API_KEY直接填值不要写成Bearer sk-xxx工具会自己加前缀。5.2 local proxy failed报错长这样Error: local proxy failed to connect: dial tcp 127.0.0.1:xxxx: connect: connection refused这个通常出现在 Cline 或 Claude Code 配置了本地代理端口但代理服务没起来。检查你的配置文件里有没有http_proxy或https_proxy指向本地端口。如果有要么把代理服务启动要么直接删掉这两行让请求直连 TaoToken 端点。注意 Base URL 必须是https://taotoken.net/api不要填成本地地址。5.3 reading choices 报错报错长这样KeyError: choices或者json.decoder.JSONDecodeError: Expecting value: line 1 column 1这说明请求返回的不是标准 JSON可能是 HTML 错误页或者空响应。排查先打印resp.status_code和resp.text看服务端到底返回了什么。常见原因是 URL 写错比如写成了https://taotoken.net/api少了/v1/chat/completions或者模型 ID 不存在导致服务端返回错误页。确认 URL 完整路径和 Model ID 正确后问题一般就解决了。5.4 OAuth 相关报错报错长这样OAuth token expired, please re-authenticate如果你用的是 Claude Code 并且之前登录过官方账号它可能优先走 OAuth 而不是 API Key。解决办法是在settings.json里显式配置ANTHROPIC_API_KEY和ANTHROPIC_BASE_URL并且确认没有残留的 OAuth 凭证文件。有些版本需要设置ANTHROPIC_AUTH_MODEapi_key来强制走 Key 模式。配完之后重启工具让它重新读取配置。5.5 技能训练特有的报错跑 SkillGrad 或自己写的训练循环时还可能遇到Validation gate rejected all edits in this iteration这不是通道问题是技能编辑方向不对。检查 Diagnoser 产出的文本梯度是不是太泛比如「让报告更好看」这种没有可操作性的建议。好的梯度应该具体到「第三章排序口径改为首次出现分组并删除一级累计率列」。如果连续多轮全被拒把 edit budget 降到 2让每轮只改最关键的一处。另一个常见报错Momentum buffer overflow, meta pattern too generic说明跨轮总结的元规则太抽象比如「注意数据质量」这种放之四海皆准的话。解决办法是在 Momentum Agent 的提示里加约束要求元规则必须能对应到具体的展示层或排序层问题。6. 把技能训练接进日常从手动迭代到半自动循环走到这里你手里应该有了一份能跑的SKILL.md、一张调参对照表、三个工具的 Base URL 配置、一个评分脚本以及一份报错排查清单。接下来是怎么把它变成日常习惯。我的做法是分三步走。第一步先手动跑通一轮用旧技能跑 20 条任务记录分数按 SkillOpt 的思路做一次有界编辑改不超过 3 处再跑一遍分数涨了就提交 git跌了就回滚。这一步的目的是建立手感知道什么样的编辑有效。第二步把评分脚本接进训练循环。SkillGrad 的 pipeline 里Executor、Diagnoser、Momentum、Patcher 四个调用都可以走 TaoToken 的统一端点你只需要在配置里指定一次 Base URL 和 Key。跑一轮完整训练大概 2000 到 8000 次 LLM 调用听起来多但换来的是几百行经过验证的技能文本而且这份文本能跨模型迁移——今天用这个模型训出来的技能明天换另一个模型照样生效。第三步把技能目录纳入版本管理。SKILL.md是纯文本每次编辑都有 git blame哪条口径是哪次迭代加的、为什么加全都能追溯。这比把规则塞在系统提示词里强太多后者改了什么根本说不清。长期编码和 Agent 任务如果调用量大可以考虑 Coding Plan入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 适合需要稳定跑训练循环的场景。如果只是偶尔验证模型输出用模型对话就够了。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 配置字段有疑问先查文档再动手。最后说个实用技巧技能训练最耗时的不是跑调用而是准备训练集和验证集。我的经验是训练集从真实历史任务里抽覆盖典型场景即可不用追求数量验证集一定要 held-out不能和训练集重叠否则验证门控会失效技能会过拟合到训练任务上。另外每次编辑后除了看总分还要看三个维度的分项分有时候总分涨了但口径分掉了说明编辑引入了新的口径问题这种编辑要谨慎接受。