Eval Dataset
Eval Dataset 是用于评估 Agent 质量的标准案例集合;不仅需要定义期望行为,还要通过分层、分组切分和风险切片避免泄漏与平均分掩盖关键失败。
#type / concept
#status / evergreen
#tech / ai
[!info] related notes
Eval Dataset
一句话定义
Eval Dataset 是用于评估 Agent 质量的标准案例集合。每个 case 不一定要求唯一标准答案,但应明确输入、期望不变量、禁止行为、工具/trace 期望和可用于切片分析的元数据。
核心原理
数据集结构
@dataclass
class EvalCase:
id: str
query: str
expected_answer: str = ""
expected_tools: list[str] = None
expected_sources: list[str] = None
tags: list[str] = None
difficulty: str = "medium"
case_category: str = "normal"
risk_slice: str = "standard"
scenario_family_id: str = ""
对于开放式 Agent 任务,更稳健的 case 还可以记录:
expected invariants
forbidden behaviors
trace expectations
scoring rubric
而不是强迫模型复述唯一字符串答案。
评估运行
async def run_evaluation(agent, dataset: EvalDataset, judge) -> EvalReport:
results = []
for case in dataset.cases:
response = await agent.run(case.query)
score = await judge.evaluate(
query=case.query,
answer=response.text,
reference=case.expected_answer,
)
results.append({
"case_id": case.id,
"score": score,
"latency": response.latency,
"tokens": response.token_usage,
})
return EvalReport(results)
Dataset 不是一个长期混用的题库
生产 eval 通常需要区分不同用途:
Development
→ 用于改 Agent / Prompt / Validator
Calibration
→ 用于调 Judge rubric / threshold
Holdout
→ 用于未见数据上的最终资格验证
Regression
→ 保存历史真实 failure,防止复发
Challenge
→ 故意覆盖高风险 failure mode
如果长期用同一批案例一边调系统、一边声称它证明泛化能力,最终分数会被开发过程污染。
Split 要同时考虑 Coverage 与 Leakage
推荐同时使用:
Stratified
→ 重要 case category 在需要的 split 中有代表
Grouped
→ 同一 user / episode / scenario family 不跨 split
具体见 Eval Dataset 的分层与 Grouped Split。
Dataset 必须支持 Slice Metrics
仅保存 query/reference 不足以支持成熟评测。关键 case 应带有能稳定切片的标签,例如:
- risk level;
- case category;
- scenario family;
- evidence richness;
- tool-required;
- safety / governance path。
这样 overall score 才能和 关键切片门槛 同时报告。
常见坑
- 数据集太小: 少量普通用例无法覆盖边界情况
- 不做回归测试: 改了 Prompt 不知道效果变好还是变差
- 不做标签分类: 不知道哪类问题质量差
- row-level 随机切分造成泄漏: 同一 scenario family 的近重复案例跨 development/holdout
- 把 challenge raw average 当生产成功率: 高风险 oversampling 的集合分布与真实流量不同
- 只定义唯一答案: 对开放式 Agent 任务,更重要的可能是行为不变量和禁止行为