如何给Agent技能做防作弊评测?Yao Meta Skill的train/dev/holdout与盲测体系完整指南
【免费下载链接】yao-meta-skillYAO = Yielding AI Outcomes. A rigorous engineering, evaluation, governance, and portability system for reusable agent skills.项目地址: https://gitcode.com/gh_mirrors/ya/yao-meta-skill
给 Agent 技能写评测集,最大的陷阱是"自己出题、自己答题"——改描述直到训练集全绿,上线却翻车。开源项目Yao Meta Skill(YAO = Yielding AI Outcomes)提供了一套严谨的 Agent 技能评测方法论:用 train/dev/holdout 数据集切分、盲测(blind holdout)、对抗样本和晋升门禁,防止技能描述"过拟合"小基准集。下面带你完整拆解这套防作弊评测体系。
为什么Agent技能评测容易"作弊"
Agent 技能的触发描述(description)决定了什么时候该"激活"这个技能。优化它和调模型参数很像:
- 你不断改写描述,用一组提示词测试
- 改到测试集全过,就觉得"变强了"
- 但这组提示词已经被"看过了",成绩虚高
更糟的情况是路由偷占(route theft):为了多触发自己,把兄弟技能该触发的场景也抢过来,或把本该"不触发"的提示词也触发了。Yao 把这类风险写成正式的晋升策略:只有当候选版本不仅局部更好,而且在路由边界上可测量地更安全时,才允许晋升。
数据集切分:train / dev / holdout 各管什么
核心目录在 evals/,README 说明了完整结构:evals/README.md
| 数据集 | 路径 | 职责 |
|---|---|---|
| 回归全集 | evals/trigger_cases.json | 带 family 标签的完整回归集合 |
| 训练集 | evals/train/ | 参与迭代调优的提示词 |
| 开发集 | evals/dev/ | 仅用于给候选版本排名,不授权晋升 |
| 验收集 | evals/holdout/ | 最终验证,要求不回归 |
| 盲测集 | evals/blind_holdout/ | 不参与候选排名的验收提示词 |
| 对抗集 | evals/adversarial/ | 更难的路由冲突提示词 |
| 混淆集 | evals/confusion/ | 兄弟技能路由用例,抓"偷路由" |
以 evals/dev/trigger_cases.json 为例,每个数据集分成三类桶(源自评测手册):
- should_trigger:明确该触发的提示词,验证召回率。比如"把这份运维清单转成可复用技能"
- should_not_trigger:明确不该触发的,验证精确率。比如"翻译这些笔记到法语并保持结构不变"
- near_neighbor:长得像但属于别的技能或不需要技能,抓假阳性
每条用例还带family标签(如workflow_to_skill、paraphrase_trigger、long_context_trigger),用于按家族统计——即使总分上升,某个家族悄悄变差也会被发现。
盲测体系:让"考试"和"复习"彻底分开
盲测集 evals/blind_holdout/trigger_cases.json 的设计意图很直接:优化描述时不准看这些题。比如其中的负例"把这个流程说明转成 wiki 参考文档,不要创建任何技能文件"——措辞与"打包成文档"高度重叠,是典型的边界陷阱。
运行方式是用裁判脚本做第二意见:
python3 scripts/judge_blind_eval.py --description-file SKILL.md \ --cases evals/blind_holdout/trigger_cases.json \ --semantic-config evals/semantic_config.json它基于 rubric(评分细则)对盲测提示词给出独立判分,避免"描述里悄悄塞进盲测原题"这种作弊路径。语义配置 定义了本地意图概念、排除词与权重,保证判分标准统一。
对抗集:给路由边界"加压"
evals/adversarial/trigger_cases.json 里的样本更刁钻,包含"带噪声的正例"和"欺骗性的不触发请求",例如:
- 正例:会议杂音里夹一句"把这套支持升级流程做成维护中的技能包"
- 负例:"总结这份 SOP 并翻译成日语放进知识库,只当文档用"——翻译、总结、SOP 全是触发技能的高频词,但意图明确是纯文档
对抗风险带必须保持healthy才允许晋升共享或受治理的资产。
六道晋升门禁:dev分数再好也不能直接上线
evals/promotion_policy.md 定义了完整的晋升流水线,dev 分数只是第一道:
- Dev 排名:只在 dev 上比较候选,优先级是"更少误报 → 更少漏报 → 近邻更强 → 措辞更短"。dev 本身不授权晋升
- 可见 holdout 不回归:不能新增任何误报/漏报
- 盲测不回归:盲测上不能新增任何误报/漏报
- 对抗不回归:对抗集风险带须为
healthy - 路由混淆门禁:如果技能库里有兄弟技能,路由记分卡必须干净——不允许误路由,歧义分差不得超阈值
- 家族稳定性:不允许出现新的失败盲测家族或对抗家族
三种结局:Promote(全部门禁通过)、Keep Current(只是 dev 更好,或有门禁回归)、Block(对抗风险变成overlap、偷了兄弟路由、或本不该路由的提示词开始触发)。
这套机制直接回答了"为什么需要它":防止元技能只是因为过拟合了一个小基准而看起来被优化了。
混淆矩阵:防止"抢兄弟技能的路由"
当技能不是单独存在而是技能库一员时,光看自己够不够"准"还不够。evals/confusion/route_cases.json 把多个技能的路由放在一起考:
- 每条用例声明
expected_route,比如"跑一次合并前前端审查"必须路由到team-frontend-review而不是yao-meta-skill - 配置
margin_warning_threshold(0.08):两个候选路由分差过小就标记为"歧义" - 同时跟踪
no_route:不该路由进任何技能的提示词必须留在门外
生成的路由记分卡展示混淆矩阵:每条路由的精确率、召回率、平均分差,一目了然。配套的 evals/failure-cases.md 则持续记录当前仍弱的场景(如"一次性提示词请求""只改文档不做技能"),作为长期回归检查项而不是修完就删。
如何跑起整套评测
常用入口都在 evals/README.md 中列出,核心命令包括:
# 单跑触发评测,对比基线描述 python3 scripts/trigger_eval.py --description-file evals/improved_description.txt \ --cases evals/trigger_cases.json --baseline-description-file evals/baseline_description.txt # 跑完整评测套件 python3 scripts/run_eval_suite.py # 生成混淆矩阵与评测仪表盘 python3 scripts/build_confusion_matrix.py python3 scripts/render_eval_dashboard.py对比用的基线描述故意写得弱("Create and improve agent skills."),与当前更强的描述形成可量化的进步证据。生成的报告落在 reports/ 目录,如描述优化报告、漂移历史(description_drift_history.md)等。
新手可落地的最小实践
不需要一步到位,按 references/eval-playbook.md 的分层标准起步即可:
- 个人技能:2 条真实提示词 + 人工审查
- 团队技能:3 到 5 条真实提示词,加上近邻用例
- 修订循环顺序:先修边界/描述问题,再动正文;把脆弱逻辑移进脚本或模板;每次改完用同一套评测集重跑再扩大范围
核心要点回顾:
| 实践 | 防住的作弊 |
|---|---|
| train/dev/holdout 切分 | 在"复习题"上刷分 |
| 盲测集 + 裁判脚本 | 把验收题泄进训练过程 |
| 对抗集 | 靠表面高频词侥幸通过 |
| 路由混淆矩阵 | 偷占兄弟技能的路由 |
| 家族稳定性门禁 | 总分涨但某类场景悄悄退步 |
总结
Yao Meta Skill 的评测哲学一句话:评测集的价值取决于它有多"干净",而不是它有多难。用数据集切分隔离"复习"与"考试",用盲测和对抗样本抬高作弊成本,用多重晋升门禁把"看起来更好"变成"可证明更好"。当你开始认真维护可复用的 Agent 技能时,这套 train/dev/holdout + 盲测 + 混淆矩阵的组合拳,值得直接抄作业。
【免费下载链接】yao-meta-skillYAO = Yielding AI Outcomes. A rigorous engineering, evaluation, governance, and portability system for reusable agent skills.项目地址: https://gitcode.com/gh_mirrors/ya/yao-meta-skill
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考