来源: 微信公众号文章
原文链接: https://mp.weixin.qq.com/s/lTdRNB3vTJoU0nAPBkHNtw
整理: A梦
📋 项目信息
| 项目 | 内容 |
|---|---|
| 项目名称 | skill-up |
| 开源机构 | 阿里巴巴 |
| 项目定位 | Agent Skill 命令行评测框架 |
| 开源地址 | github.com/alibaba/skill-up |
| 用户手册 | alibaba.github.io/skill-up/zh |
🤔 背景:Agent Skill 评测的痛点
过去一年,Agent Skill 迅速成为 AI 应用领域的核心基础设施。但一个核心问题长期被忽视:“它到底好不好用?”
三个典型场景
| 场景 | 问题描述 |
|---|---|
| 场景一:Skill 悄悄退化 | 同事改了 SKILL.md 里的一段描述,Skill 在某些输入下不再调用预期工具,退化成纯文本回答,但评审阶段无人察觉 |
| 场景二:换个引擎,行为就变了 | 同一个 Skill 在不同 Agent 引擎上输出结构完全不同,但缺乏系统验证手段 |
| 场景三:评测逻辑散落各处 | 评测语义散落在多个脚本和中间文件里,本地一套、CI 又一套,新人看不懂评测到底在判什么 |
核心问题: Skill 缺少标准化的评测框架,把「加载用例→启动 Agent→发送输入→收集回复→判定是否通过→生成报告」稳定地串起来。
🎯 skill-up 是什么
skill-up 是一个独立的命令行评测框架,目标是「让 Agent Skill 的每一次迭代都可被验证、可被回归」。
最小配置示例
eval.yaml(评测声明):
1 | schema_version: v1alpha1 |
case YAML(单条用例):
1 | id: case_create_plan |
运行命令
1 | skill-up run ./evals/eval.yaml |
三类输出结果
- 逐条断言的通过情况与证据(工具是否被调用、输出是否包含关键字段、判定理由)
- 汇总通过率与耗时/token 消耗
- 进程退出码: 0 表示全部通过,非 0 表示存在失败用例(可直接接入 CI)
额外支持 JUnit XML 和 可视化 HTML 报告。
🏗️ 四个核心设计
设计一:声明式评测配置
评测的环境、引擎、模型、用例、判定策略全部写在 YAML 里,而不是散落在脚本控制流中。
好处:
- 打开 eval.yaml 就能看清「这条用例要做什么、整体怎么判」
- 新增用例往往只是新增一份几十行的 YAML
设计二:expect + judge 分层判定
把断言拆成两层,降低 LLM 抖动对流水线的影响:
| 层级 | 类型 | 成本 | 作用 |
|---|---|---|---|
| expect | 本地零成本检查 | 免费 | 门槛检查:文件是否存在、输出是否含关键词、退出码是否为零 |
| judge | 深度判定 | 消耗 token | 三种策略:rule_based / script / agent_judge |
好处: 大部分明显失败在不消耗 token 的本地阶段就被拦截,CI 不会因为大模型偶发抖动被无端阻断。
设计三:多引擎支持
同一份用例可在不同 Agent 上回放:
1 | skill-up run ./evals/eval.yaml --engine claude_code |
- Skill 安装、CLI 调用、产物收集由框架处理
- 自研或第三方 Agent 可按标准化契约接入,无需改动用例
设计四:结构化报告,天生对 CI 友好
- 与 Anthropic 评测产物 Schema 兼容
- 额外提供 JUnit XML 和 HTML 报告
- 全流程通过退出码反馈结果
- 支持
skill-up import一键迁移 Anthropic 风格的 evals.json
🔄 多轮会话评测
真实用户不是「一问一答」,而是「你一句、Agent 一句」来回多轮。skill-up 支持在一个用例里定义多条连续用户消息。
示例:删除前必须确认
1 | id: confirm-before-delete |
多轮评测关键能力
| 能力 | 说明 |
|---|---|
| 真实会话保持 | 每轮都在同一个 Agent 会话中,Agent 能看到之前所有对话 |
| 逐轮质量门控 | post_condition 在每轮回复后立即检查,不达标可以早停省 token |
| 跨轮值传递 | 用正则从某轮回复里提取 token,自动填入后续消息 |
| 精确到轮的最终判定 | 既能断言「某轮回复必须包含某关键词」,也能验证「某轮是否调用了某个工具」 |
post_condition vs judge 的分工
| 维度 | post_condition(过程门卫) | judge(最终裁判) |
|---|---|---|
| 执行时机 | 每轮回复后立即 | 所有轮次结束后一次 |
| 检查范围 | 仅当前这一轮的回复文本 | 全部轮次记录、工具调用、产物文件、退出码 |
| 流程控制 | on_fail: 早停省 token 或放弃后续 | 跨轮综合定性、工具与产物验证、语义评判 |
| 核心问题 | 值不值得继续下一轮? | 整场对话最终算不算通过? |
🏭 重型端到端评测
以「代码工程升级」类 Skill 为例,评测特征:
- 依赖真实运行环境(完整语言工具链和 Agent CLI 实际可用)
- 输入是代码仓库而非文本(具体仓库快照,Skill 做实际文件修改)
- 判定在产物层面(改完的代码和”标准答案”做逐行 diff)
- 单条用例耗时长(可能几十分钟,对 CPU 和内存有真实要求)
三层判定漏斗
1 | 第一层: expect → 检查最便宜、最确定的信号 |
judge-agent with skill
当评审规则越来越接近领域手册时,可以给评审 Agent 单独安装一个评测专用 Skill:
1 | judge: |
关键隔离: judge Skill 只安装给评审 Agent,不会安装给被测 Agent,防止被测 Agent “迎合判题器”。
📊 集团内部落地案例
迁移前后对比
| 维度 | 迁移前(手搓流水线) | 迁移后(skill-up) |
|---|---|---|
| 代码量 | ~1200 行(Shell + 配置解析 + CI 编排) | 声明式 YAML + 少量证据脚本 |
| 通用执行编排 | 多个 Shell 脚本,约数百行 | 删除,交由框架承接 |
| 判定方式 | 结论解析脚本 + 源码 diff 脚本硬判 | expect + 证据脚本 + agent_judge / judge skill |
| 引擎支持 | 仅锁定单一引擎 | 一个参数切换多引擎回归 |
| 本地/CI 一致性 | 两套,改动不同步 | 共享同一份评测声明 |
| 失败处理 | 明显失败也要跑完整对比 | expect 失败即跳过昂贵阶段 |
| 新增用例成本 | 改 CI 配置 + 确认脚本兼容 | 新增一份约 40 行的 YAML |
| 报告查看 | 下载制品、解压、读原始文件 | 一个链接直达可视化报告 |
核心收益
- 声明式结构: 从「读完好几个脚本才拼得出来」变成「打开 YAML 就能顺着看清」
- 分层判定: 廉价失败快速返回、确定性证据稳定产出、复杂差异交给评审 Agent
- 跨引擎回归: 从「重写整套安装脚本」变成「改一个参数」
- 协作改善: HTML 报告发布成可访问链接,评审、验收、争议解决直接甩链接
🚀 五分钟上手
路径 A:Agent 自动生成评测集(推荐)
skill-up 开源了 skill-upper Agent Skill,专门帮 Agent 读取 SKILL.md 并推断评测方式:
1 | # 以全局安装到 Claude Code 为例 |
装上后,在 Skill 仓库根目录对 Agent 说「评测当前 Skill」,skill-upper 会生成 evals/eval.yaml 和 cases,并调用 skill-up 跑一遍。
路径 B:纯 CLI 上手
1 | # 安装 |
⚠️ 清晰边界
skill-up 不擅长的地方:
| 场景 | 建议方案 |
|---|---|
| 产物必须逐字节一致 | 用 script judge 靠退出码硬判,不必动用 agent_judge |
| 真实环境可复现 | 工具链、镜像、标准答案仍需自己准备 |
| 单条跑几十分钟的重型用例 | 更适合定时回归而非每次提交都卡门禁,当成「质量基线」而非「每个 commit 的强阻断」 |
📝 总结
skill-up 的定位:用简单易懂的声明式配置,固化我们对 Agent Skill 的预期,让代码评审和 CI 流水线都能有效验证它。
从「一问一答」的单轮断言,到贴近真实交互的多轮会话,再到承接真实业务的重型端到端评测,它始终做同一件事:
把 Skill 的质量从「靠肉眼和记忆维护」变成「可声明、可回放、可回归」。
🔗 相关链接
- 开源仓库: github.com/alibaba/skill-up
- 中文用户手册: alibaba.github.io/skill-up/zh
- Issue 反馈: github.com/alibaba/skill-up/issues
整理:A梦 (turbineyan)
来源:微信公众号文章
原文:https://mp.weixin.qq.com/s/lTdRNB3vTJoU0nAPBkHNtw