切换主题

Agent 评测数据集怎么做?从真实任务、轨迹日志到回归测试

Easton editorial illustration: production agent control room
4
样本层级
golden set、negative cases、edge cases、regression cases。
5
评测维度
工具选择、参数格式、执行顺序、最终答案、人工标注对齐度。
6
关键轨迹字段
traceId、span_id、tool_calls、state_events、approval records、human labels。
数据来源: 本文工程清单基于 OpenAI、LangSmith、Phoenix、DeepEval 和 OpenAI Agents SDK 官方文档整理;API 命名、平台状态和产品 UI 发布后仍应以官方文档为准。

"OpenAI Evaluation best practices 建议先定义目标、收集数据集、定义指标、运行比较并持续评测;测试数据可来自生产数据、历史数据、领域样本和人工标注。"

上周还能生成日报的 Agent,模型升级后仍给出”看似正确”的最终总结,但轨迹里漏掉了权限校验和数据刷新工具。客服 Agent 最终回复没错,但调用了错误的退款工具参数;公开 benchmark 看不出这个风险。一次事故复盘里已经有 traceId、tool call、approvalId、state event 和人工判定,但没有被固化成下次发布前必跑的测试。

这类退化不能靠换个模型或跑一次 demo 兜住。Agent 评测数据集要来自真实任务分布和生产失败轨迹,包括工具调用、参数格式、状态转移、审批记录和人工标注,再接入 CI 门禁做回归测试。接下来把重点放在失败案例和真实场景:如何构建可持续运行的 eval dataset,守住每次发布的质量边界。

一、为什么公开 benchmark 不够

1.1 公开 benchmark 的局限

公开 benchmark 测的是模型能力,不是你的业务任务质量。AgentBench、WebArena 这类评测集提供了标准任务,但它们无法覆盖团队特有的工具链、权限模型和状态机。

比如,你的报表 Agent 需要调用 check_permission、refresh_data、generate_report 三个工具,并按”检查→刷新→生成”顺序执行。公开 benchmark 不会测试这个流程,因为它不知道你的工具 schema 和权限边界。

模型在公开 benchmark 上分数好看,不代表业务任务不会退化。Agent 评测数据集要测的是你的真实任务分布,而不是通用的推理能力。

1.2 自建数据集的核心价值

自建 eval dataset 能捕获公开 benchmark 看不到的风险。以下是典型场景对比:

场景公开 benchmark自建 eval dataset
报表 Agent 漏权限校验看不出,无此工具和权限模型捕获轨迹约束:必须调用 check_permission
客服 Agent 调错退款参数无此工具,无退款 schema预期工具调用列表 + 参数格式约束
模型升级后状态转移变差无此状态机状态轨迹断言:检查→审批→执行顺序
事故复盘未固化成测试无事故数据失败案例进入 negative cases

公开 benchmark 选模型,自建数据集守住发布门禁。两者互补,不能互相替代。如果你已经读过Agent 评估基准对比,知道哪些公开评测集适合选型,这里就不再重复;重点是如何从自己的生产环境构建评测数据。

二、Agent eval dataset 的核心字段

2.1 必选字段

Agent eval dataset 不是简单保存用户输入和期望答案,而是要记录工具调用轨迹、状态转移和人工判定。以下是必选字段:

字段说明来源
input用户任务描述生产 trace / 手工设计
expected output预期最终答案人工标注 / golden set
expected tool calls预期工具调用列表轨迹分析,如 ["check_permission", "refresh_data"]
trajectory assertions轨迹约束(必须/禁止/顺序)状态机 + 审批流程
human labels人工判定(正确/错误/部分)事故复盘 / 标注队列

LangSmith 在 Evaluation concepts 中建议 Agent 评测应覆盖工具选择、参数格式和执行轨迹,而不是只看最终答案。OpenAI Agents SDK Tracing 提供了 trace_id、workflow_name、span 等字段用于记录工具调用和状态事件,但这些原始字段需要先脱敏和抽取,不能直接入库。

2.2 可选字段

以下字段根据业务需求添加:

