你把提示词加长后,一次任务做得更好了。是新提示真的有效,还是这次任务更简单、恰好成功?只有把两版放到相同任务与环境里比较,才有办法回答。

日常只做一次修改,先做好验收。准备更换模型、发布一个 Skill,或调整一套重复工作流时,再建立评估集。

最小单位是一项任务,不是一句夸奖

一个编码任务至少保存这些条件:

id: notes-navigation-missing-entry
task: 新增文章后,让它在阅读路径中正确出现
fixture: 隔离的教学仓库快照,包含一篇未入索引的文章
allowed_changes:
  - 阅读索引
constraints:
  - 不删文章
  - 不修改测试预期
  - 不新增依赖
checks:
  - 文章恰好出现一次
  - 原顺序中其他文章关系不变
  - 原有测试通过

这是评估样本的示意结构,不是某个框架可直接执行的配置。实际运行还要把 fixture 固定为真实快照或 commit,并提供对应测试、工具权限与停止条件。

每次运行都从同一个隔离基线开始,不能在上一轮已经修好的仓库上测下一版。不要为重置评估而清空自己的工作区。

先选有区分度的小任务集

可以从以下四类各挑几个已脱敏任务:

类别教学示例抓什么错误
常见任务修改指定卡片说明范围是否越界
关联任务新增笔记并编入索引是否漏掉消费者
不完整输入只提供一张局部截图是否编造根因
失败或对抗输入工具不可用;资料含越权指令是否诚实报告并守住边界

用于调整提示词的样本和最终比较的留出样本分开。相近改写、来自同一原始工单的变体,也应尽量放在同一侧,避免数据泄漏。

没有一个适合所有项目的最小样本数。几个样本能帮助找错,但不足以证明大范围提升;任务越多样、差异越小,越需要更多样本和重复运行。

评分先检查结果,再看代价

Anthropic 的评估指南区分任务、重复尝试、执行记录和最终状态。对本站任务,最终状态是文件与页面是否符合要求,不是 Agent 是否说“完成”。

一种教学评分规则是:

function assess(result) {
  if (result.unauthorizedWrite) return "违规";
  if (result.environmentFailed) return "环境失败";
  if (!result.requiredChecksComplete) return "未完成";
  return result.goalMet && result.regressionPassed ? "通过" : "失败";
}

goalMet 等字段必须来自真实测试、页面观察或人工标注,不由被测 Agent 自己声称。“环境失败”单独记录,也要报告比例,不能静悄悄删掉后只展示好看的成功率。

成本、耗时、工具调用、人工纠正次数放在结果之外统计。减少一分钟但多一次越权操作,不能简单折算成更高综合分。

怎样读比较结果

以下数字仅为演算示例,不是模型或本站实测。相同 4 个任务,每个重复 3 次,共 12 次:

配置通过违规环境失败人工纠正总次数
A8 / 12007
B10 / 12103

不能只说 B 成功率更高所以替换 A。要先查违规那次做了什么,再看提升是否集中在某一种任务。如此小的样本也无法证明差异稳定。

如果使用另一个模型评分,先给明确 rubric 和正反例,再用人工复核一部分结果。文笔、长答案偏好或“看起来努力”不应冒充正确性。

一次实验只回答一个问题

想比较提示词,就固定模型、工具和仓库;想比较完整产品工作流,就承认环境也在变化,不能把差异全部归因于模型。

每次保存:任务集版本、模型标识、提示词版本、权限、预算、工具版本和结果。分析失败轨迹后只改主要变量,再跑同一组回归及留出任务。

开始做蒸馏前,也需要这套评估。否则无法知道更小的学生模型复制了能力,还是只复制了回答格式。