跳到主内容
创建时间:最后更新:作者:白川

建立任务夹具,跑通第一次评估

定义输入、环境和完成标准,先验证评分器,再运行真正的智能体任务。

建立任务夹具,跑通第一次评估

智能体回复“检查完成”,不等于它读取了正确文件,更不等于报告准确。评估需要把“希望它做什么”写成独立可核查的条件,再运行任务并保存证据。

这篇先做四个很小的任务:命名函数、箭头函数、缺失文件和不需要工具的请求。规模小是为了能解释每个分数,不是用四个用例代替完整质量评测。

独立示例位于仓库 columns/coding-agent/examples/evaluation-optimization/,固定 Pi 相关依赖为 1.5.0。先在该目录执行 npm install,下文命令也从此处运行。离线样本不需要密钥;真实模型入口另行配置,不会由测试自动触发。

把一个任务拆成输入与判定

src/tasks.ts 保存任务定义。prompt 交给模型,expected 只交给评分器;不要为了让实验稳定,把参考答案也拼进模型上下文。

ts
export interface Report {
  file: string
  status: "ok" | "missing"
  names: string[]
}
export interface Task {
  id: string
  prompt: string
  file?: string
  expected: Report | "ready"
}

// 这些期望值只交给评分器,不进入模型提示或工具实现。
export const tasks: Task[] = [
  {
    id: "named",
    file: "sample.ts",
    prompt: "检查 sample.ts 的命名 function 声明,返回 JSON 报告。",
    expected: { file: "sample.ts", status: "ok", names: ["greet"] },
  },
  {
    id: "arrow",
    file: "arrow.ts",
    prompt: "检查 arrow.ts 的命名 function 声明,返回 JSON 报告。",
    expected: { file: "arrow.ts", status: "ok", names: [] },
  },
  {
    id: "missing",
    file: "missing.ts",
    prompt: "检查 missing.ts,文件缺失也应如实返回 JSON 报告。",
    expected: { file: "missing.ts", status: "missing", names: [] },
  },
  { id: "no-tool", prompt: "不要检查文件,不调用工具,只回复 ready。", expected: "ready" },
]

fixtures/sample.ts 只有一个命名 function 声明,arrow.ts 包含箭头函数,missing.ts 故意不存在。检查器只做文本匹配,因此箭头函数的预期 names 为空;这不是声称箭头函数不存在,而是明确当前任务的能力边界。

任务独立成功条件能排除的假成功
named
实际检查文件并报告 greet
未读取就猜答案
arrow
不把箭头函数报成命名声明
只看标识符就报函数
missing
如实返回 missing
编造空文件或成功读取
no-tool
回复 ready 且不调用工具
为提高调用率而滥用工具

参考结果应先通过评分,再故意改坏字段、删除工具证据或修改输入,确认评分能发现问题。一个从未见过失败样本的评分器,很容易只是在验证“程序可以运行”。

先运行离线评分检查

bash
npm run typecheck
npm test
npm run eval:offline

offline 输出包含 mode: synthetic-fixtures-not-agent-performance。它用手写的 baseline/candidate 结果测试评分与报告,故意让其中一份箭头函数答案出错。输出的分差属于预设数据,不是模型调优收益。

测试中的 Agent 循环也使用模拟流,只验证工具执行和评测适配逻辑。模拟流照着已知答案返回结果,不能证明真实模型会选择工具或遵守格式。

再选择是否运行真实任务

在本地终端配置 EVAL_PROVIDER、EVAL_MODEL、EVAL_API_KEY,选择固定版本内置目录支持的模型,然后执行:

bash
npm run eval:live -- prompt 1

该命令运行四任务、两组、各一次,共八个 arm,可能包含多轮模型请求,会消耗实际配额。它不读取个人 Pi 凭据,也没有费用硬上限;密钥只从显式环境变量进入内存连接。

每个 arm 创建独立 Agent,不共享会话历史;工具只能读取三个教学文件名。它没有 shell 和写入工具,但这仍不是运行任意恶意代码的沙箱。线上模型、服务端缓存和负载也不因新建 Agent 就完全独立。

从小样本开始,保留真实任务分布

确定性检查通过后,再增加常见任务、失败样本、边界输入和不应调用工具的反例。公开开发集用于快速修正,保留集用于验证有没有只适应已知答案;二者都需要版本与来源。

新任务应能被参考实现解决,评分规则应与用户请求一致。比如任务没有要求某个报告文件名,评分却只检查那个路径,得到的失败可能是评测设计问题。完成标准要约束必要结果,同时允许合理实现方式。

依据与版本

官方本地快照为 8efd314fa,evals 包标记 1.3.0;本系列示例另按发布包 1.5.0 核验。官方 evals 是 private 工作区包,教程使用自定义教学协议,不冒充稳定公共评测 SDK。