字段说明用途
approval records审批记录(审批人、时间、结果)权限模型中需审批的工具调用
state transitions状态转移序列状态机约束,如 ["init", "check", "approve"]
metadatatraceId、环境、模型版本复盘定位和版本对比

如果你读过 Agent 权限模型(N157)和人工审批设计(N155),会知道 approval records 应记录审批步骤、审批人和审批结果,用于验证高风险操作是否经过审批。

2.3 脱敏与隐私

生产 trace 不能原样进入评测集。OpenAI Agents SDK Tracing 文档提醒,有些 span 会捕获模型输入输出或函数工具输入输出,需配置是否包含敏感数据。

必须脱敏字段:PII(姓名、邮箱、手机号)、secret(API key、数据库密码)、客户数据(订单号、交易金额)。

保留字段:traceId、span_id(用于定位)、workflow_name(用于分类)、工具名、状态名(用于断言)。

脱敏方法包括替换为占位符(如 <user_id>)、哈希处理或直接删除。Phoenix 在 Running Evals on Traces 文档中提到,trace 可以被转成评测输入,但仍需要 label/score/rubric,不能把完整原始 trace 直接放进评测集。

三、从生产 trace 到 eval example

3.1 数据采集流程

从生产 trace 构建 eval example,需要经过脱敏、标注、分层和入库四个步骤。这不是一次性工程,而是持续运营。

步骤清单:

  1. 从监控平台导出失败 trace(参考Agent 监控与失败恢复)。
  2. 按失败类型分类:工具调用错误、参数格式错误、状态转移错误、最终答案错误。
  3. 脱敏处理:删除 PII/secret/客户数据,保留 traceId、span_id、workflow_name。
  4. 人工标注:正确/错误/部分正确 + 失败原因。
  5. 分层入库:golden set / negative cases / edge cases。

Phoenix datasets 文档指出,examples 可从 production、staging、evaluations 或 manual 收集。生产环境提供真实任务分布,但 staging 环境的测试用例也能补充边界场景。

3.2 分层标准

层级标准用途
golden set100% 正确 + 高频任务发布门禁必过,pass rate 阈值
negative cases典型失败模式回归测试告警,防止相同错误重现
edge cases长尾/边界场景补充覆盖,酌情纳入

标注维度(对应 LLM-as-judge rubric):工具选择正确性、参数格式正确性、执行顺序正确性、最终答案质量、人工标注对齐度。

OpenAI 在 Evaluation best practices 中建议测试数据包括 typical、edge、adversarial cases,并用 human expert labellers。这里提到的分层标准与之对应,但强调高频任务和典型失败模式,因为评测集的目的是守住发布门禁,而不是覆盖所有场景。

四、Trajectory assertions 写法

4.1 轨迹约束类型

Trajectory assertions 定义 Agent 必须遵守的工具调用、参数格式、状态转移和审批规则。以下是五种约束类型:

约束类型示例失败条件
必须调用工具列表["check_permission", "refresh_data", "generate_report"]缺少任意工具
禁止调用工具列表["delete_user", "drop_table"]用了禁止工具
参数格式约束{"refund_amount": "number", "user_id": "uuid"}参数类型错误
状态转移顺序["init", "check", "approve", "execute"]状态跳跃或重复
审批步骤存在性["need_approval", "approval_granted"]缺少审批事件

LangSmith 在 Evaluation concepts 中提到 Agent 评测应评估 trajectory、tool selection 和 argument formatting。Phoenix 在 Running Evals on Traces 文档中用 span_id 关联评测结果到具体执行片段,说明轨迹断言可以定位到失败 span。

如果你读过 Agent 规划能力评测(N158)和状态机与提示词边界,会知道状态轨迹字段来自状态机的 state/event/checkpoint,用于验证状态转移是否符合预期顺序。

4.2 代码示例

以下是 trajectory assertions 的伪代码示例,适用于通用 Agent 评测:

