为什么需要
做 AI Agent 产品,最大的痛点是 Skill 质量不稳定。手写的 prompt 效果飘忽,强模型一次性生成的 skill 也不一定好,传统的"自反思修订"完全靠运气。你想要的是:能不能像训练神经网络那样,有 epoch、batch size、learning rate、validation gate,迭代地、稳定地提升 skill 的质量。
SkillOpt 是微软研究院的开源项目,核心思路是把 skill 文档(一个 .md 文件)当作可训练的状态——用一个 optimizer 模型根据 scored rollouts 产出 bounded add/delete/replace edits,候选编辑只有在 held-out validation 分数严格提升时才被接受。零推理时模型调用,部署时模型权重不变。
对独立开发者的实际价值:你做了一个出海 AI 产品,Agent 里的 skill(客服话术、文档生成模板、SQL 生成器)质量忽好忽坏。用 SkillOpt 训练一遍,skill 准确率平均 +23.5 分,且优化后的 skill 文档能跨模型、跨执行环境(Codex CLI、Claude Code CLI)迁移,不需要重新训练。
怎么用
PyPI 一行安装:
pip install skillopt
# 可选 extras
pip install skillopt[alfworld] # ALFWorld 基准
pip install skillopt[webui] # Gradio 监控面板
pip install skillopt[claude] # Claude 模型后端
配置 LLM(支持 OpenAI / Azure / Claude / Qwen / MiniMax):
cp .env.example .env
# 填入 API 配置
source .env
训练一个 skill:
python scripts/train.py \
--config configs/searchqa/default.yaml \
--split_dir /path/to/your/searchqa_split \
--azure_openai_endpoint https://your-resource.openai.azure.com/ \
--optimizer_model gpt-5.5 \
--target_model gpt-5.5 \
--num_epochs 4 --batch_size 40
只评估不训练:
python scripts/eval_only.py \
--config configs/searchqa/default.yaml \
--skill ckpt/searchqa/gpt5.5_skill.md \
--split valid_unseen \
--split_dir /path/to/searchqa_split
启动 WebUI 监控训练进度:
python -m skillopt_webui.app --port 7860
使用案例
独立开发者做了一个面向海外开发者的 AI 编程助手,Agent 里有个"生成单元测试"的 skill 质量忽好忽坏。手动调 prompt 调了 2 周,accuracy 还是在 65-72% 之间浮动。用 SkillOpt 在 SearchQA 数据集上训练一遍:
- optimizer 用 GPT-5.5,target 也用 GPT-5.5
- 4 epoch、batch size 40、textual learning rate 4(cosine decay)
- 训练完输出的
best_skill.md(300-2000 token)在测试集上 accuracy 提到 89%
更关键的是:把这个 skill 拿到 Codex CLI、Claude Code CLI 里直接用,准确率还能保持 85%+,不需要重新训练。
另一个场景:自己做了一个 RAG 应用,retrieval 的 skill 在不同 embedding 模型上效果差异大。用 SkillOpt 训一次,输出的 skill 文档能跨 embedding 模型迁移,节省反复调参的时间。
注意事项
- 定价:完全免费开源,MIT 协议
- Python 3.10+,需要 LLM API(OpenAI / Azure / Anthropic / Qwen / MiniMax 都支持)
- 支持 6 个基准:SearchQA、ALFWorld、DocVQA、LiveMathematicianBench、SpreadsheetBench、OfficeQA
- 添加新 benchmark:实现
skillopt/envs/<name>/下的 dataloader、rollout、initial.md 即可 - 训练数据需要自己准备 split(train/val/test 各一个 items.json),仓库里提供了 SearchQA 的示例 split
- slow-update 默认是 force-accept 模式;想完全复现论文结果需要把
optimizer.slow_update_gate_with_selection: true - 由微软研究院 + 清华团队联合出品,论文 arXiv:2605.23904