# trajectory assertions 示例
def assert_trajectory_correct(result):
    # 提取工具调用列表
    tools_called = [call.tool for call in result.tool_calls]

    # 必须调用工具
    required_tools = ["check_permission", "refresh_data"]
    for tool in required_tools:
        assert tool in tools_called, f"Missing required tool: {tool}"

    # 禁止调用工具
    forbidden_tools = ["delete_user"]
    for tool in forbidden_tools:
        assert tool not in tools_called, f"Called forbidden tool: {tool}"

    # 参数格式约束
    for call in result.tool_calls:
        if call.tool == "refund":
            assert isinstance(call.args["refund_amount"], (int, float)), "refund_amount must be number"
            assert len(call.args["user_id"]) == 36, "user_id must be uuid format"

    # 状态转移顺序
    expected_states = ["init", "check", "approve", "execute"]
    actual_states = [event.state for event in result.state_events]
    assert actual_states == expected_states, "State transition order mismatch"

    # 审批步骤存在性
    approval_events = [e for e in result.state_events if e.type == "approval"]
    assert len(approval_events) >= 1, "Missing approval step"

这段代码展示了如何检查必须调用工具、禁止调用工具、参数格式、状态转移顺序和审批步骤。实际实现时,可以用 LangSmith 的 trajectory assertion 或 Phoenix 的 trace eval,但核心逻辑一致。

如果你读过Agent 规划能力评测,会知道规划轨迹也可以变成回归样本,用于验证任务分解和自我纠错能力。

五、LLM-as-judge 的分层 rubric

5.1 为什么总分不够

LLM-as-judge 如果只给总分,波动大,难以定位问题。总分 80 分,可能是工具选择错了但答案凑巧对,也可能是答案错了但格式好看。无法区分是 prompt、工具 schema、检索还是状态机问题。

LangSmith 在 Evaluation concepts 中建议为 Agent 的关键组件定义质量标准:correct tool selection、proper argument formatting、trajectory。每个组件单独评分,才能在模型升级或 prompt 变化后快速定位退化点。

如果你读过Prompt 工程高级实践,会知道 DeepEval 也强调分层指标,如 TaskCompletenessMetric,而不是只看最终输出。

5.2 分层评分表格

以下 rubric 将 Agent 评测拆成五个维度,每个维度 0-2 分:

维度0 分1 分2 分
工具选择正确性错误工具部分正确完全正确
参数格式正确性类型错误部分字段错误完全正确
执行顺序正确性状态跳跃顺序偏差完全正确
最终答案质量不满足需求部分满足完全满足
人工标注对齐度与专家判断矛盾部分一致高度一致

rubric 配置示例(可用于 LangSmith 或 Phoenix):

rubric:
  dimensions:
    - name: tool_selection
      weight: 0.3
      criteria:
        0: "调用了错误的工具"
        1: "调用了部分正确的工具"
        2: "工具选择完全正确"

    - name: argument_formatting
      weight: 0.2
      criteria:
        0: "参数类型错误"
        1: "部分字段格式错误"
        2: "参数格式完全正确"

    - name: execution_order
      weight: 0.2
      criteria:
        0: "状态转移跳跃或重复"
        1: "执行顺序有偏差"
        2: "执行顺序完全正确"

    - name: final_answer_quality
      weight: 0.2
      criteria:
        0: "不满足用户需求"
        1: "部分满足需求"
        2: "完全满足需求"

    - name: human_alignment
      weight: 0.1
      criteria:
        0: "与专家判断矛盾"
        1: "部分一致"
        2: "高度一致"

工具选择权重最高(0.3),因为 Agent 的核心是调用正确的工具。人工标注对齐度权重最低(0.1),用于校验 LLM-as-judge 与专家判断的一致性。

六、发布门禁与回归测试

6.1 CI 集成步骤

Agent eval dataset 的价值在于接入 CI,变成发布门禁。以下是集成步骤:

步骤清单:

  1. 在 CI pipeline 中添加 eval 运行步骤(如 pytest、LangSmith offline eval、Phoenix experiments)。
  2. 配置 pass rate 阈值(如 90%)。
  3. 设置 golden set 全部通过条件(100%)。
  4. 配置 negative cases 告警规则(触发后不阻断,但通知团队)。
  5. 设置版本对比(improvement/regression),对比基线版本和当前版本。
  6. 定义门禁触发时机(PR / merge / canary)。

LangSmith 在 Evaluation concepts 中提到 offline evaluations 可用于 regression testing、unit testing、backtesting,目标是 datasets 中的 examples。Phoenix experiments 文档说明 experiments 可比较 prompt、LLM 或应用逻辑变化,判断 improvement/regression。DeepEval 宣称 pytest-native eval,可在 CI/CD 或 Python scripts 运行,并用 LLMTestCase 和 TaskCompletenessMetric 对 Agent trace 逐层评分。

6.2 阈值配置表格

指标阈值失败动作
pass rate≥ 90%阻断合并
golden set100% 通过阻断合并
negative cases触发告警不阻断,但通知团队负责人
version comparison无 regression阻断合并

CI 配置示例:

evaluation:
  triggers:
    - pull_request
    - merge_to_main
    - canary_deployment

  conditions:
    pass_rate: 0.9
    golden_set: 1.0
    no_regression: true

  notifications:
    on_failure: ["team-lead", "on-call"]
    on_negative_alert: ["team-lead"]

门禁触发时机包括 PR(阻止问题代码进入主干)、merge(确保合并后仍满足条件)、canary(在生产流量前验证)。如果你读过成本控制与模型路由(N156),会知道成本阈值也可以作为门禁条件,这里先聚焦评测阈值。

七、真实案例复盘

7.1 场景描述

日报 Agent 上周能正常生成报告:调用 check_permission 校验权限,调用 refresh_data 刷新数据,再调用 generate_report 生成报表。模型升级后,Agent 仍给出”看似正确”的最终总结,但轨迹里漏掉了 check_permission 和 refresh_data。

用户拿到的是一份没有权限校验、数据过期的报表,但表面上看不出来。公开 benchmark 测不出这个风险,因为它没有你的工具 schema 和状态机。

7.2 问题定位

从监控平台导出失败 trace(参考Agent 监控与失败恢复)。分析轨迹发现:工具调用列表缺少 check_permission 和 refresh_data、状态转移从 init 直接跳到 execute、缺少 check 和 approve 步骤、最终答案看起来正确但数据源没有刷新。

标注为:工具选择错误 + 状态转移跳跃。

7.3 数据集更新

将失败案例加入 negative cases。同时补充 golden set:找到上周成功的日报任务,包含完整工具调用序列,标注为正确案例。

更新 trajectory assertions:必须调用工具列表添加 check_permission 和 refresh_data、状态转移顺序断言为 ["init", "check", "approve", "execute"]。

7.4 CI 门禁拦截

下次 PR 触发 eval 运行。negative case 触发告警:缺少 check_permission 工具调用。golden set 全部通过,说明成功案例没问题。

定位到是 prompt 问题:升级后的模型对”生成报表”指令的理解更偏向直接执行,忽略了前置校验和刷新步骤。

7.5 修复与回归

修复 prompt,强调”生成报表前必须先校验权限和刷新数据”。重新运行 eval:pass rate 从 85% 提升至 95%、negative case 通过无告警、golden set 全部通过、版本对比显示 improvement 无 regression。

合并上线。CI 门禁守住了这次退化。

7.6 字段映射表格

阶段使用的字段
问题定位traceId、span_id、tool_calls、state_events
数据集更新input、expected tool calls、trajectory assertions、human labels
CI 门禁pass rate、golden set、negative cases
修复验证pass rate、version comparison

这个循环展示了从生产失败到回归测试的完整流程。每次事故复盘后,把 traceId、tool call、approvalId、state event 和人工判定固化成 eval example,下次发布前就不会再踩同一个坑。

八、下一步阅读

  • Agent 状态机与提示词边界:理解状态转移约束和轨迹断言字段来源
  • Agent 权限模型:理解审批记录字段和高风险工具调用规则
  • 人工审批设计:理解 approval records 和审批流程固化
  • 成本控制与模型路由:理解成本阈值作为门禁条件
  • Agent 监控与失败恢复:理解失败 trace 导出和事故复盘循环

建立 Agent 评测数据集和回归测试

把真实 Agent 任务、生产 trace、失败案例、工具调用轨迹和人工标注整理成可版本化的 eval dataset,并接入 CI 发布门禁。

⏱️ 预计耗时: 60 分钟

  1. 1

    步骤 1: 收集候选任务

    从生产、staging、人工测试和事故复盘中收集真实 Agent 任务,优先覆盖高频、高风险和已发生过退化的流程。
  2. 2

    步骤 2: 绑定执行轨迹

    为每条任务绑定 traceId、span_id、state events、tool calls、审批记录和最终输出,保留可定位失败的锚点。
  3. 3

    步骤 3: 脱敏原始数据

    删除或替换 PII、secret、客户数据、真实订单号和工具返回中的敏感字段,只保留评测所需的结构化信息。
  4. 4

    步骤 4: 抽取 dataset schema

    为样本补齐 input、expected output、expected tool calls、trajectory assertions、rubric、risk tags、human labels 和版本信息。
  5. 5

    步骤 5: 分层入库

    把样本分为 golden set、negative cases、edge cases 和 regression cases,分别配置通过阈值和告警策略。
  6. 6

    步骤 6: 配置评测器

    为不同维度配置 code evaluator、rule evaluator、LLM-as-judge 或 human annotation,避免只依赖一个总分。
  7. 7

    步骤 7: 接入发布门禁

    把 regression suite 接入 CI、模型升级、prompt 改动和工具 schema 改动前的门禁流程。
  8. 8

    步骤 8: 复盘后持续更新

    每次事故复盘后补充新 case,并记录 dataset version、变更原因、适用范围和数据保留策略。

常见问题

生产 trace 能不能直接拿来当 eval dataset?
不能。生产 trace 需要先脱敏,删除 PII、secret 和客户数据,再人工标注正确、错误或部分正确,最后分层入库为 golden set、negative cases 或 edge cases。OpenAI Agents SDK Tracing 文档也提醒,有些 span 会捕获敏感输入输出,需要控制是否包含。
如何给 Agent 工具调用写 expected trajectory?
从成功案例中提取工具调用序列,定义必须调用和禁止调用的工具列表,再添加状态转移顺序约束。Agent 评测不只看最终答案,还要看工具选择、参数格式和执行轨迹。
失败案例要不要都进 regression suite?
不需要。优先纳入高频、高风险、已造成事故、覆盖关键状态转移或能防止重复退化的案例;长尾边界案例可以先进入 edge cases,再按风险决定是否进入强门禁。
LLM-as-judge 分数波动时,发布门禁怎么设阈值?
不要只看总分。golden set 应全部通过,pass rate 根据业务风险设定,例如 90%;工具选择、参数格式、轨迹、最终答案和人工标注对齐度应分层评分,并配合代码断言和规则断言。
数据集里要不要保存用户原始输入和工具返回?
用户原始输入只能在脱敏后保存,工具返回也应只保存关键字段,删除敏感数据。traceId 和 span_id 可以保留用于定位,但不应把完整原始 trace 直接放进评测集。
模型升级后旧任务变差,怎么快速定位问题?
从 CI 门禁告警开始,查看 pass rate 和 regression 对比,定位失败 test case,再分析工具选择、参数格式和状态转移。问题通常落在 prompt、工具 schema、检索、权限或状态机边界上。
自建 eval dataset 和公开 benchmark 是什么关系?
公开 benchmark 衡量通用能力,适合模型选型;自建数据集衡量你的产品任务、工具、权限、数据分布和失败模式,适合上线前门禁。两者互补,不能互相替代。
OpenAI Evals platform 要关闭了,怎么办?
截至 2026-07-07,OpenAI 官方文档显示 Evals platform 计划在 2026-10-31 对既有用户 read-only,并在 2026-11-30 shutdown。建议优先保持数据集格式可迁移,用 JSON/YAML 定义 test data、ground truth 和 grader,不要把回归体系绑定到单一平台。

14 分钟阅读 · 发布于: 2026年10月21日

评论

使用 GitHub 账号登录后即可评论

Easton BlogEaston Blog